vxlan_private.h (4924B)
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