Skip to content

Commit 416a66f

Browse files
author
Khang Nguyen
committed
mctp-netlink: Add helpers to add or remove neighbours
Mirror the existing mctp_nl_route_{add,del} helpers. Signed-off-by: Khang Nguyen <[email protected]>
1 parent 69ed224 commit 416a66f

File tree

4 files changed

+113
-83
lines changed

4 files changed

+113
-83
lines changed

src/mctp-netlink.c

+72
Original file line numberDiff line numberDiff line change
@@ -1163,3 +1163,75 @@ int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, const char* ifname)
11631163
return mctp_nl_send(nl, &msg.nh);
11641164
}
11651165

1166+
/* Common parts of RTM_NEWNEIGH and RTM_DELNEIGH */
1167+
struct mctp_ndalter_msg {
1168+
struct nlmsghdr nh;
1169+
struct ndmsg ndmsg;
1170+
uint8_t rta_buff[RTA_SPACE(1) + RTA_SPACE(MAX_ADDR_LEN)];
1171+
};
1172+
1173+
static int fill_ndalter_args(struct mctp_nl *nl, struct mctp_ndalter_msg *msg,
1174+
struct rtattr **prta, size_t *prta_len,
1175+
mctp_eid_t eid, const char *ifname)
1176+
{
1177+
struct rtattr *rta;
1178+
size_t rta_len;
1179+
int ifindex;
1180+
1181+
ifindex = mctp_nl_ifindex_byname(nl, ifname);
1182+
if (!ifindex) {
1183+
warnx("invalid device %s", ifname);
1184+
return -1;
1185+
}
1186+
1187+
msg->nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
1188+
msg->ndmsg.ndm_ifindex = ifindex;
1189+
msg->ndmsg.ndm_family = AF_MCTP;
1190+
msg->nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg->ndmsg));
1191+
1192+
rta_len = sizeof(msg->rta_buff);
1193+
rta = (void *)msg->rta_buff;
1194+
1195+
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len, NDA_DST,
1196+
&eid, sizeof(eid));
1197+
1198+
if (prta)
1199+
*prta = rta;
1200+
if (prta_len)
1201+
*prta_len = rta_len;
1202+
1203+
return 0;
1204+
}
1205+
1206+
int mctp_nl_neigh_add(struct mctp_nl *nl, uint8_t eid, const char *ifname,
1207+
uint8_t *haddr, uint8_t halen)
1208+
{
1209+
struct mctp_ndalter_msg msg;
1210+
struct rtattr *rta;
1211+
size_t rta_len;
1212+
int rc;
1213+
1214+
rc = fill_ndalter_args(nl, &msg, &rta, &rta_len, eid, ifname);
1215+
if (rc) {
1216+
return rc;
1217+
}
1218+
msg.nh.nlmsg_type = RTM_NEWNEIGH;
1219+
msg.nh.nlmsg_len +=
1220+
mctp_put_rtnlmsg_attr(&rta, &rta_len, NDA_LLADDR, haddr, halen);
1221+
1222+
return mctp_nl_send(nl, &msg.nh);
1223+
}
1224+
1225+
int mctp_nl_neigh_del(struct mctp_nl *nl, uint8_t eid, const char *ifname)
1226+
{
1227+
struct mctp_ndalter_msg msg;
1228+
int rc;
1229+
1230+
rc = fill_ndalter_args(nl, &msg, NULL, NULL, eid, ifname);
1231+
if (rc) {
1232+
return rc;
1233+
}
1234+
msg.nh.nlmsg_type = RTM_DELNEIGH;
1235+
1236+
return mctp_nl_send(nl, &msg.nh);
1237+
}

src/mctp-netlink.h

+5
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ int mctp_nl_route_add(struct mctp_nl *nl, uint8_t eid, const char* ifname,
7474
uint32_t mtu);
7575
int mctp_nl_route_del(struct mctp_nl *nl, uint8_t eid, const char* ifname);
7676

