platform: add l_perm_address in NMPlatformLink and parse it from netlink

Add `l_perm_address` in `NMPlatformLink` and add it to
`nm_platform_link_to_string`, `nm_platform_link_hash_update`,
`nm_platform_link_cmp` functions, and parse it from netlink.

Signed-off-by: Wen Liang <liangwen12year@gmail.com>
This commit is contained in:
Wen Liang 2021-07-26 10:57:30 -04:00 committed by Thomas Haller
parent db13b93563
commit 585257509f
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
3 changed files with 34 additions and 8 deletions

View file

@ -145,6 +145,8 @@ G_STATIC_ASSERT(RTA_MAX == (__RTA_MAX - 1));
#define IFLA_BR_VLAN_STATS_ENABLED 41
#define IFLA_PERM_ADDRESS 54
/*****************************************************************************/
/* Appeared in the kernel prior to 3.13 dated 19 January, 2014 */
@ -2935,6 +2937,7 @@ _new_from_nl_link(NMPlatform * platform,
[IFLA_NET_NS_PID] = {.type = NLA_U32},
[IFLA_NET_NS_FD] = {.type = NLA_U32},
[IFLA_LINK_NETNSID] = {},
[IFLA_PERM_ADDRESS] = {.type = NLA_UNSPEC},
};
const struct ifinfomsg *ifi;
struct nlattr * tb[G_N_ELEMENTS(policy)];
@ -2945,12 +2948,13 @@ _new_from_nl_link(NMPlatform * platform,
gboolean * completed_from_cache = cache ? &completed_from_cache_val : NULL;
const NMPObject * link_cached = NULL;
const NMPObject * lnk_data = NULL;
gboolean address_complete_from_cache = TRUE;
gboolean broadcast_complete_from_cache = TRUE;
gboolean lnk_data_complete_from_cache = TRUE;
gboolean need_ext_data = FALSE;
gboolean af_inet6_token_valid = FALSE;
gboolean af_inet6_addr_gen_mode_valid = FALSE;
gboolean address_complete_from_cache = TRUE;
gboolean perm_address_complete_from_cache = TRUE;
gboolean broadcast_complete_from_cache = TRUE;
gboolean lnk_data_complete_from_cache = TRUE;
gboolean need_ext_data = FALSE;
gboolean af_inet6_token_valid = FALSE;
gboolean af_inet6_addr_gen_mode_valid = FALSE;
if (!nlmsg_valid_hdr(nlh, sizeof(*ifi)))
return NULL;
@ -3053,6 +3057,11 @@ _new_from_nl_link(NMPlatform * platform,
address_complete_from_cache = FALSE;
}
if (tb[IFLA_PERM_ADDRESS]) {
_nmp_link_address_set(&obj->link.l_perm_address, tb[IFLA_PERM_ADDRESS]);
perm_address_complete_from_cache = FALSE;
}
if (tb[IFLA_BROADCAST]) {
_nmp_link_address_set(&obj->link.l_broadcast, tb[IFLA_BROADCAST]);
broadcast_complete_from_cache = FALSE;
@ -3135,8 +3144,8 @@ _new_from_nl_link(NMPlatform * platform,
if (completed_from_cache
&& (lnk_data_complete_from_cache || need_ext_data || address_complete_from_cache
|| broadcast_complete_from_cache || !af_inet6_token_valid
|| !af_inet6_addr_gen_mode_valid || !tb[IFLA_STATS64])) {
|| perm_address_complete_from_cache || broadcast_complete_from_cache
|| !af_inet6_token_valid || !af_inet6_addr_gen_mode_valid || !tb[IFLA_STATS64])) {
_lookup_cached_link(cache, obj->link.ifindex, completed_from_cache, &link_cached);
if (link_cached && link_cached->_link.netlink.is_in_netlink) {
if (lnk_data_complete_from_cache && link_cached->link.type == obj->link.type
@ -3160,6 +3169,8 @@ _new_from_nl_link(NMPlatform * platform,
if (address_complete_from_cache)
obj->link.l_address = link_cached->link.l_address;
if (perm_address_complete_from_cache)
obj->link.l_perm_address = link_cached->link.l_perm_address;
if (broadcast_complete_from_cache)
obj->link.l_broadcast = link_cached->link.l_broadcast;
if (!af_inet6_token_valid)

View file

@ -56,6 +56,7 @@ G_STATIC_ASSERT(_nm_alignof(NMPlatformIPAddress) == _nm_alignof(NMPlatformIPXAdd
G_STATIC_ASSERT(sizeof(((NMPLinkAddress *) NULL)->data) == _NM_UTILS_HWADDR_LEN_MAX);
G_STATIC_ASSERT(sizeof(((NMPlatformLink *) NULL)->l_address.data) == _NM_UTILS_HWADDR_LEN_MAX);
G_STATIC_ASSERT(sizeof(((NMPlatformLink *) NULL)->l_perm_address.data) == _NM_UTILS_HWADDR_LEN_MAX);
G_STATIC_ASSERT(sizeof(((NMPlatformLink *) NULL)->l_broadcast.data) == _NM_UTILS_HWADDR_LEN_MAX);
static const char *
@ -5527,6 +5528,7 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
gsize l;
char str_addrmode[30];
char str_address[_NM_UTILS_HWADDR_LEN_MAX * 3];
char str_perm_address[_NM_UTILS_HWADDR_LEN_MAX * 3];
char str_broadcast[_NM_UTILS_HWADDR_LEN_MAX * 3];
char str_inet6_token[NM_UTILS_INET_ADDRSTRLEN];
const char *str_link_type;
@ -5565,6 +5567,7 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
parent[0] = 0;
_nmp_link_address_to_string(&link->l_address, str_address);
_nmp_link_address_to_string(&link->l_perm_address, str_perm_address);
_nmp_link_address_to_string(&link->l_broadcast, str_broadcast);
str_link_type = nm_link_type_to_string(link->type);
@ -5584,6 +5587,7 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
"%s" /* is-in-udev */
"%s%s" /* addr-gen-mode */
"%s%s" /* l_address */
"%s%s" /* l_perm_address */
"%s%s" /* l_broadcast */
"%s%s" /* inet6_token */
"%s%s" /* driver */
@ -5609,6 +5613,8 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
: "",
str_address[0] ? " addr " : "",
str_address[0] ? str_address : "",
str_perm_address[0] ? " permaddr " : "",
str_perm_address[0] ? str_perm_address : "",
str_broadcast[0] ? " brd " : "",
str_broadcast[0] ? str_broadcast : "",
link->inet6_token.id ? " inet6token " : "",
@ -7305,6 +7311,9 @@ nm_platform_link_hash_update(const NMPlatformLink *obj, NMHashState *h)
nm_hash_update_mem(h,
obj->l_address.data,
NM_MIN(obj->l_address.len, sizeof(obj->l_address.data)));
nm_hash_update_mem(h,
obj->l_perm_address.data,
NM_MIN(obj->l_perm_address.len, sizeof(obj->l_perm_address.data)));
nm_hash_update_mem(h,
obj->l_broadcast.data,
NM_MIN(obj->l_broadcast.len, sizeof(obj->l_broadcast.data)));
@ -7325,12 +7334,15 @@ nm_platform_link_cmp(const NMPlatformLink *a, const NMPlatformLink *b)
NM_CMP_FIELD_BOOL(a, b, initialized);
NM_CMP_FIELD(a, b, arptype);
NM_CMP_FIELD(a, b, l_address.len);
NM_CMP_FIELD(a, b, l_perm_address.len);
NM_CMP_FIELD(a, b, l_broadcast.len);
NM_CMP_FIELD(a, b, inet6_addr_gen_mode_inv);
NM_CMP_FIELD_STR_INTERNED(a, b, kind);
NM_CMP_FIELD_STR_INTERNED(a, b, driver);
if (a->l_address.len)
NM_CMP_FIELD_MEMCMP_LEN(a, b, l_address.data, a->l_address.len);
if (a->l_perm_address.len)
NM_CMP_FIELD_MEMCMP_LEN(a, b, l_perm_address.data, a->l_perm_address.len);
if (a->l_broadcast.len)
NM_CMP_FIELD_MEMCMP_LEN(a, b, l_broadcast.data, a->l_broadcast.len);
NM_CMP_FIELD_MEMCMP(a, b, inet6_token);

View file

@ -231,6 +231,9 @@ struct _NMPlatformLink {
/* IFLA_ADDRESS */
NMPLinkAddress l_address;
/* IFLA_PERM_ADDRESS */
NMPLinkAddress l_perm_address;
/* IFLA_BROADCAST */
NMPLinkAddress l_broadcast;