|
@@ -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;
|