77+
/* MCTP neigh helper */
78+
int mctp_nl_neigh_add(struct mctp_nl *nl, uint8_t eid, const char *ifname,
79+
uint8_t *haddr, uint8_t halen);
80+
int mctp_nl_neigh_del(struct mctp_nl *nl, uint8_t eid, const char *ifname);
81+
7782
/* Helpers */
7883

7984
void* mctp_get_rtnlmsg_attr(int rta_type, struct rtattr *rta, size_t len,

src/mctp.c

+14-65
Original file line numberDiff line numberDiff line change
@@ -1023,62 +1023,14 @@ static int cmd_neigh_show(struct ctx *ctx, int argc, const char **argv)
10231023
return 0;
10241024
}
10251025

1026-
struct mctp_neighalter_msg {
1027-
struct nlmsghdr nh;
1028-
struct ndmsg ndmsg;
1029-
uint8_t rta_buff[RTA_SPACE(1) + RTA_SPACE(MAX_ADDR_LEN)];
1030-
};
1031-
1032-
static int fill_neighalter_args(struct ctx *ctx,
1033-
struct mctp_neighalter_msg *msg,
1034-
struct rtattr **prta, size_t *prta_len,
1035-
const char *eidstr, const char *linkstr) {
1036-
struct rtattr *rta;
1037-
uint32_t tmp;
1038-
uint8_t eid;
1039-
int ifindex;
1040-
size_t rta_len;
1041-
1042-
ifindex = mctp_nl_ifindex_byname(ctx->nl, linkstr);
1043-
if (!ifindex) {
1044-
warnx("invalid device %s", linkstr);
1045-
return -1;
1046-
}
1047-
1048-
if (parse_uint32(eidstr, &tmp) < 0 || tmp > 0xff) {
1049-
warnx("invalid address %s", eidstr);
1050-
return -1;
1051-
}
1052-
eid = tmp & 0xff;
1053-
1054-
memset(msg, 0x0, sizeof(*msg));
1055-
msg->nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
1056-
msg->ndmsg.ndm_ifindex = ifindex;
1057-
msg->ndmsg.ndm_family = AF_MCTP;
1058-
1059-
msg->nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg->ndmsg));
1060-
rta_len = sizeof(msg->rta_buff);
1061-
rta = (void*)msg->rta_buff;
1062-
1063-
msg->nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len,
1064-
NDA_DST, &eid, sizeof(eid));
1065-
1066-
1067-
if (prta)
1068-
*prta = rta;
1069-
if (prta_len)
1070-
*prta_len = rta_len;
1071-
return 0;
1072-
}
1073-
10741026
static int cmd_neigh_add(struct ctx *ctx, int argc, const char **argv)
10751027
{
1076-
struct mctp_neighalter_msg msg;
1077-
struct rtattr *rta;
10781028
const char *linkstr, *eidstr, *lladdrstr;
1079-
int rc;
10801029
uint8_t llbuf[MAX_ADDR_LEN];
1081-
size_t llbuf_len, rta_len;
1030+
size_t llbuf_len;
1031+
mctp_eid_t eid;
1032+
uint32_t tmp;
1033+
int rc;
10821034

10831035
rc = 0;
10841036
if (argc != 6) {
@@ -1107,22 +1059,20 @@ static int cmd_neigh_add(struct ctx *ctx, int argc, const char **argv)
11071059
return rc;
11081060
}
11091061

1110-
rc = fill_neighalter_args(ctx, &msg, &rta, &rta_len,
1111-
eidstr, linkstr);
1112-
if (rc) {
1062+
if (parse_uint32(eidstr, &tmp) < 0 || tmp > 0xff) {
1063+
warnx("invalid address %s", eidstr);
11131064
return -1;
11141065
}
1066+
eid = tmp & 0xff;
11151067

1116-
msg.nh.nlmsg_type = RTM_NEWNEIGH;
1117-
msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len,
1118-
NDA_LLADDR, llbuf, llbuf_len);
1119-
return mctp_nl_send(ctx->nl, &msg.nh);
1068+
return mctp_nl_neigh_add(ctx->nl, eid, linkstr, llbuf, llbuf_len);
11201069
}
11211070

