diff options
Diffstat (limited to 'drivers/net/macsec.c')
| -rw-r--r-- | drivers/net/macsec.c | 193 | 
1 files changed, 134 insertions, 59 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 84d3e5ca8817..47ee2c840b55 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -85,7 +85,7 @@ struct gcm_iv {   * @tfm: crypto struct, key storage   */  struct macsec_key { -	u64 id; +	u8 id[MACSEC_KEYID_LEN];  	struct crypto_aead *tfm;  }; @@ -880,12 +880,12 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,  	macsec_skb_cb(skb)->valid = false;  	skb = skb_share_check(skb, GFP_ATOMIC);  	if (!skb) -		return NULL; +		return ERR_PTR(-ENOMEM);  	req = aead_request_alloc(rx_sa->key.tfm, GFP_ATOMIC);  	if (!req) {  		kfree_skb(skb); -		return NULL; +		return ERR_PTR(-ENOMEM);  	}  	hdr = (struct macsec_eth_header *)skb->data; @@ -905,7 +905,7 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,  		skb = skb_unshare(skb, GFP_ATOMIC);  		if (!skb) {  			aead_request_free(req); -			return NULL; +			return ERR_PTR(-ENOMEM);  		}  	} else {  		/* integrity only: all headers + data authenticated */ @@ -921,14 +921,14 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,  	dev_hold(dev);  	ret = crypto_aead_decrypt(req);  	if (ret == -EINPROGRESS) { -		return NULL; +		return ERR_PTR(ret);  	} else if (ret != 0) {  		/* decryption/authentication failed  		 * 10.6 if validateFrames is disabled, deliver anyway  		 */  		if (ret != -EBADMSG) {  			kfree_skb(skb); -			skb = NULL; +			skb = ERR_PTR(ret);  		}  	} else {  		macsec_skb_cb(skb)->valid = true; @@ -1146,8 +1146,10 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)  	    secy->validate_frames != MACSEC_VALIDATE_DISABLED)  		skb = macsec_decrypt(skb, dev, rx_sa, sci, secy); -	if (!skb) { -		macsec_rxsa_put(rx_sa); +	if (IS_ERR(skb)) { +		/* the decrypt callback needs the reference */ +		if (PTR_ERR(skb) != -EINPROGRESS) +			macsec_rxsa_put(rx_sa);  		rcu_read_unlock();  		*pskb = NULL;  		return RX_HANDLER_CONSUMED; @@ -1161,7 +1163,8 @@ deliver:  			    macsec_extra_len(macsec_skb_cb(skb)->has_sci));  	macsec_reset_skb(skb, secy->netdev); -	macsec_rxsa_put(rx_sa); +	if (rx_sa) +		macsec_rxsa_put(rx_sa);  	count_rx(dev, skb->len);  	rcu_read_unlock(); @@ -1405,9 +1408,10 @@ static sci_t nla_get_sci(const struct nlattr *nla)  	return (__force sci_t)nla_get_u64(nla);  } -static int nla_put_sci(struct sk_buff *skb, int attrtype, sci_t value) +static int nla_put_sci(struct sk_buff *skb, int attrtype, sci_t value, +		       int padattr)  { -	return nla_put_u64(skb, attrtype, (__force u64)value); +	return nla_put_u64_64bit(skb, attrtype, (__force u64)value, padattr);  }  static struct macsec_tx_sa *get_txsa_from_nl(struct net *net, @@ -1526,7 +1530,8 @@ static const struct nla_policy macsec_genl_sa_policy[NUM_MACSEC_SA_ATTR] = {  	[MACSEC_SA_ATTR_AN] = { .type = NLA_U8 },  	[MACSEC_SA_ATTR_ACTIVE] = { .type = NLA_U8 },  	[MACSEC_SA_ATTR_PN] = { .type = NLA_U32 }, -	[MACSEC_SA_ATTR_KEYID] = { .type = NLA_U64 }, +	[MACSEC_SA_ATTR_KEYID] = { .type = NLA_BINARY, +				   .len = MACSEC_KEYID_LEN, },  	[MACSEC_SA_ATTR_KEY] = { .type = NLA_BINARY,  				 .len = MACSEC_MAX_KEY_LEN, },  }; @@ -1573,6 +1578,9 @@ static bool validate_add_rxsa(struct nlattr **attrs)  			return false;  	} +	if (nla_len(attrs[MACSEC_SA_ATTR_KEYID]) != MACSEC_KEYID_LEN) +		return false; +  	return true;  } @@ -1622,8 +1630,9 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)  	}  	rx_sa = kmalloc(sizeof(*rx_sa), GFP_KERNEL); -	if (init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]), secy->key_len, -		       secy->icv_len)) { +	if (!rx_sa || init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]), +				 secy->key_len, secy->icv_len)) { +		kfree(rx_sa);  		rtnl_unlock();  		return -ENOMEM;  	} @@ -1637,7 +1646,7 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)  	if (tb_sa[MACSEC_SA_ATTR_ACTIVE])  		rx_sa->active = !!nla_get_u8(tb_sa[MACSEC_SA_ATTR_ACTIVE]); -	rx_sa->key.id = nla_get_u64(tb_sa[MACSEC_SA_ATTR_KEYID]); +	nla_memcpy(rx_sa->key.id, tb_sa[MACSEC_SA_ATTR_KEYID], MACSEC_KEYID_LEN);  	rx_sa->sc = rx_sc;  	rcu_assign_pointer(rx_sc->sa[assoc_num], rx_sa); @@ -1718,6 +1727,9 @@ static bool validate_add_txsa(struct nlattr **attrs)  			return false;  	} +	if (nla_len(attrs[MACSEC_SA_ATTR_KEYID]) != MACSEC_KEYID_LEN) +		return false; +  	return true;  } @@ -1768,11 +1780,12 @@ static int macsec_add_txsa(struct sk_buff *skb, struct genl_info *info)  	tx_sa = kmalloc(sizeof(*tx_sa), GFP_KERNEL);  	if (!tx_sa || init_tx_sa(tx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]),  				 secy->key_len, secy->icv_len)) { +		kfree(tx_sa);  		rtnl_unlock();  		return -ENOMEM;  	} -	tx_sa->key.id = nla_get_u64(tb_sa[MACSEC_SA_ATTR_KEYID]); +	nla_memcpy(tx_sa->key.id, tb_sa[MACSEC_SA_ATTR_KEYID], MACSEC_KEYID_LEN);  	spin_lock_bh(&tx_sa->lock);  	tx_sa->next_pn = nla_get_u32(tb_sa[MACSEC_SA_ATTR_PN]); @@ -2131,16 +2144,36 @@ static int copy_rx_sc_stats(struct sk_buff *skb,  		sum.InPktsUnusedSA    += tmp.InPktsUnusedSA;  	} -	if (nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_OCTETS_VALIDATED, sum.InOctetsValidated) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_OCTETS_DECRYPTED, sum.InOctetsDecrypted) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNCHECKED, sum.InPktsUnchecked) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_DELAYED, sum.InPktsDelayed) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_OK, sum.InPktsOK) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_INVALID, sum.InPktsInvalid) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_LATE, sum.InPktsLate) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_VALID, sum.InPktsNotValid) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_USING_SA, sum.InPktsNotUsingSA) || -	    nla_put_u64(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNUSED_SA, sum.InPktsUnusedSA)) +	if (nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_OCTETS_VALIDATED, +			      sum.InOctetsValidated, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_OCTETS_DECRYPTED, +			      sum.InOctetsDecrypted, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNCHECKED, +			      sum.InPktsUnchecked, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_DELAYED, +			      sum.InPktsDelayed, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_OK, +			      sum.InPktsOK, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_INVALID, +			      sum.InPktsInvalid, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_LATE, +			      sum.InPktsLate, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_VALID, +			      sum.InPktsNotValid, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_USING_SA, +			      sum.InPktsNotUsingSA, +			      MACSEC_RXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNUSED_SA, +			      sum.InPktsUnusedSA, +			      MACSEC_RXSC_STATS_ATTR_PAD))  		return -EMSGSIZE;  	return 0; @@ -2169,10 +2202,18 @@ static int copy_tx_sc_stats(struct sk_buff *skb,  		sum.OutOctetsEncrypted += tmp.OutOctetsEncrypted;  	} -	if (nla_put_u64(skb, MACSEC_TXSC_STATS_ATTR_OUT_PKTS_PROTECTED, sum.OutPktsProtected) || -	    nla_put_u64(skb, MACSEC_TXSC_STATS_ATTR_OUT_PKTS_ENCRYPTED, sum.OutPktsEncrypted) || -	    nla_put_u64(skb, MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_PROTECTED, sum.OutOctetsProtected) || -	    nla_put_u64(skb, MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_ENCRYPTED, sum.OutOctetsEncrypted)) +	if (nla_put_u64_64bit(skb, MACSEC_TXSC_STATS_ATTR_OUT_PKTS_PROTECTED, +			      sum.OutPktsProtected, +			      MACSEC_TXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_TXSC_STATS_ATTR_OUT_PKTS_ENCRYPTED, +			      sum.OutPktsEncrypted, +			      MACSEC_TXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_PROTECTED, +			      sum.OutOctetsProtected, +			      MACSEC_TXSC_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_ENCRYPTED, +			      sum.OutOctetsEncrypted, +			      MACSEC_TXSC_STATS_ATTR_PAD))  		return -EMSGSIZE;  	return 0; @@ -2205,14 +2246,30 @@ static int copy_secy_stats(struct sk_buff *skb,  		sum.InPktsOverrun    += tmp.InPktsOverrun;  	} -	if (nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_OUT_PKTS_UNTAGGED, sum.OutPktsUntagged) || -	    nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_UNTAGGED, sum.InPktsUntagged) || -	    nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_OUT_PKTS_TOO_LONG, sum.OutPktsTooLong) || -	    nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_TAG, sum.InPktsNoTag) || -	    nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_BAD_TAG, sum.InPktsBadTag) || -	    nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_UNKNOWN_SCI, sum.InPktsUnknownSCI) || -	    nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_SCI, sum.InPktsNoSCI) || -	    nla_put_u64(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_OVERRUN, sum.InPktsOverrun)) +	if (nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_OUT_PKTS_UNTAGGED, +			      sum.OutPktsUntagged, +			      MACSEC_SECY_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_UNTAGGED, +			      sum.InPktsUntagged, +			      MACSEC_SECY_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_OUT_PKTS_TOO_LONG, +			      sum.OutPktsTooLong, +			      MACSEC_SECY_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_TAG, +			      sum.InPktsNoTag, +			      MACSEC_SECY_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_BAD_TAG, +			      sum.InPktsBadTag, +			      MACSEC_SECY_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_UNKNOWN_SCI, +			      sum.InPktsUnknownSCI, +			      MACSEC_SECY_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_SCI, +			      sum.InPktsNoSCI, +			      MACSEC_SECY_STATS_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_STATS_ATTR_IN_PKTS_OVERRUN, +			      sum.InPktsOverrun, +			      MACSEC_SECY_STATS_ATTR_PAD))  		return -EMSGSIZE;  	return 0; @@ -2226,8 +2283,11 @@ static int nla_put_secy(struct macsec_secy *secy, struct sk_buff *skb)  	if (!secy_nest)  		return 1; -	if (nla_put_sci(skb, MACSEC_SECY_ATTR_SCI, secy->sci) || -	    nla_put_u64(skb, MACSEC_SECY_ATTR_CIPHER_SUITE, DEFAULT_CIPHER_ID) || +	if (nla_put_sci(skb, MACSEC_SECY_ATTR_SCI, secy->sci, +			MACSEC_SECY_ATTR_PAD) || +	    nla_put_u64_64bit(skb, MACSEC_SECY_ATTR_CIPHER_SUITE, +			      MACSEC_DEFAULT_CIPHER_ID, +			      MACSEC_SECY_ATTR_PAD) ||  	    nla_put_u8(skb, MACSEC_SECY_ATTR_ICV_LEN, secy->icv_len) ||  	    nla_put_u8(skb, MACSEC_SECY_ATTR_OPER, secy->operational) ||  	    nla_put_u8(skb, MACSEC_SECY_ATTR_PROTECT, secy->protect_frames) || @@ -2268,7 +2328,7 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,  	if (!hdr)  		return -EMSGSIZE; -	rtnl_lock(); +	genl_dump_check_consistent(cb, hdr, &macsec_fam);  	if (nla_put_u32(skb, MACSEC_ATTR_IFINDEX, dev->ifindex))  		goto nla_put_failure; @@ -2312,7 +2372,7 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,  		if (nla_put_u8(skb, MACSEC_SA_ATTR_AN, i) ||  		    nla_put_u32(skb, MACSEC_SA_ATTR_PN, tx_sa->next_pn) || -		    nla_put_u64(skb, MACSEC_SA_ATTR_KEYID, tx_sa->key.id) || +		    nla_put(skb, MACSEC_SA_ATTR_KEYID, MACSEC_KEYID_LEN, tx_sa->key.id) ||  		    nla_put_u8(skb, MACSEC_SA_ATTR_ACTIVE, tx_sa->active)) {  			nla_nest_cancel(skb, txsa_nest);  			nla_nest_cancel(skb, txsa_list); @@ -2353,7 +2413,8 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,  		}  		if (nla_put_u8(skb, MACSEC_RXSC_ATTR_ACTIVE, rx_sc->active) || -		    nla_put_sci(skb, MACSEC_RXSC_ATTR_SCI, rx_sc->sci)) { +		    nla_put_sci(skb, MACSEC_RXSC_ATTR_SCI, rx_sc->sci, +				MACSEC_RXSC_ATTR_PAD)) {  			nla_nest_cancel(skb, rxsc_nest);  			nla_nest_cancel(skb, rxsc_list);  			goto nla_put_failure; @@ -2413,7 +2474,7 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,  			if (nla_put_u8(skb, MACSEC_SA_ATTR_AN, i) ||  			    nla_put_u32(skb, MACSEC_SA_ATTR_PN, rx_sa->next_pn) || -			    nla_put_u64(skb, MACSEC_SA_ATTR_KEYID, rx_sa->key.id) || +			    nla_put(skb, MACSEC_SA_ATTR_KEYID, MACSEC_KEYID_LEN, rx_sa->key.id) ||  			    nla_put_u8(skb, MACSEC_SA_ATTR_ACTIVE, rx_sa->active)) {  				nla_nest_cancel(skb, rxsa_nest);  				nla_nest_cancel(skb, rxsc_nest); @@ -2429,18 +2490,17 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,  	nla_nest_end(skb, rxsc_list); -	rtnl_unlock(); -  	genlmsg_end(skb, hdr);  	return 0;  nla_put_failure: -	rtnl_unlock();  	genlmsg_cancel(skb, hdr);  	return -EMSGSIZE;  } +static int macsec_generation = 1; /* protected by RTNL */ +  static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb)  {  	struct net *net = sock_net(skb->sk); @@ -2450,6 +2510,10 @@ static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb)  	dev_idx = cb->args[0];  	d = 0; +	rtnl_lock(); + +	cb->seq = macsec_generation; +  	for_each_netdev(net, dev) {  		struct macsec_secy *secy; @@ -2467,6 +2531,7 @@ next:  	}  done: +	rtnl_unlock();  	cb->args[0] = d;  	return skb->len;  } @@ -2826,7 +2891,7 @@ static void macsec_free_netdev(struct net_device *dev)  static void macsec_setup(struct net_device *dev)  {  	ether_setup(dev); -	dev->tx_queue_len = 0; +	dev->priv_flags |= IFF_NO_QUEUE;  	dev->netdev_ops = &macsec_netdev_ops;  	dev->destructor = macsec_free_netdev; @@ -2920,10 +2985,14 @@ 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); +	macsec_generation++; +  	unregister_netdevice_queue(dev, head);  	list_del_rcu(&macsec->secys); -	if (list_empty(&rxd->secys)) +	if (list_empty(&rxd->secys)) {  		netdev_rx_handler_unregister(real_dev); +		kfree(rxd); +	}  	macsec_del_dev(macsec);  } @@ -2945,8 +3014,10 @@ static int register_macsec_dev(struct net_device *real_dev,  		err = netdev_rx_handler_register(real_dev, macsec_handle_frame,  						 rxd); -		if (err < 0) +		if (err < 0) { +			kfree(rxd);  			return err; +		}  	}  	list_add_tail_rcu(&macsec->secys, &rxd->secys); @@ -3066,6 +3137,8 @@ static int macsec_newlink(struct net *net, struct net_device *dev,  	if (err < 0)  		goto del_dev; +	macsec_generation++; +  	dev_hold(real_dev);  	return 0; @@ -3079,7 +3152,7 @@ unregister:  static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[])  { -	u64 csid = DEFAULT_CIPHER_ID; +	u64 csid = MACSEC_DEFAULT_CIPHER_ID;  	u8 icv_len = DEFAULT_ICV_LEN;  	int flag;  	bool es, scb, sci; @@ -3094,8 +3167,8 @@ static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[])  		icv_len = nla_get_u8(data[IFLA_MACSEC_ICV_LEN]);  	switch (csid) { -	case DEFAULT_CIPHER_ID: -	case DEFAULT_CIPHER_ALT: +	case MACSEC_DEFAULT_CIPHER_ID: +	case MACSEC_DEFAULT_CIPHER_ALT:  		if (icv_len < MACSEC_MIN_ICV_LEN ||  		    icv_len > MACSEC_MAX_ICV_LEN)  			return -EINVAL; @@ -3129,8 +3202,8 @@ static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[])  	    nla_get_u8(data[IFLA_MACSEC_VALIDATION]) > MACSEC_VALIDATE_MAX)  		return -EINVAL; -	if ((data[IFLA_MACSEC_PROTECT] && -	     nla_get_u8(data[IFLA_MACSEC_PROTECT])) && +	if ((data[IFLA_MACSEC_REPLAY_PROTECT] && +	     nla_get_u8(data[IFLA_MACSEC_REPLAY_PROTECT])) &&  	    !data[IFLA_MACSEC_WINDOW])  		return -EINVAL; @@ -3145,9 +3218,9 @@ static struct net *macsec_get_link_net(const struct net_device *dev)  static size_t macsec_get_size(const struct net_device *dev)  {  	return 0 + -		nla_total_size(8) + /* SCI */ +		nla_total_size_64bit(8) + /* SCI */  		nla_total_size(1) + /* ICV_LEN */ -		nla_total_size(8) + /* CIPHER_SUITE */ +		nla_total_size_64bit(8) + /* CIPHER_SUITE */  		nla_total_size(4) + /* WINDOW */  		nla_total_size(1) + /* ENCODING_SA */  		nla_total_size(1) + /* ENCRYPT */ @@ -3166,9 +3239,11 @@ static int macsec_fill_info(struct sk_buff *skb,  	struct macsec_secy *secy = &macsec_priv(dev)->secy;  	struct macsec_tx_sc *tx_sc = &secy->tx_sc; -	if (nla_put_sci(skb, IFLA_MACSEC_SCI, secy->sci) || +	if (nla_put_sci(skb, IFLA_MACSEC_SCI, secy->sci, +			IFLA_MACSEC_PAD) ||  	    nla_put_u8(skb, IFLA_MACSEC_ICV_LEN, secy->icv_len) || -	    nla_put_u64(skb, IFLA_MACSEC_CIPHER_SUITE, DEFAULT_CIPHER_ID) || +	    nla_put_u64_64bit(skb, IFLA_MACSEC_CIPHER_SUITE, +			      MACSEC_DEFAULT_CIPHER_ID, IFLA_MACSEC_PAD) ||  	    nla_put_u8(skb, IFLA_MACSEC_ENCODING_SA, tx_sc->encoding_sa) ||  	    nla_put_u8(skb, IFLA_MACSEC_ENCRYPT, tx_sc->encrypt) ||  	    nla_put_u8(skb, IFLA_MACSEC_PROTECT, secy->protect_frames) ||  | 
