linux/net/bridge/br_mdb.c
<<
>>
Prefs
   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
  19static 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;
  52fail:
  53        nla_nest_cancel(skb, nest);
  54        return -EMSGSIZE;
  55}
  56
  57static 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        if (flags & MDB_PG_FLAGS_STAR_EXCL)
  66                e->flags |= MDB_FLAGS_STAR_EXCL;
  67        if (flags & MDB_PG_FLAGS_BLOCKED)
  68                e->flags |= MDB_FLAGS_BLOCKED;
  69}
  70
  71static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip,
  72                                 struct nlattr **mdb_attrs)
  73{
  74        memset(ip, 0, sizeof(struct br_ip));
  75        ip->vid = entry->vid;
  76        ip->proto = entry->addr.proto;
  77        switch (ip->proto) {
  78        case htons(ETH_P_IP):
  79                ip->dst.ip4 = entry->addr.u.ip4;
  80                if (mdb_attrs && mdb_attrs[MDBE_ATTR_SOURCE])
  81                        ip->src.ip4 = nla_get_in_addr(mdb_attrs[MDBE_ATTR_SOURCE]);
  82                break;
  83#if IS_ENABLED(CONFIG_IPV6)
  84        case htons(ETH_P_IPV6):
  85                ip->dst.ip6 = entry->addr.u.ip6;
  86                if (mdb_attrs && mdb_attrs[MDBE_ATTR_SOURCE])
  87                        ip->src.ip6 = nla_get_in6_addr(mdb_attrs[MDBE_ATTR_SOURCE]);
  88                break;
  89#endif
  90        }
  91
  92}
  93
  94static int __mdb_fill_srcs(struct sk_buff *skb,
  95                           struct net_bridge_port_group *p)
  96{
  97        struct net_bridge_group_src *ent;
  98        struct nlattr *nest, *nest_ent;
  99
 100        if (hlist_empty(&p->src_list))
 101                return 0;
 102
 103        nest = nla_nest_start(skb, MDBA_MDB_EATTR_SRC_LIST);
 104        if (!nest)
 105                return -EMSGSIZE;
 106
 107        hlist_for_each_entry_rcu(ent, &p->src_list, node,
 108                                 lockdep_is_held(&p->key.port->br->multicast_lock)) {
 109                nest_ent = nla_nest_start(skb, MDBA_MDB_SRCLIST_ENTRY);
 110                if (!nest_ent)
 111                        goto out_cancel_err;
 112                switch (ent->addr.proto) {
 113                case htons(ETH_P_IP):
 114                        if (nla_put_in_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
 115                                            ent->addr.src.ip4)) {
 116                                nla_nest_cancel(skb, nest_ent);
 117                                goto out_cancel_err;
 118                        }
 119                        break;
 120#if IS_ENABLED(CONFIG_IPV6)
 121                case htons(ETH_P_IPV6):
 122                        if (nla_put_in6_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
 123                                             &ent->addr.src.ip6)) {
 124                                nla_nest_cancel(skb, nest_ent);
 125                                goto out_cancel_err;
 126                        }
 127                        break;
 128#endif
 129                default:
 130                        nla_nest_cancel(skb, nest_ent);
 131                        continue;
 132                }
 133                if (nla_put_u32(skb, MDBA_MDB_SRCATTR_TIMER,
 134                                br_timer_value(&ent->timer))) {
 135                        nla_nest_cancel(skb, nest_ent);
 136                        goto out_cancel_err;
 137                }
 138                nla_nest_end(skb, nest_ent);
 139        }
 140
 141        nla_nest_end(skb, nest);
 142
 143        return 0;
 144
 145out_cancel_err:
 146        nla_nest_cancel(skb, nest);
 147        return -EMSGSIZE;
 148}
 149
 150static int __mdb_fill_info(struct sk_buff *skb,
 151                           struct net_bridge_mdb_entry *mp,
 152                           struct net_bridge_port_group *p)
 153{
 154        bool dump_srcs_mode = false;
 155        struct timer_list *mtimer;
 156        struct nlattr *nest_ent;
 157        struct br_mdb_entry e;
 158        u8 flags = 0;
 159        int ifindex;
 160
 161        memset(&e, 0, sizeof(e));
 162        if (p) {
 163                ifindex = p->key.port->dev->ifindex;
 164                mtimer = &p->timer;
 165                flags = p->flags;
 166        } else {
 167                ifindex = mp->br->dev->ifindex;
 168                mtimer = &mp->timer;
 169        }
 170
 171        __mdb_entry_fill_flags(&e, flags);
 172        e.ifindex = ifindex;
 173        e.vid = mp->addr.vid;
 174        if (mp->addr.proto == htons(ETH_P_IP))
 175                e.addr.u.ip4 = mp->addr.dst.ip4;
 176#if IS_ENABLED(CONFIG_IPV6)
 177        if (mp->addr.proto == htons(ETH_P_IPV6))
 178                e.addr.u.ip6 = mp->addr.dst.ip6;
 179#endif
 180        e.addr.proto = mp->addr.proto;
 181        nest_ent = nla_nest_start_noflag(skb,
 182                                         MDBA_MDB_ENTRY_INFO);
 183        if (!nest_ent)
 184                return -EMSGSIZE;
 185
 186        if (nla_put_nohdr(skb, sizeof(e), &e) ||
 187            nla_put_u32(skb,
 188                        MDBA_MDB_EATTR_TIMER,
 189                        br_timer_value(mtimer)))
 190                goto nest_err;
 191
 192        switch (mp->addr.proto) {
 193        case htons(ETH_P_IP):
 194                dump_srcs_mode = !!(mp->br->multicast_igmp_version == 3);
 195                if (mp->addr.src.ip4) {
 196                        if (nla_put_in_addr(skb, MDBA_MDB_EATTR_SOURCE,
 197                                            mp->addr.src.ip4))
 198                                goto nest_err;
 199                        break;
 200                }
 201                break;
 202#if IS_ENABLED(CONFIG_IPV6)
 203        case htons(ETH_P_IPV6):
 204                dump_srcs_mode = !!(mp->br->multicast_mld_version == 2);
 205                if (!ipv6_addr_any(&mp->addr.src.ip6)) {
 206                        if (nla_put_in6_addr(skb, MDBA_MDB_EATTR_SOURCE,
 207                                             &mp->addr.src.ip6))
 208                                goto nest_err;
 209                        break;
 210                }
 211                break;
 212#endif
 213        }
 214        if (p) {
 215                if (nla_put_u8(skb, MDBA_MDB_EATTR_RTPROT, p->rt_protocol))
 216                        goto nest_err;
 217                if (dump_srcs_mode &&
 218                    (__mdb_fill_srcs(skb, p) ||
 219                     nla_put_u8(skb, MDBA_MDB_EATTR_GROUP_MODE,
 220                                p->filter_mode)))
 221                        goto nest_err;
 222        }
 223        nla_nest_end(skb, nest_ent);
 224
 225        return 0;
 226
 227nest_err:
 228        nla_nest_cancel(skb, nest_ent);
 229        return -EMSGSIZE;
 230}
 231
 232static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
 233                            struct net_device *dev)
 234{
 235        int idx = 0, s_idx = cb->args[1], err = 0, pidx = 0, s_pidx = cb->args[2];
 236        struct net_bridge *br = netdev_priv(dev);
 237        struct net_bridge_mdb_entry *mp;
 238        struct nlattr *nest, *nest2;
 239
 240        if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
 241                return 0;
 242
 243        nest = nla_nest_start_noflag(skb, MDBA_MDB);
 244        if (nest == NULL)
 245                return -EMSGSIZE;
 246
 247        hlist_for_each_entry_rcu(mp, &br->mdb_list, mdb_node) {
 248                struct net_bridge_port_group *p;
 249                struct net_bridge_port_group __rcu **pp;
 250
 251                if (idx < s_idx)
 252                        goto skip;
 253
 254                nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
 255                if (!nest2) {
 256                        err = -EMSGSIZE;
 257                        break;
 258                }
 259
 260                if (!s_pidx && mp->host_joined) {
 261                        err = __mdb_fill_info(skb, mp, NULL);
 262                        if (err) {
 263                                nla_nest_cancel(skb, nest2);
 264                                break;
 265                        }
 266                }
 267
 268                for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL;
 269                      pp = &p->next) {
 270                        if (!p->key.port)
 271                                continue;
 272                        if (pidx < s_pidx)
 273                                goto skip_pg;
 274
 275                        err = __mdb_fill_info(skb, mp, p);
 276                        if (err) {
 277                                nla_nest_end(skb, nest2);
 278                                goto out;
 279                        }
 280skip_pg:
 281                        pidx++;
 282                }
 283                pidx = 0;
 284                s_pidx = 0;
 285                nla_nest_end(skb, nest2);
 286skip:
 287                idx++;
 288        }
 289
 290out:
 291        cb->args[1] = idx;
 292        cb->args[2] = pidx;
 293        nla_nest_end(skb, nest);
 294        return err;
 295}
 296
 297static int br_mdb_valid_dump_req(const struct nlmsghdr *nlh,
 298                                 struct netlink_ext_ack *extack)
 299{
 300        struct br_port_msg *bpm;
 301
 302        if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*bpm))) {
 303                NL_SET_ERR_MSG_MOD(extack, "Invalid header for mdb dump request");
 304                return -EINVAL;
 305        }
 306
 307        bpm = nlmsg_data(nlh);
 308        if (bpm->ifindex) {
 309                NL_SET_ERR_MSG_MOD(extack, "Filtering by device index is not supported for mdb dump request");
 310                return -EINVAL;
 311        }
 312        if (nlmsg_attrlen(nlh, sizeof(*bpm))) {
 313                NL_SET_ERR_MSG(extack, "Invalid data after header in mdb dump request");
 314                return -EINVAL;
 315        }
 316
 317        return 0;
 318}
 319
 320static int br_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
 321{
 322        struct net_device *dev;
 323        struct net *net = sock_net(skb->sk);
 324        struct nlmsghdr *nlh = NULL;
 325        int idx = 0, s_idx;
 326
 327        if (cb->strict_check) {
 328                int err = br_mdb_valid_dump_req(cb->nlh, cb->extack);
 329
 330                if (err < 0)
 331                        return err;
 332        }
 333
 334        s_idx = cb->args[0];
 335
 336        rcu_read_lock();
 337
 338        cb->seq = net->dev_base_seq;
 339
 340        for_each_netdev_rcu(net, dev) {
 341                if (dev->priv_flags & IFF_EBRIDGE) {
 342                        struct br_port_msg *bpm;
 343
 344                        if (idx < s_idx)
 345                                goto skip;
 346
 347                        nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
 348                                        cb->nlh->nlmsg_seq, RTM_GETMDB,
 349                                        sizeof(*bpm), NLM_F_MULTI);
 350                        if (nlh == NULL)
 351                                break;
 352
 353                        bpm = nlmsg_data(nlh);
 354                        memset(bpm, 0, sizeof(*bpm));
 355                        bpm->ifindex = dev->ifindex;
 356                        if (br_mdb_fill_info(skb, cb, dev) < 0)
 357                                goto out;
 358                        if (br_rports_fill_info(skb, cb, dev) < 0)
 359                                goto out;
 360
 361                        cb->args[1] = 0;
 362                        nlmsg_end(skb, nlh);
 363                skip:
 364                        idx++;
 365                }
 366        }
 367
 368out:
 369        if (nlh)
 370                nlmsg_end(skb, nlh);
 371        rcu_read_unlock();
 372        cb->args[0] = idx;
 373        return skb->len;
 374}
 375
 376static int nlmsg_populate_mdb_fill(struct sk_buff *skb,
 377                                   struct net_device *dev,
 378                                   struct net_bridge_mdb_entry *mp,
 379                                   struct net_bridge_port_group *pg,
 380                                   int type)
 381{
 382        struct nlmsghdr *nlh;
 383        struct br_port_msg *bpm;
 384        struct nlattr *nest, *nest2;
 385
 386        nlh = nlmsg_put(skb, 0, 0, type, sizeof(*bpm), 0);
 387        if (!nlh)
 388                return -EMSGSIZE;
 389
 390        bpm = nlmsg_data(nlh);
 391        memset(bpm, 0, sizeof(*bpm));
 392        bpm->family  = AF_BRIDGE;
 393        bpm->ifindex = dev->ifindex;
 394        nest = nla_nest_start_noflag(skb, MDBA_MDB);
 395        if (nest == NULL)
 396                goto cancel;
 397        nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
 398        if (nest2 == NULL)
 399                goto end;
 400
 401        if (__mdb_fill_info(skb, mp, pg))
 402                goto end;
 403
 404        nla_nest_end(skb, nest2);
 405        nla_nest_end(skb, nest);
 406        nlmsg_end(skb, nlh);
 407        return 0;
 408
 409end:
 410        nla_nest_end(skb, nest);
 411cancel:
 412        nlmsg_cancel(skb, nlh);
 413        return -EMSGSIZE;
 414}
 415
 416static size_t rtnl_mdb_nlmsg_size(struct net_bridge_port_group *pg)
 417{
 418        size_t nlmsg_size = NLMSG_ALIGN(sizeof(struct br_port_msg)) +
 419                            nla_total_size(sizeof(struct br_mdb_entry)) +
 420                            nla_total_size(sizeof(u32));
 421        struct net_bridge_group_src *ent;
 422        size_t addr_size = 0;
 423
 424        if (!pg)
 425                goto out;
 426
 427        /* MDBA_MDB_EATTR_RTPROT */
 428        nlmsg_size += nla_total_size(sizeof(u8));
 429
 430        switch (pg->key.addr.proto) {
 431        case htons(ETH_P_IP):
 432                /* MDBA_MDB_EATTR_SOURCE */
 433                if (pg->key.addr.src.ip4)
 434                        nlmsg_size += nla_total_size(sizeof(__be32));
 435                if (pg->key.port->br->multicast_igmp_version == 2)
 436                        goto out;
 437                addr_size = sizeof(__be32);
 438                break;
 439#if IS_ENABLED(CONFIG_IPV6)
 440        case htons(ETH_P_IPV6):
 441                /* MDBA_MDB_EATTR_SOURCE */
 442                if (!ipv6_addr_any(&pg->key.addr.src.ip6))
 443                        nlmsg_size += nla_total_size(sizeof(struct in6_addr));
 444                if (pg->key.port->br->multicast_mld_version == 1)
 445                        goto out;
 446                addr_size = sizeof(struct in6_addr);
 447                break;
 448#endif
 449        }
 450
 451        /* MDBA_MDB_EATTR_GROUP_MODE */
 452        nlmsg_size += nla_total_size(sizeof(u8));
 453
 454        /* MDBA_MDB_EATTR_SRC_LIST nested attr */
 455        if (!hlist_empty(&pg->src_list))
 456                nlmsg_size += nla_total_size(0);
 457
 458        hlist_for_each_entry(ent, &pg->src_list, node) {
 459                /* MDBA_MDB_SRCLIST_ENTRY nested attr +
 460                 * MDBA_MDB_SRCATTR_ADDRESS + MDBA_MDB_SRCATTR_TIMER
 461                 */
 462                nlmsg_size += nla_total_size(0) +
 463                              nla_total_size(addr_size) +
 464                              nla_total_size(sizeof(u32));
 465        }
 466out:
 467        return nlmsg_size;
 468}
 469
 470struct br_mdb_complete_info {
 471        struct net_bridge_port *port;
 472        struct br_ip ip;
 473};
 474
 475static void br_mdb_complete(struct net_device *dev, int err, void *priv)
 476{
 477        struct br_mdb_complete_info *data = priv;
 478        struct net_bridge_port_group __rcu **pp;
 479        struct net_bridge_port_group *p;
 480        struct net_bridge_mdb_entry *mp;
 481        struct net_bridge_port *port = data->port;
 482        struct net_bridge *br = port->br;
 483
 484        if (err)
 485                goto err;
 486
 487        spin_lock_bh(&br->multicast_lock);
 488        mp = br_mdb_ip_get(br, &data->ip);
 489        if (!mp)
 490                goto out;
 491        for (pp = &mp->ports; (p = mlock_dereference(*pp, br)) != NULL;
 492             pp = &p->next) {
 493                if (p->key.port != port)
 494                        continue;
 495                p->flags |= MDB_PG_FLAGS_OFFLOAD;
 496        }
 497out:
 498        spin_unlock_bh(&br->multicast_lock);
 499err:
 500        kfree(priv);
 501}
 502
 503static void br_mdb_switchdev_host_port(struct net_device *dev,
 504                                       struct net_device *lower_dev,
 505                                       struct net_bridge_mdb_entry *mp,
 506                                       int type)
 507{
 508        struct switchdev_obj_port_mdb mdb = {
 509                .obj = {
 510                        .id = SWITCHDEV_OBJ_ID_HOST_MDB,
 511                        .flags = SWITCHDEV_F_DEFER,
 512                },
 513                .vid = mp->addr.vid,
 514        };
 515
 516        if (mp->addr.proto == htons(ETH_P_IP))
 517                ip_eth_mc_map(mp->addr.dst.ip4, mdb.addr);
 518#if IS_ENABLED(CONFIG_IPV6)
 519        else
 520                ipv6_eth_mc_map(&mp->addr.dst.ip6, mdb.addr);
 521#endif
 522
 523        mdb.obj.orig_dev = dev;
 524        switch (type) {
 525        case RTM_NEWMDB:
 526                switchdev_port_obj_add(lower_dev, &mdb.obj, NULL);
 527                break;
 528        case RTM_DELMDB:
 529                switchdev_port_obj_del(lower_dev, &mdb.obj);
 530                break;
 531        }
 532}
 533
 534static void br_mdb_switchdev_host(struct net_device *dev,
 535                                  struct net_bridge_mdb_entry *mp, int type)
 536{
 537        struct net_device *lower_dev;
 538        struct list_head *iter;
 539
 540        netdev_for_each_lower_dev(dev, lower_dev, iter)
 541                br_mdb_switchdev_host_port(dev, lower_dev, mp, type);
 542}
 543
 544void br_mdb_notify(struct net_device *dev,
 545                   struct net_bridge_mdb_entry *mp,
 546                   struct net_bridge_port_group *pg,
 547                   int type)
 548{
 549        struct br_mdb_complete_info *complete_info;
 550        struct switchdev_obj_port_mdb mdb = {
 551                .obj = {
 552                        .id = SWITCHDEV_OBJ_ID_PORT_MDB,
 553                        .flags = SWITCHDEV_F_DEFER,
 554                },
 555                .vid = mp->addr.vid,
 556        };
 557        struct net *net = dev_net(dev);
 558        struct sk_buff *skb;
 559        int err = -ENOBUFS;
 560
 561        if (pg) {
 562                if (mp->addr.proto == htons(ETH_P_IP))
 563                        ip_eth_mc_map(mp->addr.dst.ip4, mdb.addr);
 564#if IS_ENABLED(CONFIG_IPV6)
 565                else
 566                        ipv6_eth_mc_map(&mp->addr.dst.ip6, mdb.addr);
 567#endif
 568                mdb.obj.orig_dev = pg->key.port->dev;
 569                switch (type) {
 570                case RTM_NEWMDB:
 571                        complete_info = kmalloc(sizeof(*complete_info), GFP_ATOMIC);
 572                        if (!complete_info)
 573                                break;
 574                        complete_info->port = pg->key.port;
 575                        complete_info->ip = mp->addr;
 576                        mdb.obj.complete_priv = complete_info;
 577                        mdb.obj.complete = br_mdb_complete;
 578                        if (switchdev_port_obj_add(pg->key.port->dev, &mdb.obj, NULL))
 579                                kfree(complete_info);
 580                        break;
 581                case RTM_DELMDB:
 582                        switchdev_port_obj_del(pg->key.port->dev, &mdb.obj);
 583                        break;
 584                }
 585        } else {
 586                br_mdb_switchdev_host(dev, mp, type);
 587        }
 588
 589        skb = nlmsg_new(rtnl_mdb_nlmsg_size(pg), GFP_ATOMIC);
 590        if (!skb)
 591                goto errout;
 592
 593        err = nlmsg_populate_mdb_fill(skb, dev, mp, pg, type);
 594        if (err < 0) {
 595                kfree_skb(skb);
 596                goto errout;
 597        }
 598
 599        rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
 600        return;
 601errout:
 602        rtnl_set_sk_err(net, RTNLGRP_MDB, err);
 603}
 604
 605static int nlmsg_populate_rtr_fill(struct sk_buff *skb,
 606                                   struct net_device *dev,
 607                                   int ifindex, u32 pid,
 608                                   u32 seq, int type, unsigned int flags)
 609{
 610        struct br_port_msg *bpm;
 611        struct nlmsghdr *nlh;
 612        struct nlattr *nest;
 613
 614        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), 0);
 615        if (!nlh)
 616                return -EMSGSIZE;
 617
 618        bpm = nlmsg_data(nlh);
 619        memset(bpm, 0, sizeof(*bpm));
 620        bpm->family = AF_BRIDGE;
 621        bpm->ifindex = dev->ifindex;
 622        nest = nla_nest_start_noflag(skb, MDBA_ROUTER);
 623        if (!nest)
 624                goto cancel;
 625
 626        if (nla_put_u32(skb, MDBA_ROUTER_PORT, ifindex))
 627                goto end;
 628
 629        nla_nest_end(skb, nest);
 630        nlmsg_end(skb, nlh);
 631        return 0;
 632
 633end:
 634        nla_nest_end(skb, nest);
 635cancel:
 636        nlmsg_cancel(skb, nlh);
 637        return -EMSGSIZE;
 638}
 639
 640static inline size_t rtnl_rtr_nlmsg_size(void)
 641{
 642        return NLMSG_ALIGN(sizeof(struct br_port_msg))
 643                + nla_total_size(sizeof(__u32));
 644}
 645
 646void br_rtr_notify(struct net_device *dev, struct net_bridge_port *port,
 647                   int type)
 648{
 649        struct net *net = dev_net(dev);
 650        struct sk_buff *skb;
 651        int err = -ENOBUFS;
 652        int ifindex;
 653
 654        ifindex = port ? port->dev->ifindex : 0;
 655        skb = nlmsg_new(rtnl_rtr_nlmsg_size(), GFP_ATOMIC);
 656        if (!skb)
 657                goto errout;
 658
 659        err = nlmsg_populate_rtr_fill(skb, dev, ifindex, 0, 0, type, NTF_SELF);
 660        if (err < 0) {
 661                kfree_skb(skb);
 662                goto errout;
 663        }
 664
 665        rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
 666        return;
 667
 668errout:
 669        rtnl_set_sk_err(net, RTNLGRP_MDB, err);
 670}
 671
 672static bool is_valid_mdb_entry(struct br_mdb_entry *entry,
 673                               struct netlink_ext_ack *extack)
 674{
 675        if (entry->ifindex == 0) {
 676                NL_SET_ERR_MSG_MOD(extack, "Zero entry ifindex is not allowed");
 677                return false;
 678        }
 679
 680        if (entry->addr.proto == htons(ETH_P_IP)) {
 681                if (!ipv4_is_multicast(entry->addr.u.ip4)) {
 682                        NL_SET_ERR_MSG_MOD(extack, "IPv4 entry group address is not multicast");
 683                        return false;
 684                }
 685                if (ipv4_is_local_multicast(entry->addr.u.ip4)) {
 686                        NL_SET_ERR_MSG_MOD(extack, "IPv4 entry group address is local multicast");
 687                        return false;
 688                }
 689#if IS_ENABLED(CONFIG_IPV6)
 690        } else if (entry->addr.proto == htons(ETH_P_IPV6)) {
 691                if (ipv6_addr_is_ll_all_nodes(&entry->addr.u.ip6)) {
 692                        NL_SET_ERR_MSG_MOD(extack, "IPv6 entry group address is link-local all nodes");
 693                        return false;
 694                }
 695#endif
 696        } else {
 697                NL_SET_ERR_MSG_MOD(extack, "Unknown entry protocol");
 698                return false;
 699        }
 700
 701        if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY) {
 702                NL_SET_ERR_MSG_MOD(extack, "Unknown entry state");
 703                return false;
 704        }
 705        if (entry->vid >= VLAN_VID_MASK) {
 706                NL_SET_ERR_MSG_MOD(extack, "Invalid entry VLAN id");
 707                return false;
 708        }
 709
 710        return true;
 711}
 712
 713static bool is_valid_mdb_source(struct nlattr *attr, __be16 proto,
 714                                struct netlink_ext_ack *extack)
 715{
 716        switch (proto) {
 717        case htons(ETH_P_IP):
 718                if (nla_len(attr) != sizeof(struct in_addr)) {
 719                        NL_SET_ERR_MSG_MOD(extack, "IPv4 invalid source address length");
 720                        return false;
 721                }
 722                if (ipv4_is_multicast(nla_get_in_addr(attr))) {
 723                        NL_SET_ERR_MSG_MOD(extack, "IPv4 multicast source address is not allowed");
 724                        return false;
 725                }
 726                break;
 727#if IS_ENABLED(CONFIG_IPV6)
 728        case htons(ETH_P_IPV6): {
 729                struct in6_addr src;
 730
 731                if (nla_len(attr) != sizeof(struct in6_addr)) {
 732                        NL_SET_ERR_MSG_MOD(extack, "IPv6 invalid source address length");
 733                        return false;
 734                }
 735                src = nla_get_in6_addr(attr);
 736                if (ipv6_addr_is_multicast(&src)) {
 737                        NL_SET_ERR_MSG_MOD(extack, "IPv6 multicast source address is not allowed");
 738                        return false;
 739                }
 740                break;
 741        }
 742#endif
 743        default:
 744                NL_SET_ERR_MSG_MOD(extack, "Invalid protocol used with source address");
 745                return false;
 746        }
 747
 748        return true;
 749}
 750
 751static const struct nla_policy br_mdbe_attrs_pol[MDBE_ATTR_MAX + 1] = {
 752        [MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
 753                                              sizeof(struct in_addr),
 754                                              sizeof(struct in6_addr)),
 755};
 756
 757static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
 758                        struct net_device **pdev, struct br_mdb_entry **pentry,
 759                        struct nlattr **mdb_attrs, struct netlink_ext_ack *extack)
 760{
 761        struct net *net = sock_net(skb->sk);
 762        struct br_mdb_entry *entry;
 763        struct br_port_msg *bpm;
 764        struct nlattr *tb[MDBA_SET_ENTRY_MAX+1];
 765        struct net_device *dev;
 766        int err;
 767
 768        err = nlmsg_parse_deprecated(nlh, sizeof(*bpm), tb,
 769                                     MDBA_SET_ENTRY_MAX, NULL, NULL);
 770        if (err < 0)
 771                return err;
 772
 773        bpm = nlmsg_data(nlh);
 774        if (bpm->ifindex == 0) {
 775                NL_SET_ERR_MSG_MOD(extack, "Invalid bridge ifindex");
 776                return -EINVAL;
 777        }
 778
 779        dev = __dev_get_by_index(net, bpm->ifindex);
 780        if (dev == NULL) {
 781                NL_SET_ERR_MSG_MOD(extack, "Bridge device doesn't exist");
 782                return -ENODEV;
 783        }
 784
 785        if (!(dev->priv_flags & IFF_EBRIDGE)) {
 786                NL_SET_ERR_MSG_MOD(extack, "Device is not a bridge");
 787                return -EOPNOTSUPP;
 788        }
 789
 790        *pdev = dev;
 791
 792        if (!tb[MDBA_SET_ENTRY]) {
 793                NL_SET_ERR_MSG_MOD(extack, "Missing MDBA_SET_ENTRY attribute");
 794                return -EINVAL;
 795        }
 796        if (nla_len(tb[MDBA_SET_ENTRY]) != sizeof(struct br_mdb_entry)) {
 797                NL_SET_ERR_MSG_MOD(extack, "Invalid MDBA_SET_ENTRY attribute length");
 798                return -EINVAL;
 799        }
 800
 801        entry = nla_data(tb[MDBA_SET_ENTRY]);
 802        if (!is_valid_mdb_entry(entry, extack))
 803                return -EINVAL;
 804        *pentry = entry;
 805
 806        if (tb[MDBA_SET_ENTRY_ATTRS]) {
 807                err = nla_parse_nested(mdb_attrs, MDBE_ATTR_MAX,
 808                                       tb[MDBA_SET_ENTRY_ATTRS],
 809                                       br_mdbe_attrs_pol, extack);
 810                if (err)
 811                        return err;
 812                if (mdb_attrs[MDBE_ATTR_SOURCE] &&
 813                    !is_valid_mdb_source(mdb_attrs[MDBE_ATTR_SOURCE],
 814                                         entry->addr.proto, extack))
 815                        return -EINVAL;
 816        } else {
 817                memset(mdb_attrs, 0,
 818                       sizeof(struct nlattr *) * (MDBE_ATTR_MAX + 1));
 819        }
 820
 821        return 0;
 822}
 823
 824static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
 825                            struct br_mdb_entry *entry,
 826                            struct nlattr **mdb_attrs,
 827                            struct netlink_ext_ack *extack)
 828{
 829        struct net_bridge_mdb_entry *mp, *star_mp;
 830        struct net_bridge_port_group *p;
 831        struct net_bridge_port_group __rcu **pp;
 832        struct br_ip group, star_group;
 833        unsigned long now = jiffies;
 834        u8 filter_mode;
 835        int err;
 836
 837        __mdb_entry_to_br_ip(entry, &group, mdb_attrs);
 838
 839        /* host join errors which can happen before creating the group */
 840        if (!port) {
 841                /* don't allow any flags for host-joined groups */
 842                if (entry->state) {
 843                        NL_SET_ERR_MSG_MOD(extack, "Flags are not allowed for host groups");
 844                        return -EINVAL;
 845                }
 846                if (!br_multicast_is_star_g(&group)) {
 847                        NL_SET_ERR_MSG_MOD(extack, "Groups with sources cannot be manually host joined");
 848                        return -EINVAL;
 849                }
 850        }
 851
 852        mp = br_mdb_ip_get(br, &group);
 853        if (!mp) {
 854                mp = br_multicast_new_group(br, &group);
 855                err = PTR_ERR_OR_ZERO(mp);
 856                if (err)
 857                        return err;
 858        }
 859
 860        /* host join */
 861        if (!port) {
 862                if (mp->host_joined) {
 863                        NL_SET_ERR_MSG_MOD(extack, "Group is already joined by host");
 864                        return -EEXIST;
 865                }
 866
 867                br_multicast_host_join(mp, false);
 868                br_mdb_notify(br->dev, mp, NULL, RTM_NEWMDB);
 869
 870                return 0;
 871        }
 872
 873        for (pp = &mp->ports;
 874             (p = mlock_dereference(*pp, br)) != NULL;
 875             pp = &p->next) {
 876                if (p->key.port == port) {
 877                        NL_SET_ERR_MSG_MOD(extack, "Group is already joined by port");
 878                        return -EEXIST;
 879                }
 880                if ((unsigned long)p->key.port < (unsigned long)port)
 881                        break;
 882        }
 883
 884        filter_mode = br_multicast_is_star_g(&group) ? MCAST_EXCLUDE :
 885                                                       MCAST_INCLUDE;
 886
 887        p = br_multicast_new_port_group(port, &group, *pp, entry->state, NULL,
 888                                        filter_mode, RTPROT_STATIC);
 889        if (unlikely(!p)) {
 890                NL_SET_ERR_MSG_MOD(extack, "Couldn't allocate new port group");
 891                return -ENOMEM;
 892        }
 893        rcu_assign_pointer(*pp, p);
 894        if (entry->state == MDB_TEMPORARY)
 895                mod_timer(&p->timer, now + br->multicast_membership_interval);
 896        br_mdb_notify(br->dev, mp, p, RTM_NEWMDB);
 897        /* if we are adding a new EXCLUDE port group (*,G) it needs to be also
 898         * added to all S,G entries for proper replication, if we are adding
 899         * a new INCLUDE port (S,G) then all of *,G EXCLUDE ports need to be
 900         * added to it for proper replication
 901         */
 902        if (br_multicast_should_handle_mode(br, group.proto)) {
 903                switch (filter_mode) {
 904                case MCAST_EXCLUDE:
 905                        br_multicast_star_g_handle_mode(p, MCAST_EXCLUDE);
 906                        break;
 907                case MCAST_INCLUDE:
 908                        star_group = p->key.addr;
 909                        memset(&star_group.src, 0, sizeof(star_group.src));
 910                        star_mp = br_mdb_ip_get(br, &star_group);
 911                        if (star_mp)
 912                                br_multicast_sg_add_exclude_ports(star_mp, p);
 913                        break;
 914                }
 915        }
 916
 917        return 0;
 918}
 919
 920static int __br_mdb_add(struct net *net, struct net_bridge *br,
 921                        struct net_bridge_port *p,
 922                        struct br_mdb_entry *entry,
 923                        struct nlattr **mdb_attrs,
 924                        struct netlink_ext_ack *extack)
 925{
 926        int ret;
 927
 928        spin_lock_bh(&br->multicast_lock);
 929        ret = br_mdb_add_group(br, p, entry, mdb_attrs, extack);
 930        spin_unlock_bh(&br->multicast_lock);
 931
 932        return ret;
 933}
 934
 935static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
 936                      struct netlink_ext_ack *extack)
 937{
 938        struct nlattr *mdb_attrs[MDBE_ATTR_MAX + 1];
 939        struct net *net = sock_net(skb->sk);
 940        struct net_bridge_vlan_group *vg;
 941        struct net_bridge_port *p = NULL;
 942        struct net_device *dev, *pdev;
 943        struct br_mdb_entry *entry;
 944        struct net_bridge_vlan *v;
 945        struct net_bridge *br;
 946        int err;
 947
 948        err = br_mdb_parse(skb, nlh, &dev, &entry, mdb_attrs, extack);
 949        if (err < 0)
 950                return err;
 951
 952        br = netdev_priv(dev);
 953
 954        if (!netif_running(br->dev)) {
 955                NL_SET_ERR_MSG_MOD(extack, "Bridge device is not running");
 956                return -EINVAL;
 957        }
 958
 959        if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) {
 960                NL_SET_ERR_MSG_MOD(extack, "Bridge's multicast processing is disabled");
 961                return -EINVAL;
 962        }
 963
 964        if (entry->ifindex != br->dev->ifindex) {
 965                pdev = __dev_get_by_index(net, entry->ifindex);
 966                if (!pdev) {
 967                        NL_SET_ERR_MSG_MOD(extack, "Port net device doesn't exist");
 968                        return -ENODEV;
 969                }
 970
 971                p = br_port_get_rtnl(pdev);
 972                if (!p) {
 973                        NL_SET_ERR_MSG_MOD(extack, "Net device is not a bridge port");
 974                        return -EINVAL;
 975                }
 976
 977                if (p->br != br) {
 978                        NL_SET_ERR_MSG_MOD(extack, "Port belongs to a different bridge device");
 979                        return -EINVAL;
 980                }
 981                if (p->state == BR_STATE_DISABLED) {
 982                        NL_SET_ERR_MSG_MOD(extack, "Port is in disabled state");
 983                        return -EINVAL;
 984                }
 985                vg = nbp_vlan_group(p);
 986        } else {
 987                vg = br_vlan_group(br);
 988        }
 989
 990        /* If vlan filtering is enabled and VLAN is not specified
 991         * install mdb entry on all vlans configured on the port.
 992         */
 993        if (br_vlan_enabled(br->dev) && vg && entry->vid == 0) {
 994                list_for_each_entry(v, &vg->vlan_list, vlist) {
 995                        entry->vid = v->vid;
 996                        err = __br_mdb_add(net, br, p, entry, mdb_attrs, extack);
 997                        if (err)
 998                                break;
 999                }
1000        } else {
1001                err = __br_mdb_add(net, br, p, entry, mdb_attrs, extack);
1002        }
1003
1004        return err;
1005}
1006
1007static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry,
1008                        struct nlattr **mdb_attrs)
1009{
1010        struct net_bridge_mdb_entry *mp;
1011        struct net_bridge_port_group *p;
1012        struct net_bridge_port_group __rcu **pp;
1013        struct br_ip ip;
1014        int err = -EINVAL;
1015
1016        if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED))
1017                return -EINVAL;
1018
1019        __mdb_entry_to_br_ip(entry, &ip, mdb_attrs);
1020
1021        spin_lock_bh(&br->multicast_lock);
1022        mp = br_mdb_ip_get(br, &ip);
1023        if (!mp)
1024                goto unlock;
1025
1026        /* host leave */
1027        if (entry->ifindex == mp->br->dev->ifindex && mp->host_joined) {
1028                br_multicast_host_leave(mp, false);
1029                err = 0;
1030                br_mdb_notify(br->dev, mp, NULL, RTM_DELMDB);
1031                if (!mp->ports && netif_running(br->dev))
1032                        mod_timer(&mp->timer, jiffies);
1033                goto unlock;
1034        }
1035
1036        for (pp = &mp->ports;
1037             (p = mlock_dereference(*pp, br)) != NULL;
1038             pp = &p->next) {
1039                if (!p->key.port || p->key.port->dev->ifindex != entry->ifindex)
1040                        continue;
1041
1042                if (p->key.port->state == BR_STATE_DISABLED)
1043                        goto unlock;
1044
1045                br_multicast_del_pg(mp, p, pp);
1046                err = 0;
1047                break;
1048        }
1049
1050unlock:
1051        spin_unlock_bh(&br->multicast_lock);
1052        return err;
1053}
1054
1055static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
1056                      struct netlink_ext_ack *extack)
1057{
1058        struct nlattr *mdb_attrs[MDBE_ATTR_MAX + 1];
1059        struct net *net = sock_net(skb->sk);
1060        struct net_bridge_vlan_group *vg;
1061        struct net_bridge_port *p = NULL;
1062        struct net_device *dev, *pdev;
1063        struct br_mdb_entry *entry;
1064        struct net_bridge_vlan *v;
1065        struct net_bridge *br;
1066        int err;
1067
1068        err = br_mdb_parse(skb, nlh, &dev, &entry, mdb_attrs, extack);
1069        if (err < 0)
1070                return err;
1071
1072        br = netdev_priv(dev);
1073
1074        if (entry->ifindex != br->dev->ifindex) {
1075                pdev = __dev_get_by_index(net, entry->ifindex);
1076                if (!pdev)
1077                        return -ENODEV;
1078
1079                p = br_port_get_rtnl(pdev);
1080                if (!p || p->br != br || p->state == BR_STATE_DISABLED)
1081                        return -EINVAL;
1082                vg = nbp_vlan_group(p);
1083        } else {
1084                vg = br_vlan_group(br);
1085        }
1086
1087        /* If vlan filtering is enabled and VLAN is not specified
1088         * delete mdb entry on all vlans configured on the port.
1089         */
1090        if (br_vlan_enabled(br->dev) && vg && entry->vid == 0) {
1091                list_for_each_entry(v, &vg->vlan_list, vlist) {
1092                        entry->vid = v->vid;
1093                        err = __br_mdb_del(br, entry, mdb_attrs);
1094                }
1095        } else {
1096                err = __br_mdb_del(br, entry, mdb_attrs);
1097        }
1098
1099        return err;
1100}
1101
1102void br_mdb_init(void)
1103{
1104        rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_GETMDB, NULL, br_mdb_dump, 0);
1105        rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, 0);
1106        rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, 0);
1107}
1108
1109void br_mdb_uninit(void)
1110{
1111        rtnl_unregister(PF_BRIDGE, RTM_GETMDB);
1112        rtnl_unregister(PF_BRIDGE, RTM_NEWMDB);
1113        rtnl_unregister(PF_BRIDGE, RTM_DELMDB);
1114}
1115