Commit 1570415f authored by Petr Machata's avatar Petr Machata Committed by David S. Miller

net: dev: Add NETDEV_PRE_CHANGEADDR

The NETDEV_CHANGEADDR notification is emitted after a device address
changes. Extending this message to allow vetoing is certainly possible,
but several other notification types have instead adopted a simple
two-stage approach: first a "pre" notification is sent to make sure all
interested parties are OK with a change that's about to be done. Then
the change is done, and afterwards a "post" notification is sent.

This dual approach is easier to use: when the change is vetoed, nothing
has changed yet, and it's therefore unnecessary to roll anything back.
Therefore adopt it for NETDEV_CHANGEADDR as well.

To that end, add NETDEV_PRE_CHANGEADDR and an info structure to go along
with it.
Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3a37a963
...@@ -2450,7 +2450,8 @@ enum netdev_cmd { ...@@ -2450,7 +2450,8 @@ enum netdev_cmd {
NETDEV_REGISTER, NETDEV_REGISTER,
NETDEV_UNREGISTER, NETDEV_UNREGISTER,
NETDEV_CHANGEMTU, /* notify after mtu change happened */ NETDEV_CHANGEMTU, /* notify after mtu change happened */
NETDEV_CHANGEADDR, NETDEV_CHANGEADDR, /* notify after the address change */
NETDEV_PRE_CHANGEADDR, /* notify before the address change */
NETDEV_GOING_DOWN, NETDEV_GOING_DOWN,
NETDEV_CHANGENAME, NETDEV_CHANGENAME,
NETDEV_FEAT_CHANGE, NETDEV_FEAT_CHANGE,
...@@ -2512,6 +2513,11 @@ struct netdev_notifier_changelowerstate_info { ...@@ -2512,6 +2513,11 @@ struct netdev_notifier_changelowerstate_info {
void *lower_state_info; /* is lower dev state */ void *lower_state_info; /* is lower dev state */
}; };
struct netdev_notifier_pre_changeaddr_info {
struct netdev_notifier_info info; /* must be first */
const unsigned char *dev_addr;
};
static inline void netdev_notifier_info_init(struct netdev_notifier_info *info, static inline void netdev_notifier_info_init(struct netdev_notifier_info *info,
struct net_device *dev) struct net_device *dev)
{ {
......
...@@ -1589,6 +1589,7 @@ const char *netdev_cmd_to_name(enum netdev_cmd cmd) ...@@ -1589,6 +1589,7 @@ const char *netdev_cmd_to_name(enum netdev_cmd cmd)
N(UDP_TUNNEL_DROP_INFO) N(CHANGE_TX_QUEUE_LEN) N(UDP_TUNNEL_DROP_INFO) N(CHANGE_TX_QUEUE_LEN)
N(CVLAN_FILTER_PUSH_INFO) N(CVLAN_FILTER_DROP_INFO) N(CVLAN_FILTER_PUSH_INFO) N(CVLAN_FILTER_DROP_INFO)
N(SVLAN_FILTER_PUSH_INFO) N(SVLAN_FILTER_DROP_INFO) N(SVLAN_FILTER_PUSH_INFO) N(SVLAN_FILTER_DROP_INFO)
N(PRE_CHANGEADDR)
} }
#undef N #undef N
return "UNKNOWN_NETDEV_EVENT"; return "UNKNOWN_NETDEV_EVENT";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment