Skip to content

Commit 540de66

Browse files
committed
mctp, mctp-netlink: allow add & remove of range routes
Add a separate parser for the route target argument, allowing <min>-<max> ranges to be specified, and pass to the rtm_dst_len value of the netlink rtmsg. Fixes: #58 Signed-off-by: Jeremy Kerr <[email protected]>
1 parent 0e79e79 commit 540de66

File tree

6 files changed

+101
-41
lines changed

6 files changed

+101
-41
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
3737

3838
6. `mctp` now supports gateway routes
3939

40+
7. `mctp` route can add & delete range routes, using a <min>-<max> range format
41+
4042
### Changed
4143

4244
1. tests are now run with address sanitizer enabled (-fsanitize=address)

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ Use `mctp help` for the list of available commands:
5252

5353
mctp route
5454
mctp route show [net <network>]
55-
mctp route add <eid> via <dev> [mtu <mtu>]
56-
mctp route add <eid> gw <eid> [net <net>] [mtu <mtu>]
57-
mctp route del <eid> via <dev>
58-
mctp route del <eid> gw <eid> [net <net>]
55+
mctp route add <eid>[-<eid>] via <dev> [mtu <mtu>]
56+
mctp route add <eid>[-<eid>] gw <eid> [net <net>] [mtu <mtu>]
57+
mctp route del <eid>[-<eid>] via <dev>
58+
mctp route del <eid>[-<eid>] gw <eid> [net <net>]
5959

6060
mctp neigh
6161
mctp neigh show [dev <network>]

src/mctp-netlink.c

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,7 +1250,7 @@ struct mctp_rtalter_msg {
12501250
};
12511251
static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg,
12521252
struct rtattr **prta, size_t *prta_len,
1253-
mctp_eid_t eid, int ifindex,
1253+
mctp_eid_t eid, int ifindex, unsigned int extent,
12541254
const struct mctp_fq_addr *gw)
12551255
{
12561256
struct rtattr *rta;
@@ -1261,27 +1261,31 @@ static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg,
12611261
return -1;
12621262
}
12631263

1264+
if (extent > 0xff || (unsigned int)eid + extent > 0xfe) {
1265+
warnx("invalid route extent");
1266+
return -1;
1267+
}
1268+
12641269
memset(msg, 0x0, sizeof(*msg));
12651270
msg->nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
12661271

12671272
msg->rtmsg.rtm_family = AF_MCTP;
12681273
msg->rtmsg.rtm_type = RTN_UNICAST;
1269-
// TODO add eid range handling
1270-
msg->rtmsg.rtm_dst_len = 0;
1274+
msg->rtmsg.rtm_dst_len = extent;
12711275
msg->rtmsg.rtm_type = RTN_UNICAST;
12721276

12731277
msg->nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg->rtmsg));
12741278
rta_len = sizeof(msg->rta_buff);
12751279
rta = (void *)msg->rta_buff;
12761280

1277-
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len,
1278-
RTA_DST, &eid, sizeof(eid));
1281+
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, RTA_DST,
1282+
&eid, sizeof(eid));
12791283
if (ifindex) {
1280-
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len,
1281-
RTA_OIF, &ifindex, sizeof(ifindex));
1284+
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(
1285+
&rta, &rta_len, RTA_OIF, &ifindex, sizeof(ifindex));
12821286
} else {
1283-
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len,
1284-
RTA_GATEWAY, gw, sizeof(*gw));
1287+
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(
1288+
&rta, &rta_len, RTA_GATEWAY, gw, sizeof(*gw));
12851289
}
12861290

12871291
if (prta)
@@ -1292,15 +1296,16 @@ static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg,
12921296
return 0;
12931297
}
12941298

1295-
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, int ifindex,
1296-
const struct mctp_fq_addr *gw, uint32_t mtu)
1299+
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
1300+
int ifindex, const struct mctp_fq_addr *gw, uint32_t mtu)
12971301
{
12981302
struct mctp_rtalter_msg msg;
12991303
struct rtattr *rta;
13001304
size_t rta_len;
13011305
int rc;
13021306

1303-
rc = fill_rtalter_args(nl, &msg, &rta, &rta_len, eid, ifindex, gw);
1307+
rc = fill_rtalter_args(nl, &msg, &rta, &rta_len, eid, extent, ifindex,
1308+
gw);
13041309
if (rc) {
13051310
return -1;
13061311
}
@@ -1329,13 +1334,13 @@ int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, int ifindex,
13291334
return mctp_nl_send(nl, &msg.nh);
13301335
}
13311336

