|
@@ -3306,6 +3306,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 +3493,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;
|