aboutsummaryrefslogtreecommitdiffstats
path: root/net/hsr
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-11-19 09:19:39 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-19 16:39:06 -0500
commit2a94fe48f32ccf7321450a2cc07f2b724a444e5b (patch)
treee5a066d8f83d8822d448421019a4503f361295f9 /net/hsr
parent68eb55031da7c967d954e5f9415cd05f4abdb692 (diff)
genetlink: make multicast groups const, prevent abuse
Register generic netlink multicast groups as an array with the family and give them contiguous group IDs. Then instead of passing the global group ID to the various functions that send messages, pass the ID relative to the family - for most families that's just 0 because the only have one group. This avoids the list_head and ID in each group, adding a new field for the mcast group ID offset to the family. At the same time, this allows us to prevent abusing groups again like the quota and dropmon code did, since we can now check that a family only uses a group it owns. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/hsr')
-rw-r--r--net/hsr/hsr_netlink.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c
index 0009416c08c2..5325af85eea6 100644
--- a/net/hsr/hsr_netlink.c
+++ b/net/hsr/hsr_netlink.c
@@ -90,8 +90,8 @@ static struct genl_family hsr_genl_family = {
90 .maxattr = HSR_A_MAX, 90 .maxattr = HSR_A_MAX,
91}; 91};
92 92
93static struct genl_multicast_group hsr_network_genl_mcgrp = { 93static const struct genl_multicast_group hsr_mcgrps[] = {
94 .name = "hsr-network", 94 { .name = "hsr-network", },
95}; 95};
96 96
97 97
@@ -129,8 +129,7 @@ void hsr_nl_ringerror(struct hsr_priv *hsr_priv, unsigned char addr[ETH_ALEN],
129 goto nla_put_failure; 129 goto nla_put_failure;
130 130
131 genlmsg_end(skb, msg_head); 131 genlmsg_end(skb, msg_head);
132 genlmsg_multicast(&hsr_genl_family, skb, 0, 132 genlmsg_multicast(&hsr_genl_family, skb, 0, 0, GFP_ATOMIC);
133 hsr_network_genl_mcgrp.id, GFP_ATOMIC);
134 133
135 return; 134 return;
136 135
@@ -164,8 +163,7 @@ void hsr_nl_nodedown(struct hsr_priv *hsr_priv, unsigned char addr[ETH_ALEN])
164 goto nla_put_failure; 163 goto nla_put_failure;
165 164
166 genlmsg_end(skb, msg_head); 165 genlmsg_end(skb, msg_head);
167 genlmsg_multicast(&hsr_genl_family, skb, 0, 166 genlmsg_multicast(&hsr_genl_family, skb, 0, 0, GFP_ATOMIC);
168 hsr_network_genl_mcgrp.id, GFP_ATOMIC);
169 167
170 return; 168 return;
171 169
@@ -416,18 +414,13 @@ int __init hsr_netlink_init(void)
416 if (rc) 414 if (rc)
417 goto fail_rtnl_link_register; 415 goto fail_rtnl_link_register;
418 416
419 rc = genl_register_family_with_ops(&hsr_genl_family, hsr_ops); 417 rc = genl_register_family_with_ops_groups(&hsr_genl_family, hsr_ops,
418 hsr_mcgrps);
420 if (rc) 419 if (rc)
421 goto fail_genl_register_family; 420 goto fail_genl_register_family;
422 421
423 rc = genl_register_mc_group(&hsr_genl_family, &hsr_network_genl_mcgrp);
424 if (rc)
425 goto fail_genl_register_mc_group;
426
427 return 0; 422 return 0;
428 423
429fail_genl_register_mc_group:
430 genl_unregister_family(&hsr_genl_family);
431fail_genl_register_family: 424fail_genl_register_family:
432 rtnl_link_unregister(&hsr_link_ops); 425 rtnl_link_unregister(&hsr_link_ops);
433fail_rtnl_link_register: 426fail_rtnl_link_register: