• Home
  • Raw
  • Download

Lines Matching refs:vxlan

59 static int vxlan_sock_add(struct vxlan_dev *vxlan);
61 static void vxlan_vs_del_dev(struct vxlan_dev *vxlan);
215 if (node->vxlan->default_dst.remote_vni != vni) in vxlan_vs_find_vni()
219 const struct vxlan_config *cfg = &node->vxlan->cfg; in vxlan_vs_find_vni()
226 return node->vxlan; in vxlan_vs_find_vni()
247 static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan, in vxlan_fdb_info() argument
274 ndm->ndm_ifindex = vxlan->dev->ifindex; in vxlan_fdb_info()
280 if (!net_eq(dev_net(vxlan->dev), vxlan->net) && in vxlan_fdb_info()
282 peernet2id(dev_net(vxlan->dev), vxlan->net))) in vxlan_fdb_info()
291 if (rdst->remote_port && rdst->remote_port != vxlan->cfg.dst_port && in vxlan_fdb_info()
294 if (rdst->remote_vni != vxlan->default_dst.remote_vni && in vxlan_fdb_info()
297 if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) && fdb->vni && in vxlan_fdb_info()
333 static void __vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb, in __vxlan_fdb_notify() argument
336 struct net *net = dev_net(vxlan->dev); in __vxlan_fdb_notify()
344 err = vxlan_fdb_info(skb, vxlan, fdb, 0, 0, type, 0, rd); in __vxlan_fdb_notify()
359 static void vxlan_fdb_switchdev_notifier_info(const struct vxlan_dev *vxlan, in vxlan_fdb_switchdev_notifier_info() argument
365 fdb_info->info.dev = vxlan->dev; in vxlan_fdb_switchdev_notifier_info()
377 static int vxlan_fdb_switchdev_call_notifiers(struct vxlan_dev *vxlan, in vxlan_fdb_switchdev_call_notifiers() argument
392 vxlan_fdb_switchdev_notifier_info(vxlan, fdb, rd, NULL, &info); in vxlan_fdb_switchdev_call_notifiers()
393 ret = call_switchdev_notifiers(notifier_type, vxlan->dev, in vxlan_fdb_switchdev_call_notifiers()
398 static int vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb, in vxlan_fdb_notify() argument
407 err = vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd, in vxlan_fdb_notify()
413 vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd, in vxlan_fdb_notify()
419 __vxlan_fdb_notify(vxlan, fdb, rd, type); in vxlan_fdb_notify()
425 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_ip_miss() local
434 vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL); in vxlan_ip_miss()
437 static void vxlan_fdb_miss(struct vxlan_dev *vxlan, const u8 eth_addr[ETH_ALEN]) in vxlan_fdb_miss() argument
446 vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL); in vxlan_fdb_miss()
471 static u32 fdb_head_index(struct vxlan_dev *vxlan, const u8 *mac, __be32 vni) in fdb_head_index() argument
473 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) in fdb_head_index()
480 static inline struct hlist_head *vxlan_fdb_head(struct vxlan_dev *vxlan, in vxlan_fdb_head() argument
483 return &vxlan->fdb_head[fdb_head_index(vxlan, mac, vni)]; in vxlan_fdb_head()
487 static struct vxlan_fdb *__vxlan_find_mac(struct vxlan_dev *vxlan, in __vxlan_find_mac() argument
490 struct hlist_head *head = vxlan_fdb_head(vxlan, mac, vni); in __vxlan_find_mac()
495 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) { in __vxlan_find_mac()
507 static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan, in vxlan_find_mac() argument
512 f = __vxlan_find_mac(vxlan, mac, vni); in vxlan_find_mac()
540 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_find_uc() local
554 f = __vxlan_find_mac(vxlan, eth_addr, vni); in vxlan_fdb_find_uc()
561 vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, NULL, fdb_info); in vxlan_fdb_find_uc()
570 const struct vxlan_dev *vxlan, in vxlan_fdb_notify_one() argument
578 vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, extack, &fdb_info); in vxlan_fdb_notify_one()
588 struct vxlan_dev *vxlan; in vxlan_fdb_replay() local
596 vxlan = netdev_priv(dev); in vxlan_fdb_replay()
599 spin_lock_bh(&vxlan->hash_lock[h]); in vxlan_fdb_replay()
600 hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist) { in vxlan_fdb_replay()
603 rc = vxlan_fdb_notify_one(nb, vxlan, in vxlan_fdb_replay()
611 spin_unlock_bh(&vxlan->hash_lock[h]); in vxlan_fdb_replay()
616 spin_unlock_bh(&vxlan->hash_lock[h]); in vxlan_fdb_replay()
623 struct vxlan_dev *vxlan; in vxlan_fdb_clear_offload() local
630 vxlan = netdev_priv(dev); in vxlan_fdb_clear_offload()
633 spin_lock_bh(&vxlan->hash_lock[h]); in vxlan_fdb_clear_offload()
634 hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist) in vxlan_fdb_clear_offload()
638 spin_unlock_bh(&vxlan->hash_lock[h]); in vxlan_fdb_clear_offload()
796 static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, in vxlan_fdb_alloc() argument
815 static void vxlan_fdb_insert(struct vxlan_dev *vxlan, const u8 *mac, in vxlan_fdb_insert() argument
818 ++vxlan->addrcnt; in vxlan_fdb_insert()
820 vxlan_fdb_head(vxlan, mac, src_vni)); in vxlan_fdb_insert()
823 static int vxlan_fdb_create(struct vxlan_dev *vxlan, in vxlan_fdb_create() argument
833 if (vxlan->cfg.addrmax && in vxlan_fdb_create()
834 vxlan->addrcnt >= vxlan->cfg.addrmax) in vxlan_fdb_create()
837 netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); in vxlan_fdb_create()
838 f = vxlan_fdb_alloc(vxlan, mac, state, src_vni, ndm_flags); in vxlan_fdb_create()
871 static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f, in vxlan_fdb_destroy() argument
876 netdev_dbg(vxlan->dev, "delete %pM\n", f->eth_addr); in vxlan_fdb_destroy()
878 --vxlan->addrcnt; in vxlan_fdb_destroy()
881 vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH, in vxlan_fdb_destroy()
896 static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan, in vxlan_fdb_update_existing() argument
957 err = vxlan_fdb_notify(vxlan, f, rd, RTM_NEWNEIGH, in vxlan_fdb_update_existing()
975 static int vxlan_fdb_update_create(struct vxlan_dev *vxlan, in vxlan_fdb_update_create() argument
992 netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); in vxlan_fdb_update_create()
993 rc = vxlan_fdb_create(vxlan, mac, ip, state, port, src_vni, in vxlan_fdb_update_create()
998 vxlan_fdb_insert(vxlan, mac, src_vni, f); in vxlan_fdb_update_create()
999 rc = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH, in vxlan_fdb_update_create()
1007 vxlan_fdb_destroy(vxlan, f, false, false); in vxlan_fdb_update_create()
1012 static int vxlan_fdb_update(struct vxlan_dev *vxlan, in vxlan_fdb_update() argument
1022 f = __vxlan_find_mac(vxlan, mac, src_vni); in vxlan_fdb_update()
1025 netdev_dbg(vxlan->dev, in vxlan_fdb_update()
1030 return vxlan_fdb_update_existing(vxlan, ip, state, flags, port, in vxlan_fdb_update()
1037 return vxlan_fdb_update_create(vxlan, mac, ip, state, flags, in vxlan_fdb_update()
1043 static void vxlan_fdb_dst_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f, in vxlan_fdb_dst_destroy() argument
1047 vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH, swdev_notify, NULL); in vxlan_fdb_dst_destroy()
1051 static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan, in vxlan_fdb_parse() argument
1055 struct net *net = dev_net(vxlan->dev); in vxlan_fdb_parse()
1063 union vxlan_addr *remote = &vxlan->default_dst.remote_ip; in vxlan_fdb_parse()
1080 *port = vxlan->cfg.dst_port; in vxlan_fdb_parse()
1088 *vni = vxlan->default_dst.remote_vni; in vxlan_fdb_parse()
1096 *src_vni = vxlan->default_dst.remote_vni; in vxlan_fdb_parse()
1121 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_add() local
1139 err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex); in vxlan_fdb_add()
1143 if (vxlan->default_dst.remote_ip.sa.sa_family != ip.sa.sa_family) in vxlan_fdb_add()
1146 hash_index = fdb_head_index(vxlan, addr, src_vni); in vxlan_fdb_add()
1147 spin_lock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_add()
1148 err = vxlan_fdb_update(vxlan, addr, &ip, ndm->ndm_state, flags, in vxlan_fdb_add()
1152 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_add()
1157 static int __vxlan_fdb_delete(struct vxlan_dev *vxlan, in __vxlan_fdb_delete() argument
1166 f = vxlan_find_mac(vxlan, addr, src_vni); in __vxlan_fdb_delete()
1180 vxlan_fdb_dst_destroy(vxlan, f, rd, swdev_notify); in __vxlan_fdb_delete()
1184 vxlan_fdb_destroy(vxlan, f, true, swdev_notify); in __vxlan_fdb_delete()
1195 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_delete() local
1203 err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex); in vxlan_fdb_delete()
1207 hash_index = fdb_head_index(vxlan, addr, src_vni); in vxlan_fdb_delete()
1208 spin_lock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_delete()
1209 err = __vxlan_fdb_delete(vxlan, addr, ip, port, src_vni, vni, ifindex, in vxlan_fdb_delete()
1211 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_delete()
1221 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_dump() local
1228 hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) { in vxlan_fdb_dump()
1235 err = vxlan_fdb_info(skb, vxlan, f, in vxlan_fdb_dump()
1258 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_get() local
1266 vni = vxlan->default_dst.remote_vni; in vxlan_fdb_get()
1270 f = __vxlan_find_mac(vxlan, addr, vni); in vxlan_fdb_get()
1277 err = vxlan_fdb_info(skb, vxlan, f, portid, seq, in vxlan_fdb_get()
1292 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_snoop() local
1302 f = vxlan_find_mac(vxlan, src_mac, vni); in vxlan_snoop()
1321 vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL); in vxlan_snoop()
1323 u32 hash_index = fdb_head_index(vxlan, src_mac, vni); in vxlan_snoop()
1326 spin_lock(&vxlan->hash_lock[hash_index]); in vxlan_snoop()
1330 vxlan_fdb_update(vxlan, src_mac, src_ip, in vxlan_snoop()
1333 vxlan->cfg.dst_port, in vxlan_snoop()
1335 vxlan->default_dst.remote_vni, in vxlan_snoop()
1337 spin_unlock(&vxlan->hash_lock[hash_index]); in vxlan_snoop()
1346 struct vxlan_dev *vxlan; in vxlan_group_used() local
1366 list_for_each_entry(vxlan, &vn->vxlan_list, next) { in vxlan_group_used()
1367 if (!netif_running(vxlan->dev) || vxlan == dev) in vxlan_group_used()
1371 rtnl_dereference(vxlan->vn4_sock) != sock4) in vxlan_group_used()
1375 rtnl_dereference(vxlan->vn6_sock) != sock6) in vxlan_group_used()
1379 if (!vxlan_addr_equal(&vxlan->default_dst.remote_ip, in vxlan_group_used()
1383 if (vxlan->default_dst.remote_ifindex != in vxlan_group_used()
1414 static void vxlan_sock_release(struct vxlan_dev *vxlan) in vxlan_sock_release() argument
1416 struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock); in vxlan_sock_release()
1418 struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock); in vxlan_sock_release()
1420 RCU_INIT_POINTER(vxlan->vn6_sock, NULL); in vxlan_sock_release()
1423 RCU_INIT_POINTER(vxlan->vn4_sock, NULL); in vxlan_sock_release()
1426 vxlan_vs_del_dev(vxlan); in vxlan_sock_release()
1444 static int vxlan_igmp_join(struct vxlan_dev *vxlan) in vxlan_igmp_join() argument
1447 union vxlan_addr *ip = &vxlan->default_dst.remote_ip; in vxlan_igmp_join()
1448 int ifindex = vxlan->default_dst.remote_ifindex; in vxlan_igmp_join()
1452 struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock); in vxlan_igmp_join()
1464 struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock); in vxlan_igmp_join()
1478 static int vxlan_igmp_leave(struct vxlan_dev *vxlan) in vxlan_igmp_leave() argument
1481 union vxlan_addr *ip = &vxlan->default_dst.remote_ip; in vxlan_igmp_leave()
1482 int ifindex = vxlan->default_dst.remote_ifindex; in vxlan_igmp_leave()
1486 struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock); in vxlan_igmp_leave()
1498 struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock); in vxlan_igmp_leave()
1592 static bool vxlan_set_mac(struct vxlan_dev *vxlan, in vxlan_set_mac() argument
1600 skb->protocol = eth_type_trans(skb, vxlan->dev); in vxlan_set_mac()
1604 if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr)) in vxlan_set_mac()
1618 if ((vxlan->cfg.flags & VXLAN_F_LEARN) && in vxlan_set_mac()
1653 struct vxlan_dev *vxlan; in vxlan_rcv() local
1685 vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni); in vxlan_rcv()
1686 if (!vxlan) in vxlan_rcv()
1699 !net_eq(vxlan->net, dev_net(vxlan->dev)))) in vxlan_rcv()
1740 if (!vxlan_set_mac(vxlan, vs, skb, vni)) in vxlan_rcv()
1744 skb->dev = vxlan->dev; in vxlan_rcv()
1752 ++vxlan->dev->stats.rx_frame_errors; in vxlan_rcv()
1753 ++vxlan->dev->stats.rx_errors; in vxlan_rcv()
1759 if (unlikely(!(vxlan->dev->flags & IFF_UP))) { in vxlan_rcv()
1761 atomic_long_inc(&vxlan->dev->rx_dropped); in vxlan_rcv()
1765 stats = this_cpu_ptr(vxlan->dev->tstats); in vxlan_rcv()
1771 gro_cells_receive(&vxlan->gro_cells, skb); in vxlan_rcv()
1786 struct vxlan_dev *vxlan; in vxlan_err_lookup() local
1804 vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni); in vxlan_err_lookup()
1805 if (!vxlan) in vxlan_err_lookup()
1813 struct vxlan_dev *vxlan = netdev_priv(dev); in arp_reduce() local
1858 f = vxlan_find_mac(vxlan, n->ha, vni); in arp_reduce()
1880 } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) { in arp_reduce()
1983 struct vxlan_dev *vxlan = netdev_priv(dev); in neigh_reduce() local
2013 f = vxlan_find_mac(vxlan, n->ha, vni); in neigh_reduce()
2031 } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) { in neigh_reduce()
2048 struct vxlan_dev *vxlan = netdev_priv(dev); in route_shortcircuit() local
2064 if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) { in route_shortcircuit()
2085 if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) { in route_shortcircuit()
2214 static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_device *dev, in vxlan_get_route() argument
2246 rt = ip_route_output_key(vxlan->net, &fl4); in vxlan_get_route()
2265 static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan, in vxlan6_get_route() argument
2301 ndst = ipv6_stub->ipv6_dst_lookup_flow(vxlan->net, sock6->sock->sk, in vxlan6_get_route()
2376 struct vxlan_dev *vxlan, in encap_bypass_if_local() argument
2395 dst_vxlan = vxlan_find_vni(vxlan->net, dst_ifindex, vni, in encap_bypass_if_local()
2397 vxlan->cfg.flags); in encap_bypass_if_local()
2404 vxlan_encap_bypass(skb, vxlan, dst_vxlan, vni); in encap_bypass_if_local()
2417 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_xmit_one() local
2429 u32 flags = vxlan->cfg.flags; in vxlan_xmit_one()
2431 bool xnet = !net_eq(vxlan->net, dev_net(vxlan->dev)); in vxlan_xmit_one()
2440 vxlan_encap_bypass(skb, vxlan, vxlan, default_vni); in vxlan_xmit_one()
2446 dst_port = rdst->remote_port ? rdst->remote_port : vxlan->cfg.dst_port; in vxlan_xmit_one()
2449 local_ip = vxlan->cfg.saddr; in vxlan_xmit_one()
2455 ttl = vxlan->cfg.ttl; in vxlan_xmit_one()
2460 tos = vxlan->cfg.tos; in vxlan_xmit_one()
2468 label = vxlan->cfg.label; in vxlan_xmit_one()
2484 dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port; in vxlan_xmit_one()
2498 src_port = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min, in vxlan_xmit_one()
2499 vxlan->cfg.port_max, true); in vxlan_xmit_one()
2503 struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock); in vxlan_xmit_one()
2510 rt = vxlan_get_route(vxlan, dev, sock4, skb, ifindex, tos, in vxlan_xmit_one()
2522 err = encap_bypass_if_local(skb, dev, vxlan, dst, in vxlan_xmit_one()
2528 if (vxlan->cfg.df == VXLAN_DF_SET) { in vxlan_xmit_one()
2530 } else if (vxlan->cfg.df == VXLAN_DF_INHERIT) { in vxlan_xmit_one()
2557 struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock); in vxlan_xmit_one()
2562 ndst = vxlan6_get_route(vxlan, dev, sock6, skb, ifindex, tos, in vxlan_xmit_one()
2576 err = encap_bypass_if_local(skb, dev, vxlan, dst, in vxlan_xmit_one()
2627 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_xmit() local
2639 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) { in vxlan_xmit()
2652 if (vxlan->cfg.flags & VXLAN_F_PROXY) { in vxlan_xmit()
2671 f = vxlan_find_mac(vxlan, eth->h_dest, vni); in vxlan_xmit()
2674 if (f && (f->flags & NTF_ROUTER) && (vxlan->cfg.flags & VXLAN_F_RSC) && in vxlan_xmit()
2679 f = vxlan_find_mac(vxlan, eth->h_dest, vni); in vxlan_xmit()
2683 f = vxlan_find_mac(vxlan, all_zeros_mac, vni); in vxlan_xmit()
2685 if ((vxlan->cfg.flags & VXLAN_F_L2MISS) && in vxlan_xmit()
2687 vxlan_fdb_miss(vxlan, eth->h_dest); in vxlan_xmit()
2717 struct vxlan_dev *vxlan = from_timer(vxlan, t, age_timer); in vxlan_cleanup() local
2721 if (!netif_running(vxlan->dev)) in vxlan_cleanup()
2727 spin_lock(&vxlan->hash_lock[h]); in vxlan_cleanup()
2728 hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) { in vxlan_cleanup()
2739 timeout = f->used + vxlan->cfg.age_interval * HZ; in vxlan_cleanup()
2741 netdev_dbg(vxlan->dev, in vxlan_cleanup()
2745 vxlan_fdb_destroy(vxlan, f, true, true); in vxlan_cleanup()
2749 spin_unlock(&vxlan->hash_lock[h]); in vxlan_cleanup()
2752 mod_timer(&vxlan->age_timer, next_timer); in vxlan_cleanup()
2755 static void vxlan_vs_del_dev(struct vxlan_dev *vxlan) in vxlan_vs_del_dev() argument
2757 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in vxlan_vs_del_dev()
2760 hlist_del_init_rcu(&vxlan->hlist4.hlist); in vxlan_vs_del_dev()
2762 hlist_del_init_rcu(&vxlan->hlist6.hlist); in vxlan_vs_del_dev()
2767 static void vxlan_vs_add_dev(struct vxlan_sock *vs, struct vxlan_dev *vxlan, in vxlan_vs_add_dev() argument
2770 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in vxlan_vs_add_dev()
2771 __be32 vni = vxlan->default_dst.remote_vni; in vxlan_vs_add_dev()
2773 node->vxlan = vxlan; in vxlan_vs_add_dev()
2789 static void vxlan_fdb_delete_default(struct vxlan_dev *vxlan, __be32 vni) in vxlan_fdb_delete_default() argument
2792 u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, vni); in vxlan_fdb_delete_default()
2794 spin_lock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_delete_default()
2795 f = __vxlan_find_mac(vxlan, all_zeros_mac, vni); in vxlan_fdb_delete_default()
2797 vxlan_fdb_destroy(vxlan, f, true, true); in vxlan_fdb_delete_default()
2798 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_delete_default()
2803 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_uninit() local
2805 gro_cells_destroy(&vxlan->gro_cells); in vxlan_uninit()
2807 vxlan_fdb_delete_default(vxlan, vxlan->cfg.vni); in vxlan_uninit()
2815 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_open() local
2818 ret = vxlan_sock_add(vxlan); in vxlan_open()
2822 if (vxlan_addr_multicast(&vxlan->default_dst.remote_ip)) { in vxlan_open()
2823 ret = vxlan_igmp_join(vxlan); in vxlan_open()
2827 vxlan_sock_release(vxlan); in vxlan_open()
2832 if (vxlan->cfg.age_interval) in vxlan_open()
2833 mod_timer(&vxlan->age_timer, jiffies + FDB_AGE_INTERVAL); in vxlan_open()
2839 static void vxlan_flush(struct vxlan_dev *vxlan, bool do_all) in vxlan_flush() argument
2846 spin_lock_bh(&vxlan->hash_lock[h]); in vxlan_flush()
2847 hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) { in vxlan_flush()
2854 vxlan_fdb_destroy(vxlan, f, true, true); in vxlan_flush()
2856 spin_unlock_bh(&vxlan->hash_lock[h]); in vxlan_flush()
2863 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_stop() local
2864 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in vxlan_stop()
2867 if (vxlan_addr_multicast(&vxlan->default_dst.remote_ip) && in vxlan_stop()
2868 !vxlan_group_used(vn, vxlan)) in vxlan_stop()
2869 ret = vxlan_igmp_leave(vxlan); in vxlan_stop()
2871 del_timer_sync(&vxlan->age_timer); in vxlan_stop()
2873 vxlan_flush(vxlan, false); in vxlan_stop()
2874 vxlan_sock_release(vxlan); in vxlan_stop()
2886 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_change_mtu() local
2887 struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_change_mtu()
2888 struct net_device *lowerdev = __dev_get_by_index(vxlan->net, in vxlan_change_mtu()
2890 bool use_ipv6 = !!(vxlan->cfg.flags & VXLAN_F_IPV6); in vxlan_change_mtu()
2908 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fill_metadata_dst() local
2912 sport = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min, in vxlan_fill_metadata_dst()
2913 vxlan->cfg.port_max, true); in vxlan_fill_metadata_dst()
2914 dport = info->key.tp_dst ? : vxlan->cfg.dst_port; in vxlan_fill_metadata_dst()
2917 struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock); in vxlan_fill_metadata_dst()
2920 rt = vxlan_get_route(vxlan, dev, sock4, skb, 0, info->key.tos, in vxlan_fill_metadata_dst()
2929 struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock); in vxlan_fill_metadata_dst()
2932 ndst = vxlan6_get_route(vxlan, dev, sock6, skb, 0, info->key.tos, in vxlan_fill_metadata_dst()
3016 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_setup() local
3040 INIT_LIST_HEAD(&vxlan->next); in vxlan_setup()
3042 timer_setup(&vxlan->age_timer, vxlan_cleanup, TIMER_DEFERRABLE); in vxlan_setup()
3044 vxlan->dev = dev; in vxlan_setup()
3046 gro_cells_init(&vxlan->gro_cells, dev); in vxlan_setup()
3049 spin_lock_init(&vxlan->hash_lock[h]); in vxlan_setup()
3050 INIT_HLIST_HEAD(&vxlan->fdb_head[h]); in vxlan_setup()
3262 static int __vxlan_sock_add(struct vxlan_dev *vxlan, bool ipv6) in __vxlan_sock_add() argument
3264 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in __vxlan_sock_add()
3269 if (vxlan->cfg.remote_ifindex) in __vxlan_sock_add()
3271 vxlan->net, vxlan->cfg.remote_ifindex); in __vxlan_sock_add()
3273 if (!vxlan->cfg.no_share) { in __vxlan_sock_add()
3275 vs = vxlan_find_sock(vxlan->net, ipv6 ? AF_INET6 : AF_INET, in __vxlan_sock_add()
3276 vxlan->cfg.dst_port, vxlan->cfg.flags, in __vxlan_sock_add()
3285 vs = vxlan_socket_create(vxlan->net, ipv6, in __vxlan_sock_add()
3286 vxlan->cfg.dst_port, vxlan->cfg.flags, in __vxlan_sock_add()
3292 rcu_assign_pointer(vxlan->vn6_sock, vs); in __vxlan_sock_add()
3293 node = &vxlan->hlist6; in __vxlan_sock_add()
3297 rcu_assign_pointer(vxlan->vn4_sock, vs); in __vxlan_sock_add()
3298 node = &vxlan->hlist4; in __vxlan_sock_add()
3300 vxlan_vs_add_dev(vs, vxlan, node); in __vxlan_sock_add()
3304 static int vxlan_sock_add(struct vxlan_dev *vxlan) in vxlan_sock_add() argument
3306 bool metadata = vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA; in vxlan_sock_add()
3307 bool ipv6 = vxlan->cfg.flags & VXLAN_F_IPV6 || metadata; in vxlan_sock_add()
3311 RCU_INIT_POINTER(vxlan->vn4_sock, NULL); in vxlan_sock_add()
3313 RCU_INIT_POINTER(vxlan->vn6_sock, NULL); in vxlan_sock_add()
3315 ret = __vxlan_sock_add(vxlan, true); in vxlan_sock_add()
3321 ret = __vxlan_sock_add(vxlan, false); in vxlan_sock_add()
3323 vxlan_sock_release(vxlan); in vxlan_sock_add()
3495 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_config_apply() local
3496 struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_config_apply()
3510 vxlan->net = src_net; in vxlan_config_apply()
3543 memcpy(&vxlan->cfg, conf, sizeof(*conf)); in vxlan_config_apply()
3550 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_dev_configure() local
3554 ret = vxlan_config_validate(src_net, conf, &lowerdev, vxlan, extack); in vxlan_dev_configure()
3568 struct vxlan_dev *vxlan = netdev_priv(dev); in __vxlan_dev_create() local
3575 dst = &vxlan->default_dst; in __vxlan_dev_create()
3584 err = vxlan_fdb_create(vxlan, all_zeros_mac, in __vxlan_dev_create()
3587 vxlan->cfg.dst_port, in __vxlan_dev_create()
3616 vxlan_fdb_insert(vxlan, all_zeros_mac, dst->remote_vni, f); in __vxlan_dev_create()
3619 err = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), in __vxlan_dev_create()
3622 vxlan_fdb_destroy(vxlan, f, false, false); in __vxlan_dev_create()
3629 list_add(&vxlan->next, &vn->vxlan_list); in __vxlan_dev_create()
3681 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_nl2conf() local
3688 memcpy(conf, &vxlan->cfg, sizeof(*conf)); in vxlan_nl2conf()
3952 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_changelink() local
3958 dst = &vxlan->default_dst; in vxlan_changelink()
3963 err = vxlan_config_validate(vxlan->net, &conf, &lowerdev, in vxlan_changelink()
3964 vxlan, extack); in vxlan_changelink()
3978 u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, conf.vni); in vxlan_changelink()
3980 spin_lock_bh(&vxlan->hash_lock[hash_index]); in vxlan_changelink()
3982 err = vxlan_fdb_update(vxlan, all_zeros_mac, in vxlan_changelink()
3986 vxlan->cfg.dst_port, in vxlan_changelink()
3991 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_changelink()
3998 __vxlan_fdb_delete(vxlan, all_zeros_mac, in vxlan_changelink()
4000 vxlan->cfg.dst_port, in vxlan_changelink()
4005 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_changelink()
4008 if (conf.age_interval != vxlan->cfg.age_interval) in vxlan_changelink()
4009 mod_timer(&vxlan->age_timer, jiffies); in vxlan_changelink()
4016 vxlan_config_apply(dev, &conf, lowerdev, vxlan->net, true); in vxlan_changelink()
4022 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_dellink() local
4024 vxlan_flush(vxlan, true); in vxlan_dellink()
4026 list_del(&vxlan->next); in vxlan_dellink()
4028 if (vxlan->default_dst.remote_dev) in vxlan_dellink()
4029 netdev_upper_dev_unlink(vxlan->default_dst.remote_dev, dev); in vxlan_dellink()
4064 const struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fill_info() local
4065 const struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_fill_info()
4067 .low = htons(vxlan->cfg.port_min), in vxlan_fill_info()
4068 .high = htons(vxlan->cfg.port_max), in vxlan_fill_info()
4091 if (!vxlan_addr_any(&vxlan->cfg.saddr)) { in vxlan_fill_info()
4092 if (vxlan->cfg.saddr.sa.sa_family == AF_INET) { in vxlan_fill_info()
4094 vxlan->cfg.saddr.sin.sin_addr.s_addr)) in vxlan_fill_info()
4099 &vxlan->cfg.saddr.sin6.sin6_addr)) in vxlan_fill_info()
4105 if (nla_put_u8(skb, IFLA_VXLAN_TTL, vxlan->cfg.ttl) || in vxlan_fill_info()
4107 !!(vxlan->cfg.flags & VXLAN_F_TTL_INHERIT)) || in vxlan_fill_info()
4108 nla_put_u8(skb, IFLA_VXLAN_TOS, vxlan->cfg.tos) || in vxlan_fill_info()
4109 nla_put_u8(skb, IFLA_VXLAN_DF, vxlan->cfg.df) || in vxlan_fill_info()
4110 nla_put_be32(skb, IFLA_VXLAN_LABEL, vxlan->cfg.label) || in vxlan_fill_info()
4112 !!(vxlan->cfg.flags & VXLAN_F_LEARN)) || in vxlan_fill_info()
4114 !!(vxlan->cfg.flags & VXLAN_F_PROXY)) || in vxlan_fill_info()
4116 !!(vxlan->cfg.flags & VXLAN_F_RSC)) || in vxlan_fill_info()
4118 !!(vxlan->cfg.flags & VXLAN_F_L2MISS)) || in vxlan_fill_info()
4120 !!(vxlan->cfg.flags & VXLAN_F_L3MISS)) || in vxlan_fill_info()
4122 !!(vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)) || in vxlan_fill_info()
4123 nla_put_u32(skb, IFLA_VXLAN_AGEING, vxlan->cfg.age_interval) || in vxlan_fill_info()
4124 nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->cfg.addrmax) || in vxlan_fill_info()
4125 nla_put_be16(skb, IFLA_VXLAN_PORT, vxlan->cfg.dst_port) || in vxlan_fill_info()
4127 !(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM_TX)) || in vxlan_fill_info()
4129 !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_TX)) || in vxlan_fill_info()
4131 !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_RX)) || in vxlan_fill_info()
4133 !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_TX)) || in vxlan_fill_info()
4135 !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_RX))) in vxlan_fill_info()
4141 if (vxlan->cfg.flags & VXLAN_F_GBP && in vxlan_fill_info()
4145 if (vxlan->cfg.flags & VXLAN_F_GPE && in vxlan_fill_info()
4149 if (vxlan->cfg.flags & VXLAN_F_REMCSUM_NOPARTIAL && in vxlan_fill_info()
4161 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_get_link_net() local
4163 return vxlan->net; in vxlan_get_link_net()
4218 struct vxlan_dev *vxlan, *next; in vxlan_handle_lowerdev_unregister() local
4221 list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) { in vxlan_handle_lowerdev_unregister()
4222 struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_handle_lowerdev_unregister()
4231 vxlan_dellink(vxlan->dev, &list_kill); in vxlan_handle_lowerdev_unregister()
4264 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_offloaded_set() local
4269 hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni); in vxlan_fdb_offloaded_set()
4271 spin_lock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_offloaded_set()
4273 f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni); in vxlan_fdb_offloaded_set()
4287 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_offloaded_set()
4294 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_external_learn_add() local
4299 hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni); in vxlan_fdb_external_learn_add()
4302 spin_lock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_external_learn_add()
4303 err = vxlan_fdb_update(vxlan, fdb_info->eth_addr, &fdb_info->remote_ip, in vxlan_fdb_external_learn_add()
4312 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_external_learn_add()
4321 struct vxlan_dev *vxlan = netdev_priv(dev); in vxlan_fdb_external_learn_del() local
4326 hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni); in vxlan_fdb_external_learn_del()
4327 spin_lock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_external_learn_del()
4329 f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni); in vxlan_fdb_external_learn_del()
4333 err = __vxlan_fdb_delete(vxlan, fdb_info->eth_addr, in vxlan_fdb_external_learn_del()
4341 spin_unlock_bh(&vxlan->hash_lock[hash_index]); in vxlan_fdb_external_learn_del()
4403 struct vxlan_dev *vxlan, *next; in vxlan_destroy_tunnels() local
4411 list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) { in vxlan_destroy_tunnels()
4415 if (!net_eq(dev_net(vxlan->dev), net)) in vxlan_destroy_tunnels()
4416 unregister_netdevice_queue(vxlan->dev, head); in vxlan_destroy_tunnels()