diff options
Diffstat (limited to 'drivers/net/macsec.c')
| -rw-r--r-- | drivers/net/macsec.c | 33 | 
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 16aa3a478e9e..3d0874331763 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -3870,6 +3870,18 @@ static void macsec_common_dellink(struct net_device *dev, struct list_head *head  	struct macsec_dev *macsec = macsec_priv(dev);  	struct net_device *real_dev = macsec->real_dev; +	/* If h/w offloading is available, propagate to the device */ +	if (macsec_is_offloaded(macsec)) { +		const struct macsec_ops *ops; +		struct macsec_context ctx; + +		ops = macsec_get_ops(netdev_priv(dev), &ctx); +		if (ops) { +			ctx.secy = &macsec->secy; +			macsec_offload(ops->mdo_del_secy, &ctx); +		} +	} +  	unregister_netdevice_queue(dev, head);  	list_del_rcu(&macsec->secys);  	macsec_del_dev(macsec); @@ -3884,18 +3896,6 @@ static void macsec_dellink(struct net_device *dev, struct list_head *head)  	struct net_device *real_dev = macsec->real_dev;  	struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev); -	/* If h/w offloading is available, propagate to the device */ -	if (macsec_is_offloaded(macsec)) { -		const struct macsec_ops *ops; -		struct macsec_context ctx; - -		ops = macsec_get_ops(netdev_priv(dev), &ctx); -		if (ops) { -			ctx.secy = &macsec->secy; -			macsec_offload(ops->mdo_del_secy, &ctx); -		} -	} -  	macsec_common_dellink(dev, head);  	if (list_empty(&rxd->secys)) { @@ -4018,6 +4018,15 @@ static int macsec_newlink(struct net *net, struct net_device *dev,  	    !macsec_check_offload(macsec->offload, macsec))  		return -EOPNOTSUPP; +	/* send_sci must be set to true when transmit sci explicitly is set */ +	if ((data && data[IFLA_MACSEC_SCI]) && +	    (data && data[IFLA_MACSEC_INC_SCI])) { +		u8 send_sci = !!nla_get_u8(data[IFLA_MACSEC_INC_SCI]); + +		if (!send_sci) +			return -EINVAL; +	} +  	if (data && data[IFLA_MACSEC_ICV_LEN])  		icv_len = nla_get_u8(data[IFLA_MACSEC_ICV_LEN]);  	mtu = real_dev->mtu - icv_len - macsec_extra_len(true);  | 