1332-
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, int ifindex,
1333-
const struct mctp_fq_addr *gw)
1337+
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
1338+
int ifindex, const struct mctp_fq_addr *gw)
13341339
{
13351340
struct mctp_rtalter_msg msg;
13361341
int rc;
13371342

1338-
rc = fill_rtalter_args(nl, &msg, NULL, NULL, eid, ifindex, gw);
1343+
rc = fill_rtalter_args(nl, &msg, NULL, NULL, eid, extent, ifindex, gw);
13391344
if (rc) {
13401345
return rc;
13411346
}

src/mctp-netlink.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ int mctp_nl_addr_add(struct mctp_nl *nl, uint8_t eid, int ifindex);
108108
int mctp_nl_addr_del(struct mctp_nl *nl, uint8_t eid, int ifindex);
109109

110110
/* MCTP route helper */
111-
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, int ifindex,
112-
const struct mctp_fq_addr *gw, uint32_t mtu);
113-
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, int ifindex,
114-
const struct mctp_fq_addr *gw);
111+
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
112+
int ifindex, const struct mctp_fq_addr *gw, uint32_t mtu);
113+
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
114+
int ifindex, const struct mctp_fq_addr *gw);
115115

116116
/* Helpers */
117117

src/mctp.c

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -872,9 +872,54 @@ static int cmd_route_show(struct ctx *ctx, int argc, const char **argv)
872872
return 0;
873873
}
874874

875+
static int parse_eid_range(const char *str, mctp_eid_t *eid,
876+
unsigned int *extent)
877+
{
878+
char tmp[10]; /* sufficient length to handle "100-101" */
879+
mctp_eid_t min, max;
880+
size_t len;
881+
char *sep;
882+
int rc;
883+
884+
len = strlen(str);
885+
if (len >= sizeof(tmp) - 1)
886+
return -1;
887+
888+
strncpy(tmp, str, sizeof(tmp) - 1);
889+
tmp[sizeof(tmp) - 1] = '\0';
890+
891+
sep = strchr(tmp, '-');
892+
if (sep) {
893+
rc = parse_eid(sep + 1, &max);
894+
if (rc)
895+
return rc;
896+
897+
if (max >= 0xff)
898+
return -1;
899+
900+
*sep = '\0';
901+
}
902+
903+
rc = parse_eid(tmp, &min);
904+
if (rc)
905+
return rc;
906+
907+
*eid = min;
908+
if (sep) {
909+
if (max < min)
910+
return -1;
911+
*extent = max - min;
912+
} else {
913+
*extent = 0;
914+
}
915+
916+
return 0;
917+
}
918+
875919
static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
876-
mctp_eid_t *eidp, int *ifindexp,
877-
struct mctp_fq_addr *gwp, unsigned int *mtup)
920+
mctp_eid_t *eidp, unsigned int *extent,
921+
int *ifindexp, struct mctp_fq_addr *gwp,
922+
unsigned int *mtup)
878923
{
879924
const char *eidstr, *linkstr = NULL;
880925
struct mctp_fq_addr gw = { 0 };
@@ -887,9 +932,9 @@ static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
887932
return -1;
888933

889934
eidstr = argv[0];
890-
rc = parse_eid(eidstr, &eid);
935+
rc = parse_eid_range(eidstr, &eid, extent);
891936
if (rc) {
892-
warnx("Invalid EID '%s'", eidstr);
937+
warnx("Invalid EID/range '%s'", eidstr);
893938
return -1;
894939
}
895940

@@ -958,34 +1003,37 @@ static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
9581003
static int cmd_route_add(struct ctx *ctx, int argc, const char **argv)
9591004
{
9601005
struct mctp_fq_addr gw = { 0 };
961-
uint32_t mtu = 0;
9621006
int rc, ifindex = 0;
1007+
unsigned int extent;
1008+
uint32_t mtu = 0;
9631009
mctp_eid_t eid;
9641010

965-
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &ifindex, &gw, &mtu);
1011+
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &extent, &ifindex,
1012+
&gw, &mtu);
9661013
if (rc) {
9671014
warnx("add: invalid command line arguments");
9681015
return -1;
9691016
}
9701017

971-
return mctp_nl_route_add(ctx->nl, eid, ifindex, &gw, mtu);
1018+
return mctp_nl_route_add(ctx->nl, eid, extent, ifindex, &gw, mtu);
9721019
}
9731020

9741021
static int cmd_route_del(struct ctx *ctx, int argc, const char **argv)
9751022
{
9761023
struct mctp_fq_addr gw = { 0 };
977-
unsigned int mtu = 0;
1024+
unsigned int extent, mtu = 0;
9781025
int ifindex = 0;
9791026
mctp_eid_t eid;
9801027
int rc;
9811028

982-
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &ifindex, &gw, &mtu);
1029+
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &extent, &ifindex,
1030+
&gw, &mtu);
9831031
if (rc) {
9841032
warnx("del: invalid command line arguments");
9851033
return -1;
9861034
}
9871035

988-
return mctp_nl_route_del(ctx->nl, eid, ifindex, &gw);
1036+
return mctp_nl_route_del(ctx->nl, eid, extent, ifindex, &gw);
9891037
}
9901038

9911039
static int cmd_route(struct ctx *ctx, int argc, const char **argv)
@@ -995,12 +1043,16 @@ static int cmd_route(struct ctx *ctx, int argc, const char **argv)
9951043
fprintf(stderr, "%s route\n", ctx->top_cmd);
9961044
fprintf(stderr, "%s route show [net <network>]\n",
9971045
ctx->top_cmd);
998-
fprintf(stderr, "%s route add <eid> via <dev> [mtu <mtu>]\n",
1046+
fprintf(stderr,
1047+
"%s route add <eid>[-<eid>] via <dev> [mtu <mtu>]\n",
9991048
ctx->top_cmd);
1000-
fprintf(stderr, "%s route add <eid> gw <eid> [net <net>] [mtu <mtu>]\n",
1049+
fprintf(stderr,
1050+
"%s route add <eid>[-<eid>] gw <eid> [net <net>] [mtu <mtu>]\n",
1051+
ctx->top_cmd);
1052+
fprintf(stderr, "%s route del <eid>[-<eid>] via <dev>\n",
10011053
ctx->top_cmd);
1002-
fprintf(stderr, "%s route del <eid> via <dev>\n", ctx->top_cmd);
1003-
fprintf(stderr, "%s route del <eid> gw <eid> [net <net>]\n",
1054+
fprintf(stderr,
1055+
"%s route del <eid>[-<eid>] gw <eid> [net <net>]\n",
10041056
ctx->top_cmd);
10051057
return 255;
10061058
}

src/mctpd.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1601,15 +1601,16 @@ static int peer_set_mtu(struct ctx *ctx, struct peer *peer, uint32_t mtu)
16011601
return -EPROTO;
16021602
}
16031603

1604-
rc = mctp_nl_route_del(ctx->nl, peer->eid, peer->phys.ifindex, NULL);
1604+
rc = mctp_nl_route_del(ctx->nl, peer->eid, 0, peer->phys.ifindex, NULL);
16051605
if (rc < 0 && rc != -ENOENT) {
16061606
warnx("%s, Failed removing existing route for eid %d %s",
16071607
__func__, peer->phys.ifindex,
16081608
mctp_nl_if_byindex(ctx->nl, peer->phys.ifindex));
16091609
// Continue regardless, route_add will likely fail with EEXIST
16101610
}
16111611

1612-
rc = mctp_nl_route_add(ctx->nl, peer->eid, peer->phys.ifindex, NULL, mtu);
1612+
rc = mctp_nl_route_add(ctx->nl, peer->eid, 0, peer->phys.ifindex, NULL,
1613+
mtu);
16131614
if (rc >= 0) {
16141615
peer->mtu = mtu;
16151616
}
@@ -2323,10 +2324,10 @@ static int peer_route_update(struct peer *peer, uint16_t type)
23232324
}
23242325

23252326
if (type == RTM_NEWROUTE) {
2326-
return mctp_nl_route_add(peer->ctx->nl, peer->eid,
2327+
return mctp_nl_route_add(peer->ctx->nl, peer->eid, 0,
23272328
peer->phys.ifindex, NULL, peer->mtu);
23282329
} else if (type == RTM_DELROUTE) {
2329-
return mctp_nl_route_del(peer->ctx->nl, peer->eid,
2330+
return mctp_nl_route_del(peer->ctx->nl, peer->eid, 0,
23302331
peer->phys.ifindex, NULL);
23312332
}
23322333

0 commit comments

Comments
 (0)