Skip to content

Commit 74a3740

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 <jk@codeconstruct.com.au>
1 parent 2cbe95f commit 74a3740

6 files changed

Lines changed: 96 additions & 35 deletions

File tree

CHANGELOG.md

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

3131
5. `mctp` now supports gateway routes
3232

33+
6. `mctp` route can add & delete range routes, using a <min>-<max> range format
34+
3335
### Changed
3436

3537
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: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,8 @@ struct mctp_rtalter_msg {
11521152
};
11531153
static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg,
11541154
struct rtattr **prta, size_t *prta_len,
1155-
mctp_eid_t eid, const char* linkstr, const struct mctp_fq_addr *gw)
1155+
mctp_eid_t eid, unsigned int extent,
1156+
const char* linkstr, const struct mctp_fq_addr *gw)
11561157
{
11571158
struct rtattr *rta;
11581159
int ifindex = 0;
@@ -1169,13 +1170,17 @@ static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg,
11691170
return -1;
11701171
}
11711172

1173+
if (extent > 0xff || (unsigned int)eid + extent > 0xfe) {
1174+
warnx("invalid route extent");
1175+
return -1;
1176+
}
1177+
11721178
memset(msg, 0x0, sizeof(*msg));
11731179
msg->nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
11741180

11751181
msg->rtmsg.rtm_family = AF_MCTP;
11761182
msg->rtmsg.rtm_type = RTN_UNICAST;
1177-
// TODO add eid range handling
1178-
msg->rtmsg.rtm_dst_len = 0;
1183+
msg->rtmsg.rtm_dst_len = extent;
11791184
msg->rtmsg.rtm_type = RTN_UNICAST;
11801185

11811186
msg->nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg->rtmsg));
@@ -1200,15 +1205,17 @@ static int fill_rtalter_args(struct mctp_nl *nl, struct mctp_rtalter_msg *msg,
12001205
return 0;
12011206
}
12021207

1203-
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, const char* ifname,
1204-
const struct mctp_fq_addr *gw, uint32_t mtu)
1208+
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
1209+
const char* ifname, const struct mctp_fq_addr *gw,
1210+
uint32_t mtu)
12051211
{
12061212
struct mctp_rtalter_msg msg;
12071213
struct rtattr *rta;
12081214
size_t rta_len;
12091215
int rc;
12101216

1211-
rc = fill_rtalter_args(nl, &msg, &rta, &rta_len, eid, ifname, gw);
1217+
rc = fill_rtalter_args(nl, &msg, &rta, &rta_len, eid, extent, ifname,
1218+
gw);
12121219
if (rc) {
12131220
return -1;
12141221
}
@@ -1237,13 +1244,13 @@ int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, const char* ifname,
12371244

12381245
}
12391246

1240-
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, const char* ifname,
1241-
const struct mctp_fq_addr *gw)
1247+
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
1248+
const char* ifname, const struct mctp_fq_addr *gw)
12421249
{
12431250
struct mctp_rtalter_msg msg;
12441251
int rc;
12451252

1246-
rc = fill_rtalter_args(nl, &msg, NULL, NULL, eid, ifname, gw);
1253+
rc = fill_rtalter_args(nl, &msg, NULL, NULL, eid, extent, ifname, gw);
12471254
if (rc) {
12481255
return rc;
12491256
}

src/mctp-netlink.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,11 @@ void *mctp_nl_get_link_userdata(const mctp_nl *nl, int ifindex);
9999
void *mctp_nl_get_link_userdata_byname(const mctp_nl *nl, const char *ifname);
100100

101101
/* MCTP route helper */
102-
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, const char* ifname,
103-
const struct mctp_fq_addr *gw, uint32_t mtu);
104-
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, const char* ifname,
105-
const struct mctp_fq_addr *gw);
102+
int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
103+
const char* ifname, const struct mctp_fq_addr *gw,
104+
uint32_t mtu);
105+
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, unsigned int extent,
106+
const char* ifname, const struct mctp_fq_addr *gw);
106107

107108
/* Helpers */
108109

src/mctp.c

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -892,9 +892,55 @@ static int parse_eid(const char *str, mctp_eid_t *eid)
892892
return 0;
893893
}
894894

895+
static int parse_eid_range(const char *str, mctp_eid_t *eid,
896+
unsigned int *extent)
897+
{
898+
char tmp[10]; /* sufficient length to handle "100-101" */
899+
mctp_eid_t min, max;
900+
size_t len;
901+
char *sep;
902+
int rc;
903+
904+
len = strlen(str);
905+
if (len >= sizeof(tmp) - 1)
906+
return -1;
907+
908+
strncpy(tmp, str, sizeof(tmp) - 1);
909+
tmp[sizeof(tmp) - 1] = '\0';
910+
911+
sep = strchr(tmp, '-');
912+
if (sep) {
913+
rc = parse_eid(sep + 1, &max);
914+
if (rc)
915+
return rc;
916+
917+
if (max >= 0xff)
918+
return -1;
919+
920+
*sep = '\0';
921+
}
922+
923+
rc = parse_eid(tmp, &min);
924+
if (rc)
925+
return rc;
926+
927+
*eid = min;
928+
if (sep) {
929+
if (max < min)
930+
return -1;
931+
*extent = max - min;
932+
} else {
933+
*extent = 0;
934+
}
935+
936+
return 0;
937+
}
938+
939+
895940
static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
896-
mctp_eid_t *eidp, const char **linkstrp,
897-
struct mctp_fq_addr *gwp, unsigned int *mtup)
941+
mctp_eid_t *eidp, unsigned int *extent,
942+
const char **linkstrp, struct mctp_fq_addr *gwp,
943+
unsigned int *mtup)
898944
{
899945
const char *eidstr, *linkstr = NULL;
900946
struct mctp_fq_addr gw = { 0 };
@@ -907,9 +953,9 @@ static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
907953
return -1;
908954

909955
eidstr = argv[0];
910-
rc = parse_eid(eidstr, &eid);
956+
rc = parse_eid_range(eidstr, &eid, extent);
911957
if (rc) {
912-
warnx("Invalid EID '%s'", eidstr);
958+
warnx("Invalid EID/range '%s'", eidstr);
913959
return -1;
914960
}
915961

@@ -972,35 +1018,37 @@ static int parse_route_args(struct ctx *ctx, int argc, const char **argv,
9721018
static int cmd_route_add(struct ctx *ctx, int argc, const char **argv)
9731019
{
9741020
struct mctp_fq_addr gw = { 0 };
1021+
unsigned int extent, mtu = 0;
9751022
const char *linkstr = NULL;
976-
unsigned int mtu = 0;
9771023
mctp_eid_t eid;
9781024
int rc;
9791025

980-
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &linkstr, &gw, &mtu);
1026+
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &extent,
1027+
&linkstr, &gw, &mtu);
9811028
if (rc) {
9821029
warnx("add: invalid command line arguments");
9831030
return -1;
9841031
}
9851032

986-
return mctp_nl_route_add(ctx->nl, eid, linkstr, &gw, mtu);
1033+
return mctp_nl_route_add(ctx->nl, eid, extent, linkstr, &gw, mtu);
9871034
}
9881035

