platform: use new platform API to get genl family id for wireguard
This commit is contained in:
@@ -2493,7 +2493,7 @@ _wireguard_get_device_cb(struct nl_msg *msg, void *arg)
|
||||
static const NMPObject *
|
||||
_wireguard_read_info(NMPlatform *platform /* used only as logging context */,
|
||||
struct nl_sock *genl,
|
||||
int wireguard_family_id,
|
||||
guint16 wireguard_family_id,
|
||||
int ifindex)
|
||||
{
|
||||
nm_auto_nlmsg struct nl_msg *msg = NULL;
|
||||
@@ -2507,10 +2507,12 @@ _wireguard_read_info(NMPlatform *platform /* used only as logging context */
|
||||
guint i;
|
||||
|
||||
nm_assert(genl);
|
||||
nm_assert(wireguard_family_id >= 0);
|
||||
nm_assert(ifindex > 0);
|
||||
|
||||
_LOGT("wireguard: fetching information for ifindex %d (genl-id %d)...",
|
||||
if (wireguard_family_id == 0)
|
||||
return NULL;
|
||||
|
||||
_LOGT("wireguard: fetching information for ifindex %d (genl-id %u)...",
|
||||
ifindex,
|
||||
wireguard_family_id);
|
||||
|
||||
@@ -2623,25 +2625,8 @@ nla_put_failure:
|
||||
g_return_val_if_reached(NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
_wireguard_get_family_id(NMPlatform *platform, int ifindex_try)
|
||||
{
|
||||
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE(platform);
|
||||
int wireguard_family_id = -1;
|
||||
|
||||
if (ifindex_try > 0) {
|
||||
const NMPlatformLink *plink;
|
||||
|
||||
if (nm_platform_link_get_lnk_wireguard(platform, ifindex_try, &plink))
|
||||
wireguard_family_id = NMP_OBJECT_UP_CAST(plink)->_link.wireguard_family_id;
|
||||
}
|
||||
if (wireguard_family_id < 0)
|
||||
wireguard_family_id = genl_ctrl_resolve(priv->sk_genl_sync, "wireguard");
|
||||
return wireguard_family_id;
|
||||
}
|
||||
|
||||
static const NMPObject *
|
||||
_wireguard_refresh_link(NMPlatform *platform, int wireguard_family_id, int ifindex)
|
||||
_wireguard_refresh_link(NMPlatform *platform, guint16 wireguard_family_id, int ifindex)
|
||||
{
|
||||
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE(platform);
|
||||
nm_auto_nmpobj const NMPObject *obj_old = NULL;
|
||||
@@ -2651,7 +2636,7 @@ _wireguard_refresh_link(NMPlatform *platform, int wireguard_family_id, int ifind
|
||||
const NMPObject *plink = NULL;
|
||||
nm_auto_nmpobj NMPObject *obj = NULL;
|
||||
|
||||
nm_assert(wireguard_family_id >= 0);
|
||||
nm_assert(wireguard_family_id > 0);
|
||||
nm_assert(ifindex > 0);
|
||||
|
||||
nm_platform_process_events(platform);
|
||||
@@ -2676,15 +2661,13 @@ _wireguard_refresh_link(NMPlatform *platform, int wireguard_family_id, int ifind
|
||||
}
|
||||
}
|
||||
|
||||
if (plink->_link.wireguard_family_id == wireguard_family_id
|
||||
&& plink->_link.netlink.lnk == lnk_new)
|
||||
if (plink->_link.netlink.lnk == lnk_new)
|
||||
return plink;
|
||||
|
||||
/* we use nmp_cache_update_netlink() to re-inject the new object into the cache.
|
||||
* For that, we need to clone it, and tweak it so that it's suitable. It's a bit
|
||||
* of a hack, in particular that we need to clear driver and udev-device. */
|
||||
obj = nmp_object_clone(plink, FALSE);
|
||||
obj->_link.wireguard_family_id = wireguard_family_id;
|
||||
obj = nmp_object_clone(plink, FALSE);
|
||||
nmp_object_unref(obj->_link.netlink.lnk);
|
||||
obj->_link.netlink.lnk = g_steal_pointer(&lnk_new);
|
||||
obj->link.driver = NULL;
|
||||
@@ -2710,7 +2693,7 @@ _wireguard_refresh_link(NMPlatform *platform, int wireguard_family_id, int ifind
|
||||
static int
|
||||
_wireguard_create_change_nlmsgs(NMPlatform *platform,
|
||||
int ifindex,
|
||||
int wireguard_family_id,
|
||||
guint16 wireguard_family_id,
|
||||
const NMPlatformLnkWireGuard *lnk_wireguard,
|
||||
const NMPWireGuardPeer *peers,
|
||||
const NMPlatformWireGuardChangePeerFlags *peer_flags,
|
||||
@@ -2952,12 +2935,12 @@ link_wireguard_change(NMPlatform *platform,
|
||||
{
|
||||
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE(platform);
|
||||
gs_unref_ptrarray GPtrArray *msgs = NULL;
|
||||
int wireguard_family_id;
|
||||
guint16 wireguard_family_id;
|
||||
guint i;
|
||||
int r;
|
||||
|
||||
wireguard_family_id = _wireguard_get_family_id(platform, ifindex);
|
||||
if (wireguard_family_id < 0)
|
||||
wireguard_family_id = nm_platform_genl_get_family_id(platform, NMP_GENL_FAMILY_TYPE_WIREGUARD);
|
||||
if (wireguard_family_id == 0)
|
||||
return -NME_PL_NO_FIRMWARE;
|
||||
|
||||
r = _wireguard_create_change_nlmsgs(platform,
|
||||
@@ -3337,22 +3320,11 @@ _new_from_nl_link(NMPlatform *platform,
|
||||
* notifications, so we don't actually update the cache. For
|
||||
* now, always refetch link data here. */
|
||||
|
||||
_lookup_cached_link(cache, obj->link.ifindex, completed_from_cache, &link_cached);
|
||||
if (link_cached && link_cached->_link.netlink.is_in_netlink
|
||||
&& link_cached->link.type == NM_LINK_TYPE_WIREGUARD)
|
||||
obj->_link.wireguard_family_id = link_cached->_link.wireguard_family_id;
|
||||
else
|
||||
obj->_link.wireguard_family_id = -1;
|
||||
|
||||
if (obj->_link.wireguard_family_id < 0)
|
||||
obj->_link.wireguard_family_id = genl_ctrl_resolve(genl, "wireguard");
|
||||
|
||||
if (obj->_link.wireguard_family_id >= 0) {
|
||||
lnk_data_new = _wireguard_read_info(platform,
|
||||
genl,
|
||||
obj->_link.wireguard_family_id,
|
||||
obj->link.ifindex);
|
||||
}
|
||||
lnk_data_new = _wireguard_read_info(
|
||||
platform,
|
||||
genl,
|
||||
nm_platform_genl_get_family_id(platform, NMP_GENL_FAMILY_TYPE_WIREGUARD),
|
||||
obj->link.ifindex);
|
||||
|
||||
if (lnk_data_new && obj->_link.netlink.lnk
|
||||
&& nmp_object_equal(obj->_link.netlink.lnk, lnk_data_new))
|
||||
|
@@ -1149,10 +1149,7 @@ _vt_cmd_obj_hash_update_link(const NMPObject *obj, NMHashState *h)
|
||||
nm_assert(NMP_OBJECT_GET_TYPE(obj) == NMP_OBJECT_TYPE_LINK);
|
||||
|
||||
nm_platform_link_hash_update(&obj->link, h);
|
||||
nm_hash_update_vals(h,
|
||||
obj->_link.netlink.is_in_netlink,
|
||||
obj->_link.wireguard_family_id,
|
||||
obj->_link.udev.device);
|
||||
nm_hash_update_vals(h, obj->_link.netlink.is_in_netlink, obj->_link.udev.device);
|
||||
if (obj->_link.netlink.lnk)
|
||||
nmp_object_hash_update(obj->_link.netlink.lnk, h);
|
||||
}
|
||||
@@ -1232,7 +1229,6 @@ _vt_cmd_obj_cmp_link(const NMPObject *obj1, const NMPObject *obj2)
|
||||
NM_CMP_RETURN(nm_platform_link_cmp(&obj1->link, &obj2->link));
|
||||
NM_CMP_DIRECT(obj1->_link.netlink.is_in_netlink, obj2->_link.netlink.is_in_netlink);
|
||||
NM_CMP_RETURN(nmp_object_cmp(obj1->_link.netlink.lnk, obj2->_link.netlink.lnk));
|
||||
NM_CMP_DIRECT(obj1->_link.wireguard_family_id, obj2->_link.wireguard_family_id);
|
||||
|
||||
if (obj1->_link.udev.device != obj2->_link.udev.device) {
|
||||
if (!obj1->_link.udev.device)
|
||||
|
@@ -238,11 +238,6 @@ typedef struct {
|
||||
|
||||
/* Auxiliary data object for Wi-Fi and WPAN */
|
||||
GObject *ext_data;
|
||||
|
||||
/* FIXME: not every NMPObjectLink should pay the price for tracking
|
||||
* the wireguard family id. This should be tracked via ext_data, which
|
||||
* would be exactly the right place. */
|
||||
int wireguard_family_id;
|
||||
} NMPObjectLink;
|
||||
|
||||
typedef struct {
|
||||
|
Reference in New Issue
Block a user