1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/if_bridge.h>
5 #include <linux/list.h>
6 #include <linux/netdevice.h>
7 #include <linux/netlink.h>
8 #include <linux/rhashtable.h>
9 #include <linux/rhashtable-types.h>
10 #include <linux/rtnetlink.h>
11 #include <linux/skbuff.h>
12 #include <linux/types.h>
13 #include <net/netlink.h>
14 #include <net/vxlan.h>
16 #include "vxlan_private.h"
18 struct vxlan_mdb_entry_key {
24 struct vxlan_mdb_entry {
25 struct rhash_head rhnode;
26 struct list_head remotes;
27 struct vxlan_mdb_entry_key key;
28 struct hlist_node mdb_node;
32 #define VXLAN_MDB_REMOTE_F_BLOCKED BIT(0)
34 struct vxlan_mdb_remote {
35 struct list_head list;
36 struct vxlan_rdst __rcu *rd;
40 struct hlist_head src_list;
44 #define VXLAN_SGRP_F_DELETE BIT(0)
46 struct vxlan_mdb_src_entry {
47 struct hlist_node node;
48 union vxlan_addr addr;
52 struct vxlan_mdb_dump_ctx {
58 struct vxlan_mdb_config_src_entry {
59 union vxlan_addr addr;
60 struct list_head node;
63 struct vxlan_mdb_config {
64 struct vxlan_dev *vxlan;
65 struct vxlan_mdb_entry_key group;
66 struct list_head src_list;
67 union vxlan_addr remote_ip;
77 static const struct rhashtable_params vxlan_mdb_rht_params = {
78 .head_offset = offsetof(struct vxlan_mdb_entry, rhnode),
79 .key_offset = offsetof(struct vxlan_mdb_entry, key),
80 .key_len = sizeof(struct vxlan_mdb_entry_key),
81 .automatic_shrinking = true,
84 static int __vxlan_mdb_add(const struct vxlan_mdb_config *cfg,
85 struct netlink_ext_ack *extack);
86 static int __vxlan_mdb_del(const struct vxlan_mdb_config *cfg,
87 struct netlink_ext_ack *extack);
89 static void vxlan_br_mdb_entry_fill(const struct vxlan_dev *vxlan,
90 const struct vxlan_mdb_entry *mdb_entry,
91 const struct vxlan_mdb_remote *remote,
92 struct br_mdb_entry *e)
94 const union vxlan_addr *dst = &mdb_entry->key.dst;
96 memset(e, 0, sizeof(*e));
97 e->ifindex = vxlan->dev->ifindex;
98 e->state = MDB_PERMANENT;
100 if (remote->flags & VXLAN_MDB_REMOTE_F_BLOCKED)
101 e->flags |= MDB_FLAGS_BLOCKED;
103 switch (dst->sa.sa_family) {
105 e->addr.u.ip4 = dst->sin.sin_addr.s_addr;
106 e->addr.proto = htons(ETH_P_IP);
108 #if IS_ENABLED(CONFIG_IPV6)
110 e->addr.u.ip6 = dst->sin6.sin6_addr;
111 e->addr.proto = htons(ETH_P_IPV6);
117 static int vxlan_mdb_entry_info_fill_srcs(struct sk_buff *skb,
118 const struct vxlan_mdb_remote *remote)
120 struct vxlan_mdb_src_entry *ent;
123 if (hlist_empty(&remote->src_list))
126 nest = nla_nest_start(skb, MDBA_MDB_EATTR_SRC_LIST);
130 hlist_for_each_entry(ent, &remote->src_list, node) {
131 struct nlattr *nest_ent;
133 nest_ent = nla_nest_start(skb, MDBA_MDB_SRCLIST_ENTRY);
137 if (vxlan_nla_put_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
139 nla_put_u32(skb, MDBA_MDB_SRCATTR_TIMER, 0))
142 nla_nest_end(skb, nest_ent);
145 nla_nest_end(skb, nest);
150 nla_nest_cancel(skb, nest);
154 static int vxlan_mdb_entry_info_fill(const struct vxlan_dev *vxlan,
156 const struct vxlan_mdb_entry *mdb_entry,
157 const struct vxlan_mdb_remote *remote)
159 struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
160 struct br_mdb_entry e;
163 nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY_INFO);
167 vxlan_br_mdb_entry_fill(vxlan, mdb_entry, remote, &e);
169 if (nla_put_nohdr(skb, sizeof(e), &e) ||
170 nla_put_u32(skb, MDBA_MDB_EATTR_TIMER, 0))
173 if (!vxlan_addr_any(&mdb_entry->key.src) &&
174 vxlan_nla_put_addr(skb, MDBA_MDB_EATTR_SOURCE, &mdb_entry->key.src))
177 if (nla_put_u8(skb, MDBA_MDB_EATTR_RTPROT, remote->rt_protocol) ||
178 nla_put_u8(skb, MDBA_MDB_EATTR_GROUP_MODE, remote->filter_mode) ||
179 vxlan_mdb_entry_info_fill_srcs(skb, remote) ||
180 vxlan_nla_put_addr(skb, MDBA_MDB_EATTR_DST, &rd->remote_ip))
183 if (rd->remote_port && rd->remote_port != vxlan->cfg.dst_port &&
184 nla_put_u16(skb, MDBA_MDB_EATTR_DST_PORT,
185 be16_to_cpu(rd->remote_port)))
188 if (rd->remote_vni != vxlan->default_dst.remote_vni &&
189 nla_put_u32(skb, MDBA_MDB_EATTR_VNI, be32_to_cpu(rd->remote_vni)))
192 if (rd->remote_ifindex &&
193 nla_put_u32(skb, MDBA_MDB_EATTR_IFINDEX, rd->remote_ifindex))
196 if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) &&
197 mdb_entry->key.vni && nla_put_u32(skb, MDBA_MDB_EATTR_SRC_VNI,
198 be32_to_cpu(mdb_entry->key.vni)))
201 nla_nest_end(skb, nest);
206 nla_nest_cancel(skb, nest);
210 static int vxlan_mdb_entry_fill(const struct vxlan_dev *vxlan,
212 struct vxlan_mdb_dump_ctx *ctx,
213 const struct vxlan_mdb_entry *mdb_entry)
215 int remote_idx = 0, s_remote_idx = ctx->remote_idx;
216 struct vxlan_mdb_remote *remote;
220 nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
224 list_for_each_entry(remote, &mdb_entry->remotes, list) {
225 if (remote_idx < s_remote_idx)
228 err = vxlan_mdb_entry_info_fill(vxlan, skb, mdb_entry, remote);
235 ctx->remote_idx = err ? remote_idx : 0;
236 nla_nest_end(skb, nest);
240 static int vxlan_mdb_fill(const struct vxlan_dev *vxlan, struct sk_buff *skb,
241 struct vxlan_mdb_dump_ctx *ctx)
243 int entry_idx = 0, s_entry_idx = ctx->entry_idx;
244 struct vxlan_mdb_entry *mdb_entry;
248 nest = nla_nest_start_noflag(skb, MDBA_MDB);
252 hlist_for_each_entry(mdb_entry, &vxlan->mdb_list, mdb_node) {
253 if (entry_idx < s_entry_idx)
256 err = vxlan_mdb_entry_fill(vxlan, skb, ctx, mdb_entry);
263 ctx->entry_idx = err ? entry_idx : 0;
264 nla_nest_end(skb, nest);
268 int vxlan_mdb_dump(struct net_device *dev, struct sk_buff *skb,
269 struct netlink_callback *cb)
271 struct vxlan_mdb_dump_ctx *ctx = (void *)cb->ctx;
272 struct vxlan_dev *vxlan = netdev_priv(dev);
273 struct br_port_msg *bpm;
274 struct nlmsghdr *nlh;
279 NL_ASSERT_DUMP_CTX_FITS(struct vxlan_mdb_dump_ctx);
281 nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
282 cb->nlh->nlmsg_seq, RTM_NEWMDB, sizeof(*bpm),
287 bpm = nlmsg_data(nlh);
288 memset(bpm, 0, sizeof(*bpm));
289 bpm->family = AF_BRIDGE;
290 bpm->ifindex = dev->ifindex;
292 err = vxlan_mdb_fill(vxlan, skb, ctx);
296 cb->seq = vxlan->mdb_seq;
297 nl_dump_check_consistent(cb, nlh);
302 static const struct nla_policy
303 vxlan_mdbe_src_list_entry_pol[MDBE_SRCATTR_MAX + 1] = {
304 [MDBE_SRCATTR_ADDRESS] = NLA_POLICY_RANGE(NLA_BINARY,
305 sizeof(struct in_addr),
306 sizeof(struct in6_addr)),
309 static const struct nla_policy
310 vxlan_mdbe_src_list_pol[MDBE_SRC_LIST_MAX + 1] = {
311 [MDBE_SRC_LIST_ENTRY] = NLA_POLICY_NESTED(vxlan_mdbe_src_list_entry_pol),
314 static const struct netlink_range_validation vni_range = {
315 .max = VXLAN_N_VID - 1,
318 static const struct nla_policy vxlan_mdbe_attrs_pol[MDBE_ATTR_MAX + 1] = {
319 [MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
320 sizeof(struct in_addr),
321 sizeof(struct in6_addr)),
322 [MDBE_ATTR_GROUP_MODE] = NLA_POLICY_RANGE(NLA_U8, MCAST_EXCLUDE,
324 [MDBE_ATTR_SRC_LIST] = NLA_POLICY_NESTED(vxlan_mdbe_src_list_pol),
325 [MDBE_ATTR_RTPROT] = NLA_POLICY_MIN(NLA_U8, RTPROT_STATIC),
326 [MDBE_ATTR_DST] = NLA_POLICY_RANGE(NLA_BINARY,
327 sizeof(struct in_addr),
328 sizeof(struct in6_addr)),
329 [MDBE_ATTR_DST_PORT] = { .type = NLA_U16 },
330 [MDBE_ATTR_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
331 [MDBE_ATTR_IFINDEX] = NLA_POLICY_MIN(NLA_S32, 1),
332 [MDBE_ATTR_SRC_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
335 static bool vxlan_mdb_is_valid_source(const struct nlattr *attr, __be16 proto,
336 struct netlink_ext_ack *extack)
339 case htons(ETH_P_IP):
340 if (nla_len(attr) != sizeof(struct in_addr)) {
341 NL_SET_ERR_MSG_MOD(extack, "IPv4 invalid source address length");
344 if (ipv4_is_multicast(nla_get_in_addr(attr))) {
345 NL_SET_ERR_MSG_MOD(extack, "IPv4 multicast source address is not allowed");
349 #if IS_ENABLED(CONFIG_IPV6)
350 case htons(ETH_P_IPV6): {
353 if (nla_len(attr) != sizeof(struct in6_addr)) {
354 NL_SET_ERR_MSG_MOD(extack, "IPv6 invalid source address length");
357 src = nla_get_in6_addr(attr);
358 if (ipv6_addr_is_multicast(&src)) {
359 NL_SET_ERR_MSG_MOD(extack, "IPv6 multicast source address is not allowed");
366 NL_SET_ERR_MSG_MOD(extack, "Invalid protocol used with source address");
373 static void vxlan_mdb_group_set(struct vxlan_mdb_entry_key *group,
374 const struct br_mdb_entry *entry,
375 const struct nlattr *source_attr)
377 switch (entry->addr.proto) {
378 case htons(ETH_P_IP):
379 group->dst.sa.sa_family = AF_INET;
380 group->dst.sin.sin_addr.s_addr = entry->addr.u.ip4;
382 #if IS_ENABLED(CONFIG_IPV6)
383 case htons(ETH_P_IPV6):
384 group->dst.sa.sa_family = AF_INET6;
385 group->dst.sin6.sin6_addr = entry->addr.u.ip6;
391 vxlan_nla_get_addr(&group->src, source_attr);
394 static bool vxlan_mdb_is_star_g(const struct vxlan_mdb_entry_key *group)
396 return !vxlan_addr_any(&group->dst) && vxlan_addr_any(&group->src);
399 static bool vxlan_mdb_is_sg(const struct vxlan_mdb_entry_key *group)
401 return !vxlan_addr_any(&group->dst) && !vxlan_addr_any(&group->src);
404 static int vxlan_mdb_config_src_entry_init(struct vxlan_mdb_config *cfg,
406 const struct nlattr *src_entry,
407 struct netlink_ext_ack *extack)
409 struct nlattr *tb[MDBE_SRCATTR_MAX + 1];
410 struct vxlan_mdb_config_src_entry *src;
413 err = nla_parse_nested(tb, MDBE_SRCATTR_MAX, src_entry,
414 vxlan_mdbe_src_list_entry_pol, extack);
418 if (NL_REQ_ATTR_CHECK(extack, src_entry, tb, MDBE_SRCATTR_ADDRESS))
421 if (!vxlan_mdb_is_valid_source(tb[MDBE_SRCATTR_ADDRESS], proto,
425 src = kzalloc(sizeof(*src), GFP_KERNEL);
429 err = vxlan_nla_get_addr(&src->addr, tb[MDBE_SRCATTR_ADDRESS]);
433 list_add_tail(&src->node, &cfg->src_list);
443 vxlan_mdb_config_src_entry_fini(struct vxlan_mdb_config_src_entry *src)
445 list_del(&src->node);
449 static int vxlan_mdb_config_src_list_init(struct vxlan_mdb_config *cfg,
451 const struct nlattr *src_list,
452 struct netlink_ext_ack *extack)
454 struct vxlan_mdb_config_src_entry *src, *tmp;
455 struct nlattr *src_entry;
458 nla_for_each_nested(src_entry, src_list, rem) {
459 err = vxlan_mdb_config_src_entry_init(cfg, proto, src_entry,
462 goto err_src_entry_init;
468 list_for_each_entry_safe_reverse(src, tmp, &cfg->src_list, node)
469 vxlan_mdb_config_src_entry_fini(src);
473 static void vxlan_mdb_config_src_list_fini(struct vxlan_mdb_config *cfg)
475 struct vxlan_mdb_config_src_entry *src, *tmp;
477 list_for_each_entry_safe_reverse(src, tmp, &cfg->src_list, node)
478 vxlan_mdb_config_src_entry_fini(src);
481 static int vxlan_mdb_config_attrs_init(struct vxlan_mdb_config *cfg,
482 const struct br_mdb_entry *entry,
483 const struct nlattr *set_attrs,
484 struct netlink_ext_ack *extack)
486 struct nlattr *mdbe_attrs[MDBE_ATTR_MAX + 1];
489 err = nla_parse_nested(mdbe_attrs, MDBE_ATTR_MAX, set_attrs,
490 vxlan_mdbe_attrs_pol, extack);
494 if (NL_REQ_ATTR_CHECK(extack, set_attrs, mdbe_attrs, MDBE_ATTR_DST)) {
495 NL_SET_ERR_MSG_MOD(extack, "Missing remote destination IP address");
499 if (mdbe_attrs[MDBE_ATTR_SOURCE] &&
500 !vxlan_mdb_is_valid_source(mdbe_attrs[MDBE_ATTR_SOURCE],
501 entry->addr.proto, extack))
504 vxlan_mdb_group_set(&cfg->group, entry, mdbe_attrs[MDBE_ATTR_SOURCE]);
506 /* rtnetlink code only validates that IPv4 group address is
509 if (!vxlan_addr_is_multicast(&cfg->group.dst) &&
510 !vxlan_addr_any(&cfg->group.dst)) {
511 NL_SET_ERR_MSG_MOD(extack, "Group address is not multicast");
515 if (vxlan_addr_any(&cfg->group.dst) &&
516 mdbe_attrs[MDBE_ATTR_SOURCE]) {
517 NL_SET_ERR_MSG_MOD(extack, "Source cannot be specified for the all-zeros entry");
521 if (vxlan_mdb_is_sg(&cfg->group))
522 cfg->filter_mode = MCAST_INCLUDE;
524 if (mdbe_attrs[MDBE_ATTR_GROUP_MODE]) {
525 if (!vxlan_mdb_is_star_g(&cfg->group)) {
526 NL_SET_ERR_MSG_MOD(extack, "Filter mode can only be set for (*, G) entries");
529 cfg->filter_mode = nla_get_u8(mdbe_attrs[MDBE_ATTR_GROUP_MODE]);
532 if (mdbe_attrs[MDBE_ATTR_SRC_LIST]) {
533 if (!vxlan_mdb_is_star_g(&cfg->group)) {
534 NL_SET_ERR_MSG_MOD(extack, "Source list can only be set for (*, G) entries");
537 if (!mdbe_attrs[MDBE_ATTR_GROUP_MODE]) {
538 NL_SET_ERR_MSG_MOD(extack, "Source list cannot be set without filter mode");
541 err = vxlan_mdb_config_src_list_init(cfg, entry->addr.proto,
542 mdbe_attrs[MDBE_ATTR_SRC_LIST],
548 if (vxlan_mdb_is_star_g(&cfg->group) && list_empty(&cfg->src_list) &&
549 cfg->filter_mode == MCAST_INCLUDE) {
550 NL_SET_ERR_MSG_MOD(extack, "Cannot add (*, G) INCLUDE with an empty source list");
554 if (mdbe_attrs[MDBE_ATTR_RTPROT])
555 cfg->rt_protocol = nla_get_u8(mdbe_attrs[MDBE_ATTR_RTPROT]);
557 err = vxlan_nla_get_addr(&cfg->remote_ip, mdbe_attrs[MDBE_ATTR_DST]);
559 NL_SET_ERR_MSG_MOD(extack, "Invalid remote destination address");
560 goto err_src_list_fini;
563 if (mdbe_attrs[MDBE_ATTR_DST_PORT])
565 cpu_to_be16(nla_get_u16(mdbe_attrs[MDBE_ATTR_DST_PORT]));
567 if (mdbe_attrs[MDBE_ATTR_VNI])
569 cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_VNI]));
571 if (mdbe_attrs[MDBE_ATTR_IFINDEX]) {
572 cfg->remote_ifindex =
573 nla_get_s32(mdbe_attrs[MDBE_ATTR_IFINDEX]);
574 if (!__dev_get_by_index(cfg->vxlan->net, cfg->remote_ifindex)) {
575 NL_SET_ERR_MSG_MOD(extack, "Outgoing interface not found");
577 goto err_src_list_fini;
581 if (mdbe_attrs[MDBE_ATTR_SRC_VNI])
583 cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_SRC_VNI]));
588 vxlan_mdb_config_src_list_fini(cfg);
592 static int vxlan_mdb_config_init(struct vxlan_mdb_config *cfg,
593 struct net_device *dev, struct nlattr *tb[],
595 struct netlink_ext_ack *extack)
597 struct br_mdb_entry *entry = nla_data(tb[MDBA_SET_ENTRY]);
598 struct vxlan_dev *vxlan = netdev_priv(dev);
600 memset(cfg, 0, sizeof(*cfg));
602 cfg->group.vni = vxlan->default_dst.remote_vni;
603 INIT_LIST_HEAD(&cfg->src_list);
604 cfg->nlflags = nlmsg_flags;
605 cfg->filter_mode = MCAST_EXCLUDE;
606 cfg->rt_protocol = RTPROT_STATIC;
607 cfg->remote_vni = vxlan->default_dst.remote_vni;
608 cfg->remote_port = vxlan->cfg.dst_port;
610 if (entry->ifindex != dev->ifindex) {
611 NL_SET_ERR_MSG_MOD(extack, "Port net device must be the VXLAN net device");
615 /* State is not part of the entry key and can be ignored on deletion
618 if ((nlmsg_flags & (NLM_F_CREATE | NLM_F_REPLACE)) &&
619 entry->state != MDB_PERMANENT) {
620 NL_SET_ERR_MSG_MOD(extack, "MDB entry must be permanent");
625 NL_SET_ERR_MSG_MOD(extack, "Invalid MDB entry flags");
630 NL_SET_ERR_MSG_MOD(extack, "VID must not be specified");
634 if (entry->addr.proto != htons(ETH_P_IP) &&
635 entry->addr.proto != htons(ETH_P_IPV6)) {
636 NL_SET_ERR_MSG_MOD(extack, "Group address must be an IPv4 / IPv6 address");
640 if (NL_REQ_ATTR_CHECK(extack, NULL, tb, MDBA_SET_ENTRY_ATTRS)) {
641 NL_SET_ERR_MSG_MOD(extack, "Missing MDBA_SET_ENTRY_ATTRS attribute");
645 return vxlan_mdb_config_attrs_init(cfg, entry, tb[MDBA_SET_ENTRY_ATTRS],
649 static void vxlan_mdb_config_fini(struct vxlan_mdb_config *cfg)
651 vxlan_mdb_config_src_list_fini(cfg);
654 static struct vxlan_mdb_entry *
655 vxlan_mdb_entry_lookup(struct vxlan_dev *vxlan,
656 const struct vxlan_mdb_entry_key *group)
658 return rhashtable_lookup_fast(&vxlan->mdb_tbl, group,
659 vxlan_mdb_rht_params);
662 static struct vxlan_mdb_remote *
663 vxlan_mdb_remote_lookup(const struct vxlan_mdb_entry *mdb_entry,
664 const union vxlan_addr *addr)
666 struct vxlan_mdb_remote *remote;
668 list_for_each_entry(remote, &mdb_entry->remotes, list) {
669 struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
671 if (vxlan_addr_equal(addr, &rd->remote_ip))
678 static void vxlan_mdb_rdst_free(struct rcu_head *head)
680 struct vxlan_rdst *rd = container_of(head, struct vxlan_rdst, rcu);
682 dst_cache_destroy(&rd->dst_cache);
686 static int vxlan_mdb_remote_rdst_init(const struct vxlan_mdb_config *cfg,
687 struct vxlan_mdb_remote *remote)
689 struct vxlan_rdst *rd;
692 rd = kzalloc(sizeof(*rd), GFP_KERNEL);
696 err = dst_cache_init(&rd->dst_cache, GFP_KERNEL);
700 rd->remote_ip = cfg->remote_ip;
701 rd->remote_port = cfg->remote_port;
702 rd->remote_vni = cfg->remote_vni;
703 rd->remote_ifindex = cfg->remote_ifindex;
704 rcu_assign_pointer(remote->rd, rd);
713 static void vxlan_mdb_remote_rdst_fini(struct vxlan_rdst *rd)
715 call_rcu(&rd->rcu, vxlan_mdb_rdst_free);
718 static int vxlan_mdb_remote_init(const struct vxlan_mdb_config *cfg,
719 struct vxlan_mdb_remote *remote)
723 err = vxlan_mdb_remote_rdst_init(cfg, remote);
727 remote->flags = cfg->flags;
728 remote->filter_mode = cfg->filter_mode;
729 remote->rt_protocol = cfg->rt_protocol;
730 INIT_HLIST_HEAD(&remote->src_list);
735 static void vxlan_mdb_remote_fini(struct vxlan_dev *vxlan,
736 struct vxlan_mdb_remote *remote)
738 WARN_ON_ONCE(!hlist_empty(&remote->src_list));
739 vxlan_mdb_remote_rdst_fini(rtnl_dereference(remote->rd));
742 static struct vxlan_mdb_src_entry *
743 vxlan_mdb_remote_src_entry_lookup(const struct vxlan_mdb_remote *remote,
744 const union vxlan_addr *addr)
746 struct vxlan_mdb_src_entry *ent;
748 hlist_for_each_entry(ent, &remote->src_list, node) {
749 if (vxlan_addr_equal(&ent->addr, addr))
756 static struct vxlan_mdb_src_entry *
757 vxlan_mdb_remote_src_entry_add(struct vxlan_mdb_remote *remote,
758 const union vxlan_addr *addr)
760 struct vxlan_mdb_src_entry *ent;
762 ent = kzalloc(sizeof(*ent), GFP_KERNEL);
767 hlist_add_head(&ent->node, &remote->src_list);
773 vxlan_mdb_remote_src_entry_del(struct vxlan_mdb_src_entry *ent)
775 hlist_del(&ent->node);
780 vxlan_mdb_remote_src_fwd_add(const struct vxlan_mdb_config *cfg,
781 const union vxlan_addr *addr,
782 struct netlink_ext_ack *extack)
784 struct vxlan_mdb_config sg_cfg;
786 memset(&sg_cfg, 0, sizeof(sg_cfg));
787 sg_cfg.vxlan = cfg->vxlan;
788 sg_cfg.group.src = *addr;
789 sg_cfg.group.dst = cfg->group.dst;
790 sg_cfg.group.vni = cfg->group.vni;
791 INIT_LIST_HEAD(&sg_cfg.src_list);
792 sg_cfg.remote_ip = cfg->remote_ip;
793 sg_cfg.remote_ifindex = cfg->remote_ifindex;
794 sg_cfg.remote_vni = cfg->remote_vni;
795 sg_cfg.remote_port = cfg->remote_port;
796 sg_cfg.nlflags = cfg->nlflags;
797 sg_cfg.filter_mode = MCAST_INCLUDE;
798 if (cfg->filter_mode == MCAST_EXCLUDE)
799 sg_cfg.flags = VXLAN_MDB_REMOTE_F_BLOCKED;
800 sg_cfg.rt_protocol = cfg->rt_protocol;
802 return __vxlan_mdb_add(&sg_cfg, extack);
806 vxlan_mdb_remote_src_fwd_del(struct vxlan_dev *vxlan,
807 const struct vxlan_mdb_entry_key *group,
808 const struct vxlan_mdb_remote *remote,
809 const union vxlan_addr *addr)
811 struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
812 struct vxlan_mdb_config sg_cfg;
814 memset(&sg_cfg, 0, sizeof(sg_cfg));
815 sg_cfg.vxlan = vxlan;
816 sg_cfg.group.src = *addr;
817 sg_cfg.group.dst = group->dst;
818 sg_cfg.group.vni = group->vni;
819 INIT_LIST_HEAD(&sg_cfg.src_list);
820 sg_cfg.remote_ip = rd->remote_ip;
822 __vxlan_mdb_del(&sg_cfg, NULL);
826 vxlan_mdb_remote_src_add(const struct vxlan_mdb_config *cfg,
827 struct vxlan_mdb_remote *remote,
828 const struct vxlan_mdb_config_src_entry *src,
829 struct netlink_ext_ack *extack)
831 struct vxlan_mdb_src_entry *ent;
834 ent = vxlan_mdb_remote_src_entry_lookup(remote, &src->addr);
836 ent = vxlan_mdb_remote_src_entry_add(remote, &src->addr);
839 } else if (!(cfg->nlflags & NLM_F_REPLACE)) {
840 NL_SET_ERR_MSG_MOD(extack, "Source entry already exists");
844 err = vxlan_mdb_remote_src_fwd_add(cfg, &ent->addr, extack);
848 /* Clear flags in case source entry was marked for deletion as part of
856 vxlan_mdb_remote_src_entry_del(ent);
860 static void vxlan_mdb_remote_src_del(struct vxlan_dev *vxlan,
861 const struct vxlan_mdb_entry_key *group,
862 const struct vxlan_mdb_remote *remote,
863 struct vxlan_mdb_src_entry *ent)
865 vxlan_mdb_remote_src_fwd_del(vxlan, group, remote, &ent->addr);
866 vxlan_mdb_remote_src_entry_del(ent);
869 static int vxlan_mdb_remote_srcs_add(const struct vxlan_mdb_config *cfg,
870 struct vxlan_mdb_remote *remote,
871 struct netlink_ext_ack *extack)
873 struct vxlan_mdb_config_src_entry *src;
874 struct vxlan_mdb_src_entry *ent;
875 struct hlist_node *tmp;
878 list_for_each_entry(src, &cfg->src_list, node) {
879 err = vxlan_mdb_remote_src_add(cfg, remote, src, extack);
887 hlist_for_each_entry_safe(ent, tmp, &remote->src_list, node)
888 vxlan_mdb_remote_src_del(cfg->vxlan, &cfg->group, remote, ent);
892 static void vxlan_mdb_remote_srcs_del(struct vxlan_dev *vxlan,
893 const struct vxlan_mdb_entry_key *group,
894 struct vxlan_mdb_remote *remote)
896 struct vxlan_mdb_src_entry *ent;
897 struct hlist_node *tmp;
899 hlist_for_each_entry_safe(ent, tmp, &remote->src_list, node)
900 vxlan_mdb_remote_src_del(vxlan, group, remote, ent);
904 vxlan_mdb_nlmsg_src_list_size(const struct vxlan_mdb_entry_key *group,
905 const struct vxlan_mdb_remote *remote)
907 struct vxlan_mdb_src_entry *ent;
910 if (hlist_empty(&remote->src_list))
913 /* MDBA_MDB_EATTR_SRC_LIST */
914 nlmsg_size = nla_total_size(0);
916 hlist_for_each_entry(ent, &remote->src_list, node) {
917 /* MDBA_MDB_SRCLIST_ENTRY */
918 nlmsg_size += nla_total_size(0) +
919 /* MDBA_MDB_SRCATTR_ADDRESS */
920 nla_total_size(vxlan_addr_size(&group->dst)) +
921 /* MDBA_MDB_SRCATTR_TIMER */
922 nla_total_size(sizeof(u8));
929 vxlan_mdb_nlmsg_remote_size(const struct vxlan_dev *vxlan,
930 const struct vxlan_mdb_entry *mdb_entry,
931 const struct vxlan_mdb_remote *remote)
933 const struct vxlan_mdb_entry_key *group = &mdb_entry->key;
934 struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
937 /* MDBA_MDB_ENTRY_INFO */
938 nlmsg_size = nla_total_size(sizeof(struct br_mdb_entry)) +
939 /* MDBA_MDB_EATTR_TIMER */
940 nla_total_size(sizeof(u32));
942 /* MDBA_MDB_EATTR_SOURCE */
943 if (vxlan_mdb_is_sg(group))
944 nlmsg_size += nla_total_size(vxlan_addr_size(&group->dst));
945 /* MDBA_MDB_EATTR_RTPROT */
946 nlmsg_size += nla_total_size(sizeof(u8));
947 /* MDBA_MDB_EATTR_SRC_LIST */
948 nlmsg_size += vxlan_mdb_nlmsg_src_list_size(group, remote);
949 /* MDBA_MDB_EATTR_GROUP_MODE */
950 nlmsg_size += nla_total_size(sizeof(u8));
951 /* MDBA_MDB_EATTR_DST */
952 nlmsg_size += nla_total_size(vxlan_addr_size(&rd->remote_ip));
953 /* MDBA_MDB_EATTR_DST_PORT */
954 if (rd->remote_port && rd->remote_port != vxlan->cfg.dst_port)
955 nlmsg_size += nla_total_size(sizeof(u16));
956 /* MDBA_MDB_EATTR_VNI */
957 if (rd->remote_vni != vxlan->default_dst.remote_vni)
958 nlmsg_size += nla_total_size(sizeof(u32));
959 /* MDBA_MDB_EATTR_IFINDEX */
960 if (rd->remote_ifindex)
961 nlmsg_size += nla_total_size(sizeof(u32));
962 /* MDBA_MDB_EATTR_SRC_VNI */
963 if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) && group->vni)
964 nlmsg_size += nla_total_size(sizeof(u32));
969 static size_t vxlan_mdb_nlmsg_size(const struct vxlan_dev *vxlan,
970 const struct vxlan_mdb_entry *mdb_entry,
971 const struct vxlan_mdb_remote *remote)
973 return NLMSG_ALIGN(sizeof(struct br_port_msg)) +
979 vxlan_mdb_nlmsg_remote_size(vxlan, mdb_entry, remote);
982 static int vxlan_mdb_nlmsg_fill(const struct vxlan_dev *vxlan,
984 const struct vxlan_mdb_entry *mdb_entry,
985 const struct vxlan_mdb_remote *remote,
988 struct nlattr *mdb_nest, *mdb_entry_nest;
989 struct br_port_msg *bpm;
990 struct nlmsghdr *nlh;
992 nlh = nlmsg_put(skb, 0, 0, type, sizeof(*bpm), 0);
996 bpm = nlmsg_data(nlh);
997 memset(bpm, 0, sizeof(*bpm));
998 bpm->family = AF_BRIDGE;
999 bpm->ifindex = vxlan->dev->ifindex;
1001 mdb_nest = nla_nest_start_noflag(skb, MDBA_MDB);
1004 mdb_entry_nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
1005 if (!mdb_entry_nest)
1008 if (vxlan_mdb_entry_info_fill(vxlan, skb, mdb_entry, remote))
1011 nla_nest_end(skb, mdb_entry_nest);
1012 nla_nest_end(skb, mdb_nest);
1013 nlmsg_end(skb, nlh);
1018 nlmsg_cancel(skb, nlh);
1022 static void vxlan_mdb_remote_notify(const struct vxlan_dev *vxlan,
1023 const struct vxlan_mdb_entry *mdb_entry,
1024 const struct vxlan_mdb_remote *remote,
1027 struct net *net = dev_net(vxlan->dev);
1028 struct sk_buff *skb;
1031 skb = nlmsg_new(vxlan_mdb_nlmsg_size(vxlan, mdb_entry, remote),
1036 err = vxlan_mdb_nlmsg_fill(vxlan, skb, mdb_entry, remote, type);
1042 rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_KERNEL);
1045 rtnl_set_sk_err(net, RTNLGRP_MDB, err);
1049 vxlan_mdb_remote_srcs_replace(const struct vxlan_mdb_config *cfg,
1050 const struct vxlan_mdb_entry *mdb_entry,
1051 struct vxlan_mdb_remote *remote,
1052 struct netlink_ext_ack *extack)
1054 struct vxlan_dev *vxlan = cfg->vxlan;
1055 struct vxlan_mdb_src_entry *ent;
1056 struct hlist_node *tmp;
1059 hlist_for_each_entry(ent, &remote->src_list, node)
1060 ent->flags |= VXLAN_SGRP_F_DELETE;
1062 err = vxlan_mdb_remote_srcs_add(cfg, remote, extack);
1064 goto err_clear_delete;
1066 hlist_for_each_entry_safe(ent, tmp, &remote->src_list, node) {
1067 if (ent->flags & VXLAN_SGRP_F_DELETE)
1068 vxlan_mdb_remote_src_del(vxlan, &mdb_entry->key, remote,
1075 hlist_for_each_entry(ent, &remote->src_list, node)
1076 ent->flags &= ~VXLAN_SGRP_F_DELETE;
1080 static int vxlan_mdb_remote_replace(const struct vxlan_mdb_config *cfg,
1081 const struct vxlan_mdb_entry *mdb_entry,
1082 struct vxlan_mdb_remote *remote,
1083 struct netlink_ext_ack *extack)
1085 struct vxlan_rdst *new_rd, *old_rd = rtnl_dereference(remote->rd);
1086 struct vxlan_dev *vxlan = cfg->vxlan;
1089 err = vxlan_mdb_remote_rdst_init(cfg, remote);
1092 new_rd = rtnl_dereference(remote->rd);
1094 err = vxlan_mdb_remote_srcs_replace(cfg, mdb_entry, remote, extack);
1096 goto err_rdst_reset;
1098 WRITE_ONCE(remote->flags, cfg->flags);
1099 WRITE_ONCE(remote->filter_mode, cfg->filter_mode);
1100 remote->rt_protocol = cfg->rt_protocol;
1101 vxlan_mdb_remote_notify(vxlan, mdb_entry, remote, RTM_NEWMDB);
1103 vxlan_mdb_remote_rdst_fini(old_rd);
1108 rcu_assign_pointer(remote->rd, old_rd);
1109 vxlan_mdb_remote_rdst_fini(new_rd);
1113 static int vxlan_mdb_remote_add(const struct vxlan_mdb_config *cfg,
1114 struct vxlan_mdb_entry *mdb_entry,
1115 struct netlink_ext_ack *extack)
1117 struct vxlan_mdb_remote *remote;
1120 remote = vxlan_mdb_remote_lookup(mdb_entry, &cfg->remote_ip);
1122 if (!(cfg->nlflags & NLM_F_REPLACE)) {
1123 NL_SET_ERR_MSG_MOD(extack, "Replace not specified and MDB remote entry already exists");
1126 return vxlan_mdb_remote_replace(cfg, mdb_entry, remote, extack);
1129 if (!(cfg->nlflags & NLM_F_CREATE)) {
1130 NL_SET_ERR_MSG_MOD(extack, "Create not specified and entry does not exist");
1134 remote = kzalloc(sizeof(*remote), GFP_KERNEL);
1138 err = vxlan_mdb_remote_init(cfg, remote);
1140 NL_SET_ERR_MSG_MOD(extack, "Failed to initialize remote MDB entry");
1141 goto err_free_remote;
1144 err = vxlan_mdb_remote_srcs_add(cfg, remote, extack);
1146 goto err_remote_fini;
1148 list_add_rcu(&remote->list, &mdb_entry->remotes);
1149 vxlan_mdb_remote_notify(cfg->vxlan, mdb_entry, remote, RTM_NEWMDB);
1154 vxlan_mdb_remote_fini(cfg->vxlan, remote);
1160 static void vxlan_mdb_remote_del(struct vxlan_dev *vxlan,
1161 struct vxlan_mdb_entry *mdb_entry,
1162 struct vxlan_mdb_remote *remote)
1164 vxlan_mdb_remote_notify(vxlan, mdb_entry, remote, RTM_DELMDB);
1165 list_del_rcu(&remote->list);
1166 vxlan_mdb_remote_srcs_del(vxlan, &mdb_entry->key, remote);
1167 vxlan_mdb_remote_fini(vxlan, remote);
1168 kfree_rcu(remote, rcu);
1171 static struct vxlan_mdb_entry *
1172 vxlan_mdb_entry_get(struct vxlan_dev *vxlan,
1173 const struct vxlan_mdb_entry_key *group)
1175 struct vxlan_mdb_entry *mdb_entry;
1178 mdb_entry = vxlan_mdb_entry_lookup(vxlan, group);
1182 mdb_entry = kzalloc(sizeof(*mdb_entry), GFP_KERNEL);
1184 return ERR_PTR(-ENOMEM);
1186 INIT_LIST_HEAD(&mdb_entry->remotes);
1187 memcpy(&mdb_entry->key, group, sizeof(mdb_entry->key));
1188 hlist_add_head(&mdb_entry->mdb_node, &vxlan->mdb_list);
1190 err = rhashtable_lookup_insert_fast(&vxlan->mdb_tbl,
1192 vxlan_mdb_rht_params);
1194 goto err_free_entry;
1196 if (hlist_is_singular_node(&mdb_entry->mdb_node, &vxlan->mdb_list))
1197 vxlan->cfg.flags |= VXLAN_F_MDB;
1202 hlist_del(&mdb_entry->mdb_node);
1204 return ERR_PTR(err);
1207 static void vxlan_mdb_entry_put(struct vxlan_dev *vxlan,
1208 struct vxlan_mdb_entry *mdb_entry)
1210 if (!list_empty(&mdb_entry->remotes))
1213 if (hlist_is_singular_node(&mdb_entry->mdb_node, &vxlan->mdb_list))
1214 vxlan->cfg.flags &= ~VXLAN_F_MDB;
1216 rhashtable_remove_fast(&vxlan->mdb_tbl, &mdb_entry->rhnode,
1217 vxlan_mdb_rht_params);
1218 hlist_del(&mdb_entry->mdb_node);
1219 kfree_rcu(mdb_entry, rcu);
1222 static int __vxlan_mdb_add(const struct vxlan_mdb_config *cfg,
1223 struct netlink_ext_ack *extack)
1225 struct vxlan_dev *vxlan = cfg->vxlan;
1226 struct vxlan_mdb_entry *mdb_entry;
1229 mdb_entry = vxlan_mdb_entry_get(vxlan, &cfg->group);
1230 if (IS_ERR(mdb_entry))
1231 return PTR_ERR(mdb_entry);
1233 err = vxlan_mdb_remote_add(cfg, mdb_entry, extack);
1242 vxlan_mdb_entry_put(vxlan, mdb_entry);
1246 static int __vxlan_mdb_del(const struct vxlan_mdb_config *cfg,
1247 struct netlink_ext_ack *extack)
1249 struct vxlan_dev *vxlan = cfg->vxlan;
1250 struct vxlan_mdb_entry *mdb_entry;
1251 struct vxlan_mdb_remote *remote;
1253 mdb_entry = vxlan_mdb_entry_lookup(vxlan, &cfg->group);
1255 NL_SET_ERR_MSG_MOD(extack, "Did not find MDB entry");
1259 remote = vxlan_mdb_remote_lookup(mdb_entry, &cfg->remote_ip);
1261 NL_SET_ERR_MSG_MOD(extack, "Did not find MDB remote entry");
1265 vxlan_mdb_remote_del(vxlan, mdb_entry, remote);
1266 vxlan_mdb_entry_put(vxlan, mdb_entry);
1273 int vxlan_mdb_add(struct net_device *dev, struct nlattr *tb[], u16 nlmsg_flags,
1274 struct netlink_ext_ack *extack)
1276 struct vxlan_mdb_config cfg;
1281 err = vxlan_mdb_config_init(&cfg, dev, tb, nlmsg_flags, extack);
1285 err = __vxlan_mdb_add(&cfg, extack);
1287 vxlan_mdb_config_fini(&cfg);
1291 int vxlan_mdb_del(struct net_device *dev, struct nlattr *tb[],
1292 struct netlink_ext_ack *extack)
1294 struct vxlan_mdb_config cfg;
1299 err = vxlan_mdb_config_init(&cfg, dev, tb, 0, extack);
1303 err = __vxlan_mdb_del(&cfg, extack);
1305 vxlan_mdb_config_fini(&cfg);
1309 static const struct nla_policy vxlan_mdbe_attrs_get_pol[MDBE_ATTR_MAX + 1] = {
1310 [MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
1311 sizeof(struct in_addr),
1312 sizeof(struct in6_addr)),
1313 [MDBE_ATTR_SRC_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
1316 static int vxlan_mdb_get_parse(struct net_device *dev, struct nlattr *tb[],
1317 struct vxlan_mdb_entry_key *group,
1318 struct netlink_ext_ack *extack)
1320 struct br_mdb_entry *entry = nla_data(tb[MDBA_GET_ENTRY]);
1321 struct nlattr *mdbe_attrs[MDBE_ATTR_MAX + 1];
1322 struct vxlan_dev *vxlan = netdev_priv(dev);
1325 memset(group, 0, sizeof(*group));
1326 group->vni = vxlan->default_dst.remote_vni;
1328 if (!tb[MDBA_GET_ENTRY_ATTRS]) {
1329 vxlan_mdb_group_set(group, entry, NULL);
1333 err = nla_parse_nested(mdbe_attrs, MDBE_ATTR_MAX,
1334 tb[MDBA_GET_ENTRY_ATTRS],
1335 vxlan_mdbe_attrs_get_pol, extack);
1339 if (mdbe_attrs[MDBE_ATTR_SOURCE] &&
1340 !vxlan_mdb_is_valid_source(mdbe_attrs[MDBE_ATTR_SOURCE],
1341 entry->addr.proto, extack))
1344 vxlan_mdb_group_set(group, entry, mdbe_attrs[MDBE_ATTR_SOURCE]);
1346 if (mdbe_attrs[MDBE_ATTR_SRC_VNI])
1348 cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_SRC_VNI]));
1353 static struct sk_buff *
1354 vxlan_mdb_get_reply_alloc(const struct vxlan_dev *vxlan,
1355 const struct vxlan_mdb_entry *mdb_entry)
1357 struct vxlan_mdb_remote *remote;
1360 nlmsg_size = NLMSG_ALIGN(sizeof(struct br_port_msg)) +
1363 /* MDBA_MDB_ENTRY */
1366 list_for_each_entry(remote, &mdb_entry->remotes, list)
1367 nlmsg_size += vxlan_mdb_nlmsg_remote_size(vxlan, mdb_entry,
1370 return nlmsg_new(nlmsg_size, GFP_KERNEL);
1374 vxlan_mdb_get_reply_fill(const struct vxlan_dev *vxlan,
1375 struct sk_buff *skb,
1376 const struct vxlan_mdb_entry *mdb_entry,
1377 u32 portid, u32 seq)
1379 struct nlattr *mdb_nest, *mdb_entry_nest;
1380 struct vxlan_mdb_remote *remote;
1381 struct br_port_msg *bpm;
1382 struct nlmsghdr *nlh;
1385 nlh = nlmsg_put(skb, portid, seq, RTM_NEWMDB, sizeof(*bpm), 0);
1389 bpm = nlmsg_data(nlh);
1390 memset(bpm, 0, sizeof(*bpm));
1391 bpm->family = AF_BRIDGE;
1392 bpm->ifindex = vxlan->dev->ifindex;
1393 mdb_nest = nla_nest_start_noflag(skb, MDBA_MDB);
1398 mdb_entry_nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
1399 if (!mdb_entry_nest) {
1404 list_for_each_entry(remote, &mdb_entry->remotes, list) {
1405 err = vxlan_mdb_entry_info_fill(vxlan, skb, mdb_entry, remote);
1410 nla_nest_end(skb, mdb_entry_nest);
1411 nla_nest_end(skb, mdb_nest);
1412 nlmsg_end(skb, nlh);
1417 nlmsg_cancel(skb, nlh);
1421 int vxlan_mdb_get(struct net_device *dev, struct nlattr *tb[], u32 portid,
1422 u32 seq, struct netlink_ext_ack *extack)
1424 struct vxlan_dev *vxlan = netdev_priv(dev);
1425 struct vxlan_mdb_entry *mdb_entry;
1426 struct vxlan_mdb_entry_key group;
1427 struct sk_buff *skb;
1432 err = vxlan_mdb_get_parse(dev, tb, &group, extack);
1436 mdb_entry = vxlan_mdb_entry_lookup(vxlan, &group);
1438 NL_SET_ERR_MSG_MOD(extack, "MDB entry not found");
1442 skb = vxlan_mdb_get_reply_alloc(vxlan, mdb_entry);
1446 err = vxlan_mdb_get_reply_fill(vxlan, skb, mdb_entry, portid, seq);
1448 NL_SET_ERR_MSG_MOD(extack, "Failed to fill MDB get reply");
1452 return rtnl_unicast(skb, dev_net(dev), portid);
1459 struct vxlan_mdb_entry *vxlan_mdb_entry_skb_get(struct vxlan_dev *vxlan,
1460 struct sk_buff *skb,
1463 struct vxlan_mdb_entry *mdb_entry;
1464 struct vxlan_mdb_entry_key group;
1466 if (!is_multicast_ether_addr(eth_hdr(skb)->h_dest) ||
1467 is_broadcast_ether_addr(eth_hdr(skb)->h_dest))
1470 /* When not in collect metadata mode, 'src_vni' is zero, but MDB
1471 * entries are stored with the VNI of the VXLAN device.
1473 if (!(vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA))
1474 src_vni = vxlan->default_dst.remote_vni;
1476 memset(&group, 0, sizeof(group));
1477 group.vni = src_vni;
1479 switch (skb->protocol) {
1480 case htons(ETH_P_IP):
1481 if (!pskb_may_pull(skb, sizeof(struct iphdr)))
1483 group.dst.sa.sa_family = AF_INET;
1484 group.dst.sin.sin_addr.s_addr = ip_hdr(skb)->daddr;
1485 group.src.sa.sa_family = AF_INET;
1486 group.src.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
1488 #if IS_ENABLED(CONFIG_IPV6)
1489 case htons(ETH_P_IPV6):
1490 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
1492 group.dst.sa.sa_family = AF_INET6;
1493 group.dst.sin6.sin6_addr = ipv6_hdr(skb)->daddr;
1494 group.src.sa.sa_family = AF_INET6;
1495 group.src.sin6.sin6_addr = ipv6_hdr(skb)->saddr;
1502 mdb_entry = vxlan_mdb_entry_lookup(vxlan, &group);
1506 memset(&group.src, 0, sizeof(group.src));
1507 mdb_entry = vxlan_mdb_entry_lookup(vxlan, &group);
1511 /* No (S, G) or (*, G) found. Look up the all-zeros entry, but only if
1512 * the destination IP address is not link-local multicast since we want
1513 * to transmit such traffic together with broadcast and unknown unicast
1516 switch (skb->protocol) {
1517 case htons(ETH_P_IP):
1518 if (ipv4_is_local_multicast(group.dst.sin.sin_addr.s_addr))
1520 group.dst.sin.sin_addr.s_addr = 0;
1522 #if IS_ENABLED(CONFIG_IPV6)
1523 case htons(ETH_P_IPV6):
1524 if (ipv6_addr_type(&group.dst.sin6.sin6_addr) &
1525 IPV6_ADDR_LINKLOCAL)
1527 memset(&group.dst.sin6.sin6_addr, 0,
1528 sizeof(group.dst.sin6.sin6_addr));
1535 return vxlan_mdb_entry_lookup(vxlan, &group);
1538 netdev_tx_t vxlan_mdb_xmit(struct vxlan_dev *vxlan,
1539 const struct vxlan_mdb_entry *mdb_entry,
1540 struct sk_buff *skb)
1542 struct vxlan_mdb_remote *remote, *fremote = NULL;
1543 __be32 src_vni = mdb_entry->key.vni;
1545 list_for_each_entry_rcu(remote, &mdb_entry->remotes, list) {
1546 struct sk_buff *skb1;
1548 if ((vxlan_mdb_is_star_g(&mdb_entry->key) &&
1549 READ_ONCE(remote->filter_mode) == MCAST_INCLUDE) ||
1550 (READ_ONCE(remote->flags) & VXLAN_MDB_REMOTE_F_BLOCKED))
1558 skb1 = skb_clone(skb, GFP_ATOMIC);
1560 vxlan_xmit_one(skb1, vxlan->dev, src_vni,
1561 rcu_dereference(remote->rd), false);
1565 vxlan_xmit_one(skb, vxlan->dev, src_vni,
1566 rcu_dereference(fremote->rd), false);
1570 return NETDEV_TX_OK;
1573 static void vxlan_mdb_check_empty(void *ptr, void *arg)
1578 static void vxlan_mdb_remotes_flush(struct vxlan_dev *vxlan,
1579 struct vxlan_mdb_entry *mdb_entry)
1581 struct vxlan_mdb_remote *remote, *tmp;
1583 list_for_each_entry_safe(remote, tmp, &mdb_entry->remotes, list)
1584 vxlan_mdb_remote_del(vxlan, mdb_entry, remote);
1587 static void vxlan_mdb_entries_flush(struct vxlan_dev *vxlan)
1589 struct vxlan_mdb_entry *mdb_entry;
1590 struct hlist_node *tmp;
1592 /* The removal of an entry cannot trigger the removal of another entry
1593 * since entries are always added to the head of the list.
1595 hlist_for_each_entry_safe(mdb_entry, tmp, &vxlan->mdb_list, mdb_node) {
1596 vxlan_mdb_remotes_flush(vxlan, mdb_entry);
1597 vxlan_mdb_entry_put(vxlan, mdb_entry);
1601 int vxlan_mdb_init(struct vxlan_dev *vxlan)
1605 err = rhashtable_init(&vxlan->mdb_tbl, &vxlan_mdb_rht_params);
1609 INIT_HLIST_HEAD(&vxlan->mdb_list);
1614 void vxlan_mdb_fini(struct vxlan_dev *vxlan)
1616 vxlan_mdb_entries_flush(vxlan);
1617 WARN_ON_ONCE(vxlan->cfg.flags & VXLAN_F_MDB);
1618 rhashtable_free_and_destroy(&vxlan->mdb_tbl, vxlan_mdb_check_empty,