Lines Matching defs:vxlan

29 #include <net/vxlan.h>
61 static int vxlan_sock_add(struct vxlan_dev *vxlan);
63 static void vxlan_vs_del_dev(struct vxlan_dev *vxlan);
108 if (!node->vxlan)
111 if (node->vxlan->cfg.flags & VXLAN_F_VNIFILTER) {
112 vnode = vxlan_vnifilter_lookup(node->vxlan, vni);
115 } else if (node->vxlan->default_dst.remote_vni != vni) {
120 const struct vxlan_config *cfg = &node->vxlan->cfg;
129 return node->vxlan;
150 static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan,
192 ndm->ndm_ifindex = vxlan->dev->ifindex;
198 if (!net_eq(dev_net(vxlan->dev), vxlan->net) &&
200 peernet2id(dev_net(vxlan->dev), vxlan->net)))
214 rdst->remote_port != vxlan->cfg.dst_port &&
217 if (rdst->remote_vni != vxlan->default_dst.remote_vni &&
225 if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) && fdb->vni &&
258 static void __vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,
261 struct net *net = dev_net(vxlan->dev);
269 err = vxlan_fdb_info(skb, vxlan, fdb, 0, 0, type, 0, rd);
284 static void vxlan_fdb_switchdev_notifier_info(const struct vxlan_dev *vxlan,
290 fdb_info->info.dev = vxlan->dev;
302 static int vxlan_fdb_switchdev_call_notifiers(struct vxlan_dev *vxlan,
317 vxlan_fdb_switchdev_notifier_info(vxlan, fdb, rd, NULL, &info);
318 ret = call_switchdev_notifiers(notifier_type, vxlan->dev,
323 static int vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,
332 err = vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd,
338 vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd,
344 __vxlan_fdb_notify(vxlan, fdb, rd, type);
350 struct vxlan_dev *vxlan = netdev_priv(dev);
359 vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL);
362 static void vxlan_fdb_miss(struct vxlan_dev *vxlan, const u8 eth_addr[ETH_ALEN])
371 vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL);
396 u32 fdb_head_index(struct vxlan_dev *vxlan, const u8 *mac, __be32 vni)
398 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)
405 static inline struct hlist_head *vxlan_fdb_head(struct vxlan_dev *vxlan,
408 return &vxlan->fdb_head[fdb_head_index(vxlan, mac, vni)];
412 static struct vxlan_fdb *__vxlan_find_mac(struct vxlan_dev *vxlan,
415 struct hlist_head *head = vxlan_fdb_head(vxlan, mac, vni);
420 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) {
432 static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan,
437 f = __vxlan_find_mac(vxlan, mac, vni);
444 /* caller should hold vxlan->hash_lock */
465 struct vxlan_dev *vxlan = netdev_priv(dev);
479 f = __vxlan_find_mac(vxlan, eth_addr, vni);
486 vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, NULL, fdb_info);
495 const struct vxlan_dev *vxlan,
503 vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, extack, &fdb_info);
513 struct vxlan_dev *vxlan;
521 vxlan = netdev_priv(dev);
524 spin_lock_bh(&vxlan->hash_lock[h]);
525 hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist) {
528 rc = vxlan_fdb_notify_one(nb, vxlan,
536 spin_unlock_bh(&vxlan->hash_lock[h]);
541 spin_unlock_bh(&vxlan->hash_lock[h]);
548 struct vxlan_dev *vxlan;
555 vxlan = netdev_priv(dev);
558 spin_lock_bh(&vxlan->hash_lock[h]);
559 hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist)
563 spin_unlock_bh(&vxlan->hash_lock[h]);
711 skb_gro_pull(skb, sizeof(struct vxlanhdr)); /* pull vxlan header */
793 static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, const u8 *mac,
807 RCU_INIT_POINTER(f->vdev, vxlan);
815 static void vxlan_fdb_insert(struct vxlan_dev *vxlan, const u8 *mac,
818 ++vxlan->addrcnt;
820 vxlan_fdb_head(vxlan, mac, src_vni));
823 static int vxlan_fdb_nh_update(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,
833 nh = nexthop_find_by_id(vxlan->net, nhid);
855 switch (vxlan->default_dst.remote_ip.sa.sa_family) {
885 int vxlan_fdb_create(struct vxlan_dev *vxlan,
896 if (vxlan->cfg.addrmax &&
897 vxlan->addrcnt >= vxlan->cfg.addrmax)
900 netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip);
901 f = vxlan_fdb_alloc(vxlan, mac, state, src_vni, ndm_flags);
906 rc = vxlan_fdb_nh_update(vxlan, f, nhid, extack);
947 static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,
952 netdev_dbg(vxlan->dev, "delete %pM\n", f->eth_addr);
954 --vxlan->addrcnt;
957 vxlan_fdb_notify(vxlan, f, NULL, RTM_DELNEIGH,
961 vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH,
978 static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan,
1028 rc = vxlan_fdb_nh_update(vxlan, f, nhid, extack);
1058 err = vxlan_fdb_notify(vxlan, f, rd, RTM_NEWNEIGH,
1078 static int vxlan_fdb_update_create(struct vxlan_dev *vxlan,
1095 netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip);
1096 rc = vxlan_fdb_create(vxlan, mac, ip, state, port, src_vni,
1101 vxlan_fdb_insert(vxlan, mac, src_vni, f);
1102 rc = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH,
1110 vxlan_fdb_destroy(vxlan, f, false, false);
1115 int vxlan_fdb_update(struct vxlan_dev *vxlan,
1125 f = __vxlan_find_mac(vxlan, mac, src_vni);
1128 netdev_dbg(vxlan->dev,
1133 return vxlan_fdb_update_existing(vxlan, ip, state, flags, port,
1140 return vxlan_fdb_update_create(vxlan, mac, ip, state, flags,
1147 static void vxlan_fdb_dst_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,
1151 vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH, swdev_notify, NULL);
1155 static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
1160 struct net *net = dev_net(vxlan->dev);
1176 union vxlan_addr *remote = &vxlan->default_dst.remote_ip;
1191 NL_SET_ERR_MSG(extack, "Invalid vxlan port");
1196 *port = vxlan->cfg.dst_port;
1206 *vni = vxlan->default_dst.remote_vni;
1216 *src_vni = vxlan->default_dst.remote_vni;
1250 struct vxlan_dev *vxlan = netdev_priv(dev);
1251 /* struct net *net = dev_net(vxlan->dev); */
1268 err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
1273 if (vxlan->default_dst.remote_ip.sa.sa_family != ip.sa.sa_family)
1276 hash_index = fdb_head_index(vxlan, addr, src_vni);
1277 spin_lock_bh(&vxlan->hash_lock[hash_index]);
1278 err = vxlan_fdb_update(vxlan, addr, &ip, ndm->ndm_state, flags,
1282 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
1287 int __vxlan_fdb_delete(struct vxlan_dev *vxlan,
1296 f = vxlan_find_mac(vxlan, addr, src_vni);
1310 vxlan_fdb_dst_destroy(vxlan, f, rd, swdev_notify);
1314 vxlan_fdb_destroy(vxlan, f, true, swdev_notify);
1326 struct vxlan_dev *vxlan = netdev_priv(dev);
1334 err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
1339 hash_index = fdb_head_index(vxlan, addr, src_vni);
1340 spin_lock_bh(&vxlan->hash_lock[hash_index]);
1341 err = __vxlan_fdb_delete(vxlan, addr, ip, port, src_vni, vni, ifindex,
1343 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
1353 struct vxlan_dev *vxlan = netdev_priv(dev);
1361 hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) {
1367 err = vxlan_fdb_info(skb, vxlan, f,
1385 err = vxlan_fdb_info(skb, vxlan, f,
1411 struct vxlan_dev *vxlan = netdev_priv(dev);
1419 vni = vxlan->default_dst.remote_vni;
1423 f = __vxlan_find_mac(vxlan, addr, vni);
1430 err = vxlan_fdb_info(skb, vxlan, f, portid, seq,
1445 struct vxlan_dev *vxlan = netdev_priv(dev);
1455 f = vxlan_find_mac(vxlan, src_mac, vni);
1478 vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL);
1480 u32 hash_index = fdb_head_index(vxlan, src_mac, vni);
1483 spin_lock(&vxlan->hash_lock[hash_index]);
1487 vxlan_fdb_update(vxlan, src_mac, src_ip,
1490 vxlan->cfg.dst_port,
1492 vxlan->default_dst.remote_vni,
1494 spin_unlock(&vxlan->hash_lock[hash_index]);
1521 static void vxlan_sock_release(struct vxlan_dev *vxlan)
1523 struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock);
1525 struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock);
1527 RCU_INIT_POINTER(vxlan->vn6_sock, NULL);
1530 RCU_INIT_POINTER(vxlan->vn4_sock, NULL);
1533 if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)
1534 vxlan_vs_del_vnigrp(vxlan);
1536 vxlan_vs_del_dev(vxlan);
1604 static bool vxlan_set_mac(struct vxlan_dev *vxlan,
1612 skb->protocol = eth_type_trans(skb, vxlan->dev);
1616 if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr))
1634 if ((vxlan->cfg.flags & VXLAN_F_LEARN) &&
1669 struct vxlan_dev *vxlan;
1687 netdev_dbg(skb->dev, "invalid vxlan flags=%#x vni=%#x\n",
1690 /* Return non vxlan pkt */
1702 vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni, &vninode);
1703 if (!vxlan)
1717 !net_eq(vxlan->net, dev_net(vxlan->dev))))
1761 if (!vxlan_set_mac(vxlan, vs, skb, vni))
1765 skb->dev = vxlan->dev;
1778 DEV_STATS_INC(vxlan->dev, rx_length_errors);
1779 DEV_STATS_INC(vxlan->dev, rx_errors);
1780 vxlan_vnifilter_count(vxlan, vni, vninode,
1789 DEV_STATS_INC(vxlan->dev, rx_frame_errors);
1790 DEV_STATS_INC(vxlan->dev, rx_errors);
1791 vxlan_vnifilter_count(vxlan, vni, vninode,
1798 if (unlikely(!(vxlan->dev->flags & IFF_UP))) {
1800 dev_core_stats_rx_dropped_inc(vxlan->dev);
1801 vxlan_vnifilter_count(vxlan, vni, vninode,
1806 dev_sw_netstats_rx_add(vxlan->dev, skb->len);
1807 vxlan_vnifilter_count(vxlan, vni, vninode, VXLAN_VNI_STATS_RX, skb->len);
1808 gro_cells_receive(&vxlan->gro_cells, skb);
1823 struct vxlan_dev *vxlan;
1841 vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni, NULL);
1842 if (!vxlan)
1850 struct vxlan_dev *vxlan = netdev_priv(dev);
1861 vxlan_vnifilter_count(vxlan, vni, NULL,
1897 f = vxlan_find_mac(vxlan, n->ha, vni);
1919 vxlan_vnifilter_count(vxlan, vni, NULL,
1923 } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) {
2030 struct vxlan_dev *vxlan = netdev_priv(dev);
2061 f = vxlan_find_mac(vxlan, n->ha, vni);
2078 vxlan_vnifilter_count(vxlan, vni, NULL,
2081 } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) {
2099 struct vxlan_dev *vxlan = netdev_priv(dev);
2115 if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) {
2136 if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) {
2296 struct vxlan_dev *vxlan,
2312 vxlan->cfg.flags & VXLAN_F_LOCALBYPASS) {
2316 dst_vxlan = vxlan_find_vni(vxlan->net, dst_ifindex, vni,
2318 vxlan->cfg.flags);
2321 vxlan_vnifilter_count(vxlan, vni, NULL,
2327 vxlan_encap_bypass(skb, vxlan, dst_vxlan, vni, true);
2341 struct vxlan_dev *vxlan = netdev_priv(dev);
2352 u32 flags = vxlan->cfg.flags;
2355 bool xnet = !net_eq(vxlan->net, dev_net(vxlan->dev));
2368 vxlan_encap_bypass(skb, vxlan, vxlan,
2375 addr_family = vxlan->cfg.saddr.sa.sa_family;
2376 dst_port = rdst->remote_port ? rdst->remote_port : vxlan->cfg.dst_port;
2381 key.u.ipv4.src = vxlan->cfg.saddr.sin.sin_addr.s_addr;
2384 key.u.ipv6.src = vxlan->cfg.saddr.sin6.sin6_addr;
2393 ttl = vxlan->cfg.ttl;
2397 tos = vxlan->cfg.tos;
2408 switch (vxlan->cfg.label_policy) {
2410 key.label = vxlan->cfg.label;
2428 dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port;
2441 src_port = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min,
2442 vxlan->cfg.port_max, true);
2446 struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock);
2454 rt = udp_tunnel_dst_lookup(skb, dev, vxlan->net, ifindex,
2464 err = encap_bypass_if_local(skb, dev, vxlan, AF_INET,
2470 if (vxlan->cfg.df == VXLAN_DF_SET) {
2472 } else if (vxlan->cfg.df == VXLAN_DF_INHERIT) {
2501 vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);
2518 struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
2524 ndst = udp_tunnel6_dst_lookup(skb, dev, vxlan->net, sock6->sock,
2537 err = encap_bypass_if_local(skb, dev, vxlan, AF_INET6,
2561 vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);
2579 vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX, pkt_len);
2586 vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX_DROPS, 0);
2598 vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX_ERRORS, 0);
2639 struct vxlan_dev *vxlan = netdev_priv(dev);
2657 if (vxlan->cfg.saddr.sa.sa_family != nh_rdst.remote_ip.sa.sa_family)
2683 struct vxlan_dev *vxlan = netdev_priv(dev);
2696 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) {
2710 if (vxlan->cfg.flags & VXLAN_F_PROXY) {
2731 if (vxlan->cfg.flags & VXLAN_F_MDB) {
2735 mdb_entry = vxlan_mdb_entry_skb_get(vxlan, skb, vni);
2739 ret = vxlan_mdb_xmit(vxlan, mdb_entry, skb);
2747 f = vxlan_find_mac(vxlan, eth->h_dest, vni);
2750 if (f && (f->flags & NTF_ROUTER) && (vxlan->cfg.flags & VXLAN_F_RSC) &&
2755 f = vxlan_find_mac(vxlan, eth->h_dest, vni);
2759 f = vxlan_find_mac(vxlan, all_zeros_mac, vni);
2761 if ((vxlan->cfg.flags & VXLAN_F_L2MISS) &&
2763 vxlan_fdb_miss(vxlan, eth->h_dest);
2766 vxlan_vnifilter_count(vxlan, vni, NULL,
2775 (vni ? : vxlan->default_dst.remote_vni), did_rsc);
2800 struct vxlan_dev *vxlan = from_timer(vxlan, t, age_timer);
2804 if (!netif_running(vxlan->dev))
2810 spin_lock(&vxlan->hash_lock[h]);
2811 hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) {
2822 timeout = f->used + vxlan->cfg.age_interval * HZ;
2824 netdev_dbg(vxlan->dev,
2828 vxlan_fdb_destroy(vxlan, f, true, true);
2832 spin_unlock(&vxlan->hash_lock[h]);
2835 mod_timer(&vxlan->age_timer, next_timer);
2838 static void vxlan_vs_del_dev(struct vxlan_dev *vxlan)
2840 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);
2843 hlist_del_init_rcu(&vxlan->hlist4.hlist);
2845 hlist_del_init_rcu(&vxlan->hlist6.hlist);
2850 static void vxlan_vs_add_dev(struct vxlan_sock *vs, struct vxlan_dev *vxlan,
2853 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);
2854 __be32 vni = vxlan->default_dst.remote_vni;
2856 node->vxlan = vxlan;
2865 struct vxlan_dev *vxlan = netdev_priv(dev);
2868 if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)
2869 vxlan_vnigroup_init(vxlan);
2871 err = gro_cells_init(&vxlan->gro_cells, dev);
2875 err = vxlan_mdb_init(vxlan);
2883 gro_cells_destroy(&vxlan->gro_cells);
2885 if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)
2886 vxlan_vnigroup_uninit(vxlan);
2890 static void vxlan_fdb_delete_default(struct vxlan_dev *vxlan, __be32 vni)
2893 u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, vni);
2895 spin_lock_bh(&vxlan->hash_lock[hash_index]);
2896 f = __vxlan_find_mac(vxlan, all_zeros_mac, vni);
2898 vxlan_fdb_destroy(vxlan, f, true, true);
2899 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
2904 struct vxlan_dev *vxlan = netdev_priv(dev);
2906 vxlan_mdb_fini(vxlan);
2908 if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)
2909 vxlan_vnigroup_uninit(vxlan);
2911 gro_cells_destroy(&vxlan->gro_cells);
2913 vxlan_fdb_delete_default(vxlan, vxlan->cfg.vni);
2919 struct vxlan_dev *vxlan = netdev_priv(dev);
2922 ret = vxlan_sock_add(vxlan);
2926 ret = vxlan_multicast_join(vxlan);
2928 vxlan_sock_release(vxlan);
2932 if (vxlan->cfg.age_interval)
2933 mod_timer(&vxlan->age_timer, jiffies + FDB_AGE_INTERVAL);
2952 const struct vxlan_dev *vxlan)
2954 return is_zero_ether_addr(f->eth_addr) && f->vni == vxlan->cfg.vni;
2965 const struct vxlan_dev *vxlan,
2974 if (desc->ignore_default_entry && vxlan_fdb_is_default_entry(f, vxlan))
3010 vxlan_fdb_flush_match_remotes(struct vxlan_fdb *f, struct vxlan_dev *vxlan,
3021 vxlan_fdb_dst_destroy(vxlan, f, rd, true);
3029 static void vxlan_flush(struct vxlan_dev *vxlan,
3038 spin_lock_bh(&vxlan->hash_lock[h]);
3039 hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) {
3043 if (!vxlan_fdb_flush_matches(f, vxlan, desc))
3049 vxlan_fdb_flush_match_remotes(f, vxlan, desc,
3056 vxlan_fdb_destroy(vxlan, f, true, true);
3058 spin_unlock_bh(&vxlan->hash_lock[h]);
3081 struct vxlan_dev *vxlan = netdev_priv(dev);
3137 vxlan_flush(vxlan, &desc);
3145 struct vxlan_dev *vxlan = netdev_priv(dev);
3153 vxlan_multicast_leave(vxlan);
3155 del_timer_sync(&vxlan->age_timer);
3157 vxlan_flush(vxlan, &desc);
3158 vxlan_sock_release(vxlan);
3170 struct vxlan_dev *vxlan = netdev_priv(dev);
3171 struct vxlan_rdst *dst = &vxlan->default_dst;
3172 struct net_device *lowerdev = __dev_get_by_index(vxlan->net,
3179 int max_mtu = lowerdev->mtu - vxlan_headroom(vxlan->cfg.flags);
3190 struct vxlan_dev *vxlan = netdev_priv(dev);
3194 sport = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min,
3195 vxlan->cfg.port_max, true);
3196 dport = info->key.tp_dst ? : vxlan->cfg.dst_port;
3199 struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock);
3205 rt = udp_tunnel_dst_lookup(skb, dev, vxlan->net, 0,
3215 struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
3221 ndst = udp_tunnel6_dst_lookup(skb, dev, vxlan->net, sock6->sock,
3273 .name = "vxlan",
3309 struct vxlan_dev *vxlan = netdev_priv(dev);
3335 INIT_LIST_HEAD(&vxlan->next);
3337 timer_setup(&vxlan->age_timer, vxlan_cleanup, TIMER_DEFERRABLE);
3339 vxlan->dev = dev;
3342 spin_lock_init(&vxlan->hash_lock[h]);
3343 INIT_HLIST_HEAD(&vxlan->fdb_head[h]);
3471 strscpy(drvinfo->driver, "vxlan", sizeof(drvinfo->driver));
3477 struct vxlan_dev *vxlan = netdev_priv(dev);
3478 struct vxlan_rdst *dst = &vxlan->default_dst;
3479 struct net_device *lowerdev = __dev_get_by_index(vxlan->net,
3585 static int __vxlan_sock_add(struct vxlan_dev *vxlan, bool ipv6)
3587 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);
3588 bool metadata = vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA;
3593 if (vxlan->cfg.remote_ifindex)
3595 vxlan->net, vxlan->cfg.remote_ifindex);
3597 if (!vxlan->cfg.no_share) {
3599 vs = vxlan_find_sock(vxlan->net, ipv6 ? AF_INET6 : AF_INET,
3600 vxlan->cfg.dst_port, vxlan->cfg.flags,
3609 vs = vxlan_socket_create(vxlan->net, ipv6,
3610 vxlan->cfg.dst_port, vxlan->cfg.flags,
3616 rcu_assign_pointer(vxlan->vn6_sock, vs);
3617 node = &vxlan->hlist6;
3621 rcu_assign_pointer(vxlan->vn4_sock, vs);
3622 node = &vxlan->hlist4;
3625 if (metadata && (vxlan->cfg.flags & VXLAN_F_VNIFILTER))
3626 vxlan_vs_add_vnigrp(vxlan, vs, ipv6);
3628 vxlan_vs_add_dev(vs, vxlan, node);
3633 static int vxlan_sock_add(struct vxlan_dev *vxlan)
3635 bool metadata = vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA;
3636 bool ipv6 = vxlan->cfg.flags & VXLAN_F_IPV6 || metadata;
3640 RCU_INIT_POINTER(vxlan->vn4_sock, NULL);
3642 RCU_INIT_POINTER(vxlan->vn6_sock, NULL);
3644 ret = __vxlan_sock_add(vxlan, true);
3650 ret = __vxlan_sock_add(vxlan, false);
3652 vxlan_sock_release(vxlan);
3656 int vxlan_vni_in_use(struct net *src_net, struct vxlan_dev *vxlan,
3663 if (tmp == vxlan)
3845 struct vxlan_dev *vxlan = netdev_priv(dev);
3846 struct vxlan_rdst *dst = &vxlan->default_dst;
3860 vxlan->net = src_net;
3893 memcpy(&vxlan->cfg, conf, sizeof(*conf));
3900 struct vxlan_dev *vxlan = netdev_priv(dev);
3904 ret = vxlan_config_validate(src_net, conf, &lowerdev, vxlan, extack);
3918 struct vxlan_dev *vxlan = netdev_priv(dev);
3925 dst = &vxlan->default_dst;
3934 err = vxlan_fdb_create(vxlan, all_zeros_mac,
3937 vxlan->cfg.dst_port,
3968 vxlan_fdb_insert(vxlan, all_zeros_mac, dst->remote_vni, f);
3971 err = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f),
3974 vxlan_fdb_destroy(vxlan, f, false, false);
3981 list_add(&vxlan->next, &vn->vxlan_list);
4033 struct vxlan_dev *vxlan = netdev_priv(dev);
4040 memcpy(conf, &vxlan->cfg, sizeof(*conf));
4306 "vxlan vnifilter only valid in collect metadata mode");
4332 struct vxlan_dev *vxlan = netdev_priv(dev);
4338 dst = &vxlan->default_dst;
4343 err = vxlan_config_validate(vxlan->net, &conf, &lowerdev,
4344 vxlan, extack);
4358 u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, conf.vni);
4360 spin_lock_bh(&vxlan->hash_lock[hash_index]);
4362 err = vxlan_fdb_update(vxlan, all_zeros_mac,
4366 vxlan->cfg.dst_port,
4371 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
4378 __vxlan_fdb_delete(vxlan, all_zeros_mac,
4380 vxlan->cfg.dst_port,
4385 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
4390 if (vxlan->cfg.flags & VXLAN_F_VNIFILTER) {
4391 err = vxlan_vnilist_update_group(vxlan, &dst->remote_ip,
4401 if (conf.age_interval != vxlan->cfg.age_interval)
4402 mod_timer(&vxlan->age_timer, jiffies);
4407 vxlan_config_apply(dev, &conf, lowerdev, vxlan->net, true);
4413 struct vxlan_dev *vxlan = netdev_priv(dev);
4419 vxlan_flush(vxlan, &desc);
4421 list_del(&vxlan->next);
4423 if (vxlan->default_dst.remote_dev)
4424 netdev_upper_dev_unlink(vxlan->default_dst.remote_dev, dev);
4465 const struct vxlan_dev *vxlan = netdev_priv(dev);
4466 const struct vxlan_rdst *dst = &vxlan->default_dst;
4468 .low = htons(vxlan->cfg.port_min),
4469 .high = htons(vxlan->cfg.port_max),
4492 if (!vxlan_addr_any(&vxlan->cfg.saddr)) {
4493 if (vxlan->cfg.saddr.sa.sa_family == AF_INET) {
4495 vxlan->cfg.saddr.sin.sin_addr.s_addr))
4500 &vxlan->cfg.saddr.sin6.sin6_addr))
4506 if (nla_put_u8(skb, IFLA_VXLAN_TTL, vxlan->cfg.ttl) ||
4508 !!(vxlan->cfg.flags & VXLAN_F_TTL_INHERIT)) ||
4509 nla_put_u8(skb, IFLA_VXLAN_TOS, vxlan->cfg.tos) ||
4510 nla_put_u8(skb, IFLA_VXLAN_DF, vxlan->cfg.df) ||
4511 nla_put_be32(skb, IFLA_VXLAN_LABEL, vxlan->cfg.label) ||
4512 nla_put_u32(skb, IFLA_VXLAN_LABEL_POLICY, vxlan->cfg.label_policy) ||
4514 !!(vxlan->cfg.flags & VXLAN_F_LEARN)) ||
4516 !!(vxlan->cfg.flags & VXLAN_F_PROXY)) ||
4518 !!(vxlan->cfg.flags & VXLAN_F_RSC)) ||
4520 !!(vxlan->cfg.flags & VXLAN_F_L2MISS)) ||
4522 !!(vxlan->cfg.flags & VXLAN_F_L3MISS)) ||
4524 !!(vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)) ||
4525 nla_put_u32(skb, IFLA_VXLAN_AGEING, vxlan->cfg.age_interval) ||
4526 nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->cfg.addrmax) ||
4527 nla_put_be16(skb, IFLA_VXLAN_PORT, vxlan->cfg.dst_port) ||
4529 !(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM_TX)) ||
4531 !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_TX)) ||
4533 !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_RX)) ||
4535 !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_TX)) ||
4537 !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_RX)) ||
4539 !!(vxlan->cfg.flags & VXLAN_F_LOCALBYPASS)))
4545 if (vxlan->cfg.flags & VXLAN_F_GBP &&
4549 if (vxlan->cfg.flags & VXLAN_F_GPE &&
4553 if (vxlan->cfg.flags & VXLAN_F_REMCSUM_NOPARTIAL &&
4557 if (vxlan->cfg.flags & VXLAN_F_VNIFILTER &&
4559 !!(vxlan->cfg.flags & VXLAN_F_VNIFILTER)))
4570 struct vxlan_dev *vxlan = netdev_priv(dev);
4572 return READ_ONCE(vxlan->net);
4576 .kind = "vxlan",
4627 struct vxlan_dev *vxlan, *next;
4630 list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) {
4631 struct vxlan_rdst *dst = &vxlan->default_dst;
4633 /* In case we created vxlan device with carrier
4635 * we also need to remove vxlan device. In other
4640 vxlan_dellink(vxlan->dev, &list_kill);
4670 struct vxlan_dev *vxlan = netdev_priv(dev);
4675 hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);
4677 spin_lock_bh(&vxlan->hash_lock[hash_index]);
4679 f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni);
4693 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
4700 struct vxlan_dev *vxlan = netdev_priv(dev);
4705 hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);
4708 spin_lock_bh(&vxlan->hash_lock[hash_index]);
4709 err = vxlan_fdb_update(vxlan, fdb_info->eth_addr, &fdb_info->remote_ip,
4718 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
4727 struct vxlan_dev *vxlan = netdev_priv(dev);
4732 hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);
4733 spin_lock_bh(&vxlan->hash_lock[hash_index]);
4735 f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni);
4739 err = __vxlan_fdb_delete(vxlan, fdb_info->eth_addr,
4747 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
4795 struct vxlan_dev *vxlan;
4800 vxlan = rcu_dereference(fdb->vdev);
4801 WARN_ON(!vxlan);
4802 hash_index = fdb_head_index(vxlan, fdb->eth_addr,
4803 vxlan->default_dst.remote_vni);
4804 spin_lock_bh(&vxlan->hash_lock[hash_index]);
4806 vxlan_fdb_destroy(vxlan, fdb, false, false);
4807 spin_unlock_bh(&vxlan->hash_lock[hash_index]);
4849 struct vxlan_dev *vxlan, *next;
4851 list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next)
4852 vxlan_dellink(vxlan->dev, dev_to_kill);
4938 MODULE_ALIAS_RTNL_LINK("vxlan");