aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSabrina Dubroca <sd@queasysnail.net>2016-04-22 05:28:05 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-24 14:31:58 -0400
commit96cfc5052c5d434563873caa7707b32b9e389b16 (patch)
treeaabf940f183470c62512bb1852bbacc8ba3e18fe
parentc3b7d0bd7ac2c501d4806db71ddd383c184968e8 (diff)
macsec: add consistency check to netlink dumps
Use genl_dump_check_consistent in dump_secy. Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver") Suggested-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/macsec.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index 1fd2b147fda1..41fbe556ba6d 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -2271,6 +2271,8 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,
2271 if (!hdr) 2271 if (!hdr)
2272 return -EMSGSIZE; 2272 return -EMSGSIZE;
2273 2273
2274 genl_dump_check_consistent(cb, hdr, &macsec_fam);
2275
2274 if (nla_put_u32(skb, MACSEC_ATTR_IFINDEX, dev->ifindex)) 2276 if (nla_put_u32(skb, MACSEC_ATTR_IFINDEX, dev->ifindex))
2275 goto nla_put_failure; 2277 goto nla_put_failure;
2276 2278
@@ -2439,6 +2441,8 @@ nla_put_failure:
2439 return -EMSGSIZE; 2441 return -EMSGSIZE;
2440} 2442}
2441 2443
2444static int macsec_generation = 1; /* protected by RTNL */
2445
2442static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb) 2446static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb)
2443{ 2447{
2444 struct net *net = sock_net(skb->sk); 2448 struct net *net = sock_net(skb->sk);
@@ -2449,6 +2453,9 @@ static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb)
2449 2453
2450 d = 0; 2454 d = 0;
2451 rtnl_lock(); 2455 rtnl_lock();
2456
2457 cb->seq = macsec_generation;
2458
2452 for_each_netdev(net, dev) { 2459 for_each_netdev(net, dev) {
2453 struct macsec_secy *secy; 2460 struct macsec_secy *secy;
2454 2461
@@ -2920,6 +2927,8 @@ static void macsec_dellink(struct net_device *dev, struct list_head *head)
2920 struct net_device *real_dev = macsec->real_dev; 2927 struct net_device *real_dev = macsec->real_dev;
2921 struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev); 2928 struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev);
2922 2929
2930 macsec_generation++;
2931
2923 unregister_netdevice_queue(dev, head); 2932 unregister_netdevice_queue(dev, head);
2924 list_del_rcu(&macsec->secys); 2933 list_del_rcu(&macsec->secys);
2925 if (list_empty(&rxd->secys)) 2934 if (list_empty(&rxd->secys))
@@ -3066,6 +3075,8 @@ static int macsec_newlink(struct net *net, struct net_device *dev,
3066 if (err < 0) 3075 if (err < 0)
3067 goto del_dev; 3076 goto del_dev;
3068 3077
3078 macsec_generation++;
3079
3069 dev_hold(real_dev); 3080 dev_hold(real_dev);
3070 3081
3071 return 0; 3082 return 0;