mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-01 16:08:02 +02:00
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:
parent
db13b93563
commit
585257509f
3 changed files with 34 additions and 8 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -231,6 +231,9 @@ struct _NMPlatformLink {
|
|||
/* IFLA_ADDRESS */
|
||||
NMPLinkAddress l_address;
|
||||
|
||||
/* IFLA_PERM_ADDRESS */
|
||||
NMPLinkAddress l_perm_address;
|
||||
|
||||
/* IFLA_BROADCAST */
|
||||
NMPLinkAddress l_broadcast;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue