• Home
  • Raw
  • Download

Lines Matching +full:route +full:- +full:ptp

4  * Copyright (c) 2012-2013 Vyatta Inc.
65 /* per-network namespace private data for this module */
90 return vs->flags & VXLAN_F_COLLECT_METADATA || in vxlan_collect_metadata()
98 if (a->sa.sa_family != b->sa.sa_family) in vxlan_addr_equal()
100 if (a->sa.sa_family == AF_INET6) in vxlan_addr_equal()
101 return ipv6_addr_equal(&a->sin6.sin6_addr, &b->sin6.sin6_addr); in vxlan_addr_equal()
103 return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr; in vxlan_addr_equal()
108 if (ipa->sa.sa_family == AF_INET6) in vxlan_addr_any()
109 return ipv6_addr_any(&ipa->sin6.sin6_addr); in vxlan_addr_any()
111 return ipa->sin.sin_addr.s_addr == htonl(INADDR_ANY); in vxlan_addr_any()
116 if (ipa->sa.sa_family == AF_INET6) in vxlan_addr_multicast()
117 return ipv6_addr_is_multicast(&ipa->sin6.sin6_addr); in vxlan_addr_multicast()
119 return IN_MULTICAST(ntohl(ipa->sin.sin_addr.s_addr)); in vxlan_addr_multicast()
125 ip->sin6.sin6_addr = nla_get_in6_addr(nla); in vxlan_nla_get_addr()
126 ip->sa.sa_family = AF_INET6; in vxlan_nla_get_addr()
129 ip->sin.sin_addr.s_addr = nla_get_in_addr(nla); in vxlan_nla_get_addr()
130 ip->sa.sa_family = AF_INET; in vxlan_nla_get_addr()
133 return -EAFNOSUPPORT; in vxlan_nla_get_addr()
140 if (ip->sa.sa_family == AF_INET6) in vxlan_nla_put_addr()
141 return nla_put_in6_addr(skb, attr, &ip->sin6.sin6_addr); in vxlan_nla_put_addr()
143 return nla_put_in_addr(skb, attr, ip->sin.sin_addr.s_addr); in vxlan_nla_put_addr()
151 return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr; in vxlan_addr_equal()
156 return ipa->sin.sin_addr.s_addr == htonl(INADDR_ANY); in vxlan_addr_any()
161 return IN_MULTICAST(ntohl(ipa->sin.sin_addr.s_addr)); in vxlan_addr_multicast()
167 return -EAFNOSUPPORT; in vxlan_nla_get_addr()
169 ip->sin.sin_addr.s_addr = nla_get_in_addr(nla); in vxlan_nla_get_addr()
170 ip->sa.sa_family = AF_INET; in vxlan_nla_get_addr()
173 return -EAFNOSUPPORT; in vxlan_nla_get_addr()
180 return nla_put_in_addr(skb, attr, ip->sin.sin_addr.s_addr); in vxlan_nla_put_addr()
187 return &vs->vni_list[hash_32((__force u32)vni, VNI_HASH_BITS)]; in vni_head()
195 return &vn->sock_list[hash_32(ntohs(port), PORT_HASH_BITS)]; in vs_head()
199 * Guaranteed to be non-NULL because remotes are never deleted.
203 return list_entry_rcu(fdb->remotes.next, struct vxlan_rdst, list); in first_remote_rcu()
208 return list_first_entry(&fdb->remotes, struct vxlan_rdst, list); in first_remote_rtnl()
222 if (inet_sk(vs->sock->sk)->inet_sport == port && in vxlan_find_sock()
224 vs->flags == flags) in vxlan_find_sock()
236 if (vs->flags & VXLAN_F_COLLECT_METADATA) in vxlan_vs_find_vni()
240 if (node->vxlan->default_dst.remote_vni != vni) in vxlan_vs_find_vni()
244 const struct vxlan_config *cfg = &node->vxlan->cfg; in vxlan_vs_find_vni()
246 if ((cfg->flags & VXLAN_F_IPV6_LINKLOCAL) && in vxlan_vs_find_vni()
247 cfg->remote_ifindex != ifindex) in vxlan_vs_find_vni()
251 return node->vxlan; in vxlan_vs_find_vni()
285 return -EMSGSIZE; in vxlan_fdb_info()
293 send_ip = !vxlan_addr_any(&rdst->remote_ip); in vxlan_fdb_info()
294 send_eth = !is_zero_ether_addr(fdb->eth_addr); in vxlan_fdb_info()
295 ndm->ndm_family = send_ip ? rdst->remote_ip.sa.sa_family : AF_INET; in vxlan_fdb_info()
297 ndm->ndm_family = AF_BRIDGE; in vxlan_fdb_info()
298 ndm->ndm_state = fdb->state; in vxlan_fdb_info()
299 ndm->ndm_ifindex = vxlan->dev->ifindex; in vxlan_fdb_info()
300 ndm->ndm_flags = fdb->flags; in vxlan_fdb_info()
301 ndm->ndm_type = RTN_UNICAST; in vxlan_fdb_info()
303 if (!net_eq(dev_net(vxlan->dev), vxlan->net) && in vxlan_fdb_info()
305 peernet2id(dev_net(vxlan->dev), vxlan->net))) in vxlan_fdb_info()
308 if (send_eth && nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->eth_addr)) in vxlan_fdb_info()
311 if (send_ip && vxlan_nla_put_addr(skb, NDA_DST, &rdst->remote_ip)) in vxlan_fdb_info()
314 if (rdst->remote_port && rdst->remote_port != vxlan->cfg.dst_port && in vxlan_fdb_info()
315 nla_put_be16(skb, NDA_PORT, rdst->remote_port)) in vxlan_fdb_info()
317 if (rdst->remote_vni != vxlan->default_dst.remote_vni && in vxlan_fdb_info()
318 nla_put_u32(skb, NDA_VNI, be32_to_cpu(rdst->remote_vni))) in vxlan_fdb_info()
320 if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) && fdb->vni && in vxlan_fdb_info()
322 be32_to_cpu(fdb->vni))) in vxlan_fdb_info()
324 if (rdst->remote_ifindex && in vxlan_fdb_info()
325 nla_put_u32(skb, NDA_IFINDEX, rdst->remote_ifindex)) in vxlan_fdb_info()
328 ci.ndm_used = jiffies_to_clock_t(now - fdb->used); in vxlan_fdb_info()
330 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); in vxlan_fdb_info()
341 return -EMSGSIZE; in vxlan_fdb_info()
359 struct net *net = dev_net(vxlan->dev); in vxlan_fdb_notify()
361 int err = -ENOBUFS; in vxlan_fdb_notify()
369 /* -EMSGSIZE implies BUG in vxlan_nlmsg_size() */ in vxlan_fdb_notify()
370 WARN_ON(err == -EMSGSIZE); in vxlan_fdb_notify()
427 return jhash_2words(key, vni, vxlan_salt) & (FDB_HASH_SIZE - 1); in eth_vni_hash()
434 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) in vxlan_fdb_head()
435 return &vxlan->fdb_head[eth_vni_hash(mac, vni)]; in vxlan_fdb_head()
437 return &vxlan->fdb_head[eth_hash(mac)]; in vxlan_fdb_head()
448 if (ether_addr_equal(mac, f->eth_addr)) { in __vxlan_find_mac()
449 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) { in __vxlan_find_mac()
450 if (vni == f->vni) in __vxlan_find_mac()
468 f->used = jiffies; in vxlan_find_mac()
473 /* caller should hold vxlan->hash_lock */
480 list_for_each_entry(rd, &f->remotes, list) { in vxlan_fdb_find_rdst()
481 if (vxlan_addr_equal(&rd->remote_ip, ip) && in vxlan_fdb_find_rdst()
482 rd->remote_port == port && in vxlan_fdb_find_rdst()
483 rd->remote_vni == vni && in vxlan_fdb_find_rdst()
484 rd->remote_ifindex == ifindex) in vxlan_fdb_find_rdst()
502 rd = list_first_entry_or_null(&f->remotes, struct vxlan_rdst, list); in vxlan_fdb_replace()
506 dst_cache_reset(&rd->dst_cache); in vxlan_fdb_replace()
507 rd->remote_ip = *ip; in vxlan_fdb_replace()
508 rd->remote_port = port; in vxlan_fdb_replace()
509 rd->remote_vni = vni; in vxlan_fdb_replace()
510 rd->remote_ifindex = ifindex; in vxlan_fdb_replace()
527 return -ENOBUFS; in vxlan_fdb_append()
529 if (dst_cache_init(&rd->dst_cache, GFP_ATOMIC)) { in vxlan_fdb_append()
531 return -ENOBUFS; in vxlan_fdb_append()
534 rd->remote_ip = *ip; in vxlan_fdb_append()
535 rd->remote_port = port; in vxlan_fdb_append()
536 rd->remote_vni = vni; in vxlan_fdb_append()
537 rd->remote_ifindex = ifindex; in vxlan_fdb_append()
539 list_add_tail_rcu(&rd->list, &f->remotes); in vxlan_fdb_append()
554 if (skb->remcsum_offload) in vxlan_gro_remcsum()
557 if (!NAPI_GRO_CB(skb)->csum_valid) in vxlan_gro_remcsum()
566 skb->remcsum_offload = 1; in vxlan_gro_remcsum()
597 flags = vh->vx_flags; in vxlan_gro_receive()
599 if ((flags & VXLAN_HF_RCO) && (vs->flags & VXLAN_F_REMCSUM_RX)) { in vxlan_gro_receive()
601 vh->vx_vni, &grc, in vxlan_gro_receive()
602 !!(vs->flags & in vxlan_gro_receive()
612 if (!NAPI_GRO_CB(p)->same_flow) in vxlan_gro_receive()
615 vh2 = (struct vxlanhdr *)(p->data + off_vx); in vxlan_gro_receive()
616 if (vh->vx_flags != vh2->vx_flags || in vxlan_gro_receive()
617 vh->vx_vni != vh2->vx_vni) { in vxlan_gro_receive()
618 NAPI_GRO_CB(p)->same_flow = 0; in vxlan_gro_receive()
634 /* Sets 'skb->inner_mac_header' since we are always called with in vxlan_gro_complete()
635 * 'skb->encapsulation' set. in vxlan_gro_complete()
649 f->state = state; in vxlan_fdb_alloc()
650 f->flags = ndm_flags; in vxlan_fdb_alloc()
651 f->updated = f->used = jiffies; in vxlan_fdb_alloc()
652 f->vni = src_vni; in vxlan_fdb_alloc()
653 INIT_LIST_HEAD(&f->remotes); in vxlan_fdb_alloc()
654 memcpy(f->eth_addr, mac, ETH_ALEN); in vxlan_fdb_alloc()
669 if (vxlan->cfg.addrmax && in vxlan_fdb_create()
670 vxlan->addrcnt >= vxlan->cfg.addrmax) in vxlan_fdb_create()
671 return -ENOSPC; in vxlan_fdb_create()
673 netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); in vxlan_fdb_create()
676 return -ENOMEM; in vxlan_fdb_create()
684 ++vxlan->addrcnt; in vxlan_fdb_create()
685 hlist_add_head_rcu(&f->hlist, in vxlan_fdb_create()
693 /* Add new entry to forwarding table -- assumes lock held */
708 netdev_dbg(vxlan->dev, in vxlan_fdb_update()
710 return -EEXIST; in vxlan_fdb_update()
712 if (f->state != state) { in vxlan_fdb_update()
713 f->state = state; in vxlan_fdb_update()
714 f->updated = jiffies; in vxlan_fdb_update()
717 if (f->flags != ndm_flags) { in vxlan_fdb_update()
718 f->flags = ndm_flags; in vxlan_fdb_update()
719 f->updated = jiffies; in vxlan_fdb_update()
724 if (!(is_multicast_ether_addr(f->eth_addr) || in vxlan_fdb_update()
725 is_zero_ether_addr(f->eth_addr))) { in vxlan_fdb_update()
729 return -EOPNOTSUPP; in vxlan_fdb_update()
732 (is_multicast_ether_addr(f->eth_addr) || in vxlan_fdb_update()
733 is_zero_ether_addr(f->eth_addr))) { in vxlan_fdb_update()
742 return -ENOENT; in vxlan_fdb_update()
747 return -EOPNOTSUPP; in vxlan_fdb_update()
749 netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); in vxlan_fdb_update()
771 list_for_each_entry_safe(rd, nd, &f->remotes, list) { in vxlan_fdb_free()
772 dst_cache_destroy(&rd->dst_cache); in vxlan_fdb_free()
781 netdev_dbg(vxlan->dev, in vxlan_fdb_destroy()
782 "delete %pM\n", f->eth_addr); in vxlan_fdb_destroy()
784 --vxlan->addrcnt; in vxlan_fdb_destroy()
788 hlist_del_rcu(&f->hlist); in vxlan_fdb_destroy()
789 call_rcu(&f->rcu, vxlan_fdb_free); in vxlan_fdb_destroy()
796 dst_cache_destroy(&rd->dst_cache); in vxlan_dst_free()
803 list_del_rcu(&rd->list); in vxlan_fdb_dst_destroy()
805 call_rcu(&rd->rcu, vxlan_dst_free); in vxlan_fdb_dst_destroy()
812 struct net *net = dev_net(vxlan->dev); in vxlan_fdb_parse()
820 union vxlan_addr *remote = &vxlan->default_dst.remote_ip; in vxlan_fdb_parse()
821 if (remote->sa.sa_family == AF_INET) { in vxlan_fdb_parse()
822 ip->sin.sin_addr.s_addr = htonl(INADDR_ANY); in vxlan_fdb_parse()
823 ip->sa.sa_family = AF_INET; in vxlan_fdb_parse()
826 ip->sin6.sin6_addr = in6addr_any; in vxlan_fdb_parse()
827 ip->sa.sa_family = AF_INET6; in vxlan_fdb_parse()
834 return -EINVAL; in vxlan_fdb_parse()
837 *port = vxlan->cfg.dst_port; in vxlan_fdb_parse()
842 return -EINVAL; in vxlan_fdb_parse()
845 *vni = vxlan->default_dst.remote_vni; in vxlan_fdb_parse()
850 return -EINVAL; in vxlan_fdb_parse()
853 *src_vni = vxlan->default_dst.remote_vni; in vxlan_fdb_parse()
860 return -EINVAL; in vxlan_fdb_parse()
864 return -EADDRNOTAVAIL; in vxlan_fdb_parse()
878 /* struct net *net = dev_net(vxlan->dev); */ in vxlan_fdb_add()
885 if (!(ndm->ndm_state & (NUD_PERMANENT|NUD_REACHABLE))) { in vxlan_fdb_add()
887 ndm->ndm_state); in vxlan_fdb_add()
888 return -EINVAL; in vxlan_fdb_add()
892 return -EINVAL; in vxlan_fdb_add()
898 if (vxlan->default_dst.remote_ip.sa.sa_family != ip.sa.sa_family) in vxlan_fdb_add()
899 return -EAFNOSUPPORT; in vxlan_fdb_add()
901 spin_lock_bh(&vxlan->hash_lock); in vxlan_fdb_add()
902 err = vxlan_fdb_update(vxlan, addr, &ip, ndm->ndm_state, flags, in vxlan_fdb_add()
903 port, src_vni, vni, ifindex, ndm->ndm_flags); in vxlan_fdb_add()
904 spin_unlock_bh(&vxlan->hash_lock); in vxlan_fdb_add()
916 int err = -ENOENT; in __vxlan_fdb_delete()
931 if (rd && !list_is_singular(&f->remotes)) { in __vxlan_fdb_delete()
958 spin_lock_bh(&vxlan->hash_lock); in vxlan_fdb_delete()
961 spin_unlock_bh(&vxlan->hash_lock); in vxlan_fdb_delete()
979 hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) { in vxlan_fdb_dump()
982 list_for_each_entry_rcu(rd, &f->remotes, list) { in vxlan_fdb_dump()
983 if (*idx < cb->args[2]) in vxlan_fdb_dump()
987 NETLINK_CB(cb->skb).portid, in vxlan_fdb_dump()
988 cb->nlh->nlmsg_seq, in vxlan_fdb_dump()
1018 if (src_ip->sa.sa_family == AF_INET6 && in vxlan_snoop()
1019 (ipv6_addr_type(&src_ip->sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL)) in vxlan_snoop()
1027 if (likely(vxlan_addr_equal(&rdst->remote_ip, src_ip) && in vxlan_snoop()
1028 rdst->remote_ifindex == ifindex)) in vxlan_snoop()
1032 if (f->state & (NUD_PERMANENT | NUD_NOARP)) in vxlan_snoop()
1038 src_mac, &rdst->remote_ip.sa, &src_ip->sa); in vxlan_snoop()
1040 rdst->remote_ip = *src_ip; in vxlan_snoop()
1041 f->updated = jiffies; in vxlan_snoop()
1045 spin_lock(&vxlan->hash_lock); in vxlan_snoop()
1052 vxlan->cfg.dst_port, in vxlan_snoop()
1054 vxlan->default_dst.remote_vni, in vxlan_snoop()
1056 spin_unlock(&vxlan->hash_lock); in vxlan_snoop()
1070 unsigned short family = dev->default_dst.remote_ip.sa.sa_family; in vxlan_group_used()
1072 sock4 = rtnl_dereference(dev->vn4_sock); in vxlan_group_used()
1077 if (family == AF_INET && sock4 && refcount_read(&sock4->refcnt) == 1) in vxlan_group_used()
1080 sock6 = rtnl_dereference(dev->vn6_sock); in vxlan_group_used()
1081 if (family == AF_INET6 && sock6 && refcount_read(&sock6->refcnt) == 1) in vxlan_group_used()
1085 list_for_each_entry(vxlan, &vn->vxlan_list, next) { in vxlan_group_used()
1086 if (!netif_running(vxlan->dev) || vxlan == dev) in vxlan_group_used()
1090 rtnl_dereference(vxlan->vn4_sock) != sock4) in vxlan_group_used()
1094 rtnl_dereference(vxlan->vn6_sock) != sock6) in vxlan_group_used()
1098 if (!vxlan_addr_equal(&vxlan->default_dst.remote_ip, in vxlan_group_used()
1099 &dev->default_dst.remote_ip)) in vxlan_group_used()
1102 if (vxlan->default_dst.remote_ifindex != in vxlan_group_used()
1103 dev->default_dst.remote_ifindex) in vxlan_group_used()
1118 if (!refcount_dec_and_test(&vs->refcnt)) in __vxlan_sock_release_prep()
1121 vn = net_generic(sock_net(vs->sock->sk), vxlan_net_id); in __vxlan_sock_release_prep()
1122 spin_lock(&vn->sock_lock); in __vxlan_sock_release_prep()
1123 hlist_del_rcu(&vs->hlist); in __vxlan_sock_release_prep()
1124 udp_tunnel_notify_del_rx_port(vs->sock, in __vxlan_sock_release_prep()
1125 (vs->flags & VXLAN_F_GPE) ? in __vxlan_sock_release_prep()
1128 spin_unlock(&vn->sock_lock); in __vxlan_sock_release_prep()
1135 struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock); in vxlan_sock_release()
1137 struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock); in vxlan_sock_release()
1139 RCU_INIT_POINTER(vxlan->vn6_sock, NULL); in vxlan_sock_release()
1142 RCU_INIT_POINTER(vxlan->vn4_sock, NULL); in vxlan_sock_release()
1148 udp_tunnel_sock_release(sock4->sock); in vxlan_sock_release()
1154 udp_tunnel_sock_release(sock6->sock); in vxlan_sock_release()
1166 union vxlan_addr *ip = &vxlan->default_dst.remote_ip; in vxlan_igmp_join()
1167 int ifindex = vxlan->default_dst.remote_ifindex; in vxlan_igmp_join()
1168 int ret = -EINVAL; in vxlan_igmp_join()
1170 if (ip->sa.sa_family == AF_INET) { in vxlan_igmp_join()
1171 struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock); in vxlan_igmp_join()
1173 .imr_multiaddr.s_addr = ip->sin.sin_addr.s_addr, in vxlan_igmp_join()
1177 sk = sock4->sock->sk; in vxlan_igmp_join()
1183 struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock); in vxlan_igmp_join()
1185 sk = sock6->sock->sk; in vxlan_igmp_join()
1187 ret = ipv6_stub->ipv6_sock_mc_join(sk, ifindex, in vxlan_igmp_join()
1188 &ip->sin6.sin6_addr); in vxlan_igmp_join()
1200 union vxlan_addr *ip = &vxlan->default_dst.remote_ip; in vxlan_igmp_leave()
1201 int ifindex = vxlan->default_dst.remote_ifindex; in vxlan_igmp_leave()
1202 int ret = -EINVAL; in vxlan_igmp_leave()
1204 if (ip->sa.sa_family == AF_INET) { in vxlan_igmp_leave()
1205 struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock); in vxlan_igmp_leave()
1207 .imr_multiaddr.s_addr = ip->sin.sin_addr.s_addr, in vxlan_igmp_leave()
1211 sk = sock4->sock->sk; in vxlan_igmp_leave()
1217 struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock); in vxlan_igmp_leave()
1219 sk = sock6->sock->sk; in vxlan_igmp_leave()
1221 ret = ipv6_stub->ipv6_sock_mc_drop(sk, ifindex, in vxlan_igmp_leave()
1222 &ip->sin6.sin6_addr); in vxlan_igmp_leave()
1235 if (!(unparsed->vx_flags & VXLAN_HF_RCO) || skb->remcsum_offload) in vxlan_remcsum()
1238 start = vxlan_rco_start(unparsed->vx_vni); in vxlan_remcsum()
1239 offset = start + vxlan_rco_offset(unparsed->vx_vni); in vxlan_remcsum()
1247 unparsed->vx_flags &= ~VXLAN_HF_RCO; in vxlan_remcsum()
1248 unparsed->vx_vni &= VXLAN_VNI_MASK; in vxlan_remcsum()
1259 if (!(unparsed->vx_flags & VXLAN_HF_GBP)) in vxlan_parse_gbp_hdr()
1262 md->gbp = ntohs(gbp->policy_id); in vxlan_parse_gbp_hdr()
1266 tun_dst->u.tun_info.key.tun_flags |= TUNNEL_VXLAN_OPT; in vxlan_parse_gbp_hdr()
1267 tun_dst->u.tun_info.options_len = sizeof(*md); in vxlan_parse_gbp_hdr()
1269 if (gbp->dont_learn) in vxlan_parse_gbp_hdr()
1270 md->gbp |= VXLAN_GBP_DONT_LEARN; in vxlan_parse_gbp_hdr()
1272 if (gbp->policy_applied) in vxlan_parse_gbp_hdr()
1273 md->gbp |= VXLAN_GBP_POLICY_APPLIED; in vxlan_parse_gbp_hdr()
1275 /* In flow-based mode, GBP is carried in dst_metadata */ in vxlan_parse_gbp_hdr()
1277 skb->mark = md->gbp; in vxlan_parse_gbp_hdr()
1279 unparsed->vx_flags &= ~VXLAN_GBP_USED_BITS; in vxlan_parse_gbp_hdr()
1289 if (!gpe->np_applied) in vxlan_parse_gpe_hdr()
1294 if (gpe->version != 0) in vxlan_parse_gpe_hdr()
1300 if (gpe->oam_flag) in vxlan_parse_gpe_hdr()
1303 *protocol = tun_p_to_eth_p(gpe->next_protocol); in vxlan_parse_gpe_hdr()
1307 unparsed->vx_flags &= ~VXLAN_GPE_USED_BITS; in vxlan_parse_gpe_hdr()
1316 u32 ifindex = skb->dev->ifindex; in vxlan_set_mac()
1319 skb->protocol = eth_type_trans(skb, vxlan->dev); in vxlan_set_mac()
1323 if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr)) in vxlan_set_mac()
1328 saddr.sin.sin_addr.s_addr = ip_hdr(skb)->saddr; in vxlan_set_mac()
1332 saddr.sin6.sin6_addr = ipv6_hdr(skb)->saddr; in vxlan_set_mac()
1337 if ((vxlan->cfg.flags & VXLAN_F_LEARN) && in vxlan_set_mac()
1338 vxlan_snoop(skb->dev, &saddr, eth_hdr(skb)->h_source, ifindex, vni)) in vxlan_set_mac()
1358 net_info_ratelimited("non-ECT from %pI4 with TOS=%#x\n", in vxlan_ecn_decapsulate()
1359 &((struct iphdr *)oiph)->saddr, in vxlan_ecn_decapsulate()
1360 ((struct iphdr *)oiph)->tos); in vxlan_ecn_decapsulate()
1362 net_info_ratelimited("non-ECT from %pI6\n", in vxlan_ecn_decapsulate()
1363 &((struct ipv6hdr *)oiph)->saddr); in vxlan_ecn_decapsulate()
1389 netdev_dbg(skb->dev, "invalid vxlan flags=%#x vni=%#x\n", in vxlan_rcv()
1390 ntohl(vxlan_hdr(skb)->vx_flags), in vxlan_rcv()
1391 ntohl(vxlan_hdr(skb)->vx_vni)); in vxlan_rcv()
1402 vni = vxlan_vni(vxlan_hdr(skb)->vx_vni); in vxlan_rcv()
1404 vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni); in vxlan_rcv()
1411 if (vs->flags & VXLAN_F_GPE) { in vxlan_rcv()
1412 if (!vxlan_parse_gpe_hdr(&unparsed, &protocol, skb, vs->flags)) in vxlan_rcv()
1418 !net_eq(vxlan->net, dev_net(vxlan->dev)))) in vxlan_rcv()
1430 md = ip_tunnel_info_opts(&tun_dst->u.tun_info); in vxlan_rcv()
1437 if (vs->flags & VXLAN_F_REMCSUM_RX) in vxlan_rcv()
1438 if (!vxlan_remcsum(&unparsed, skb, vs->flags)) in vxlan_rcv()
1440 if (vs->flags & VXLAN_F_GBP) in vxlan_rcv()
1441 vxlan_parse_gbp_hdr(&unparsed, skb, vs->flags, md); in vxlan_rcv()
1463 skb->dev = vxlan->dev; in vxlan_rcv()
1464 skb->pkt_type = PACKET_HOST; in vxlan_rcv()
1471 ++vxlan->dev->stats.rx_frame_errors; in vxlan_rcv()
1472 ++vxlan->dev->stats.rx_errors; in vxlan_rcv()
1478 if (unlikely(!(vxlan->dev->flags & IFF_UP))) { in vxlan_rcv()
1480 atomic_long_inc(&vxlan->dev->rx_dropped); in vxlan_rcv()
1484 stats = this_cpu_ptr(vxlan->dev->tstats); in vxlan_rcv()
1485 u64_stats_update_begin(&stats->syncp); in vxlan_rcv()
1486 stats->rx_packets++; in vxlan_rcv()
1487 stats->rx_bytes += skb->len; in vxlan_rcv()
1488 u64_stats_update_end(&stats->syncp); in vxlan_rcv()
1490 gro_cells_receive(&vxlan->gro_cells, skb); in vxlan_rcv()
1510 if (dev->flags & IFF_NOARP) in arp_reduce()
1514 dev->stats.tx_dropped++; in arp_reduce()
1519 if ((parp->ar_hrd != htons(ARPHRD_ETHER) && in arp_reduce()
1520 parp->ar_hrd != htons(ARPHRD_IEEE802)) || in arp_reduce()
1521 parp->ar_pro != htons(ETH_P_IP) || in arp_reduce()
1522 parp->ar_op != htons(ARPOP_REQUEST) || in arp_reduce()
1523 parp->ar_hln != dev->addr_len || in arp_reduce()
1524 parp->ar_pln != 4) in arp_reduce()
1528 arpptr += dev->addr_len; /* sha */ in arp_reduce()
1531 arpptr += dev->addr_len; /* tha */ in arp_reduce()
1544 if (!(n->nud_state & NUD_CONNECTED)) { in arp_reduce()
1549 f = vxlan_find_mac(vxlan, n->ha, vni); in arp_reduce()
1550 if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) { in arp_reduce()
1551 /* bridge-local neighbor */ in arp_reduce()
1557 n->ha, sha); in arp_reduce()
1566 reply->ip_summed = CHECKSUM_UNNECESSARY; in arp_reduce()
1567 reply->pkt_type = PACKET_HOST; in arp_reduce()
1570 dev->stats.rx_dropped++; in arp_reduce()
1571 } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) { in arp_reduce()
1588 struct net_device *dev = request->dev; in vxlan_na_create()
1597 if (dev == NULL || !pskb_may_pull(request, request->len)) in vxlan_na_create()
1601 sizeof(*na) + na_olen + dev->needed_tailroom; in vxlan_na_create()
1606 reply->protocol = htons(ETH_P_IPV6); in vxlan_na_create()
1607 reply->dev = dev; in vxlan_na_create()
1608 skb_reserve(reply, LL_RESERVED_SPACE(request->dev)); in vxlan_na_create()
1614 daddr = eth_hdr(request)->h_source; in vxlan_na_create()
1615 ns_olen = request->len - skb_network_offset(request) - in vxlan_na_create()
1616 sizeof(struct ipv6hdr) - sizeof(*ns); in vxlan_na_create()
1617 for (i = 0; i < ns_olen-1; i += (ns->opt[i+1]<<3)) { in vxlan_na_create()
1618 if (!ns->opt[i + 1]) { in vxlan_na_create()
1622 if (ns->opt[i] == ND_OPT_SOURCE_LL_ADDR) { in vxlan_na_create()
1623 daddr = ns->opt + i + sizeof(struct nd_opt_hdr); in vxlan_na_create()
1629 ether_addr_copy(eth_hdr(reply)->h_dest, daddr); in vxlan_na_create()
1630 ether_addr_copy(eth_hdr(reply)->h_source, n->ha); in vxlan_na_create()
1631 eth_hdr(reply)->h_proto = htons(ETH_P_IPV6); in vxlan_na_create()
1632 reply->protocol = htons(ETH_P_IPV6); in vxlan_na_create()
1642 pip6->version = 6; in vxlan_na_create()
1643 pip6->priority = ipv6_hdr(request)->priority; in vxlan_na_create()
1644 pip6->nexthdr = IPPROTO_ICMPV6; in vxlan_na_create()
1645 pip6->hop_limit = 255; in vxlan_na_create()
1646 pip6->daddr = ipv6_hdr(request)->saddr; in vxlan_na_create()
1647 pip6->saddr = *(struct in6_addr *)n->primary_key; in vxlan_na_create()
1654 na->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; in vxlan_na_create()
1655 na->icmph.icmp6_router = isrouter; in vxlan_na_create()
1656 na->icmph.icmp6_override = 1; in vxlan_na_create()
1657 na->icmph.icmp6_solicited = 1; in vxlan_na_create()
1658 na->target = ns->target; in vxlan_na_create()
1659 ether_addr_copy(&na->opt[2], n->ha); in vxlan_na_create()
1660 na->opt[0] = ND_OPT_TARGET_LL_ADDR; in vxlan_na_create()
1661 na->opt[1] = na_olen >> 3; in vxlan_na_create()
1663 na->icmph.icmp6_cksum = csum_ipv6_magic(&pip6->saddr, in vxlan_na_create()
1664 &pip6->daddr, sizeof(*na)+na_olen, IPPROTO_ICMPV6, in vxlan_na_create()
1667 pip6->payload_len = htons(sizeof(*na)+na_olen); in vxlan_na_create()
1671 reply->ip_summed = CHECKSUM_UNNECESSARY; in vxlan_na_create()
1690 daddr = &iphdr->daddr; in neigh_reduce()
1694 ipv6_addr_is_multicast(&msg->target)) in neigh_reduce()
1697 n = neigh_lookup(ipv6_stub->nd_tbl, &msg->target, dev); in neigh_reduce()
1703 if (!(n->nud_state & NUD_CONNECTED)) { in neigh_reduce()
1708 f = vxlan_find_mac(vxlan, n->ha, vni); in neigh_reduce()
1709 if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) { in neigh_reduce()
1710 /* bridge-local neighbor */ in neigh_reduce()
1716 !!(f ? f->flags & NTF_ROUTER : 0)); in neigh_reduce()
1724 dev->stats.rx_dropped++; in neigh_reduce()
1726 } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) { in neigh_reduce()
1728 .sin6.sin6_addr = msg->target, in neigh_reduce()
1746 if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) in route_shortcircuit()
1750 switch (ntohs(eth_hdr(skb)->h_proto)) { in route_shortcircuit()
1758 n = neigh_lookup(&arp_tbl, &pip->daddr, dev); in route_shortcircuit()
1759 if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) { in route_shortcircuit()
1761 .sin.sin_addr.s_addr = pip->daddr, in route_shortcircuit()
1779 n = neigh_lookup(ipv6_stub->nd_tbl, &pip6->daddr, dev); in route_shortcircuit()
1780 if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) { in route_shortcircuit()
1782 .sin6.sin6_addr = pip6->daddr, in route_shortcircuit()
1800 diff = !ether_addr_equal(eth_hdr(skb)->h_dest, n->ha); in route_shortcircuit()
1802 memcpy(eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest, in route_shortcircuit()
1803 dev->addr_len); in route_shortcircuit()
1804 memcpy(eth_hdr(skb)->h_dest, n->ha, dev->addr_len); in route_shortcircuit()
1818 if (!md->gbp) in vxlan_build_gbp_hdr()
1822 vxh->vx_flags |= VXLAN_HF_GBP; in vxlan_build_gbp_hdr()
1824 if (md->gbp & VXLAN_GBP_DONT_LEARN) in vxlan_build_gbp_hdr()
1825 gbp->dont_learn = 1; in vxlan_build_gbp_hdr()
1827 if (md->gbp & VXLAN_GBP_POLICY_APPLIED) in vxlan_build_gbp_hdr()
1828 gbp->policy_applied = 1; in vxlan_build_gbp_hdr()
1830 gbp->policy_id = htons(md->gbp & VXLAN_GBP_ID_MASK); in vxlan_build_gbp_hdr()
1838 gpe->np_applied = 1; in vxlan_build_gpe_hdr()
1839 gpe->next_protocol = tun_p_from_eth_p(protocol); in vxlan_build_gpe_hdr()
1840 if (!gpe->next_protocol) in vxlan_build_gpe_hdr()
1841 return -EPFNOSUPPORT; in vxlan_build_gpe_hdr()
1857 skb->ip_summed == CHECKSUM_PARTIAL) { in vxlan_build_skb()
1862 (skb->csum_offset == offsetof(struct udphdr, check) || in vxlan_build_skb()
1863 skb->csum_offset == offsetof(struct tcphdr, check))) in vxlan_build_skb()
1867 min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len in vxlan_build_skb()
1880 vxh->vx_flags = VXLAN_HF_VNI; in vxlan_build_skb()
1881 vxh->vx_vni = vxlan_vni_field(vni); in vxlan_build_skb()
1886 start = skb_checksum_start_offset(skb) - sizeof(struct vxlanhdr); in vxlan_build_skb()
1887 vxh->vx_vni |= vxlan_compute_rco(start, skb->csum_offset); in vxlan_build_skb()
1888 vxh->vx_flags |= VXLAN_HF_RCO; in vxlan_build_skb()
1891 skb->ip_summed = CHECKSUM_NONE; in vxlan_build_skb()
1892 skb->encapsulation = 0; in vxlan_build_skb()
1899 err = vxlan_build_gpe_hdr(vxh, vxflags, skb->protocol); in vxlan_build_skb()
1902 inner_protocol = skb->protocol; in vxlan_build_skb()
1921 return ERR_PTR(-EIO); in vxlan_get_route()
1934 fl4.flowi4_mark = skb->mark; in vxlan_get_route()
1941 rt = ip_route_output_key(vxlan->net, &fl4); in vxlan_get_route()
1943 if (rt->dst.dev == dev) { in vxlan_get_route()
1944 netdev_dbg(dev, "circular route to %pI4\n", &daddr); in vxlan_get_route()
1946 return ERR_PTR(-ELOOP); in vxlan_get_route()
1951 dst_cache_set_ip4(dst_cache, &rt->dst, fl4.saddr); in vxlan_get_route()
1953 netdev_dbg(dev, "no route to %pI4\n", &daddr); in vxlan_get_route()
1954 return ERR_PTR(-ENETUNREACH); in vxlan_get_route()
1976 return ERR_PTR(-EIO); in vxlan6_get_route()
1991 fl6.flowi6_mark = skb->mark; in vxlan6_get_route()
1996 ndst = ipv6_stub->ipv6_dst_lookup_flow(vxlan->net, sock6->sock->sk, in vxlan6_get_route()
1999 netdev_dbg(dev, "no route to %pI6\n", daddr); in vxlan6_get_route()
2000 return ERR_PTR(-ENETUNREACH); in vxlan6_get_route()
2003 if (unlikely(ndst->dev == dev)) { in vxlan6_get_route()
2004 netdev_dbg(dev, "circular route to %pI6\n", daddr); in vxlan6_get_route()
2006 return ERR_PTR(-ELOOP); in vxlan6_get_route()
2022 union vxlan_addr *remote_ip = &dst_vxlan->default_dst.remote_ip; in vxlan_encap_bypass()
2024 int len = skb->len; in vxlan_encap_bypass()
2026 tx_stats = this_cpu_ptr(src_vxlan->dev->tstats); in vxlan_encap_bypass()
2027 rx_stats = this_cpu_ptr(dst_vxlan->dev->tstats); in vxlan_encap_bypass()
2028 skb->pkt_type = PACKET_HOST; in vxlan_encap_bypass()
2029 skb->encapsulation = 0; in vxlan_encap_bypass()
2030 skb->dev = dst_vxlan->dev; in vxlan_encap_bypass()
2033 if (remote_ip->sa.sa_family == AF_INET) { in vxlan_encap_bypass()
2044 dev = skb->dev; in vxlan_encap_bypass()
2045 if (unlikely(!(dev->flags & IFF_UP))) { in vxlan_encap_bypass()
2050 if (dst_vxlan->cfg.flags & VXLAN_F_LEARN) in vxlan_encap_bypass()
2051 vxlan_snoop(dev, &loopback, eth_hdr(skb)->h_source, 0, vni); in vxlan_encap_bypass()
2053 u64_stats_update_begin(&tx_stats->syncp); in vxlan_encap_bypass()
2054 tx_stats->tx_packets++; in vxlan_encap_bypass()
2055 tx_stats->tx_bytes += len; in vxlan_encap_bypass()
2056 u64_stats_update_end(&tx_stats->syncp); in vxlan_encap_bypass()
2059 u64_stats_update_begin(&rx_stats->syncp); in vxlan_encap_bypass()
2060 rx_stats->rx_packets++; in vxlan_encap_bypass()
2061 rx_stats->rx_bytes += len; in vxlan_encap_bypass()
2062 u64_stats_update_end(&rx_stats->syncp); in vxlan_encap_bypass()
2065 dev->stats.rx_dropped++; in vxlan_encap_bypass()
2078 /* IPv6 rt-flags are checked against RTF_LOCAL, but the value of in encap_bypass_if_local()
2080 * we can use RTCF_LOCAL which works for ipv4 and ipv6 route entry. in encap_bypass_if_local()
2090 dst_vxlan = vxlan_find_vni(vxlan->net, dst_ifindex, vni, in encap_bypass_if_local()
2091 daddr->sa.sa_family, dst_port, in encap_bypass_if_local()
2092 vxlan->cfg.flags); in encap_bypass_if_local()
2094 dev->stats.tx_errors++; in encap_bypass_if_local()
2097 return -ENOENT; in encap_bypass_if_local()
2124 u32 flags = vxlan->cfg.flags; in vxlan_xmit_one()
2126 bool xnet = !net_eq(vxlan->net, dev_net(vxlan->dev)); in vxlan_xmit_one()
2131 dst = &rdst->remote_ip; in vxlan_xmit_one()
2134 /* short-circuited back to local bridge */ in vxlan_xmit_one()
2141 dst_port = rdst->remote_port ? rdst->remote_port : vxlan->cfg.dst_port; in vxlan_xmit_one()
2142 vni = (rdst->remote_vni) ? : default_vni; in vxlan_xmit_one()
2143 ifindex = rdst->remote_ifindex; in vxlan_xmit_one()
2144 local_ip = vxlan->cfg.saddr; in vxlan_xmit_one()
2145 dst_cache = &rdst->dst_cache; in vxlan_xmit_one()
2146 md->gbp = skb->mark; in vxlan_xmit_one()
2150 ttl = vxlan->cfg.ttl; in vxlan_xmit_one()
2155 tos = vxlan->cfg.tos; in vxlan_xmit_one()
2159 if (dst->sa.sa_family == AF_INET) in vxlan_xmit_one()
2163 label = vxlan->cfg.label; in vxlan_xmit_one()
2167 dev->name); in vxlan_xmit_one()
2172 remote_ip.sin.sin_addr.s_addr = info->key.u.ipv4.dst; in vxlan_xmit_one()
2173 local_ip.sin.sin_addr.s_addr = info->key.u.ipv4.src; in vxlan_xmit_one()
2175 remote_ip.sin6.sin6_addr = info->key.u.ipv6.dst; in vxlan_xmit_one()
2176 local_ip.sin6.sin6_addr = info->key.u.ipv6.src; in vxlan_xmit_one()
2179 dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port; in vxlan_xmit_one()
2180 vni = tunnel_id_to_key32(info->key.tun_id); in vxlan_xmit_one()
2182 dst_cache = &info->dst_cache; in vxlan_xmit_one()
2183 if (info->key.tun_flags & TUNNEL_VXLAN_OPT) { in vxlan_xmit_one()
2184 if (info->options_len < sizeof(*md)) in vxlan_xmit_one()
2188 ttl = info->key.ttl; in vxlan_xmit_one()
2189 tos = info->key.tos; in vxlan_xmit_one()
2190 label = info->key.label; in vxlan_xmit_one()
2191 udp_sum = !!(info->key.tun_flags & TUNNEL_CSUM); in vxlan_xmit_one()
2193 src_port = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min, in vxlan_xmit_one()
2194 vxlan->cfg.port_max, true); in vxlan_xmit_one()
2197 if (dst->sa.sa_family == AF_INET) { in vxlan_xmit_one()
2198 struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock); in vxlan_xmit_one()
2203 dst->sin.sin_addr.s_addr, in vxlan_xmit_one()
2216 &rt->dst, rt->rt_flags); in vxlan_xmit_one()
2219 } else if (info->key.tun_flags & TUNNEL_DONT_FRAGMENT) { in vxlan_xmit_one()
2223 ndst = &rt->dst; in vxlan_xmit_one()
2227 ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); in vxlan_xmit_one()
2233 udp_tunnel_xmit_skb(rt, sock4->sock->sk, skb, local_ip.sin.sin_addr.s_addr, in vxlan_xmit_one()
2234 dst->sin.sin_addr.s_addr, tos, ttl, df, in vxlan_xmit_one()
2238 struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock); in vxlan_xmit_one()
2241 label, &dst->sin6.sin6_addr, in vxlan_xmit_one()
2252 u32 rt6i_flags = ((struct rt6_info *)ndst)->rt6i_flags; in vxlan_xmit_one()
2271 udp_tunnel6_xmit_skb(ndst, sock6->sock->sk, skb, dev, in vxlan_xmit_one()
2273 &dst->sin6.sin6_addr, tos, ttl, in vxlan_xmit_one()
2282 dev->stats.tx_dropped++; in vxlan_xmit_one()
2288 if (err == -ELOOP) in vxlan_xmit_one()
2289 dev->stats.collisions++; in vxlan_xmit_one()
2290 else if (err == -ENETUNREACH) in vxlan_xmit_one()
2291 dev->stats.tx_carrier_errors++; in vxlan_xmit_one()
2293 dev->stats.tx_errors++; in vxlan_xmit_one()
2317 if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) { in vxlan_xmit()
2318 if (info && info->mode & IP_TUNNEL_INFO_BRIDGE && in vxlan_xmit()
2319 info->mode & IP_TUNNEL_INFO_TX) { in vxlan_xmit()
2320 vni = tunnel_id_to_key32(info->key.tun_id); in vxlan_xmit()
2322 if (info && info->mode & IP_TUNNEL_INFO_TX) in vxlan_xmit()
2330 if (vxlan->cfg.flags & VXLAN_F_PROXY) { in vxlan_xmit()
2332 if (ntohs(eth->h_proto) == ETH_P_ARP) in vxlan_xmit()
2335 else if (ntohs(eth->h_proto) == ETH_P_IPV6 && in vxlan_xmit()
2338 ipv6_hdr(skb)->nexthdr == IPPROTO_ICMPV6) { in vxlan_xmit()
2341 if (m->icmph.icmp6_code == 0 && in vxlan_xmit()
2342 m->icmph.icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) in vxlan_xmit()
2349 f = vxlan_find_mac(vxlan, eth->h_dest, vni); in vxlan_xmit()
2352 if (f && (f->flags & NTF_ROUTER) && (vxlan->cfg.flags & VXLAN_F_RSC) && in vxlan_xmit()
2353 (ntohs(eth->h_proto) == ETH_P_IP || in vxlan_xmit()
2354 ntohs(eth->h_proto) == ETH_P_IPV6)) { in vxlan_xmit()
2357 f = vxlan_find_mac(vxlan, eth->h_dest, vni); in vxlan_xmit()
2363 if ((vxlan->cfg.flags & VXLAN_F_L2MISS) && in vxlan_xmit()
2364 !is_multicast_ether_addr(eth->h_dest)) in vxlan_xmit()
2365 vxlan_fdb_miss(vxlan, eth->h_dest); in vxlan_xmit()
2367 dev->stats.tx_dropped++; in vxlan_xmit()
2373 list_for_each_entry_rcu(rdst, &f->remotes, list) { in vxlan_xmit()
2399 if (!netif_running(vxlan->dev)) in vxlan_cleanup()
2405 spin_lock_bh(&vxlan->hash_lock); in vxlan_cleanup()
2406 hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) { in vxlan_cleanup()
2411 if (f->state & (NUD_PERMANENT | NUD_NOARP)) in vxlan_cleanup()
2414 if (f->flags & NTF_EXT_LEARNED) in vxlan_cleanup()
2417 timeout = f->used + vxlan->cfg.age_interval * HZ; in vxlan_cleanup()
2419 netdev_dbg(vxlan->dev, in vxlan_cleanup()
2421 f->eth_addr); in vxlan_cleanup()
2422 f->state = NUD_STALE; in vxlan_cleanup()
2427 spin_unlock_bh(&vxlan->hash_lock); in vxlan_cleanup()
2430 mod_timer(&vxlan->age_timer, next_timer); in vxlan_cleanup()
2435 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in vxlan_vs_del_dev()
2437 spin_lock(&vn->sock_lock); in vxlan_vs_del_dev()
2438 hlist_del_init_rcu(&vxlan->hlist4.hlist); in vxlan_vs_del_dev()
2440 hlist_del_init_rcu(&vxlan->hlist6.hlist); in vxlan_vs_del_dev()
2442 spin_unlock(&vn->sock_lock); in vxlan_vs_del_dev()
2448 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in vxlan_vs_add_dev()
2449 __be32 vni = vxlan->default_dst.remote_vni; in vxlan_vs_add_dev()
2451 node->vxlan = vxlan; in vxlan_vs_add_dev()
2452 spin_lock(&vn->sock_lock); in vxlan_vs_add_dev()
2453 hlist_add_head_rcu(&node->hlist, vni_head(vs, vni)); in vxlan_vs_add_dev()
2454 spin_unlock(&vn->sock_lock); in vxlan_vs_add_dev()
2463 dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); in vxlan_init()
2464 if (!dev->tstats) in vxlan_init()
2465 return -ENOMEM; in vxlan_init()
2467 err = gro_cells_init(&vxlan->gro_cells, dev); in vxlan_init()
2469 free_percpu(dev->tstats); in vxlan_init()
2480 spin_lock_bh(&vxlan->hash_lock); in vxlan_fdb_delete_default()
2484 spin_unlock_bh(&vxlan->hash_lock); in vxlan_fdb_delete_default()
2491 gro_cells_destroy(&vxlan->gro_cells); in vxlan_uninit()
2493 vxlan_fdb_delete_default(vxlan, vxlan->cfg.vni); in vxlan_uninit()
2495 free_percpu(dev->tstats); in vxlan_uninit()
2508 if (vxlan_addr_multicast(&vxlan->default_dst.remote_ip)) { in vxlan_open()
2510 if (ret == -EADDRINUSE) in vxlan_open()
2518 if (vxlan->cfg.age_interval) in vxlan_open()
2519 mod_timer(&vxlan->age_timer, jiffies + FDB_AGE_INTERVAL); in vxlan_open()
2529 spin_lock_bh(&vxlan->hash_lock); in vxlan_flush()
2532 hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) { in vxlan_flush()
2535 if (!do_all && (f->state & (NUD_PERMANENT | NUD_NOARP))) in vxlan_flush()
2538 if (!is_zero_ether_addr(f->eth_addr)) in vxlan_flush()
2542 spin_unlock_bh(&vxlan->hash_lock); in vxlan_flush()
2549 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in vxlan_stop()
2552 if (vxlan_addr_multicast(&vxlan->default_dst.remote_ip) && in vxlan_stop()
2556 del_timer_sync(&vxlan->age_timer); in vxlan_stop()
2572 struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_change_mtu()
2573 struct net_device *lowerdev = __dev_get_by_index(vxlan->net, in vxlan_change_mtu()
2574 dst->remote_ifindex); in vxlan_change_mtu()
2575 bool use_ipv6 = !!(vxlan->cfg.flags & VXLAN_F_IPV6); in vxlan_change_mtu()
2577 /* This check is different than dev->max_mtu, because it looks at in vxlan_change_mtu()
2578 * the lowerdev->mtu, rather than the static dev->max_mtu in vxlan_change_mtu()
2581 int max_mtu = lowerdev->mtu - in vxlan_change_mtu()
2584 return -EINVAL; in vxlan_change_mtu()
2587 dev->mtu = new_mtu; in vxlan_change_mtu()
2597 sport = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min, in vxlan_fill_metadata_dst()
2598 vxlan->cfg.port_max, true); in vxlan_fill_metadata_dst()
2599 dport = info->key.tp_dst ? : vxlan->cfg.dst_port; in vxlan_fill_metadata_dst()
2602 struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock); in vxlan_fill_metadata_dst()
2605 rt = vxlan_get_route(vxlan, dev, sock4, skb, 0, info->key.tos, in vxlan_fill_metadata_dst()
2606 info->key.u.ipv4.dst, in vxlan_fill_metadata_dst()
2607 &info->key.u.ipv4.src, dport, sport, in vxlan_fill_metadata_dst()
2608 &info->dst_cache, info); in vxlan_fill_metadata_dst()
2614 struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock); in vxlan_fill_metadata_dst()
2617 ndst = vxlan6_get_route(vxlan, dev, sock6, skb, 0, info->key.tos, in vxlan_fill_metadata_dst()
2618 info->key.label, &info->key.u.ipv6.dst, in vxlan_fill_metadata_dst()
2619 &info->key.u.ipv6.src, dport, sport, in vxlan_fill_metadata_dst()
2620 &info->dst_cache, info); in vxlan_fill_metadata_dst()
2625 return -EPFNOSUPPORT; in vxlan_fill_metadata_dst()
2628 info->key.tp_src = sport; in vxlan_fill_metadata_dst()
2629 info->key.tp_dst = dport; in vxlan_fill_metadata_dst()
2677 spin_lock(&vn->sock_lock); in vxlan_offload_rx_ports()
2679 hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist) { in vxlan_offload_rx_ports()
2682 if (vs->flags & VXLAN_F_GPE) in vxlan_offload_rx_ports()
2688 udp_tunnel_push_rx_port(dev, vs->sock, type); in vxlan_offload_rx_ports()
2690 udp_tunnel_drop_rx_port(dev, vs->sock, type); in vxlan_offload_rx_ports()
2693 spin_unlock(&vn->sock_lock); in vxlan_offload_rx_ports()
2705 dev->needs_free_netdev = true; in vxlan_setup()
2708 dev->features |= NETIF_F_LLTX; in vxlan_setup()
2709 dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM; in vxlan_setup()
2710 dev->features |= NETIF_F_RXCSUM; in vxlan_setup()
2711 dev->features |= NETIF_F_GSO_SOFTWARE; in vxlan_setup()
2713 dev->vlan_features = dev->features; in vxlan_setup()
2714 dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM; in vxlan_setup()
2715 dev->hw_features |= NETIF_F_GSO_SOFTWARE; in vxlan_setup()
2717 dev->priv_flags |= IFF_NO_QUEUE; in vxlan_setup()
2719 /* MTU range: 68 - 65535 */ in vxlan_setup()
2720 dev->min_mtu = ETH_MIN_MTU; in vxlan_setup()
2721 dev->max_mtu = ETH_MAX_MTU; in vxlan_setup()
2723 INIT_LIST_HEAD(&vxlan->next); in vxlan_setup()
2724 spin_lock_init(&vxlan->hash_lock); in vxlan_setup()
2726 timer_setup(&vxlan->age_timer, vxlan_cleanup, TIMER_DEFERRABLE); in vxlan_setup()
2728 vxlan->dev = dev; in vxlan_setup()
2731 INIT_HLIST_HEAD(&vxlan->fdb_head[h]); in vxlan_setup()
2736 dev->priv_flags &= ~IFF_TX_SKB_SHARING; in vxlan_ether_setup()
2737 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; in vxlan_ether_setup()
2738 dev->netdev_ops = &vxlan_netdev_ether_ops; in vxlan_ether_setup()
2743 dev->header_ops = NULL; in vxlan_raw_setup()
2744 dev->type = ARPHRD_NONE; in vxlan_raw_setup()
2745 dev->hard_header_len = 0; in vxlan_raw_setup()
2746 dev->addr_len = 0; in vxlan_raw_setup()
2747 dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; in vxlan_raw_setup()
2748 dev->netdev_ops = &vxlan_netdev_raw_ops; in vxlan_raw_setup()
2789 return -EINVAL; in vxlan_validate()
2795 return -EADDRNOTAVAIL; in vxlan_validate()
2805 return -EINVAL; in vxlan_validate()
2812 return -EINVAL; in vxlan_validate()
2821 return -ERANGE; in vxlan_validate()
2829 if (ntohs(p->high) < ntohs(p->low)) { in vxlan_validate()
2832 return -EINVAL; in vxlan_validate()
2842 strlcpy(drvinfo->version, VXLAN_VERSION, sizeof(drvinfo->version)); in vxlan_get_drvinfo()
2843 strlcpy(drvinfo->driver, "vxlan", sizeof(drvinfo->driver)); in vxlan_get_drvinfo()
2891 return ERR_PTR(-ENOMEM); in vxlan_socket_create()
2894 INIT_HLIST_HEAD(&vs->vni_list[h]); in vxlan_socket_create()
2902 vs->sock = sock; in vxlan_socket_create()
2903 refcount_set(&vs->refcnt, 1); in vxlan_socket_create()
2904 vs->flags = (flags & VXLAN_F_RCV_FLAGS); in vxlan_socket_create()
2906 spin_lock(&vn->sock_lock); in vxlan_socket_create()
2907 hlist_add_head_rcu(&vs->hlist, vs_head(net, port)); in vxlan_socket_create()
2909 (vs->flags & VXLAN_F_GPE) ? in vxlan_socket_create()
2912 spin_unlock(&vn->sock_lock); in vxlan_socket_create()
2930 struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id); in __vxlan_sock_add()
2934 if (!vxlan->cfg.no_share) { in __vxlan_sock_add()
2935 spin_lock(&vn->sock_lock); in __vxlan_sock_add()
2936 vs = vxlan_find_sock(vxlan->net, ipv6 ? AF_INET6 : AF_INET, in __vxlan_sock_add()
2937 vxlan->cfg.dst_port, vxlan->cfg.flags); in __vxlan_sock_add()
2938 if (vs && !refcount_inc_not_zero(&vs->refcnt)) { in __vxlan_sock_add()
2939 spin_unlock(&vn->sock_lock); in __vxlan_sock_add()
2940 return -EBUSY; in __vxlan_sock_add()
2942 spin_unlock(&vn->sock_lock); in __vxlan_sock_add()
2945 vs = vxlan_socket_create(vxlan->net, ipv6, in __vxlan_sock_add()
2946 vxlan->cfg.dst_port, vxlan->cfg.flags); in __vxlan_sock_add()
2951 rcu_assign_pointer(vxlan->vn6_sock, vs); in __vxlan_sock_add()
2952 node = &vxlan->hlist6; in __vxlan_sock_add()
2956 rcu_assign_pointer(vxlan->vn4_sock, vs); in __vxlan_sock_add()
2957 node = &vxlan->hlist4; in __vxlan_sock_add()
2965 bool metadata = vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA; in vxlan_sock_add()
2966 bool ipv6 = vxlan->cfg.flags & VXLAN_F_IPV6 || metadata; in vxlan_sock_add()
2970 RCU_INIT_POINTER(vxlan->vn4_sock, NULL); in vxlan_sock_add()
2972 RCU_INIT_POINTER(vxlan->vn6_sock, NULL); in vxlan_sock_add()
2975 if (ret < 0 && ret != -EAFNOSUPPORT) in vxlan_sock_add()
2995 if (conf->flags & VXLAN_F_GPE) { in vxlan_config_validate()
2998 * case, the other side of the PtP link will have to be in vxlan_config_validate()
3001 if ((conf->flags & ~VXLAN_F_ALLOWED_GPE) || in vxlan_config_validate()
3002 !(conf->flags & VXLAN_F_COLLECT_METADATA)) { in vxlan_config_validate()
3005 return -EINVAL; in vxlan_config_validate()
3009 if (!conf->remote_ip.sa.sa_family && !conf->saddr.sa.sa_family) { in vxlan_config_validate()
3011 conf->remote_ip.sa.sa_family = AF_INET; in vxlan_config_validate()
3012 conf->saddr.sa.sa_family = AF_INET; in vxlan_config_validate()
3013 } else if (!conf->remote_ip.sa.sa_family) { in vxlan_config_validate()
3014 conf->remote_ip.sa.sa_family = conf->saddr.sa.sa_family; in vxlan_config_validate()
3015 } else if (!conf->saddr.sa.sa_family) { in vxlan_config_validate()
3016 conf->saddr.sa.sa_family = conf->remote_ip.sa.sa_family; in vxlan_config_validate()
3019 if (conf->saddr.sa.sa_family != conf->remote_ip.sa.sa_family) { in vxlan_config_validate()
3022 return -EINVAL; in vxlan_config_validate()
3025 if (vxlan_addr_multicast(&conf->saddr)) { in vxlan_config_validate()
3027 return -EINVAL; in vxlan_config_validate()
3030 if (conf->saddr.sa.sa_family == AF_INET6) { in vxlan_config_validate()
3034 return -EPFNOSUPPORT; in vxlan_config_validate()
3037 conf->flags |= VXLAN_F_IPV6; in vxlan_config_validate()
3039 if (!(conf->flags & VXLAN_F_COLLECT_METADATA)) { in vxlan_config_validate()
3041 ipv6_addr_type(&conf->saddr.sin6.sin6_addr); in vxlan_config_validate()
3043 ipv6_addr_type(&conf->remote_ip.sin6.sin6_addr); in vxlan_config_validate()
3050 return -EINVAL; in vxlan_config_validate()
3053 conf->flags |= VXLAN_F_IPV6_LINKLOCAL; in vxlan_config_validate()
3059 return -EINVAL; in vxlan_config_validate()
3062 conf->flags &= ~VXLAN_F_IPV6_LINKLOCAL; in vxlan_config_validate()
3067 if (conf->label && !use_ipv6) { in vxlan_config_validate()
3070 return -EINVAL; in vxlan_config_validate()
3073 if (conf->remote_ifindex) { in vxlan_config_validate()
3076 lowerdev = __dev_get_by_index(src_net, conf->remote_ifindex); in vxlan_config_validate()
3080 return -ENODEV; in vxlan_config_validate()
3086 if (idev && idev->cnf.disable_ipv6) { in vxlan_config_validate()
3089 return -EPERM; in vxlan_config_validate()
3096 if (vxlan_addr_multicast(&conf->remote_ip)) { in vxlan_config_validate()
3100 return -EINVAL; in vxlan_config_validate()
3104 if (conf->flags & VXLAN_F_IPV6_LINKLOCAL) { in vxlan_config_validate()
3106 "Local interface required for link-local local/remote addresses"); in vxlan_config_validate()
3107 return -EINVAL; in vxlan_config_validate()
3114 if (!conf->dst_port) { in vxlan_config_validate()
3115 if (conf->flags & VXLAN_F_GPE) in vxlan_config_validate()
3116 conf->dst_port = htons(4790); /* IANA VXLAN-GPE port */ in vxlan_config_validate()
3118 conf->dst_port = htons(vxlan_port); in vxlan_config_validate()
3121 if (!conf->age_interval) in vxlan_config_validate()
3122 conf->age_interval = FDB_AGE_DEFAULT; in vxlan_config_validate()
3124 list_for_each_entry(tmp, &vn->vxlan_list, next) { in vxlan_config_validate()
3128 if (tmp->cfg.vni != conf->vni) in vxlan_config_validate()
3130 if (tmp->cfg.dst_port != conf->dst_port) in vxlan_config_validate()
3132 if ((tmp->cfg.flags & (VXLAN_F_RCV_FLAGS | VXLAN_F_IPV6)) != in vxlan_config_validate()
3133 (conf->flags & (VXLAN_F_RCV_FLAGS | VXLAN_F_IPV6))) in vxlan_config_validate()
3136 if ((conf->flags & VXLAN_F_IPV6_LINKLOCAL) && in vxlan_config_validate()
3137 tmp->cfg.remote_ifindex != conf->remote_ifindex) in vxlan_config_validate()
3142 return -EEXIST; in vxlan_config_validate()
3155 struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_config_apply()
3157 bool use_ipv6 = !!(conf->flags & VXLAN_F_IPV6); in vxlan_config_apply()
3161 if (conf->flags & VXLAN_F_GPE) in vxlan_config_apply()
3166 if (conf->mtu) in vxlan_config_apply()
3167 dev->mtu = conf->mtu; in vxlan_config_apply()
3169 vxlan->net = src_net; in vxlan_config_apply()
3172 dst->remote_vni = conf->vni; in vxlan_config_apply()
3174 memcpy(&dst->remote_ip, &conf->remote_ip, sizeof(conf->remote_ip)); in vxlan_config_apply()
3177 dst->remote_ifindex = conf->remote_ifindex; in vxlan_config_apply()
3179 dev->gso_max_size = lowerdev->gso_max_size; in vxlan_config_apply()
3180 dev->gso_max_segs = lowerdev->gso_max_segs; in vxlan_config_apply()
3182 needed_headroom = lowerdev->hard_header_len; in vxlan_config_apply()
3184 max_mtu = lowerdev->mtu - (use_ipv6 ? VXLAN6_HEADROOM : in vxlan_config_apply()
3189 if (!changelink && !conf->mtu) in vxlan_config_apply()
3190 dev->mtu = max_mtu; in vxlan_config_apply()
3193 if (dev->mtu > max_mtu) in vxlan_config_apply()
3194 dev->mtu = max_mtu; in vxlan_config_apply()
3196 if (use_ipv6 || conf->flags & VXLAN_F_COLLECT_METADATA) in vxlan_config_apply()
3200 dev->needed_headroom = needed_headroom; in vxlan_config_apply()
3202 memcpy(&vxlan->cfg, conf, sizeof(*conf)); in vxlan_config_apply()
3236 dev->ethtool_ops = &vxlan_ethtool_ops; in __vxlan_dev_create()
3239 if (!vxlan_addr_any(&vxlan->default_dst.remote_ip)) { in __vxlan_dev_create()
3241 &vxlan->default_dst.remote_ip, in __vxlan_dev_create()
3243 vxlan->cfg.dst_port, in __vxlan_dev_create()
3244 vxlan->default_dst.remote_vni, in __vxlan_dev_create()
3245 vxlan->default_dst.remote_vni, in __vxlan_dev_create()
3246 vxlan->default_dst.remote_ifindex, in __vxlan_dev_create()
3265 list_add(&vxlan->next, &vn->vxlan_list); in __vxlan_dev_create()
3290 memcpy(conf, &vxlan->cfg, sizeof(*conf)); in vxlan_nl2conf()
3295 if (changelink && (vni != conf->vni)) in vxlan_nl2conf()
3296 return -EOPNOTSUPP; in vxlan_nl2conf()
3297 conf->vni = cpu_to_be32(nla_get_u32(data[IFLA_VXLAN_ID])); in vxlan_nl2conf()
3301 if (changelink && (conf->remote_ip.sa.sa_family != AF_INET)) in vxlan_nl2conf()
3302 return -EOPNOTSUPP; in vxlan_nl2conf()
3304 conf->remote_ip.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_GROUP]); in vxlan_nl2conf()
3305 conf->remote_ip.sa.sa_family = AF_INET; in vxlan_nl2conf()
3308 return -EPFNOSUPPORT; in vxlan_nl2conf()
3310 if (changelink && (conf->remote_ip.sa.sa_family != AF_INET6)) in vxlan_nl2conf()
3311 return -EOPNOTSUPP; in vxlan_nl2conf()
3313 conf->remote_ip.sin6.sin6_addr = nla_get_in6_addr(data[IFLA_VXLAN_GROUP6]); in vxlan_nl2conf()
3314 conf->remote_ip.sa.sa_family = AF_INET6; in vxlan_nl2conf()
3318 if (changelink && (conf->saddr.sa.sa_family != AF_INET)) in vxlan_nl2conf()
3319 return -EOPNOTSUPP; in vxlan_nl2conf()
3321 conf->saddr.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_LOCAL]); in vxlan_nl2conf()
3322 conf->saddr.sa.sa_family = AF_INET; in vxlan_nl2conf()
3325 return -EPFNOSUPPORT; in vxlan_nl2conf()
3327 if (changelink && (conf->saddr.sa.sa_family != AF_INET6)) in vxlan_nl2conf()
3328 return -EOPNOTSUPP; in vxlan_nl2conf()
3331 conf->saddr.sin6.sin6_addr = nla_get_in6_addr(data[IFLA_VXLAN_LOCAL6]); in vxlan_nl2conf()
3332 conf->saddr.sa.sa_family = AF_INET6; in vxlan_nl2conf()
3336 conf->remote_ifindex = nla_get_u32(data[IFLA_VXLAN_LINK]); in vxlan_nl2conf()
3339 conf->tos = nla_get_u8(data[IFLA_VXLAN_TOS]); in vxlan_nl2conf()
3342 conf->ttl = nla_get_u8(data[IFLA_VXLAN_TTL]); in vxlan_nl2conf()
3346 return -EOPNOTSUPP; in vxlan_nl2conf()
3347 conf->flags |= VXLAN_F_TTL_INHERIT; in vxlan_nl2conf()
3351 conf->label = nla_get_be32(data[IFLA_VXLAN_LABEL]) & in vxlan_nl2conf()
3356 conf->flags |= VXLAN_F_LEARN; in vxlan_nl2conf()
3358 conf->flags &= ~VXLAN_F_LEARN; in vxlan_nl2conf()
3361 conf->flags |= VXLAN_F_LEARN; in vxlan_nl2conf()
3366 return -EOPNOTSUPP; in vxlan_nl2conf()
3367 conf->age_interval = nla_get_u32(data[IFLA_VXLAN_AGEING]); in vxlan_nl2conf()
3372 return -EOPNOTSUPP; in vxlan_nl2conf()
3374 conf->flags |= VXLAN_F_PROXY; in vxlan_nl2conf()
3379 return -EOPNOTSUPP; in vxlan_nl2conf()
3381 conf->flags |= VXLAN_F_RSC; in vxlan_nl2conf()
3386 return -EOPNOTSUPP; in vxlan_nl2conf()
3388 conf->flags |= VXLAN_F_L2MISS; in vxlan_nl2conf()
3393 return -EOPNOTSUPP; in vxlan_nl2conf()
3395 conf->flags |= VXLAN_F_L3MISS; in vxlan_nl2conf()
3400 return -EOPNOTSUPP; in vxlan_nl2conf()
3401 conf->addrmax = nla_get_u32(data[IFLA_VXLAN_LIMIT]); in vxlan_nl2conf()
3406 return -EOPNOTSUPP; in vxlan_nl2conf()
3408 conf->flags |= VXLAN_F_COLLECT_METADATA; in vxlan_nl2conf()
3415 conf->port_min = ntohs(p->low); in vxlan_nl2conf()
3416 conf->port_max = ntohs(p->high); in vxlan_nl2conf()
3418 return -EOPNOTSUPP; in vxlan_nl2conf()
3424 return -EOPNOTSUPP; in vxlan_nl2conf()
3425 conf->dst_port = nla_get_be16(data[IFLA_VXLAN_PORT]); in vxlan_nl2conf()
3430 return -EOPNOTSUPP; in vxlan_nl2conf()
3432 conf->flags |= VXLAN_F_UDP_ZERO_CSUM_TX; in vxlan_nl2conf()
3437 return -EOPNOTSUPP; in vxlan_nl2conf()
3439 conf->flags |= VXLAN_F_UDP_ZERO_CSUM6_TX; in vxlan_nl2conf()
3444 return -EOPNOTSUPP; in vxlan_nl2conf()
3446 conf->flags |= VXLAN_F_UDP_ZERO_CSUM6_RX; in vxlan_nl2conf()
3451 return -EOPNOTSUPP; in vxlan_nl2conf()
3453 conf->flags |= VXLAN_F_REMCSUM_TX; in vxlan_nl2conf()
3458 return -EOPNOTSUPP; in vxlan_nl2conf()
3460 conf->flags |= VXLAN_F_REMCSUM_RX; in vxlan_nl2conf()
3465 return -EOPNOTSUPP; in vxlan_nl2conf()
3466 conf->flags |= VXLAN_F_GBP; in vxlan_nl2conf()
3471 return -EOPNOTSUPP; in vxlan_nl2conf()
3472 conf->flags |= VXLAN_F_GPE; in vxlan_nl2conf()
3477 return -EOPNOTSUPP; in vxlan_nl2conf()
3478 conf->flags |= VXLAN_F_REMCSUM_NOPARTIAL; in vxlan_nl2conf()
3483 return -EOPNOTSUPP; in vxlan_nl2conf()
3484 conf->mtu = nla_get_u32(tb[IFLA_MTU]); in vxlan_nl2conf()
3509 struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_changelink()
3521 err = vxlan_dev_configure(vxlan->net, dev, &conf, true, extack); in vxlan_changelink()
3526 if (!vxlan_addr_equal(&dst->remote_ip, &old_dst.remote_ip)) { in vxlan_changelink()
3527 spin_lock_bh(&vxlan->hash_lock); in vxlan_changelink()
3531 vxlan->cfg.dst_port, in vxlan_changelink()
3536 if (!vxlan_addr_any(&dst->remote_ip)) { in vxlan_changelink()
3538 &dst->remote_ip, in vxlan_changelink()
3541 vxlan->cfg.dst_port, in vxlan_changelink()
3542 dst->remote_vni, in vxlan_changelink()
3543 dst->remote_vni, in vxlan_changelink()
3544 dst->remote_ifindex, in vxlan_changelink()
3547 spin_unlock_bh(&vxlan->hash_lock); in vxlan_changelink()
3551 spin_unlock_bh(&vxlan->hash_lock); in vxlan_changelink()
3563 list_del(&vxlan->next); in vxlan_dellink()
3599 const struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_fill_info()
3601 .low = htons(vxlan->cfg.port_min), in vxlan_fill_info()
3602 .high = htons(vxlan->cfg.port_max), in vxlan_fill_info()
3605 if (nla_put_u32(skb, IFLA_VXLAN_ID, be32_to_cpu(dst->remote_vni))) in vxlan_fill_info()
3608 if (!vxlan_addr_any(&dst->remote_ip)) { in vxlan_fill_info()
3609 if (dst->remote_ip.sa.sa_family == AF_INET) { in vxlan_fill_info()
3611 dst->remote_ip.sin.sin_addr.s_addr)) in vxlan_fill_info()
3616 &dst->remote_ip.sin6.sin6_addr)) in vxlan_fill_info()
3622 if (dst->remote_ifindex && nla_put_u32(skb, IFLA_VXLAN_LINK, dst->remote_ifindex)) in vxlan_fill_info()
3625 if (!vxlan_addr_any(&vxlan->cfg.saddr)) { in vxlan_fill_info()
3626 if (vxlan->cfg.saddr.sa.sa_family == AF_INET) { in vxlan_fill_info()
3628 vxlan->cfg.saddr.sin.sin_addr.s_addr)) in vxlan_fill_info()
3633 &vxlan->cfg.saddr.sin6.sin6_addr)) in vxlan_fill_info()
3639 if (nla_put_u8(skb, IFLA_VXLAN_TTL, vxlan->cfg.ttl) || in vxlan_fill_info()
3641 !!(vxlan->cfg.flags & VXLAN_F_TTL_INHERIT)) || in vxlan_fill_info()
3642 nla_put_u8(skb, IFLA_VXLAN_TOS, vxlan->cfg.tos) || in vxlan_fill_info()
3643 nla_put_be32(skb, IFLA_VXLAN_LABEL, vxlan->cfg.label) || in vxlan_fill_info()
3645 !!(vxlan->cfg.flags & VXLAN_F_LEARN)) || in vxlan_fill_info()
3647 !!(vxlan->cfg.flags & VXLAN_F_PROXY)) || in vxlan_fill_info()
3649 !!(vxlan->cfg.flags & VXLAN_F_RSC)) || in vxlan_fill_info()
3651 !!(vxlan->cfg.flags & VXLAN_F_L2MISS)) || in vxlan_fill_info()
3653 !!(vxlan->cfg.flags & VXLAN_F_L3MISS)) || in vxlan_fill_info()
3655 !!(vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)) || in vxlan_fill_info()
3656 nla_put_u32(skb, IFLA_VXLAN_AGEING, vxlan->cfg.age_interval) || in vxlan_fill_info()
3657 nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->cfg.addrmax) || in vxlan_fill_info()
3658 nla_put_be16(skb, IFLA_VXLAN_PORT, vxlan->cfg.dst_port) || in vxlan_fill_info()
3660 !(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM_TX)) || in vxlan_fill_info()
3662 !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_TX)) || in vxlan_fill_info()
3664 !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_RX)) || in vxlan_fill_info()
3666 !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_TX)) || in vxlan_fill_info()
3668 !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_RX))) in vxlan_fill_info()
3674 if (vxlan->cfg.flags & VXLAN_F_GBP && in vxlan_fill_info()
3678 if (vxlan->cfg.flags & VXLAN_F_GPE && in vxlan_fill_info()
3682 if (vxlan->cfg.flags & VXLAN_F_REMCSUM_NOPARTIAL && in vxlan_fill_info()
3689 return -EMSGSIZE; in vxlan_fill_info()
3696 return vxlan->net; in vxlan_get_link_net()
3754 list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) { in vxlan_handle_lowerdev_unregister()
3755 struct vxlan_rdst *dst = &vxlan->default_dst; in vxlan_handle_lowerdev_unregister()
3763 if (dst->remote_ifindex == dev->ifindex) in vxlan_handle_lowerdev_unregister()
3764 vxlan_dellink(vxlan->dev, &list_kill); in vxlan_handle_lowerdev_unregister()
3798 INIT_LIST_HEAD(&vn->vxlan_list); in vxlan_init_net()
3799 spin_lock_init(&vn->sock_lock); in vxlan_init_net()
3802 INIT_HLIST_HEAD(&vn->sock_list[h]); in vxlan_init_net()
3815 if (dev->rtnl_link_ops == &vxlan_link_ops) in vxlan_destroy_tunnels()
3818 list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) { in vxlan_destroy_tunnels()
3819 /* If vxlan->dev is in the same netns, it has already been added in vxlan_destroy_tunnels()
3822 if (!net_eq(dev_net(vxlan->dev), net)) in vxlan_destroy_tunnels()
3823 unregister_netdevice_queue(vxlan->dev, head); in vxlan_destroy_tunnels()
3827 WARN_ON_ONCE(!hlist_empty(&vn->sock_list[h])); in vxlan_destroy_tunnels()