2323struct 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);
5355static int fill_linkmap (mctp_nl * nl );
5456static void sort_linkmap (mctp_nl * nl );
5557static 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 );
5861static 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+
930949int 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
10561075static 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 ;
0 commit comments