23
23
struct linkmap_entry {
24
24
int ifindex ;
25
25
char ifname [IFNAMSIZ + 1 ];
26
+ char ifaddr [MAX_ADDR_LEN ];
27
+ size_t ifaddr_len ;
26
28
int net ;
27
29
bool up ;
28
30
@@ -53,8 +55,9 @@ static int fill_local_addrs(mctp_nl *nl);
53
55
static int fill_linkmap (mctp_nl * nl );
54
56
static void sort_linkmap (mctp_nl * nl );
55
57
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 );
58
61
static struct linkmap_entry * entry_byindex (const mctp_nl * nl ,
59
62
int index );
60
63
@@ -679,8 +682,8 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len)
679
682
680
683
for (; NLMSG_OK (nlh , len ); nlh = NLMSG_NEXT (nlh , len )) {
681
684
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 ;
684
687
uint32_t net ;
685
688
bool up ;
686
689
@@ -722,8 +725,17 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len)
722
725
continue ;
723
726
}
724
727
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
+
725
736
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 );
727
739
}
728
740
// Not done.
729
741
return 1 ;
@@ -927,6 +939,17 @@ const char* mctp_nl_if_byindex(const mctp_nl *nl, int index)
927
939
return NULL ;
928
940
}
929
941
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
+
930
953
int mctp_nl_net_byindex (const mctp_nl * nl , int index )
931
954
{
932
955
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)
1054
1077
}
1055
1078
1056
1079
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 )
1059
1083
{
1060
1084
struct linkmap_entry * entry ;
1061
1085
size_t newsz ;
@@ -1067,6 +1091,12 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
1067
1091
return -1 ;
1068
1092
}
1069
1093
1094
+ if (ifaddr_len > MAX_ADDR_LEN ) {
1095
+ warnx ("linkmap, too long ifaddr '%*s'" , (int )ifaddr_len ,
1096
+ ifaddr );
1097
+ return -1 ;
1098
+ }
1099
+
1070
1100
if (net <= 0 ) {
1071
1101
warnx ("Bad network ID %d for %*s" , net , (int )ifname_len , ifname );
1072
1102
return -1 ;
@@ -1088,6 +1118,8 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
1088
1118
entry = & nl -> linkmap [idx ];
1089
1119
memset (entry , 0 , sizeof (* entry ));
1090
1120
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 ;
1091
1123
entry -> ifindex = info -> ifi_index ;
1092
1124
entry -> net = net ;
1093
1125
entry -> up = up ;
0 commit comments