Skip to content

Commit 5ca88b9

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 5ca88b9

File tree

3 files changed

+99
-18
lines changed

3 files changed

+99
-18
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/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)