mac802154: add ifname change notifier
This patch adds a netdev notifier for interface renaming. We have a name attribute inside of subif data struct. This is needed to have always the actual netdev name in sdata name attribute. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Родитель
912f67aec7
Коммит
be4fd8e5d9
|
@ -169,6 +169,9 @@ void mac802154_get_table(struct net_device *dev,
|
|||
struct ieee802154_llsec_table **t);
|
||||
void mac802154_unlock_table(struct net_device *dev);
|
||||
|
||||
/* interface handling */
|
||||
int ieee802154_iface_init(void);
|
||||
void ieee802154_iface_exit(void);
|
||||
struct net_device *
|
||||
mac802154_add_iface(struct wpan_phy *phy, const char *name, int type);
|
||||
void ieee802154_if_remove(struct ieee802154_sub_if_data *sdata);
|
||||
|
|
|
@ -548,3 +548,38 @@ void ieee802154_remove_interfaces(struct ieee802154_local *local)
|
|||
}
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
}
|
||||
|
||||
static int netdev_notify(struct notifier_block *nb,
|
||||
unsigned long state, void *ptr)
|
||||
{
|
||||
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
||||
struct ieee802154_sub_if_data *sdata;
|
||||
|
||||
if (state != NETDEV_CHANGENAME)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (!dev->ieee802154_ptr || !dev->ieee802154_ptr->wpan_phy)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (dev->ieee802154_ptr->wpan_phy->privid != mac802154_wpan_phy_privid)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
sdata = IEEE802154_DEV_TO_SUB_IF(dev);
|
||||
memcpy(sdata->name, dev->name, IFNAMSIZ);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block mac802154_netdev_notifier = {
|
||||
.notifier_call = netdev_notify,
|
||||
};
|
||||
|
||||
int ieee802154_iface_init(void)
|
||||
{
|
||||
return register_netdevice_notifier(&mac802154_netdev_notifier);
|
||||
}
|
||||
|
||||
void ieee802154_iface_exit(void)
|
||||
{
|
||||
unregister_netdevice_notifier(&mac802154_netdev_notifier);
|
||||
}
|
||||
|
|
|
@ -182,5 +182,20 @@ void ieee802154_unregister_hw(struct ieee802154_hw *hw)
|
|||
}
|
||||
EXPORT_SYMBOL(ieee802154_unregister_hw);
|
||||
|
||||
static int __init ieee802154_init(void)
|
||||
{
|
||||
return ieee802154_iface_init();
|
||||
}
|
||||
|
||||
static void __exit ieee802154_exit(void)
|
||||
{
|
||||
ieee802154_iface_exit();
|
||||
|
||||
rcu_barrier();
|
||||
}
|
||||
|
||||
subsys_initcall(ieee802154_init);
|
||||
module_exit(ieee802154_exit);
|
||||
|
||||
MODULE_DESCRIPTION("IEEE 802.15.4 subsystem");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
Загрузка…
Ссылка в новой задаче