Skip to content

Commit f84314f

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 f9a5618 commit f84314f

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

src/mctp-netlink.c

Lines changed: 39 additions & 7 deletions
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+
char 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+
const char *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,8 @@ 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;
682-
char *ifname;
683-
size_t ifname_len, rlen, nlen, mlen;
685+
char *ifname, *ifaddr;
686+
size_t ifname_len, ifaddr_len, rlen, nlen, mlen;
684687
uint32_t net;
685688
bool up;
686689

@@ -722,8 +725,17 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len)
722725
continue;
723726
}
724727
ifname_len = strnlen(ifname, ifname_len);
728+
729+
ifaddr = mctp_get_rtnlmsg_attr(IFLA_ADDRESS, rta, rlen,
730+
&ifaddr_len);
731+
if (!ifaddr) {
732+
warnx("no ifaddr?");
733+
continue;
734+
}
735+
725736
up = info->ifi_flags & IFF_UP;
726-
linkmap_add_entry(nl, info, ifname, ifname_len, net, up);
737+
linkmap_add_entry(nl, info, ifname, ifname_len, ifaddr,
738+
ifaddr_len, net, up);
727739
}
728740
// Not done.
729741
return 1;
@@ -927,6 +939,17 @@ const char* mctp_nl_if_byindex(const mctp_nl *nl, int index)
927939
return NULL;
928940
}
929941

942+
const char *mctp_nl_ifaddr_byindex(const mctp_nl *nl, int index,
943+
size_t *ret_len)
944+
{
945+
struct linkmap_entry *entry = entry_byindex(nl, index);
946+
if (entry) {
947+
*ret_len = entry->ifaddr_len;
948+
return entry->ifaddr;
949+
}
950+
return NULL;
951+
}
952+
930953
int mctp_nl_net_byindex(const mctp_nl *nl, int index)
931954
{
932955
struct linkmap_entry *entry = entry_byindex(nl, index);
@@ -1054,8 +1077,9 @@ int *mctp_nl_if_list(const mctp_nl *nl, size_t *ret_num_ifs)
10541077
}
10551078

10561079
static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
1057-
const char *ifname, size_t ifname_len, int net,
1058-
bool up)
1080+
const char *ifname, size_t ifname_len,
1081+
const char *ifaddr, size_t ifaddr_len, int net,
1082+
bool up)
10591083
{
10601084
struct linkmap_entry *entry;
10611085
size_t newsz;
@@ -1067,6 +1091,12 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
10671091
return -1;
10681092
}
10691093

1094+
if (ifaddr_len > MAX_ADDR_LEN) {
1095+
warnx("linkmap, too long ifaddr '%*s'", (int)ifaddr_len,
1096+
ifaddr);
1097+
return -1;
1098+
}
1099+
10701100
if (net <= 0) {
10711101
warnx("Bad network ID %d for %*s", net, (int)ifname_len, ifname);
10721102
return -1;
@@ -1088,6 +1118,8 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
10881118
entry = &nl->linkmap[idx];
10891119
memset(entry, 0, sizeof(*entry));
10901120
snprintf(entry->ifname, IFNAMSIZ, "%*s", (int)ifname_len, ifname);
1121+
snprintf(entry->ifaddr, MAX_ADDR_LEN, "%*s", (int)ifaddr_len, ifaddr);
1122+
entry->ifaddr_len = ifaddr_len;
10911123
entry->ifindex = info->ifi_index;
10921124
entry->net = net;
10931125
entry->up = up;

src/mctp-netlink.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ 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+
const char *mctp_nl_ifaddr_byindex(const mctp_nl *nl, int index,
66+
size_t *ret_len);
6567
int mctp_nl_net_byindex(const mctp_nl *nl, int index);
6668
bool mctp_nl_up_byindex(const mctp_nl *nl, int index);
6769
/* Caller to free */

0 commit comments

Comments
 (0)