11221071
static int cmd_neigh_del(struct ctx *ctx, int argc, const char **argv)
11231072
{
1124-
struct mctp_neighalter_msg msg;
11251073
const char *linkstr, *eidstr;
1074+
mctp_eid_t eid;
1075+
uint32_t tmp;
11261076
int rc;
11271077

11281078
rc = 0;
@@ -1141,14 +1091,13 @@ static int cmd_neigh_del(struct ctx *ctx, int argc, const char **argv)
11411091
eidstr = argv[1];
11421092
linkstr = argv[3];
11431093

1144-
rc = fill_neighalter_args(ctx, &msg, NULL, NULL,
1145-
eidstr, linkstr);
1146-
if (rc) {
1094+
if (parse_uint32(eidstr, &tmp) < 0 || tmp > 0xff) {
1095+
warnx("invalid address %s", eidstr);
11471096
return -1;
11481097
}
1098+
eid = tmp & 0xff;
11491099

1150-
msg.nh.nlmsg_type = RTM_DELNEIGH;
1151-
return mctp_nl_send(ctx->nl, &msg.nh);
1100+
return mctp_nl_neigh_del(ctx->nl, eid, linkstr);
11521101
}
11531102

11541103
static int cmd_neigh(struct ctx *ctx, int argc, const char **argv) {

src/mctpd.c

+22-18
Original file line numberDiff line numberDiff line change
@@ -2033,26 +2033,30 @@ static int query_peer_properties(peer *peer)
20332033
return rc;
20342034
}
20352035

2036+
// type is RTM_NEWNEIGH or RTM_DELNEIGH
20362037
static int peer_neigh_update(peer *peer, uint16_t type)
20372038
{
2038-
struct {
2039-
struct nlmsghdr nh;
2040-
struct ndmsg ndmsg;
2041-
uint8_t rta_buff[RTA_SPACE(1) + RTA_SPACE(MAX_ADDR_LEN)];
2042-
} msg = {0};
2043-
size_t rta_len = sizeof(msg.rta_buff);
2044-
struct rtattr *rta = (void*)msg.rta_buff;
2045-
2046-
msg.nh.nlmsg_type = type;
2047-
msg.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
2048-
msg.ndmsg.ndm_ifindex = peer->phys.ifindex;
2049-
msg.ndmsg.ndm_family = AF_MCTP;
2050-
msg.nh.nlmsg_len = NLMSG_LENGTH(sizeof(msg.ndmsg));
2051-
msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len,
2052-
NDA_DST, &peer->eid, sizeof(peer->eid));
2053-
msg.nh.nlmsg_len += mctp_put_rtnlmsg_attr(&rta, &rta_len,
2054-
NDA_LLADDR, peer->phys.hwaddr, peer->phys.hwaddr_len);
2055-
return mctp_nl_send(peer->ctx->nl_query, &msg.nh);
2039+
const char *link;
2040+
2041+
link = mctp_nl_if_byindex(peer->ctx->nl_query, peer->phys.ifindex);
2042+
if (!link) {
2043+
warnx("BUG %s: Unknown ifindex %d", __func__,
2044+
peer->phys.ifindex);
2045+
return -ENODEV;
2046+
}
2047+
2048+
if (type == RTM_NEWNEIGH) {
2049+
return mctp_nl_neigh_add(peer->ctx->nl_query, peer->eid, link,
2050+
peer->phys.hwaddr,
2051+
peer->phys.hwaddr_len);
2052+
} else if (type == RTM_DELNEIGH) {
2053+
return mctp_nl_neigh_del(peer->ctx->nl_query, peer->eid, link,
2054+
peer->phys.hwaddr,
2055+
peer->phys.hwaddr_len);
2056+
}
2057+
2058+
warnx("BUG %s: bad type %d", __func__, type);
2059+
return -EPROTO;
20562060
}
20572061

20582062
// type is RTM_NEWROUTE or RTM_DELROUTE

0 commit comments

Comments
 (0)