diff options
author | David S. Miller <davem@davemloft.net> | 2018-10-28 19:26:43 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-10-28 19:26:43 -0700 |
commit | 3bdf6bac58170383465a2fb67cf6e13a27e43b85 (patch) | |
tree | 284e63f2de4b3186add0090063942e2c4333e626 | |
parent | 38b4f18d56372e1e21771ab7b0357b853330186c (diff) | |
parent | 07bddef9839378bd6f95b393cf24c420529b4ef1 (diff) |
Merge branch 'macsec-fixes'
Sabrina Dubroca says:
====================
macsec: linkstate fixes
This series fixes issues with handling administrative and operstate of
macsec devices.
Radu Rendec proposed another version of the first patch [0] but I'd
rather not follow the behavior of vlan devices, going with macvlan
does instead. Patrick Talbert also reported the same issue to me.
The second patch is a follow-up. The restriction on setting the device
up is a bit unreasonable, and operstate provides the information we
need in this case.
[0] https://patchwork.ozlabs.org/patch/971374/
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/macsec.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 4bb90b6867a2..64a982563d59 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -2812,9 +2812,6 @@ static int macsec_dev_open(struct net_device *dev) struct net_device *real_dev = macsec->real_dev; int err; - if (!(real_dev->flags & IFF_UP)) - return -ENETDOWN; - err = dev_uc_add(real_dev, dev->dev_addr); if (err < 0) return err; @@ -3306,6 +3303,9 @@ static int macsec_newlink(struct net *net, struct net_device *dev, if (err < 0) goto del_dev; + netif_stacked_transfer_operstate(real_dev, dev); + linkwatch_fire_event(dev); + macsec_generation++; return 0; @@ -3490,6 +3490,20 @@ static int macsec_notify(struct notifier_block *this, unsigned long event, return NOTIFY_DONE; switch (event) { + case NETDEV_DOWN: + case NETDEV_UP: + case NETDEV_CHANGE: { + struct macsec_dev *m, *n; + struct macsec_rxh_data *rxd; + + rxd = macsec_data_rtnl(real_dev); + list_for_each_entry_safe(m, n, &rxd->secys, secys) { + struct net_device *dev = m->secy.netdev; + + netif_stacked_transfer_operstate(real_dev, dev); + } + break; + } case NETDEV_UNREGISTER: { struct macsec_dev *m, *n; struct macsec_rxh_data *rxd; |