Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6-block.git] / net / bridge / br_mdb.c
1 #include <linux/err.h>
2 #include <linux/igmp.h>
3 #include <linux/kernel.h>
4 #include <linux/netdevice.h>
5 #include <linux/rculist.h>
6 #include <linux/skbuff.h>
7 #include <linux/if_ether.h>
8 #include <net/ip.h>
9 #include <net/netlink.h>
10 #if IS_ENABLED(CONFIG_IPV6)
11 #include <net/ipv6.h>
12 #include <net/addrconf.h>
13 #endif
14
15 #include "br_private.h"
16
17 static int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
18                                struct net_device *dev)
19 {
20         struct net_bridge *br = netdev_priv(dev);
21         struct net_bridge_port *p;
22         struct nlattr *nest;
23
24         if (!br->multicast_router || hlist_empty(&br->router_list))
25                 return 0;
26
27         nest = nla_nest_start(skb, MDBA_ROUTER);
28         if (nest == NULL)
29                 return -EMSGSIZE;
30
31         hlist_for_each_entry_rcu(p, &br->router_list, rlist) {
32                 if (p && nla_put_u32(skb, MDBA_ROUTER_PORT, p->dev->ifindex))
33                         goto fail;
34         }
35
36         nla_nest_end(skb, nest);
37         return 0;
38 fail:
39         nla_nest_cancel(skb, nest);
40         return -EMSGSIZE;
41 }
42
43 static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
44                             struct net_device *dev)
45 {
46         struct net_bridge *br = netdev_priv(dev);
47         struct net_bridge_mdb_htable *mdb;
48         struct nlattr *nest, *nest2;
49         int i, err = 0;
50         int idx = 0, s_idx = cb->args[1];
51
52         if (br->multicast_disabled)
53                 return 0;
54
55         mdb = rcu_dereference(br->mdb);
56         if (!mdb)
57                 return 0;
58
59         nest = nla_nest_start(skb, MDBA_MDB);
60         if (nest == NULL)
61                 return -EMSGSIZE;
62
63         for (i = 0; i < mdb->max; i++) {
64                 struct net_bridge_mdb_entry *mp;
65                 struct net_bridge_port_group *p;
66                 struct net_bridge_port_group __rcu **pp;
67                 struct net_bridge_port *port;
68
69                 hlist_for_each_entry_rcu(mp, &mdb->mhash[i], hlist[mdb->ver]) {
70                         if (idx < s_idx)
71                                 goto skip;
72
73                         nest2 = nla_nest_start(skb, MDBA_MDB_ENTRY);
74                         if (nest2 == NULL) {
75                                 err = -EMSGSIZE;
76                                 goto out;
77                         }
78
79                         for (pp = &mp->ports;
80                              (p = rcu_dereference(*pp)) != NULL;
81                               pp = &p->next) {
82                                 port = p->port;
83                                 if (port) {
84                                         struct br_mdb_entry e;
85                                         memset(&e, 0, sizeof(e));
86                                         e.ifindex = port->dev->ifindex;
87                                         e.state = p->state;
88                                         e.vid = p->addr.vid;
89                                         if (p->addr.proto == htons(ETH_P_IP))
90                                                 e.addr.u.ip4 = p->addr.u.ip4;
91 #if IS_ENABLED(CONFIG_IPV6)
92                                         if (p->addr.proto == htons(ETH_P_IPV6))
93                                                 e.addr.u.ip6 = p->addr.u.ip6;
94 #endif
95                                         e.addr.proto = p->addr.proto;
96                                         if (nla_put(skb, MDBA_MDB_ENTRY_INFO, sizeof(e), &e)) {
97                                                 nla_nest_cancel(skb, nest2);
98                                                 err = -EMSGSIZE;
99                                                 goto out;
100                                         }
101                                 }
102                         }
103                         nla_nest_end(skb, nest2);
104                 skip:
105                         idx++;
106                 }
107         }
108
109 out:
110         cb->args[1] = idx;
111         nla_nest_end(skb, nest);
112         return err;
113 }
114
115 static int br_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
116 {
117         struct net_device *dev;
118         struct net *net = sock_net(skb->sk);
119         struct nlmsghdr *nlh = NULL;
120         int idx = 0, s_idx;
121
122         s_idx = cb->args[0];
123
124         rcu_read_lock();
125
126         /* In theory this could be wrapped to 0... */
127         cb->seq = net->dev_base_seq + br_mdb_rehash_seq;
128
129         for_each_netdev_rcu(net, dev) {
130                 if (dev->priv_flags & IFF_EBRIDGE) {
131                         struct br_port_msg *bpm;
132
133                         if (idx < s_idx)
134                                 goto skip;
135
136                         nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
137                                         cb->nlh->nlmsg_seq, RTM_GETMDB,
138                                         sizeof(*bpm), NLM_F_MULTI);
139                         if (nlh == NULL)
140                                 break;
141
142                         bpm = nlmsg_data(nlh);
143                         memset(bpm, 0, sizeof(*bpm));
144                         bpm->ifindex = dev->ifindex;
145                         if (br_mdb_fill_info(skb, cb, dev) < 0)
146                                 goto out;
147                         if (br_rports_fill_info(skb, cb, dev) < 0)
148                                 goto out;
149
150                         cb->args[1] = 0;
151                         nlmsg_end(skb, nlh);
152                 skip:
153                         idx++;
154                 }
155         }
156
157 out:
158         if (nlh)
159                 nlmsg_end(skb, nlh);
160         rcu_read_unlock();
161         cb->args[0] = idx;
162         return skb->len;
163 }
164
165 static int nlmsg_populate_mdb_fill(struct sk_buff *skb,
166                                    struct net_device *dev,
167                                    struct br_mdb_entry *entry, u32 pid,
168                                    u32 seq, int type, unsigned int flags)
169 {
170         struct nlmsghdr *nlh;
171         struct br_port_msg *bpm;
172         struct nlattr *nest, *nest2;
173
174         nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), 0);
175         if (!nlh)
176                 return -EMSGSIZE;
177
178         bpm = nlmsg_data(nlh);
179         memset(bpm, 0, sizeof(*bpm));
180         bpm->family  = AF_BRIDGE;
181         bpm->ifindex = dev->ifindex;
182         nest = nla_nest_start(skb, MDBA_MDB);
183         if (nest == NULL)
184                 goto cancel;
185         nest2 = nla_nest_start(skb, MDBA_MDB_ENTRY);
186         if (nest2 == NULL)
187                 goto end;
188
189         if (nla_put(skb, MDBA_MDB_ENTRY_INFO, sizeof(*entry), entry))
190                 goto end;
191
192         nla_nest_end(skb, nest2);
193         nla_nest_end(skb, nest);
194         nlmsg_end(skb, nlh);
195         return 0;
196
197 end:
198         nla_nest_end(skb, nest);
199 cancel:
200         nlmsg_cancel(skb, nlh);
201         return -EMSGSIZE;
202 }
203
204 static inline size_t rtnl_mdb_nlmsg_size(void)
205 {
206         return NLMSG_ALIGN(sizeof(struct br_port_msg))
207                 + nla_total_size(sizeof(struct br_mdb_entry));
208 }
209
210 static void __br_mdb_notify(struct net_device *dev, struct br_mdb_entry *entry,
211                             int type)
212 {
213         struct net *net = dev_net(dev);
214         struct sk_buff *skb;
215         int err = -ENOBUFS;
216
217         skb = nlmsg_new(rtnl_mdb_nlmsg_size(), GFP_ATOMIC);
218         if (!skb)
219                 goto errout;
220
221         err = nlmsg_populate_mdb_fill(skb, dev, entry, 0, 0, type, NTF_SELF);
222         if (err < 0) {
223                 kfree_skb(skb);
224                 goto errout;
225         }
226
227         rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
228         return;
229 errout:
230         rtnl_set_sk_err(net, RTNLGRP_MDB, err);
231 }
232
233 void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
234                    struct br_ip *group, int type, u8 state)
235 {
236         struct br_mdb_entry entry;
237
238         memset(&entry, 0, sizeof(entry));
239         entry.ifindex = port->dev->ifindex;
240         entry.addr.proto = group->proto;
241         entry.addr.u.ip4 = group->u.ip4;
242 #if IS_ENABLED(CONFIG_IPV6)
243         entry.addr.u.ip6 = group->u.ip6;
244 #endif
245         entry.state = state;
246         entry.vid = group->vid;
247         __br_mdb_notify(dev, &entry, type);
248 }
249
250 static bool is_valid_mdb_entry(struct br_mdb_entry *entry)
251 {
252         if (entry->ifindex == 0)
253                 return false;
254
255         if (entry->addr.proto == htons(ETH_P_IP)) {
256                 if (!ipv4_is_multicast(entry->addr.u.ip4))
257                         return false;
258                 if (ipv4_is_local_multicast(entry->addr.u.ip4))
259                         return false;
260 #if IS_ENABLED(CONFIG_IPV6)
261         } else if (entry->addr.proto == htons(ETH_P_IPV6)) {
262                 if (ipv6_addr_is_ll_all_nodes(&entry->addr.u.ip6))
263                         return false;
264 #endif
265         } else
266                 return false;
267         if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY)
268                 return false;
269         if (entry->vid >= VLAN_VID_MASK)
270                 return false;
271
272         return true;
273 }
274
275 static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
276                         struct net_device **pdev, struct br_mdb_entry **pentry)
277 {
278         struct net *net = sock_net(skb->sk);
279         struct br_mdb_entry *entry;
280         struct br_port_msg *bpm;
281         struct nlattr *tb[MDBA_SET_ENTRY_MAX+1];
282         struct net_device *dev;
283         int err;
284
285         err = nlmsg_parse(nlh, sizeof(*bpm), tb, MDBA_SET_ENTRY_MAX, NULL);
286         if (err < 0)
287                 return err;
288
289         bpm = nlmsg_data(nlh);
290         if (bpm->ifindex == 0) {
291                 pr_info("PF_BRIDGE: br_mdb_parse() with invalid ifindex\n");
292                 return -EINVAL;
293         }
294
295         dev = __dev_get_by_index(net, bpm->ifindex);
296         if (dev == NULL) {
297                 pr_info("PF_BRIDGE: br_mdb_parse() with unknown ifindex\n");
298                 return -ENODEV;
299         }
300
301         if (!(dev->priv_flags & IFF_EBRIDGE)) {
302                 pr_info("PF_BRIDGE: br_mdb_parse() with non-bridge\n");
303                 return -EOPNOTSUPP;
304         }
305
306         *pdev = dev;
307
308         if (!tb[MDBA_SET_ENTRY] ||
309             nla_len(tb[MDBA_SET_ENTRY]) != sizeof(struct br_mdb_entry)) {
310                 pr_info("PF_BRIDGE: br_mdb_parse() with invalid attr\n");
311                 return -EINVAL;
312         }
313
314         entry = nla_data(tb[MDBA_SET_ENTRY]);
315         if (!is_valid_mdb_entry(entry)) {
316                 pr_info("PF_BRIDGE: br_mdb_parse() with invalid entry\n");
317                 return -EINVAL;
318         }
319
320         *pentry = entry;
321         return 0;
322 }
323
324 static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
325                             struct br_ip *group, unsigned char state)
326 {
327         struct net_bridge_mdb_entry *mp;
328         struct net_bridge_port_group *p;
329         struct net_bridge_port_group __rcu **pp;
330         struct net_bridge_mdb_htable *mdb;
331         unsigned long now = jiffies;
332         int err;
333
334         mdb = mlock_dereference(br->mdb, br);
335         mp = br_mdb_ip_get(mdb, group);
336         if (!mp) {
337                 mp = br_multicast_new_group(br, port, group);
338                 err = PTR_ERR(mp);
339                 if (IS_ERR(mp))
340                         return err;
341         }
342
343         for (pp = &mp->ports;
344              (p = mlock_dereference(*pp, br)) != NULL;
345              pp = &p->next) {
346                 if (p->port == port)
347                         return -EEXIST;
348                 if ((unsigned long)p->port < (unsigned long)port)
349                         break;
350         }
351
352         p = br_multicast_new_port_group(port, group, *pp, state);
353         if (unlikely(!p))
354                 return -ENOMEM;
355         rcu_assign_pointer(*pp, p);
356         if (state == MDB_TEMPORARY)
357                 mod_timer(&p->timer, now + br->multicast_membership_interval);
358
359         br_mdb_notify(br->dev, port, group, RTM_NEWMDB, state);
360         return 0;
361 }
362
363 static int __br_mdb_add(struct net *net, struct net_bridge *br,
364                         struct br_mdb_entry *entry)
365 {
366         struct br_ip ip;
367         struct net_device *dev;
368         struct net_bridge_port *p;
369         int ret;
370
371         if (!netif_running(br->dev) || br->multicast_disabled)
372                 return -EINVAL;
373
374         dev = __dev_get_by_index(net, entry->ifindex);
375         if (!dev)
376                 return -ENODEV;
377
378         p = br_port_get_rtnl(dev);
379         if (!p || p->br != br || p->state == BR_STATE_DISABLED)
380                 return -EINVAL;
381
382         memset(&ip, 0, sizeof(ip));
383         ip.vid = entry->vid;
384         ip.proto = entry->addr.proto;
385         if (ip.proto == htons(ETH_P_IP))
386                 ip.u.ip4 = entry->addr.u.ip4;
387 #if IS_ENABLED(CONFIG_IPV6)
388         else
389                 ip.u.ip6 = entry->addr.u.ip6;
390 #endif
391
392         spin_lock_bh(&br->multicast_lock);
393         ret = br_mdb_add_group(br, p, &ip, entry->state);
394         spin_unlock_bh(&br->multicast_lock);
395         return ret;
396 }
397
398 static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh)
399 {
400         struct net *net = sock_net(skb->sk);
401         struct br_mdb_entry *entry;
402         struct net_device *dev;
403         struct net_bridge *br;
404         int err;
405
406         err = br_mdb_parse(skb, nlh, &dev, &entry);
407         if (err < 0)
408                 return err;
409
410         br = netdev_priv(dev);
411
412         err = __br_mdb_add(net, br, entry);
413         if (!err)
414                 __br_mdb_notify(dev, entry, RTM_NEWMDB);
415         return err;
416 }
417
418 static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry)
419 {
420         struct net_bridge_mdb_htable *mdb;
421         struct net_bridge_mdb_entry *mp;
422         struct net_bridge_port_group *p;
423         struct net_bridge_port_group __rcu **pp;
424         struct br_ip ip;
425         int err = -EINVAL;
426
427         if (!netif_running(br->dev) || br->multicast_disabled)
428                 return -EINVAL;
429
430         memset(&ip, 0, sizeof(ip));
431         ip.vid = entry->vid;
432         ip.proto = entry->addr.proto;
433         if (ip.proto == htons(ETH_P_IP))
434                 ip.u.ip4 = entry->addr.u.ip4;
435 #if IS_ENABLED(CONFIG_IPV6)
436         else
437                 ip.u.ip6 = entry->addr.u.ip6;
438 #endif
439
440         spin_lock_bh(&br->multicast_lock);
441         mdb = mlock_dereference(br->mdb, br);
442
443         mp = br_mdb_ip_get(mdb, &ip);
444         if (!mp)
445                 goto unlock;
446
447         for (pp = &mp->ports;
448              (p = mlock_dereference(*pp, br)) != NULL;
449              pp = &p->next) {
450                 if (!p->port || p->port->dev->ifindex != entry->ifindex)
451                         continue;
452
453                 if (p->port->state == BR_STATE_DISABLED)
454                         goto unlock;
455
456                 rcu_assign_pointer(*pp, p->next);
457                 hlist_del_init(&p->mglist);
458                 del_timer(&p->timer);
459                 call_rcu_bh(&p->rcu, br_multicast_free_pg);
460                 err = 0;
461
462                 if (!mp->ports && !mp->mglist &&
463                     netif_running(br->dev))
464                         mod_timer(&mp->timer, jiffies);
465                 break;
466         }
467
468 unlock:
469         spin_unlock_bh(&br->multicast_lock);
470         return err;
471 }
472
473 static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh)
474 {
475         struct net_device *dev;
476         struct br_mdb_entry *entry;
477         struct net_bridge *br;
478         int err;
479
480         err = br_mdb_parse(skb, nlh, &dev, &entry);
481         if (err < 0)
482                 return err;
483
484         br = netdev_priv(dev);
485
486         err = __br_mdb_del(br, entry);
487         if (!err)
488                 __br_mdb_notify(dev, entry, RTM_DELMDB);
489         return err;
490 }
491
492 void br_mdb_init(void)
493 {
494         rtnl_register(PF_BRIDGE, RTM_GETMDB, NULL, br_mdb_dump, NULL);
495         rtnl_register(PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, NULL);
496         rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, NULL);
497 }
498
499 void br_mdb_uninit(void)
500 {
501         rtnl_unregister(PF_BRIDGE, RTM_GETMDB);
502         rtnl_unregister(PF_BRIDGE, RTM_NEWMDB);
503         rtnl_unregister(PF_BRIDGE, RTM_DELMDB);
504 }