9891036
static int cmd_route_del(struct ctx *ctx, int argc, const char **argv)
9901037
{
9911038
struct mctp_fq_addr gw = { 0 };
1039+
unsigned int extent, mtu = 0;
9921040
const char *linkstr = NULL;
993-
unsigned int mtu = 0;
9941041
mctp_eid_t eid;
9951042
int rc;
9961043

997-
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &linkstr, &gw, &mtu);
1044+
rc = parse_route_args(ctx, argc - 1, argv + 1, &eid, &extent,
1045+
&linkstr, &gw, &mtu);
9981046
if (rc) {
9991047
warnx("del: invalid command line arguments");
10001048
return -1;
10011049
}
10021050

1003-
return mctp_nl_route_del(ctx->nl, eid, linkstr, &gw);
1051+
return mctp_nl_route_del(ctx->nl, eid, extent, linkstr, &gw);
10041052
}
10051053

10061054
static int cmd_route(struct ctx *ctx, int argc, const char **argv)
@@ -1009,11 +1057,14 @@ static int cmd_route(struct ctx *ctx, int argc, const char **argv)
10091057
if (argc == 2 && !strcmp(argv[1], "help")) {
10101058
fprintf(stderr, "%s route\n", ctx->top_cmd);
10111059
fprintf(stderr, "%s route show [net <network>]\n", ctx->top_cmd);
1012-
fprintf(stderr, "%s route add <eid> via <dev> [mtu <mtu>]\n", ctx->top_cmd);
1013-
fprintf(stderr, "%s route add <eid> gw <eid> [net <net>] [mtu <mtu>]\n",
1060+
fprintf(stderr, "%s route add <eid>[-<eid>] via <dev> [mtu <mtu>]\n",
1061+
ctx->top_cmd);
1062+
fprintf(stderr, "%s route add <eid>[-<eid>] gw <eid> [net <net>] [mtu <mtu>]\n",
1063+
ctx->top_cmd);
1064+
fprintf(stderr, "%s route del <eid>[-<eid>] via <dev>\n",
1065+
ctx->top_cmd);
1066+
fprintf(stderr, "%s route del <eid>[-<eid>] gw <eid> [net <net>]\n",
10141067
ctx->top_cmd);
1015-
fprintf(stderr, "%s route del <eid> via <dev>\n", ctx->top_cmd);
1016-
fprintf(stderr, "%s route del <eid> gw <eid> [net <net>]\n", ctx->top_cmd);
10171068
return 255;
10181069
}
10191070

src/mctpd.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,15 +1536,15 @@ static int peer_set_mtu(struct ctx *ctx, struct peer *peer, uint32_t mtu) {
15361536
return -EPROTO;
15371537
}
15381538

1539-
rc = mctp_nl_route_del(ctx->nl_query, peer->eid, ifname, NULL);
1539+
rc = mctp_nl_route_del(ctx->nl_query, peer->eid, 0, ifname, NULL);
15401540
if (rc < 0 && rc != -ENOENT) {
15411541
warnx("%s, Failed removing existing route for eid %d %s",
15421542
__func__,
15431543
peer->phys.ifindex, ifname);
15441544
// Continue regardless, route_add will likely fail with EEXIST
15451545
}
15461546

1547-
rc = mctp_nl_route_add(ctx->nl_query, peer->eid, ifname, NULL, mtu);
1547+
rc = mctp_nl_route_add(ctx->nl_query, peer->eid, 0, ifname, NULL, mtu);
15481548
if (rc >= 0) {
15491549
peer->mtu = mtu;
15501550
}
@@ -2243,10 +2243,10 @@ static int peer_route_update(struct peer *peer, uint16_t type)
22432243
}
22442244

22452245
if (type == RTM_NEWROUTE) {
2246-
return mctp_nl_route_add(peer->ctx->nl_query, peer->eid,
2246+
return mctp_nl_route_add(peer->ctx->nl_query, peer->eid, 0,
22472247
link, NULL, peer->mtu);
22482248
} else if (type == RTM_DELROUTE) {
2249-
return mctp_nl_route_del(peer->ctx->nl_query, peer->eid,
2249+
return mctp_nl_route_del(peer->ctx->nl_query, peer->eid, 0,
22502250
link, NULL);
22512251
}
22522252

0 commit comments

Comments
 (0)