Skip to content

Commit 64f4f53

Browse files
author
Khang Nguyen
committed
mctp-netlink: Store interface physical address in linkmap
Normally, extended addressing is used to respond to requests. We can take the physical address len from the requester's sockaddr. However, when we want to send extended address on an interface, we do not have that information in linkmap. This stores interface address from netlink inside linkmap. Tested: Discovery Notify message is filled with correct address (see next commit) Signed-off-by: Khang Nguyen Duy <[email protected]>
1 parent e0f012d commit 64f4f53

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

src/mctp-netlink.c

+34-6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
struct linkmap_entry {
2424
int ifindex;
2525
char ifname[IFNAMSIZ+1];
26+
uint8_t ifaddr[MAX_ADDR_LEN];
27+
size_t ifaddr_len;
2628
int net;
2729
bool up;
2830

@@ -53,8 +55,9 @@ static int fill_local_addrs(mctp_nl *nl);
5355
static int fill_linkmap(mctp_nl *nl);
5456
static void sort_linkmap(mctp_nl *nl);
5557
static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
56-
const char *ifname, size_t ifname_len, int net,
57-
bool up);
58+
const char *ifname, size_t ifname_len,
59+
uint8_t *ifaddr, size_t ifaddr_len, int net,
60+
bool up);
5861
static struct linkmap_entry *entry_byindex(const mctp_nl *nl,
5962
int index);
6063

@@ -679,8 +682,9 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len)
679682

680683
for (; NLMSG_OK(nlh, len); nlh = NLMSG_NEXT(nlh, len)) {
681684
struct rtattr *rta, *rt_nest, *rt_mctp;
685+
uint8_t *ifaddr;
682686
char *ifname;
683-
size_t ifname_len, rlen, nlen, mlen;
687+
size_t ifname_len, ifaddr_len, rlen, nlen, mlen;
684688
uint32_t net;
685689
bool up;
686690

@@ -722,8 +726,13 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len)
722726
continue;
723727
}
724728
ifname_len = strnlen(ifname, ifname_len);
729+
730+
ifaddr = mctp_get_rtnlmsg_attr(IFLA_ADDRESS, rta, rlen,
731+
&ifaddr_len);
732+
725733
up = info->ifi_flags & IFF_UP;
726-
linkmap_add_entry(nl, info, ifname, ifname_len, net, up);
734+
linkmap_add_entry(nl, info, ifname, ifname_len, ifaddr,
735+
ifaddr_len, net, up);
727736
}
728737
// Not done.
729738
return 1;
@@ -927,6 +936,16 @@ const char* mctp_nl_if_byindex(const mctp_nl *nl, int index)
927936
return NULL;
928937
}
929938

939+
uint8_t *mctp_nl_ifaddr_byindex(const mctp_nl *nl, int index, size_t *ret_len)
940+
{
941+
struct linkmap_entry *entry = entry_byindex(nl, index);
942+
if (entry) {
943+
*ret_len = entry->ifaddr_len;
944+
return entry->ifaddr;
945+
}
946+
return NULL;
947+
}
948+
930949
int mctp_nl_net_byindex(const mctp_nl *nl, int index)
931950
{
932951
struct linkmap_entry *entry = entry_byindex(nl, index);
@@ -1054,8 +1073,9 @@ int *mctp_nl_if_list(const mctp_nl *nl, size_t *ret_num_ifs)
10541073
}
10551074

10561075
static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
1057-
const char *ifname, size_t ifname_len, int net,
1058-
bool up)
1076+
const char *ifname, size_t ifname_len,
1077+
uint8_t *ifaddr, size_t ifaddr_len, int net,
1078+
bool up)
10591079
{
10601080
struct linkmap_entry *entry;
10611081
size_t newsz;
@@ -1067,6 +1087,12 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
10671087
return -1;
10681088
}
10691089

1090+
if (ifaddr_len > MAX_ADDR_LEN) {
1091+
warnx("linkmap, too long ifaddr (%zu bytes long, expected max %d bytes)",
1092+
ifaddr_len, MAX_ADDR_LEN);
1093+
return -1;
1094+
}
1095+
10701096
if (net <= 0) {
10711097
warnx("Bad network ID %d for %*s", net, (int)ifname_len, ifname);
10721098
return -1;
@@ -1088,6 +1114,8 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
10881114
entry = &nl->linkmap[idx];
10891115
memset(entry, 0, sizeof(*entry));
10901116
snprintf(entry->ifname, IFNAMSIZ, "%*s", (int)ifname_len, ifname);
1117+
memcpy(entry->ifaddr, ifaddr, ifaddr_len);
1118+
entry->ifaddr_len = ifaddr_len;
10911119
entry->ifindex = info->ifi_index;
10921120
entry->net = net;
10931121
entry->up = up;

src/mctp-netlink.h

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ int mctp_nl_recv_all(mctp_nl *nl, int sd,
6262
/* Lookup MCTP interfaces */
6363
int mctp_nl_ifindex_byname(const mctp_nl *nl, const char *ifname);
6464
const char* mctp_nl_if_byindex(const mctp_nl *nl, int index);
65+
uint8_t *mctp_nl_ifaddr_byindex(const mctp_nl *nl, int index, size_t *ret_len);
6566
int mctp_nl_net_byindex(const mctp_nl *nl, int index);
6667
bool mctp_nl_up_byindex(const mctp_nl *nl, int index);
6768
/* Caller to free */

0 commit comments

Comments
 (0)