2323struct 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);
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+ const char * 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,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+
930953int 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
10561079static 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 ;
0 commit comments