23
23
struct linkmap_entry {
24
24
int ifindex ;
25
25
char ifname [IFNAMSIZ + 1 ];
26
+ uint8_t 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
+ uint8_t * 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,9 @@ 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 ;
685
+ uint8_t * ifaddr ;
682
686
char * ifname ;
683
- size_t ifname_len , rlen , nlen , mlen ;
687
+ size_t ifname_len , ifaddr_len , rlen , nlen , mlen ;
684
688
uint32_t net ;
685
689
bool up ;
686
690
@@ -722,8 +726,13 @@ static int parse_getlink_dump(mctp_nl *nl, struct nlmsghdr *nlh, uint32_t len)
722
726
continue ;
723
727
}
724
728
ifname_len = strnlen (ifname , ifname_len );
729
+
730
+ ifaddr = mctp_get_rtnlmsg_attr (IFLA_ADDRESS , rta , rlen ,
731
+ & ifaddr_len );
732
+
725
733
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 );
727
736
}
728
737
// Not done.
729
738
return 1 ;
@@ -927,6 +936,16 @@ const char* mctp_nl_if_byindex(const mctp_nl *nl, int index)
927
936
return NULL ;
928
937
}
929
938
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
+
930
949
int mctp_nl_net_byindex (const mctp_nl * nl , int index )
931
950
{
932
951
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)
1054
1073
}
1055
1074
1056
1075
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 )
1059
1079
{
1060
1080
struct linkmap_entry * entry ;
1061
1081
size_t newsz ;
@@ -1067,6 +1087,12 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
1067
1087
return -1 ;
1068
1088
}
1069
1089
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
+
1070
1096
if (net <= 0 ) {
1071
1097
warnx ("Bad network ID %d for %*s" , net , (int )ifname_len , ifname );
1072
1098
return -1 ;
@@ -1088,6 +1114,8 @@ static int linkmap_add_entry(mctp_nl *nl, struct ifinfomsg *info,
1088
1114
entry = & nl -> linkmap [idx ];
1089
1115
memset (entry , 0 , sizeof (* entry ));
1090
1116
snprintf (entry -> ifname , IFNAMSIZ , "%*s" , (int )ifname_len , ifname );
1117
+ memcpy (entry -> ifaddr , ifaddr , ifaddr_len );
1118
+ entry -> ifaddr_len = ifaddr_len ;
1091
1119
entry -> ifindex = info -> ifi_index ;
1092
1120
entry -> net = net ;
1093
1121
entry -> up = up ;
0 commit comments