]> git.karo-electronics.de Git - karo-tx-linux.git/blob - net/bridge/br_mdb.c
Merge remote-tracking branch 'rcu/rcu/next'
[karo-tx-linux.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 #include <net/switchdev.h>
11 #if IS_ENABLED(CONFIG_IPV6)
12 #include <net/ipv6.h>
13 #include <net/addrconf.h>
14 #endif
15
16 #include "br_private.h"
17
18 static int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
19                                struct net_device *dev)
20 {
21         struct net_bridge *br = netdev_priv(dev);
22         struct net_bridge_port *p;
23         struct nlattr *nest;
24
25         if (!br->multicast_router || hlist_empty(&br->router_list))
26                 return 0;
27
28         nest = nla_nest_start(skb, MDBA_ROUTER);
29         if (nest == NULL)
30                 return -EMSGSIZE;
31
32         hlist_for_each_entry_rcu(p, &br->router_list, rlist) {
33                 if (p && nla_put_u32(skb, MDBA_ROUTER_PORT, p->dev->ifindex))
34                         goto fail;
35         }
36
37         nla_nest_end(skb, nest);
38         return 0;
39 fail:
40         nla_nest_cancel(skb, nest);
41         return -EMSGSIZE;
42 }
43
44 static void __mdb_entry_fill_flags(struct br_mdb_entry *e, unsigned char flags)
45 {
46         e->state = flags & MDB_PG_FLAGS_PERMANENT;
47         e->flags = 0;
48         if (flags & MDB_PG_FLAGS_OFFLOAD)
49                 e->flags |= MDB_FLAGS_OFFLOAD;
50 }
51
52 static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
53                             struct net_device *dev)
54 {
55         struct net_bridge *br = netdev_priv(dev);
56         struct net_bridge_mdb_htable *mdb;
57         struct nlattr *nest, *nest2;
58         int i, err = 0;
59         int idx = 0, s_idx = cb->args[1];
60
61         if (br->multicast_disabled)
62                 return 0;
63
64         mdb = rcu_dereference(br->mdb);
65         if (!mdb)
66                 return 0;
67
68         nest = nla_nest_start(skb, MDBA_MDB);
69         if (nest == NULL)
70                 return -EMSGSIZE;
71
72         for (i = 0; i < mdb->max; i++) {
73                 struct net_bridge_mdb_entry *mp;
74                 struct net_bridge_port_group *p;
75                 struct net_bridge_port_group __rcu **pp;
76                 struct net_bridge_port *port;
77
78                 hlist_for_each_entry_rcu(mp, &mdb->mhash[i], hlist[mdb->ver]) {
79                         if (idx < s_idx)
80                                 goto skip;
81
82                         nest2 = nla_nest_start(skb, MDBA_MDB_ENTRY);
83                         if (nest2 == NULL) {
84                                 err = -EMSGSIZE;
85                                 goto out;
86                         }
87
88                         for (pp = &mp->ports;
89                              (p = rcu_dereference(*pp)) != NULL;
90                               pp = &p->next) {
91                                 port = p->port;
92                                 if (port) {
93                                         struct br_mdb_entry e;
94                                         memset(&e, 0, sizeof(e));
95                                         e.ifindex = port->dev->ifindex;
96                                         e.vid = p->addr.vid;
97                                         __mdb_entry_fill_flags(&e, p->flags);
98                                         if (p->addr.proto == htons(ETH_P_IP))
99                                                 e.addr.u.ip4 = p->addr.u.ip4;
100 #if IS_ENABLED(CONFIG_IPV6)
101                                         if (p->addr.proto == htons(ETH_P_IPV6))
102                                                 e.addr.u.ip6 = p->addr.u.ip6;
103 #endif
104                                         e.addr.proto = p->addr.proto;
105                                         if (nla_put(skb, MDBA_MDB_ENTRY_INFO, sizeof(e), &e)) {
106                                                 nla_nest_cancel(skb, nest2);
107                                                 err = -EMSGSIZE;
108                                                 goto out;
109                                         }
110                                 }
111                         }
112                         nla_nest_end(skb, nest2);
113                 skip:
114                         idx++;
115                 }
116         }
117
118 out:
119         cb->args[1] = idx;
120         nla_nest_end(skb, nest);
121         return err;
122 }
123
124 static int br_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
125 {
126         struct net_device *dev;
127         struct net *net = sock_net(skb->sk);
128         struct nlmsghdr *nlh = NULL;
129         int idx = 0, s_idx;
130
131         s_idx = cb->args[0];
132
133         rcu_read_lock();
134
135         /* In theory this could be wrapped to 0... */
136         cb->seq = net->dev_base_seq + br_mdb_rehash_seq;
137
138         for_each_netdev_rcu(net, dev) {
139                 if (dev->priv_flags & IFF_EBRIDGE) {
140                         struct br_port_msg *bpm;
141
142                         if (idx < s_idx)
143                                 goto skip;
144
145                         nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
146                                         cb->nlh->nlmsg_seq, RTM_GETMDB,
147                                         sizeof(*bpm), NLM_F_MULTI);
148                         if (nlh == NULL)
149                                 break;
150
151                         bpm = nlmsg_data(nlh);
152                         memset(bpm, 0, sizeof(*bpm));
153                         bpm->ifindex = dev->ifindex;
154                         if (br_mdb_fill_info(skb, cb, dev) < 0)
155                                 goto out;
156                         if (br_rports_fill_info(skb, cb, dev) < 0)
157                                 goto out;
158
159                         cb->args[1] = 0;
160                         nlmsg_end(skb, nlh);
161                 skip:
162                         idx++;
163                 }
164         }
165
166 out:
167         if (nlh)
168                 nlmsg_end(skb, nlh);
169         rcu_read_unlock();
170         cb->args[0] = idx;
171         return skb->len;
172 }
173
174 static int nlmsg_populate_mdb_fill(struct sk_buff *skb,
175                                    struct net_device *dev,
176                                    struct br_mdb_entry *entry, u32 pid,
177                                    u32 seq, int type, unsigned int flags)
178 {
179         struct nlmsghdr *nlh;
180         struct br_port_msg *bpm;
181         struct nlattr *nest, *nest2;
182
183         nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), 0);
184         if (!nlh)
185                 return -EMSGSIZE;
186
187         bpm = nlmsg_data(nlh);
188         memset(bpm, 0, sizeof(*bpm));
189         bpm->family  = AF_BRIDGE;
190         bpm->ifindex = dev->ifindex;
191         nest = nla_nest_start(skb, MDBA_MDB);
192         if (nest == NULL)
193                 goto cancel;
194         nest2 = nla_nest_start(skb, MDBA_MDB_ENTRY);
195         if (nest2 == NULL)
196                 goto end;
197
198         if (nla_put(skb, MDBA_MDB_ENTRY_INFO, sizeof(*entry), entry))
199                 goto end;
200
201         nla_nest_end(skb, nest2);
202         nla_nest_end(skb, nest);
203         nlmsg_end(skb, nlh);
204         return 0;
205
206 end:
207         nla_nest_end(skb, nest);
208 cancel:
209         nlmsg_cancel(skb, nlh);
210         return -EMSGSIZE;
211 }
212
213 static inline size_t rtnl_mdb_nlmsg_size(void)
214 {
215         return NLMSG_ALIGN(sizeof(struct br_port_msg))
216                 + nla_total_size(sizeof(struct br_mdb_entry));
217 }
218
219 static void __br_mdb_notify(struct net_device *dev, struct br_mdb_entry *entry,
220                             int type, struct net_bridge_port_group *pg)
221 {
222         struct switchdev_obj_port_mdb mdb = {
223                 .obj = {
224                         .id = SWITCHDEV_OBJ_ID_PORT_MDB,
225                         .flags = SWITCHDEV_F_DEFER,
226                 },
227                 .vid = entry->vid,
228         };
229         struct net_device *port_dev;
230         struct net *net = dev_net(dev);
231         struct sk_buff *skb;
232         int err = -ENOBUFS;
233
234         port_dev = __dev_get_by_index(net, entry->ifindex);
235         if (entry->addr.proto == htons(ETH_P_IP))
236                 ip_eth_mc_map(entry->addr.u.ip4, mdb.addr);
237 #if IS_ENABLED(CONFIG_IPV6)
238         else
239                 ipv6_eth_mc_map(&entry->addr.u.ip6, mdb.addr);
240 #endif
241
242         mdb.obj.orig_dev = port_dev;
243         if (port_dev && type == RTM_NEWMDB) {
244                 err = switchdev_port_obj_add(port_dev, &mdb.obj);
245                 if (!err && pg)
246                         pg->flags |= MDB_PG_FLAGS_OFFLOAD;
247         } else if (port_dev && type == RTM_DELMDB) {
248                 switchdev_port_obj_del(port_dev, &mdb.obj);
249         }
250
251         skb = nlmsg_new(rtnl_mdb_nlmsg_size(), GFP_ATOMIC);
252         if (!skb)
253                 goto errout;
254
255         err = nlmsg_populate_mdb_fill(skb, dev, entry, 0, 0, type, NTF_SELF);
256         if (err < 0) {
257                 kfree_skb(skb);
258                 goto errout;
259         }
260
261         rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
262         return;
263 errout:
264         rtnl_set_sk_err(net, RTNLGRP_MDB, err);
265 }
266
267 void br_mdb_notify(struct net_device *dev, struct net_bridge_port_group *pg,
268                    int type)
269 {
270         struct br_mdb_entry entry;
271
272         memset(&entry, 0, sizeof(entry));
273         entry.ifindex = pg->port->dev->ifindex;
274         entry.addr.proto = pg->addr.proto;
275         entry.addr.u.ip4 = pg->addr.u.ip4;
276 #if IS_ENABLED(CONFIG_IPV6)
277         entry.addr.u.ip6 = pg->addr.u.ip6;
278 #endif
279         entry.vid = pg->addr.vid;
280         __mdb_entry_fill_flags(&entry, pg->flags);
281         __br_mdb_notify(dev, &entry, type, pg);
282 }
283
284 static int nlmsg_populate_rtr_fill(struct sk_buff *skb,
285                                    struct net_device *dev,
286                                    int ifindex, u32 pid,
287                                    u32 seq, int type, unsigned int flags)
288 {
289         struct br_port_msg *bpm;
290         struct nlmsghdr *nlh;
291         struct nlattr *nest;
292
293         nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), NLM_F_MULTI);
294         if (!nlh)
295                 return -EMSGSIZE;
296
297         bpm = nlmsg_data(nlh);
298         memset(bpm, 0, sizeof(*bpm));
299         bpm->family = AF_BRIDGE;
300         bpm->ifindex = dev->ifindex;
301         nest = nla_nest_start(skb, MDBA_ROUTER);
302         if (!nest)
303                 goto cancel;
304
305         if (nla_put_u32(skb, MDBA_ROUTER_PORT, ifindex))
306                 goto end;
307
308         nla_nest_end(skb, nest);
309         nlmsg_end(skb, nlh);
310         return 0;
311
312 end:
313         nla_nest_end(skb, nest);
314 cancel:
315         nlmsg_cancel(skb, nlh);
316         return -EMSGSIZE;
317 }
318
319 static inline size_t rtnl_rtr_nlmsg_size(void)
320 {
321         return NLMSG_ALIGN(sizeof(struct br_port_msg))
322                 + nla_total_size(sizeof(__u32));
323 }
324
325 void br_rtr_notify(struct net_device *dev, struct net_bridge_port *port,
326                    int type)
327 {
328         struct net *net = dev_net(dev);
329         struct sk_buff *skb;
330         int err = -ENOBUFS;
331         int ifindex;
332
333         ifindex = port ? port->dev->ifindex : 0;
334         skb = nlmsg_new(rtnl_rtr_nlmsg_size(), GFP_ATOMIC);
335         if (!skb)
336                 goto errout;
337
338         err = nlmsg_populate_rtr_fill(skb, dev, ifindex, 0, 0, type, NTF_SELF);
339         if (err < 0) {
340                 kfree_skb(skb);
341                 goto errout;
342         }
343
344         rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
345         return;
346
347 errout:
348         rtnl_set_sk_err(net, RTNLGRP_MDB, err);
349 }
350
351 static bool is_valid_mdb_entry(struct br_mdb_entry *entry)
352 {
353         if (entry->ifindex == 0)
354                 return false;
355
356         if (entry->addr.proto == htons(ETH_P_IP)) {
357                 if (!ipv4_is_multicast(entry->addr.u.ip4))
358                         return false;
359                 if (ipv4_is_local_multicast(entry->addr.u.ip4))
360                         return false;
361 #if IS_ENABLED(CONFIG_IPV6)
362         } else if (entry->addr.proto == htons(ETH_P_IPV6)) {
363                 if (ipv6_addr_is_ll_all_nodes(&entry->addr.u.ip6))
364                         return false;
365 #endif
366         } else
367                 return false;
368         if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY)
369                 return false;
370         if (entry->vid >= VLAN_VID_MASK)
371                 return false;
372
373         return true;
374 }
375
376 static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
377                         struct net_device **pdev, struct br_mdb_entry **pentry)
378 {
379         struct net *net = sock_net(skb->sk);
380         struct br_mdb_entry *entry;
381         struct br_port_msg *bpm;
382         struct nlattr *tb[MDBA_SET_ENTRY_MAX+1];
383         struct net_device *dev;
384         int err;
385
386         err = nlmsg_parse(nlh, sizeof(*bpm), tb, MDBA_SET_ENTRY_MAX, NULL);
387         if (err < 0)
388                 return err;
389
390         bpm = nlmsg_data(nlh);
391         if (bpm->ifindex == 0) {
392                 pr_info("PF_BRIDGE: br_mdb_parse() with invalid ifindex\n");
393                 return -EINVAL;
394         }
395
396         dev = __dev_get_by_index(net, bpm->ifindex);
397         if (dev == NULL) {
398                 pr_info("PF_BRIDGE: br_mdb_parse() with unknown ifindex\n");
399                 return -ENODEV;
400         }
401
402         if (!(dev->priv_flags & IFF_EBRIDGE)) {
403                 pr_info("PF_BRIDGE: br_mdb_parse() with non-bridge\n");
404                 return -EOPNOTSUPP;
405         }
406
407         *pdev = dev;
408
409         if (!tb[MDBA_SET_ENTRY] ||
410             nla_len(tb[MDBA_SET_ENTRY]) != sizeof(struct br_mdb_entry)) {
411                 pr_info("PF_BRIDGE: br_mdb_parse() with invalid attr\n");
412                 return -EINVAL;
413         }
414
415         entry = nla_data(tb[MDBA_SET_ENTRY]);
416         if (!is_valid_mdb_entry(entry)) {
417                 pr_info("PF_BRIDGE: br_mdb_parse() with invalid entry\n");
418                 return -EINVAL;
419         }
420
421         *pentry = entry;
422         return 0;
423 }
424
425 static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
426                             struct br_ip *group, unsigned char state,
427                             struct net_bridge_port_group **pg)
428 {
429         struct net_bridge_mdb_entry *mp;
430         struct net_bridge_port_group *p;
431         struct net_bridge_port_group __rcu **pp;
432         struct net_bridge_mdb_htable *mdb;
433         unsigned long now = jiffies;
434         int err;
435
436         mdb = mlock_dereference(br->mdb, br);
437         mp = br_mdb_ip_get(mdb, group);
438         if (!mp) {
439                 mp = br_multicast_new_group(br, port, group);
440                 err = PTR_ERR(mp);
441                 if (IS_ERR(mp))
442                         return err;
443         }
444
445         for (pp = &mp->ports;
446              (p = mlock_dereference(*pp, br)) != NULL;
447              pp = &p->next) {
448                 if (p->port == port)
449                         return -EEXIST;
450                 if ((unsigned long)p->port < (unsigned long)port)
451                         break;
452         }
453
454         p = br_multicast_new_port_group(port, group, *pp, state);
455         if (unlikely(!p))
456                 return -ENOMEM;
457         rcu_assign_pointer(*pp, p);
458         *pg = p;
459         if (state == MDB_TEMPORARY)
460                 mod_timer(&p->timer, now + br->multicast_membership_interval);
461
462         return 0;
463 }
464
465 static int __br_mdb_add(struct net *net, struct net_bridge *br,
466                         struct br_mdb_entry *entry,
467                         struct net_bridge_port_group **pg)
468 {
469         struct br_ip ip;
470         struct net_device *dev;
471         struct net_bridge_port *p;
472         int ret;
473
474         if (!netif_running(br->dev) || br->multicast_disabled)
475                 return -EINVAL;
476
477         dev = __dev_get_by_index(net, entry->ifindex);
478         if (!dev)
479                 return -ENODEV;
480
481         p = br_port_get_rtnl(dev);
482         if (!p || p->br != br || p->state == BR_STATE_DISABLED)
483                 return -EINVAL;
484
485         memset(&ip, 0, sizeof(ip));
486         ip.vid = entry->vid;
487         ip.proto = entry->addr.proto;
488         if (ip.proto == htons(ETH_P_IP))
489                 ip.u.ip4 = entry->addr.u.ip4;
490 #if IS_ENABLED(CONFIG_IPV6)
491         else
492                 ip.u.ip6 = entry->addr.u.ip6;
493 #endif
494
495         spin_lock_bh(&br->multicast_lock);
496         ret = br_mdb_add_group(br, p, &ip, entry->state, pg);
497         spin_unlock_bh(&br->multicast_lock);
498         return ret;
499 }
500
501 static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh)
502 {
503         struct net *net = sock_net(skb->sk);
504         struct net_bridge_port_group *pg;
505         struct net_bridge_vlan_group *vg;
506         struct net_device *dev, *pdev;
507         struct br_mdb_entry *entry;
508         struct net_bridge_port *p;
509         struct net_bridge_vlan *v;
510         struct net_bridge *br;
511         int err;
512
513         err = br_mdb_parse(skb, nlh, &dev, &entry);
514         if (err < 0)
515                 return err;
516
517         br = netdev_priv(dev);
518
519         /* If vlan filtering is enabled and VLAN is not specified
520          * install mdb entry on all vlans configured on the port.
521          */
522         pdev = __dev_get_by_index(net, entry->ifindex);
523         if (!pdev)
524                 return -ENODEV;
525
526         p = br_port_get_rtnl(pdev);
527         if (!p || p->br != br || p->state == BR_STATE_DISABLED)
528                 return -EINVAL;
529
530         vg = nbp_vlan_group(p);
531         if (br_vlan_enabled(br) && vg && entry->vid == 0) {
532                 list_for_each_entry(v, &vg->vlan_list, vlist) {
533                         entry->vid = v->vid;
534                         err = __br_mdb_add(net, br, entry, &pg);
535                         if (err)
536                                 break;
537                         __br_mdb_notify(dev, entry, RTM_NEWMDB, pg);
538                 }
539         } else {
540                 err = __br_mdb_add(net, br, entry, &pg);
541                 if (!err)
542                         __br_mdb_notify(dev, entry, RTM_NEWMDB, pg);
543         }
544
545         return err;
546 }
547
548 static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry)
549 {
550         struct net_bridge_mdb_htable *mdb;
551         struct net_bridge_mdb_entry *mp;
552         struct net_bridge_port_group *p;
553         struct net_bridge_port_group __rcu **pp;
554         struct br_ip ip;
555         int err = -EINVAL;
556
557         if (!netif_running(br->dev) || br->multicast_disabled)
558                 return -EINVAL;
559
560         memset(&ip, 0, sizeof(ip));
561         ip.vid = entry->vid;
562         ip.proto = entry->addr.proto;
563         if (ip.proto == htons(ETH_P_IP))
564                 ip.u.ip4 = entry->addr.u.ip4;
565 #if IS_ENABLED(CONFIG_IPV6)
566         else
567                 ip.u.ip6 = entry->addr.u.ip6;
568 #endif
569
570         spin_lock_bh(&br->multicast_lock);
571         mdb = mlock_dereference(br->mdb, br);
572
573         mp = br_mdb_ip_get(mdb, &ip);
574         if (!mp)
575                 goto unlock;
576
577         for (pp = &mp->ports;
578              (p = mlock_dereference(*pp, br)) != NULL;
579              pp = &p->next) {
580                 if (!p->port || p->port->dev->ifindex != entry->ifindex)
581                         continue;
582
583                 if (p->port->state == BR_STATE_DISABLED)
584                         goto unlock;
585
586                 __mdb_entry_fill_flags(entry, p->flags);
587                 rcu_assign_pointer(*pp, p->next);
588                 hlist_del_init(&p->mglist);
589                 del_timer(&p->timer);
590                 call_rcu_bh(&p->rcu, br_multicast_free_pg);
591                 err = 0;
592
593                 if (!mp->ports && !mp->mglist &&
594                     netif_running(br->dev))
595                         mod_timer(&mp->timer, jiffies);
596                 break;
597         }
598
599 unlock:
600         spin_unlock_bh(&br->multicast_lock);
601         return err;
602 }
603
604 static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh)
605 {
606         struct net *net = sock_net(skb->sk);
607         struct net_bridge_vlan_group *vg;
608         struct net_device *dev, *pdev;
609         struct br_mdb_entry *entry;
610         struct net_bridge_port *p;
611         struct net_bridge_vlan *v;
612         struct net_bridge *br;
613         int err;
614
615         err = br_mdb_parse(skb, nlh, &dev, &entry);
616         if (err < 0)
617                 return err;
618
619         br = netdev_priv(dev);
620
621         /* If vlan filtering is enabled and VLAN is not specified
622          * delete mdb entry on all vlans configured on the port.
623          */
624         pdev = __dev_get_by_index(net, entry->ifindex);
625         if (!pdev)
626                 return -ENODEV;
627
628         p = br_port_get_rtnl(pdev);
629         if (!p || p->br != br || p->state == BR_STATE_DISABLED)
630                 return -EINVAL;
631
632         vg = nbp_vlan_group(p);
633         if (br_vlan_enabled(br) && vg && entry->vid == 0) {
634                 list_for_each_entry(v, &vg->vlan_list, vlist) {
635                         entry->vid = v->vid;
636                         err = __br_mdb_del(br, entry);
637                         if (!err)
638                                 __br_mdb_notify(dev, entry, RTM_DELMDB, NULL);
639                 }
640         } else {
641                 err = __br_mdb_del(br, entry);
642                 if (!err)
643                         __br_mdb_notify(dev, entry, RTM_DELMDB, NULL);
644         }
645
646         return err;
647 }
648
649 void br_mdb_init(void)
650 {
651         rtnl_register(PF_BRIDGE, RTM_GETMDB, NULL, br_mdb_dump, NULL);
652         rtnl_register(PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, NULL);
653         rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, NULL);
654 }
655
656 void br_mdb_uninit(void)
657 {
658         rtnl_unregister(PF_BRIDGE, RTM_GETMDB);
659         rtnl_unregister(PF_BRIDGE, RTM_NEWMDB);
660         rtnl_unregister(PF_BRIDGE, RTM_DELMDB);
661 }