1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/err.h> 3 #include <linux/igmp.h> 4 #include <linux/kernel.h> 5 #include <linux/netdevice.h> 6 #include <linux/rculist.h> 7 #include <linux/skbuff.h> 8 #include <linux/if_ether.h> 9 #include <net/ip.h> 10 #include <net/netlink.h> 11 #include <net/switchdev.h> 12 #if IS_ENABLED(CONFIG_IPV6) 13 #include <net/ipv6.h> 14 #include <net/addrconf.h> 15 #endif 16 17 #include "br_private.h" 18 19 static int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb, 20 struct net_device *dev) 21 { 22 struct net_bridge *br = netdev_priv(dev); 23 struct net_bridge_port *p; 24 struct nlattr *nest, *port_nest; 25 26 if (!br->multicast_router || hlist_empty(&br->router_list)) 27 return 0; 28 29 nest = nla_nest_start_noflag(skb, MDBA_ROUTER); 30 if (nest == NULL) 31 return -EMSGSIZE; 32 33 hlist_for_each_entry_rcu(p, &br->router_list, rlist) { 34 if (!p) 35 continue; 36 port_nest = nla_nest_start_noflag(skb, MDBA_ROUTER_PORT); 37 if (!port_nest) 38 goto fail; 39 if (nla_put_nohdr(skb, sizeof(u32), &p->dev->ifindex) || 40 nla_put_u32(skb, MDBA_ROUTER_PATTR_TIMER, 41 br_timer_value(&p->multicast_router_timer)) || 42 nla_put_u8(skb, MDBA_ROUTER_PATTR_TYPE, 43 p->multicast_router)) { 44 nla_nest_cancel(skb, port_nest); 45 goto fail; 46 } 47 nla_nest_end(skb, port_nest); 48 } 49 50 nla_nest_end(skb, nest); 51 return 0; 52 fail: 53 nla_nest_cancel(skb, nest); 54 return -EMSGSIZE; 55 } 56 57 static void __mdb_entry_fill_flags(struct br_mdb_entry *e, unsigned char flags) 58 { 59 e->state = flags & MDB_PG_FLAGS_PERMANENT; 60 e->flags = 0; 61 if (flags & MDB_PG_FLAGS_OFFLOAD) 62 e->flags |= MDB_FLAGS_OFFLOAD; 63 if (flags & MDB_PG_FLAGS_FAST_LEAVE) 64 e->flags |= MDB_FLAGS_FAST_LEAVE; 65 } 66 67 static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip) 68 { 69 memset(ip, 0, sizeof(struct br_ip)); 70 ip->vid = entry->vid; 71 ip->proto = entry->addr.proto; 72 if (ip->proto == htons(ETH_P_IP)) 73 ip->u.ip4 = entry->addr.u.ip4; 74 #if IS_ENABLED(CONFIG_IPV6) 75 else 76 ip->u.ip6 = entry->addr.u.ip6; 77 #endif 78 } 79 80 static int __mdb_fill_info(struct sk_buff *skb, 81 struct net_bridge_mdb_entry *mp, 82 struct net_bridge_port_group *p) 83 { 84 struct timer_list *mtimer; 85 struct nlattr *nest_ent; 86 struct br_mdb_entry e; 87 u8 flags = 0; 88 int ifindex; 89 90 memset(&e, 0, sizeof(e)); 91 if (p) { 92 ifindex = p->port->dev->ifindex; 93 mtimer = &p->timer; 94 flags = p->flags; 95 } else { 96 ifindex = mp->br->dev->ifindex; 97 mtimer = &mp->timer; 98 } 99 100 __mdb_entry_fill_flags(&e, flags); 101 e.ifindex = ifindex; 102 e.vid = mp->addr.vid; 103 if (mp->addr.proto == htons(ETH_P_IP)) 104 e.addr.u.ip4 = mp->addr.u.ip4; 105 #if IS_ENABLED(CONFIG_IPV6) 106 if (mp->addr.proto == htons(ETH_P_IPV6)) 107 e.addr.u.ip6 = mp->addr.u.ip6; 108 #endif 109 e.addr.proto = mp->addr.proto; 110 nest_ent = nla_nest_start_noflag(skb, 111 MDBA_MDB_ENTRY_INFO); 112 if (!nest_ent) 113 return -EMSGSIZE; 114 115 if (nla_put_nohdr(skb, sizeof(e), &e) || 116 nla_put_u32(skb, 117 MDBA_MDB_EATTR_TIMER, 118 br_timer_value(mtimer))) { 119 nla_nest_cancel(skb, nest_ent); 120 return -EMSGSIZE; 121 } 122 nla_nest_end(skb, nest_ent); 123 124 return 0; 125 } 126 127 static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb, 128 struct net_device *dev) 129 { 130 int idx = 0, s_idx = cb->args[1], err = 0; 131 struct net_bridge *br = netdev_priv(dev); 132 struct net_bridge_mdb_entry *mp; 133 struct nlattr *nest, *nest2; 134 135 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) 136 return 0; 137 138 nest = nla_nest_start_noflag(skb, MDBA_MDB); 139 if (nest == NULL) 140 return -EMSGSIZE; 141 142 hlist_for_each_entry_rcu(mp, &br->mdb_list, mdb_node) { 143 struct net_bridge_port_group *p; 144 struct net_bridge_port_group __rcu **pp; 145 146 if (idx < s_idx) 147 goto skip; 148 149 nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY); 150 if (!nest2) { 151 err = -EMSGSIZE; 152 break; 153 } 154 155 if (mp->host_joined) { 156 err = __mdb_fill_info(skb, mp, NULL); 157 if (err) { 158 nla_nest_cancel(skb, nest2); 159 break; 160 } 161 } 162 163 for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL; 164 pp = &p->next) { 165 if (!p->port) 166 continue; 167 168 err = __mdb_fill_info(skb, mp, p); 169 if (err) { 170 nla_nest_cancel(skb, nest2); 171 goto out; 172 } 173 } 174 nla_nest_end(skb, nest2); 175 skip: 176 idx++; 177 } 178 179 out: 180 cb->args[1] = idx; 181 nla_nest_end(skb, nest); 182 return err; 183 } 184 185 static int br_mdb_valid_dump_req(const struct nlmsghdr *nlh, 186 struct netlink_ext_ack *extack) 187 { 188 struct br_port_msg *bpm; 189 190 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*bpm))) { 191 NL_SET_ERR_MSG_MOD(extack, "Invalid header for mdb dump request"); 192 return -EINVAL; 193 } 194 195 bpm = nlmsg_data(nlh); 196 if (bpm->ifindex) { 197 NL_SET_ERR_MSG_MOD(extack, "Filtering by device index is not supported for mdb dump request"); 198 return -EINVAL; 199 } 200 if (nlmsg_attrlen(nlh, sizeof(*bpm))) { 201 NL_SET_ERR_MSG(extack, "Invalid data after header in mdb dump request"); 202 return -EINVAL; 203 } 204 205 return 0; 206 } 207 208 static int br_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb) 209 { 210 struct net_device *dev; 211 struct net *net = sock_net(skb->sk); 212 struct nlmsghdr *nlh = NULL; 213 int idx = 0, s_idx; 214 215 if (cb->strict_check) { 216 int err = br_mdb_valid_dump_req(cb->nlh, cb->extack); 217 218 if (err < 0) 219 return err; 220 } 221 222 s_idx = cb->args[0]; 223 224 rcu_read_lock(); 225 226 cb->seq = net->dev_base_seq; 227 228 for_each_netdev_rcu(net, dev) { 229 if (dev->priv_flags & IFF_EBRIDGE) { 230 struct br_port_msg *bpm; 231 232 if (idx < s_idx) 233 goto skip; 234 235 nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid, 236 cb->nlh->nlmsg_seq, RTM_GETMDB, 237 sizeof(*bpm), NLM_F_MULTI); 238 if (nlh == NULL) 239 break; 240 241 bpm = nlmsg_data(nlh); 242 memset(bpm, 0, sizeof(*bpm)); 243 bpm->ifindex = dev->ifindex; 244 if (br_mdb_fill_info(skb, cb, dev) < 0) 245 goto out; 246 if (br_rports_fill_info(skb, cb, dev) < 0) 247 goto out; 248 249 cb->args[1] = 0; 250 nlmsg_end(skb, nlh); 251 skip: 252 idx++; 253 } 254 } 255 256 out: 257 if (nlh) 258 nlmsg_end(skb, nlh); 259 rcu_read_unlock(); 260 cb->args[0] = idx; 261 return skb->len; 262 } 263 264 static int nlmsg_populate_mdb_fill(struct sk_buff *skb, 265 struct net_device *dev, 266 struct br_mdb_entry *entry, u32 pid, 267 u32 seq, int type, unsigned int flags) 268 { 269 struct nlmsghdr *nlh; 270 struct br_port_msg *bpm; 271 struct nlattr *nest, *nest2; 272 273 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), 0); 274 if (!nlh) 275 return -EMSGSIZE; 276 277 bpm = nlmsg_data(nlh); 278 memset(bpm, 0, sizeof(*bpm)); 279 bpm->family = AF_BRIDGE; 280 bpm->ifindex = dev->ifindex; 281 nest = nla_nest_start_noflag(skb, MDBA_MDB); 282 if (nest == NULL) 283 goto cancel; 284 nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY); 285 if (nest2 == NULL) 286 goto end; 287 288 if (nla_put(skb, MDBA_MDB_ENTRY_INFO, sizeof(*entry), entry)) 289 goto end; 290 291 nla_nest_end(skb, nest2); 292 nla_nest_end(skb, nest); 293 nlmsg_end(skb, nlh); 294 return 0; 295 296 end: 297 nla_nest_end(skb, nest); 298 cancel: 299 nlmsg_cancel(skb, nlh); 300 return -EMSGSIZE; 301 } 302 303 static inline size_t rtnl_mdb_nlmsg_size(void) 304 { 305 return NLMSG_ALIGN(sizeof(struct br_port_msg)) 306 + nla_total_size(sizeof(struct br_mdb_entry)); 307 } 308 309 struct br_mdb_complete_info { 310 struct net_bridge_port *port; 311 struct br_ip ip; 312 }; 313 314 static void br_mdb_complete(struct net_device *dev, int err, void *priv) 315 { 316 struct br_mdb_complete_info *data = priv; 317 struct net_bridge_port_group __rcu **pp; 318 struct net_bridge_port_group *p; 319 struct net_bridge_mdb_entry *mp; 320 struct net_bridge_port *port = data->port; 321 struct net_bridge *br = port->br; 322 323 if (err) 324 goto err; 325 326 spin_lock_bh(&br->multicast_lock); 327 mp = br_mdb_ip_get(br, &data->ip); 328 if (!mp) 329 goto out; 330 for (pp = &mp->ports; (p = mlock_dereference(*pp, br)) != NULL; 331 pp = &p->next) { 332 if (p->port != port) 333 continue; 334 p->flags |= MDB_PG_FLAGS_OFFLOAD; 335 } 336 out: 337 spin_unlock_bh(&br->multicast_lock); 338 err: 339 kfree(priv); 340 } 341 342 static void br_mdb_switchdev_host_port(struct net_device *dev, 343 struct net_device *lower_dev, 344 struct br_mdb_entry *entry, int type) 345 { 346 struct switchdev_obj_port_mdb mdb = { 347 .obj = { 348 .id = SWITCHDEV_OBJ_ID_HOST_MDB, 349 .flags = SWITCHDEV_F_DEFER, 350 }, 351 .vid = entry->vid, 352 }; 353 354 if (entry->addr.proto == htons(ETH_P_IP)) 355 ip_eth_mc_map(entry->addr.u.ip4, mdb.addr); 356 #if IS_ENABLED(CONFIG_IPV6) 357 else 358 ipv6_eth_mc_map(&entry->addr.u.ip6, mdb.addr); 359 #endif 360 361 mdb.obj.orig_dev = dev; 362 switch (type) { 363 case RTM_NEWMDB: 364 switchdev_port_obj_add(lower_dev, &mdb.obj, NULL); 365 break; 366 case RTM_DELMDB: 367 switchdev_port_obj_del(lower_dev, &mdb.obj); 368 break; 369 } 370 } 371 372 static void br_mdb_switchdev_host(struct net_device *dev, 373 struct br_mdb_entry *entry, int type) 374 { 375 struct net_device *lower_dev; 376 struct list_head *iter; 377 378 netdev_for_each_lower_dev(dev, lower_dev, iter) 379 br_mdb_switchdev_host_port(dev, lower_dev, entry, type); 380 } 381 382 static void __br_mdb_notify(struct net_device *dev, struct net_bridge_port *p, 383 struct br_mdb_entry *entry, int type) 384 { 385 struct br_mdb_complete_info *complete_info; 386 struct switchdev_obj_port_mdb mdb = { 387 .obj = { 388 .id = SWITCHDEV_OBJ_ID_PORT_MDB, 389 .flags = SWITCHDEV_F_DEFER, 390 }, 391 .vid = entry->vid, 392 }; 393 struct net_device *port_dev; 394 struct net *net = dev_net(dev); 395 struct sk_buff *skb; 396 int err = -ENOBUFS; 397 398 port_dev = __dev_get_by_index(net, entry->ifindex); 399 if (entry->addr.proto == htons(ETH_P_IP)) 400 ip_eth_mc_map(entry->addr.u.ip4, mdb.addr); 401 #if IS_ENABLED(CONFIG_IPV6) 402 else 403 ipv6_eth_mc_map(&entry->addr.u.ip6, mdb.addr); 404 #endif 405 406 mdb.obj.orig_dev = port_dev; 407 if (p && port_dev && type == RTM_NEWMDB) { 408 complete_info = kmalloc(sizeof(*complete_info), GFP_ATOMIC); 409 if (complete_info) { 410 complete_info->port = p; 411 __mdb_entry_to_br_ip(entry, &complete_info->ip); 412 mdb.obj.complete_priv = complete_info; 413 mdb.obj.complete = br_mdb_complete; 414 if (switchdev_port_obj_add(port_dev, &mdb.obj, NULL)) 415 kfree(complete_info); 416 } 417 } else if (p && port_dev && type == RTM_DELMDB) { 418 switchdev_port_obj_del(port_dev, &mdb.obj); 419 } 420 421 if (!p) 422 br_mdb_switchdev_host(dev, entry, type); 423 424 skb = nlmsg_new(rtnl_mdb_nlmsg_size(), GFP_ATOMIC); 425 if (!skb) 426 goto errout; 427 428 err = nlmsg_populate_mdb_fill(skb, dev, entry, 0, 0, type, NTF_SELF); 429 if (err < 0) { 430 kfree_skb(skb); 431 goto errout; 432 } 433 434 rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC); 435 return; 436 errout: 437 rtnl_set_sk_err(net, RTNLGRP_MDB, err); 438 } 439 440 void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port, 441 struct br_ip *group, int type, u8 flags) 442 { 443 struct br_mdb_entry entry; 444 445 memset(&entry, 0, sizeof(entry)); 446 if (port) 447 entry.ifindex = port->dev->ifindex; 448 else 449 entry.ifindex = dev->ifindex; 450 entry.addr.proto = group->proto; 451 entry.addr.u.ip4 = group->u.ip4; 452 #if IS_ENABLED(CONFIG_IPV6) 453 entry.addr.u.ip6 = group->u.ip6; 454 #endif 455 entry.vid = group->vid; 456 __mdb_entry_fill_flags(&entry, flags); 457 __br_mdb_notify(dev, port, &entry, type); 458 } 459 460 static int nlmsg_populate_rtr_fill(struct sk_buff *skb, 461 struct net_device *dev, 462 int ifindex, u32 pid, 463 u32 seq, int type, unsigned int flags) 464 { 465 struct br_port_msg *bpm; 466 struct nlmsghdr *nlh; 467 struct nlattr *nest; 468 469 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), NLM_F_MULTI); 470 if (!nlh) 471 return -EMSGSIZE; 472 473 bpm = nlmsg_data(nlh); 474 memset(bpm, 0, sizeof(*bpm)); 475 bpm->family = AF_BRIDGE; 476 bpm->ifindex = dev->ifindex; 477 nest = nla_nest_start_noflag(skb, MDBA_ROUTER); 478 if (!nest) 479 goto cancel; 480 481 if (nla_put_u32(skb, MDBA_ROUTER_PORT, ifindex)) 482 goto end; 483 484 nla_nest_end(skb, nest); 485 nlmsg_end(skb, nlh); 486 return 0; 487 488 end: 489 nla_nest_end(skb, nest); 490 cancel: 491 nlmsg_cancel(skb, nlh); 492 return -EMSGSIZE; 493 } 494 495 static inline size_t rtnl_rtr_nlmsg_size(void) 496 { 497 return NLMSG_ALIGN(sizeof(struct br_port_msg)) 498 + nla_total_size(sizeof(__u32)); 499 } 500 501 void br_rtr_notify(struct net_device *dev, struct net_bridge_port *port, 502 int type) 503 { 504 struct net *net = dev_net(dev); 505 struct sk_buff *skb; 506 int err = -ENOBUFS; 507 int ifindex; 508 509 ifindex = port ? port->dev->ifindex : 0; 510 skb = nlmsg_new(rtnl_rtr_nlmsg_size(), GFP_ATOMIC); 511 if (!skb) 512 goto errout; 513 514 err = nlmsg_populate_rtr_fill(skb, dev, ifindex, 0, 0, type, NTF_SELF); 515 if (err < 0) { 516 kfree_skb(skb); 517 goto errout; 518 } 519 520 rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC); 521 return; 522 523 errout: 524 rtnl_set_sk_err(net, RTNLGRP_MDB, err); 525 } 526 527 static bool is_valid_mdb_entry(struct br_mdb_entry *entry) 528 { 529 if (entry->ifindex == 0) 530 return false; 531 532 if (entry->addr.proto == htons(ETH_P_IP)) { 533 if (!ipv4_is_multicast(entry->addr.u.ip4)) 534 return false; 535 if (ipv4_is_local_multicast(entry->addr.u.ip4)) 536 return false; 537 #if IS_ENABLED(CONFIG_IPV6) 538 } else if (entry->addr.proto == htons(ETH_P_IPV6)) { 539 if (ipv6_addr_is_ll_all_nodes(&entry->addr.u.ip6)) 540 return false; 541 #endif 542 } else 543 return false; 544 if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY) 545 return false; 546 if (entry->vid >= VLAN_VID_MASK) 547 return false; 548 549 return true; 550 } 551 552 static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh, 553 struct net_device **pdev, struct br_mdb_entry **pentry) 554 { 555 struct net *net = sock_net(skb->sk); 556 struct br_mdb_entry *entry; 557 struct br_port_msg *bpm; 558 struct nlattr *tb[MDBA_SET_ENTRY_MAX+1]; 559 struct net_device *dev; 560 int err; 561 562 err = nlmsg_parse_deprecated(nlh, sizeof(*bpm), tb, 563 MDBA_SET_ENTRY_MAX, NULL, NULL); 564 if (err < 0) 565 return err; 566 567 bpm = nlmsg_data(nlh); 568 if (bpm->ifindex == 0) { 569 pr_info("PF_BRIDGE: br_mdb_parse() with invalid ifindex\n"); 570 return -EINVAL; 571 } 572 573 dev = __dev_get_by_index(net, bpm->ifindex); 574 if (dev == NULL) { 575 pr_info("PF_BRIDGE: br_mdb_parse() with unknown ifindex\n"); 576 return -ENODEV; 577 } 578 579 if (!(dev->priv_flags & IFF_EBRIDGE)) { 580 pr_info("PF_BRIDGE: br_mdb_parse() with non-bridge\n"); 581 return -EOPNOTSUPP; 582 } 583 584 *pdev = dev; 585 586 if (!tb[MDBA_SET_ENTRY] || 587 nla_len(tb[MDBA_SET_ENTRY]) != sizeof(struct br_mdb_entry)) { 588 pr_info("PF_BRIDGE: br_mdb_parse() with invalid attr\n"); 589 return -EINVAL; 590 } 591 592 entry = nla_data(tb[MDBA_SET_ENTRY]); 593 if (!is_valid_mdb_entry(entry)) { 594 pr_info("PF_BRIDGE: br_mdb_parse() with invalid entry\n"); 595 return -EINVAL; 596 } 597 598 *pentry = entry; 599 return 0; 600 } 601 602 static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, 603 struct br_ip *group, unsigned char state) 604 { 605 struct net_bridge_mdb_entry *mp; 606 struct net_bridge_port_group *p; 607 struct net_bridge_port_group __rcu **pp; 608 unsigned long now = jiffies; 609 int err; 610 611 mp = br_mdb_ip_get(br, group); 612 if (!mp) { 613 mp = br_multicast_new_group(br, group); 614 err = PTR_ERR_OR_ZERO(mp); 615 if (err) 616 return err; 617 } 618 619 /* host join */ 620 if (!port) { 621 /* don't allow any flags for host-joined groups */ 622 if (state) 623 return -EINVAL; 624 if (mp->host_joined) 625 return -EEXIST; 626 627 br_multicast_host_join(mp, false); 628 629 return 0; 630 } 631 632 for (pp = &mp->ports; 633 (p = mlock_dereference(*pp, br)) != NULL; 634 pp = &p->next) { 635 if (p->port == port) 636 return -EEXIST; 637 if ((unsigned long)p->port < (unsigned long)port) 638 break; 639 } 640 641 p = br_multicast_new_port_group(port, group, *pp, state, NULL); 642 if (unlikely(!p)) 643 return -ENOMEM; 644 rcu_assign_pointer(*pp, p); 645 if (state == MDB_TEMPORARY) 646 mod_timer(&p->timer, now + br->multicast_membership_interval); 647 648 return 0; 649 } 650 651 static int __br_mdb_add(struct net *net, struct net_bridge *br, 652 struct br_mdb_entry *entry) 653 { 654 struct br_ip ip; 655 struct net_device *dev; 656 struct net_bridge_port *p = NULL; 657 int ret; 658 659 if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED)) 660 return -EINVAL; 661 662 if (entry->ifindex != br->dev->ifindex) { 663 dev = __dev_get_by_index(net, entry->ifindex); 664 if (!dev) 665 return -ENODEV; 666 667 p = br_port_get_rtnl(dev); 668 if (!p || p->br != br || p->state == BR_STATE_DISABLED) 669 return -EINVAL; 670 } 671 672 __mdb_entry_to_br_ip(entry, &ip); 673 674 spin_lock_bh(&br->multicast_lock); 675 ret = br_mdb_add_group(br, p, &ip, entry->state); 676 spin_unlock_bh(&br->multicast_lock); 677 return ret; 678 } 679 680 static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh, 681 struct netlink_ext_ack *extack) 682 { 683 struct net *net = sock_net(skb->sk); 684 struct net_bridge_vlan_group *vg; 685 struct net_bridge_port *p = NULL; 686 struct net_device *dev, *pdev; 687 struct br_mdb_entry *entry; 688 struct net_bridge_vlan *v; 689 struct net_bridge *br; 690 int err; 691 692 err = br_mdb_parse(skb, nlh, &dev, &entry); 693 if (err < 0) 694 return err; 695 696 br = netdev_priv(dev); 697 698 if (entry->ifindex != br->dev->ifindex) { 699 pdev = __dev_get_by_index(net, entry->ifindex); 700 if (!pdev) 701 return -ENODEV; 702 703 p = br_port_get_rtnl(pdev); 704 if (!p || p->br != br || p->state == BR_STATE_DISABLED) 705 return -EINVAL; 706 vg = nbp_vlan_group(p); 707 } else { 708 vg = br_vlan_group(br); 709 } 710 711 /* If vlan filtering is enabled and VLAN is not specified 712 * install mdb entry on all vlans configured on the port. 713 */ 714 if (br_vlan_enabled(br->dev) && vg && entry->vid == 0) { 715 list_for_each_entry(v, &vg->vlan_list, vlist) { 716 entry->vid = v->vid; 717 err = __br_mdb_add(net, br, entry); 718 if (err) 719 break; 720 __br_mdb_notify(dev, p, entry, RTM_NEWMDB); 721 } 722 } else { 723 err = __br_mdb_add(net, br, entry); 724 if (!err) 725 __br_mdb_notify(dev, p, entry, RTM_NEWMDB); 726 } 727 728 return err; 729 } 730 731 static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry) 732 { 733 struct net_bridge_mdb_entry *mp; 734 struct net_bridge_port_group *p; 735 struct net_bridge_port_group __rcu **pp; 736 struct br_ip ip; 737 int err = -EINVAL; 738 739 if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED)) 740 return -EINVAL; 741 742 __mdb_entry_to_br_ip(entry, &ip); 743 744 spin_lock_bh(&br->multicast_lock); 745 mp = br_mdb_ip_get(br, &ip); 746 if (!mp) 747 goto unlock; 748 749 /* host leave */ 750 if (entry->ifindex == mp->br->dev->ifindex && mp->host_joined) { 751 br_multicast_host_leave(mp, false); 752 err = 0; 753 if (!mp->ports && netif_running(br->dev)) 754 mod_timer(&mp->timer, jiffies); 755 goto unlock; 756 } 757 758 for (pp = &mp->ports; 759 (p = mlock_dereference(*pp, br)) != NULL; 760 pp = &p->next) { 761 if (!p->port || p->port->dev->ifindex != entry->ifindex) 762 continue; 763 764 if (p->port->state == BR_STATE_DISABLED) 765 goto unlock; 766 767 __mdb_entry_fill_flags(entry, p->flags); 768 rcu_assign_pointer(*pp, p->next); 769 hlist_del_init(&p->mglist); 770 del_timer(&p->timer); 771 kfree_rcu(p, rcu); 772 err = 0; 773 774 if (!mp->ports && !mp->host_joined && 775 netif_running(br->dev)) 776 mod_timer(&mp->timer, jiffies); 777 break; 778 } 779 780 unlock: 781 spin_unlock_bh(&br->multicast_lock); 782 return err; 783 } 784 785 static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh, 786 struct netlink_ext_ack *extack) 787 { 788 struct net *net = sock_net(skb->sk); 789 struct net_bridge_vlan_group *vg; 790 struct net_bridge_port *p = NULL; 791 struct net_device *dev, *pdev; 792 struct br_mdb_entry *entry; 793 struct net_bridge_vlan *v; 794 struct net_bridge *br; 795 int err; 796 797 err = br_mdb_parse(skb, nlh, &dev, &entry); 798 if (err < 0) 799 return err; 800 801 br = netdev_priv(dev); 802 803 if (entry->ifindex != br->dev->ifindex) { 804 pdev = __dev_get_by_index(net, entry->ifindex); 805 if (!pdev) 806 return -ENODEV; 807 808 p = br_port_get_rtnl(pdev); 809 if (!p || p->br != br || p->state == BR_STATE_DISABLED) 810 return -EINVAL; 811 vg = nbp_vlan_group(p); 812 } else { 813 vg = br_vlan_group(br); 814 } 815 816 /* If vlan filtering is enabled and VLAN is not specified 817 * delete mdb entry on all vlans configured on the port. 818 */ 819 if (br_vlan_enabled(br->dev) && vg && entry->vid == 0) { 820 list_for_each_entry(v, &vg->vlan_list, vlist) { 821 entry->vid = v->vid; 822 err = __br_mdb_del(br, entry); 823 if (!err) 824 __br_mdb_notify(dev, p, entry, RTM_DELMDB); 825 } 826 } else { 827 err = __br_mdb_del(br, entry); 828 if (!err) 829 __br_mdb_notify(dev, p, entry, RTM_DELMDB); 830 } 831 832 return err; 833 } 834 835 void br_mdb_init(void) 836 { 837 rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_GETMDB, NULL, br_mdb_dump, 0); 838 rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, 0); 839 rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, 0); 840 } 841 842 void br_mdb_uninit(void) 843 { 844 rtnl_unregister(PF_BRIDGE, RTM_GETMDB); 845 rtnl_unregister(PF_BRIDGE, RTM_NEWMDB); 846 rtnl_unregister(PF_BRIDGE, RTM_DELMDB); 847 } 848