Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.14.15.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 *	Vxlan private header file
  4 *
  5 */
  6
  7#ifndef _VXLAN_PRIVATE_H
  8#define _VXLAN_PRIVATE_H
  9
 10#include <linux/rhashtable.h>
 11
 12extern unsigned int vxlan_net_id;
 13extern const u8 all_zeros_mac[ETH_ALEN + 2];
 14extern const struct rhashtable_params vxlan_vni_rht_params;
 15
 16#define PORT_HASH_BITS	8
 17#define PORT_HASH_SIZE  (1 << PORT_HASH_BITS)
 18
 19/* per-network namespace private data for this module */
 20struct vxlan_net {
 21	struct list_head  vxlan_list;
 22	struct hlist_head sock_list[PORT_HASH_SIZE];
 23	spinlock_t	  sock_lock;
 24	struct notifier_block nexthop_notifier_block;
 25};
 26
 27/* Forwarding table entry */
 28struct vxlan_fdb {
 29	struct hlist_node hlist;	/* linked list of entries */
 30	struct rcu_head	  rcu;
 31	unsigned long	  updated;	/* jiffies */
 32	unsigned long	  used;
 33	struct list_head  remotes;
 34	u8		  eth_addr[ETH_ALEN];
 35	u16		  state;	/* see ndm_state */
 36	__be32		  vni;
 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;
 41};
 42
 43#define NTF_VXLAN_ADDED_BY_USER 0x100
 44
 45/* Virtual Network hash table head */
 46static inline struct hlist_head *vni_head(struct vxlan_sock *vs, __be32 vni)
 47{
 48	return &vs->vni_list[hash_32((__force u32)vni, VNI_HASH_BITS)];
 49}
 50
 51/* Socket hash table head */
 52static inline struct hlist_head *vs_head(struct net *net, __be16 port)
 53{
 54	struct vxlan_net *vn = net_generic(net, vxlan_net_id);
 55
 56	return &vn->sock_list[hash_32(ntohs(port), PORT_HASH_BITS)];
 57}
 58
 59/* First remote destination for a forwarding entry.
 60 * Guaranteed to be non-NULL because remotes are never deleted.
 61 */
 62static inline struct vxlan_rdst *first_remote_rcu(struct vxlan_fdb *fdb)
 63{
 64	if (rcu_access_pointer(fdb->nh))
 65		return NULL;
 66	return list_entry_rcu(fdb->remotes.next, struct vxlan_rdst, list);
 67}
 68
 69static inline struct vxlan_rdst *first_remote_rtnl(struct vxlan_fdb *fdb)
 70{
 71	if (rcu_access_pointer(fdb->nh))
 72		return NULL;
 73	return list_first_entry(&fdb->remotes, struct vxlan_rdst, list);
 74}
 75
 76#if IS_ENABLED(CONFIG_IPV6)
 77static inline
 78bool vxlan_addr_equal(const union vxlan_addr *a, const union vxlan_addr *b)
 79{
 80	if (a->sa.sa_family != b->sa.sa_family)
 81		return false;
 82	if (a->sa.sa_family == AF_INET6)
 83		return ipv6_addr_equal(&a->sin6.sin6_addr, &b->sin6.sin6_addr);
 84	else
 85		return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr;
 86}
 87
 88#else /* !CONFIG_IPV6 */
 89
 90static inline
 91bool vxlan_addr_equal(const union vxlan_addr *a, const union vxlan_addr *b)
 92{
 93	return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr;
 94}
 95
 96#endif
 97
 98static inline struct vxlan_vni_node *
 99vxlan_vnifilter_lookup(struct vxlan_dev *vxlan, __be32 vni)
100{
101	struct vxlan_vni_group *vg;
102
103	vg = rcu_dereference_rtnl(vxlan->vnigrp);
104	if (!vg)
105		return NULL;
106
107	return rhashtable_lookup_fast(&vg->vni_hash, &vni,
108				      vxlan_vni_rht_params);
109}
110
111/* vxlan_core.c */
112int vxlan_fdb_create(struct vxlan_dev *vxlan,
113		     const u8 *mac, union vxlan_addr *ip,
114		     __u16 state, __be16 port, __be32 src_vni,
115		     __be32 vni, __u32 ifindex, __u16 ndm_flags,
116		     u32 nhid, struct vxlan_fdb **fdb,
117		     struct netlink_ext_ack *extack);
118int __vxlan_fdb_delete(struct vxlan_dev *vxlan,
119		       const unsigned char *addr, union vxlan_addr ip,
120		       __be16 port, __be32 src_vni, __be32 vni,
121		       u32 ifindex, bool swdev_notify);
122u32 eth_vni_hash(const unsigned char *addr, __be32 vni);
123u32 fdb_head_index(struct vxlan_dev *vxlan, const u8 *mac, __be32 vni);
124int vxlan_fdb_update(struct vxlan_dev *vxlan,
125		     const u8 *mac, union vxlan_addr *ip,
126		     __u16 state, __u16 flags,
127		     __be16 port, __be32 src_vni, __be32 vni,
128		     __u32 ifindex, __u16 ndm_flags, u32 nhid,
129		     bool swdev_notify, struct netlink_ext_ack *extack);
130int vxlan_vni_in_use(struct net *src_net, struct vxlan_dev *vxlan,
131		     struct vxlan_config *conf, __be32 vni);
132
133/* vxlan_vnifilter.c */
134int vxlan_vnigroup_init(struct vxlan_dev *vxlan);
135void vxlan_vnigroup_uninit(struct vxlan_dev *vxlan);
136
137void vxlan_vnifilter_init(void);
138void vxlan_vnifilter_uninit(void);
139void vxlan_vnifilter_count(struct vxlan_dev *vxlan, __be32 vni,
140			   struct vxlan_vni_node *vninode,
141			   int type, unsigned int len);
142
143void vxlan_vs_add_vnigrp(struct vxlan_dev *vxlan,
144			 struct vxlan_sock *vs,
145			 bool ipv6);
146void vxlan_vs_del_vnigrp(struct vxlan_dev *vxlan);
147int vxlan_vnilist_update_group(struct vxlan_dev *vxlan,
148			       union vxlan_addr *old_remote_ip,
149			       union vxlan_addr *new_remote_ip,
150			       struct netlink_ext_ack *extack);
151
152
153/* vxlan_multicast.c */
154int vxlan_multicast_join(struct vxlan_dev *vxlan);
155int vxlan_multicast_leave(struct vxlan_dev *vxlan);
156bool vxlan_group_used(struct vxlan_net *vn, struct vxlan_dev *dev,
157		      __be32 vni, union vxlan_addr *rip, int rifindex);
158int vxlan_igmp_join(struct vxlan_dev *vxlan, union vxlan_addr *rip,
159		    int rifindex);
160int vxlan_igmp_leave(struct vxlan_dev *vxlan, union vxlan_addr *rip,
161		     int rifindex);
162#endif