cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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