1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Vxlan private header file
7 #ifndef _VXLAN_PRIVATE_H
8 #define _VXLAN_PRIVATE_H
10 #include <linux/rhashtable.h>
12 extern unsigned int vxlan_net_id
;
13 extern const u8 all_zeros_mac
[ETH_ALEN
+ 2];
14 extern const struct rhashtable_params vxlan_vni_rht_params
;
16 #define PORT_HASH_BITS 8
17 #define PORT_HASH_SIZE (1 << PORT_HASH_BITS)
19 /* per-network namespace private data for this module */
21 struct list_head vxlan_list
;
22 struct hlist_head sock_list
[PORT_HASH_SIZE
];
24 struct notifier_block nexthop_notifier_block
;
27 /* Forwarding table entry */
29 struct hlist_node hlist
; /* linked list of entries */
31 unsigned long updated
; /* jiffies */
33 struct list_head remotes
;
34 u8 eth_addr
[ETH_ALEN
];
35 u16 state
; /* see ndm_state */
37 u16 flags
; /* see ndm_flags and below */
38 struct list_head nh_list
;
39 struct nexthop __rcu
*nh
;
40 struct vxlan_dev __rcu
*vdev
;
43 #define NTF_VXLAN_ADDED_BY_USER 0x100
45 /* Virtual Network hash table head */
46 static inline struct hlist_head
*vni_head(struct vxlan_sock
*vs
, __be32 vni
)
48 return &vs
->vni_list
[hash_32((__force u32
)vni
, VNI_HASH_BITS
)];
51 /* Socket hash table head */
52 static inline struct hlist_head
*vs_head(struct net
*net
, __be16 port
)
54 struct vxlan_net
*vn
= net_generic(net
, vxlan_net_id
);
56 return &vn
->sock_list
[hash_32(ntohs(port
), PORT_HASH_BITS
)];
59 /* First remote destination for a forwarding entry.
60 * Guaranteed to be non-NULL because remotes are never deleted.
62 static inline struct vxlan_rdst
*first_remote_rcu(struct vxlan_fdb
*fdb
)
64 if (rcu_access_pointer(fdb
->nh
))
66 return list_entry_rcu(fdb
->remotes
.next
, struct vxlan_rdst
, list
);
69 static inline struct vxlan_rdst
*first_remote_rtnl(struct vxlan_fdb
*fdb
)
71 if (rcu_access_pointer(fdb
->nh
))
73 return list_first_entry(&fdb
->remotes
, struct vxlan_rdst
, list
);
76 #if IS_ENABLED(CONFIG_IPV6)
78 bool vxlan_addr_equal(const union vxlan_addr
*a
, const union vxlan_addr
*b
)
80 if (a
->sa
.sa_family
!= b
->sa
.sa_family
)
82 if (a
->sa
.sa_family
== AF_INET6
)
83 return ipv6_addr_equal(&a
->sin6
.sin6_addr
, &b
->sin6
.sin6_addr
);
85 return a
->sin
.sin_addr
.s_addr
== b
->sin
.sin_addr
.s_addr
;
88 static inline int vxlan_nla_get_addr(union vxlan_addr
*ip
,
89 const struct nlattr
*nla
)
91 if (nla_len(nla
) >= sizeof(struct in6_addr
)) {
92 ip
->sin6
.sin6_addr
= nla_get_in6_addr(nla
);
93 ip
->sa
.sa_family
= AF_INET6
;
95 } else if (nla_len(nla
) >= sizeof(__be32
)) {
96 ip
->sin
.sin_addr
.s_addr
= nla_get_in_addr(nla
);
97 ip
->sa
.sa_family
= AF_INET
;
100 return -EAFNOSUPPORT
;
104 static inline int vxlan_nla_put_addr(struct sk_buff
*skb
, int attr
,
105 const union vxlan_addr
*ip
)
107 if (ip
->sa
.sa_family
== AF_INET6
)
108 return nla_put_in6_addr(skb
, attr
, &ip
->sin6
.sin6_addr
);
110 return nla_put_in_addr(skb
, attr
, ip
->sin
.sin_addr
.s_addr
);
113 static inline bool vxlan_addr_is_multicast(const union vxlan_addr
*ip
)
115 if (ip
->sa
.sa_family
== AF_INET6
)
116 return ipv6_addr_is_multicast(&ip
->sin6
.sin6_addr
);
118 return ipv4_is_multicast(ip
->sin
.sin_addr
.s_addr
);
121 #else /* !CONFIG_IPV6 */
124 bool vxlan_addr_equal(const union vxlan_addr
*a
, const union vxlan_addr
*b
)
126 return a
->sin
.sin_addr
.s_addr
== b
->sin
.sin_addr
.s_addr
;
129 static inline int vxlan_nla_get_addr(union vxlan_addr
*ip
,
130 const struct nlattr
*nla
)
132 if (nla_len(nla
) >= sizeof(struct in6_addr
)) {
133 return -EAFNOSUPPORT
;
134 } else if (nla_len(nla
) >= sizeof(__be32
)) {
135 ip
->sin
.sin_addr
.s_addr
= nla_get_in_addr(nla
);
136 ip
->sa
.sa_family
= AF_INET
;
139 return -EAFNOSUPPORT
;
143 static inline int vxlan_nla_put_addr(struct sk_buff
*skb
, int attr
,
144 const union vxlan_addr
*ip
)
146 return nla_put_in_addr(skb
, attr
, ip
->sin
.sin_addr
.s_addr
);
149 static inline bool vxlan_addr_is_multicast(const union vxlan_addr
*ip
)
151 return ipv4_is_multicast(ip
->sin
.sin_addr
.s_addr
);
156 static inline size_t vxlan_addr_size(const union vxlan_addr
*ip
)
158 if (ip
->sa
.sa_family
== AF_INET6
)
159 return sizeof(struct in6_addr
);
161 return sizeof(__be32
);
164 static inline struct vxlan_vni_node
*
165 vxlan_vnifilter_lookup(struct vxlan_dev
*vxlan
, __be32 vni
)
167 struct vxlan_vni_group
*vg
;
169 vg
= rcu_dereference_rtnl(vxlan
->vnigrp
);
173 return rhashtable_lookup_fast(&vg
->vni_hash
, &vni
,
174 vxlan_vni_rht_params
);
178 int vxlan_fdb_create(struct vxlan_dev
*vxlan
,
179 const u8
*mac
, union vxlan_addr
*ip
,
180 __u16 state
, __be16 port
, __be32 src_vni
,
181 __be32 vni
, __u32 ifindex
, __u16 ndm_flags
,
182 u32 nhid
, struct vxlan_fdb
**fdb
,
183 struct netlink_ext_ack
*extack
);
184 int __vxlan_fdb_delete(struct vxlan_dev
*vxlan
,
185 const unsigned char *addr
, union vxlan_addr ip
,
186 __be16 port
, __be32 src_vni
, __be32 vni
,
187 u32 ifindex
, bool swdev_notify
);
188 u32
eth_vni_hash(const unsigned char *addr
, __be32 vni
);
189 u32
fdb_head_index(struct vxlan_dev
*vxlan
, const u8
*mac
, __be32 vni
);
190 int vxlan_fdb_update(struct vxlan_dev
*vxlan
,
191 const u8
*mac
, union vxlan_addr
*ip
,
192 __u16 state
, __u16 flags
,
193 __be16 port
, __be32 src_vni
, __be32 vni
,
194 __u32 ifindex
, __u16 ndm_flags
, u32 nhid
,
195 bool swdev_notify
, struct netlink_ext_ack
*extack
);
196 void vxlan_xmit_one(struct sk_buff
*skb
, struct net_device
*dev
,
197 __be32 default_vni
, struct vxlan_rdst
*rdst
, bool did_rsc
);
198 int vxlan_vni_in_use(struct net
*src_net
, struct vxlan_dev
*vxlan
,
199 struct vxlan_config
*conf
, __be32 vni
);
201 /* vxlan_vnifilter.c */
202 int vxlan_vnigroup_init(struct vxlan_dev
*vxlan
);
203 void vxlan_vnigroup_uninit(struct vxlan_dev
*vxlan
);
205 int vxlan_vnifilter_init(void);
206 void vxlan_vnifilter_uninit(void);
207 void vxlan_vnifilter_count(struct vxlan_dev
*vxlan
, __be32 vni
,
208 struct vxlan_vni_node
*vninode
,
209 int type
, unsigned int len
);
211 void vxlan_vs_add_vnigrp(struct vxlan_dev
*vxlan
,
212 struct vxlan_sock
*vs
,
214 void vxlan_vs_del_vnigrp(struct vxlan_dev
*vxlan
);
215 int vxlan_vnilist_update_group(struct vxlan_dev
*vxlan
,
216 union vxlan_addr
*old_remote_ip
,
217 union vxlan_addr
*new_remote_ip
,
218 struct netlink_ext_ack
*extack
);
221 /* vxlan_multicast.c */
222 int vxlan_multicast_join(struct vxlan_dev
*vxlan
);
223 int vxlan_multicast_leave(struct vxlan_dev
*vxlan
);
224 bool vxlan_group_used(struct vxlan_net
*vn
, struct vxlan_dev
*dev
,
225 __be32 vni
, union vxlan_addr
*rip
, int rifindex
);
226 int vxlan_igmp_join(struct vxlan_dev
*vxlan
, union vxlan_addr
*rip
,
228 int vxlan_igmp_leave(struct vxlan_dev
*vxlan
, union vxlan_addr
*rip
,
232 int vxlan_mdb_dump(struct net_device
*dev
, struct sk_buff
*skb
,
233 struct netlink_callback
*cb
);
234 int vxlan_mdb_add(struct net_device
*dev
, struct nlattr
*tb
[], u16 nlmsg_flags
,
235 struct netlink_ext_ack
*extack
);
236 int vxlan_mdb_del(struct net_device
*dev
, struct nlattr
*tb
[],
237 struct netlink_ext_ack
*extack
);
238 int vxlan_mdb_del_bulk(struct net_device
*dev
, struct nlattr
*tb
[],
239 struct netlink_ext_ack
*extack
);
240 int vxlan_mdb_get(struct net_device
*dev
, struct nlattr
*tb
[], u32 portid
,
241 u32 seq
, struct netlink_ext_ack
*extack
);
242 struct vxlan_mdb_entry
*vxlan_mdb_entry_skb_get(struct vxlan_dev
*vxlan
,
245 netdev_tx_t
vxlan_mdb_xmit(struct vxlan_dev
*vxlan
,
246 const struct vxlan_mdb_entry
*mdb_entry
,
247 struct sk_buff
*skb
);
248 int vxlan_mdb_init(struct vxlan_dev
*vxlan
);
249 void vxlan_mdb_fini(struct vxlan_dev
*vxlan
);