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

if_inet6.h (6824B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 *	inet6 interface/address list definitions
      4 *	Linux INET6 implementation 
      5 *
      6 *	Authors:
      7 *	Pedro Roque		<roque@di.fc.ul.pt>	
      8 */
      9
     10#ifndef _NET_IF_INET6_H
     11#define _NET_IF_INET6_H
     12
     13#include <net/snmp.h>
     14#include <linux/ipv6.h>
     15#include <linux/refcount.h>
     16
     17/* inet6_dev.if_flags */
     18
     19#define IF_RA_OTHERCONF	0x80
     20#define IF_RA_MANAGED	0x40
     21#define IF_RA_RCVD	0x20
     22#define IF_RS_SENT	0x10
     23#define IF_READY	0x80000000
     24
     25/* prefix flags */
     26#define IF_PREFIX_ONLINK	0x01
     27#define IF_PREFIX_AUTOCONF	0x02
     28
     29enum {
     30	INET6_IFADDR_STATE_PREDAD,
     31	INET6_IFADDR_STATE_DAD,
     32	INET6_IFADDR_STATE_POSTDAD,
     33	INET6_IFADDR_STATE_ERRDAD,
     34	INET6_IFADDR_STATE_DEAD,
     35};
     36
     37struct inet6_ifaddr {
     38	struct in6_addr		addr;
     39	__u32			prefix_len;
     40	__u32			rt_priority;
     41
     42	/* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */
     43	__u32			valid_lft;
     44	__u32			prefered_lft;
     45	refcount_t		refcnt;
     46	spinlock_t		lock;
     47
     48	int			state;
     49
     50	__u32			flags;
     51	__u8			dad_probes;
     52	__u8			stable_privacy_retry;
     53
     54	__u16			scope;
     55	__u64			dad_nonce;
     56
     57	unsigned long		cstamp;	/* created timestamp */
     58	unsigned long		tstamp; /* updated timestamp */
     59
     60	struct delayed_work	dad_work;
     61
     62	struct inet6_dev	*idev;
     63	struct fib6_info	*rt;
     64
     65	struct hlist_node	addr_lst;
     66	struct list_head	if_list;
     67	/*
     68	 * Used to safely traverse idev->addr_list in process context
     69	 * if the idev->lock needed to protect idev->addr_list cannot be held.
     70	 * In that case, add the items to this list temporarily and iterate
     71	 * without holding idev->lock.
     72	 * See addrconf_ifdown and dev_forward_change.
     73	 */
     74	struct list_head	if_list_aux;
     75
     76	struct list_head	tmp_list;
     77	struct inet6_ifaddr	*ifpub;
     78	int			regen_count;
     79
     80	bool			tokenized;
     81
     82	u8			ifa_proto;
     83
     84	struct rcu_head		rcu;
     85	struct in6_addr		peer_addr;
     86};
     87
     88struct ip6_sf_socklist {
     89	unsigned int		sl_max;
     90	unsigned int		sl_count;
     91	struct rcu_head		rcu;
     92	struct in6_addr		sl_addr[];
     93};
     94
     95#define IP6_SFBLOCK	10	/* allocate this many at once */
     96
     97struct ipv6_mc_socklist {
     98	struct in6_addr		addr;
     99	int			ifindex;
    100	unsigned int		sfmode;		/* MCAST_{INCLUDE,EXCLUDE} */
    101	struct ipv6_mc_socklist __rcu *next;
    102	struct ip6_sf_socklist	__rcu *sflist;
    103	struct rcu_head		rcu;
    104};
    105
    106struct ip6_sf_list {
    107	struct ip6_sf_list __rcu *sf_next;
    108	struct in6_addr		sf_addr;
    109	unsigned long		sf_count[2];	/* include/exclude counts */
    110	unsigned char		sf_gsresp;	/* include in g & s response? */
    111	unsigned char		sf_oldin;	/* change state */
    112	unsigned char		sf_crcount;	/* retrans. left to send */
    113	struct rcu_head		rcu;
    114};
    115
    116#define MAF_TIMER_RUNNING	0x01
    117#define MAF_LAST_REPORTER	0x02
    118#define MAF_LOADED		0x04
    119#define MAF_NOREPORT		0x08
    120#define MAF_GSQUERY		0x10
    121
    122struct ifmcaddr6 {
    123	struct in6_addr		mca_addr;
    124	struct inet6_dev	*idev;
    125	struct ifmcaddr6	__rcu *next;
    126	struct ip6_sf_list	__rcu *mca_sources;
    127	struct ip6_sf_list	__rcu *mca_tomb;
    128	unsigned int		mca_sfmode;
    129	unsigned char		mca_crcount;
    130	unsigned long		mca_sfcount[2];
    131	struct delayed_work	mca_work;
    132	unsigned int		mca_flags;
    133	int			mca_users;
    134	refcount_t		mca_refcnt;
    135	unsigned long		mca_cstamp;
    136	unsigned long		mca_tstamp;
    137	struct rcu_head		rcu;
    138};
    139
    140/* Anycast stuff */
    141
    142struct ipv6_ac_socklist {
    143	struct in6_addr		acl_addr;
    144	int			acl_ifindex;
    145	struct ipv6_ac_socklist *acl_next;
    146};
    147
    148struct ifacaddr6 {
    149	struct in6_addr		aca_addr;
    150	struct fib6_info	*aca_rt;
    151	struct ifacaddr6	*aca_next;
    152	struct hlist_node	aca_addr_lst;
    153	int			aca_users;
    154	refcount_t		aca_refcnt;
    155	unsigned long		aca_cstamp;
    156	unsigned long		aca_tstamp;
    157	struct rcu_head		rcu;
    158};
    159
    160#define	IFA_HOST	IPV6_ADDR_LOOPBACK
    161#define	IFA_LINK	IPV6_ADDR_LINKLOCAL
    162#define	IFA_SITE	IPV6_ADDR_SITELOCAL
    163
    164struct ipv6_devstat {
    165	struct proc_dir_entry	*proc_dir_entry;
    166	DEFINE_SNMP_STAT(struct ipstats_mib, ipv6);
    167	DEFINE_SNMP_STAT_ATOMIC(struct icmpv6_mib_device, icmpv6dev);
    168	DEFINE_SNMP_STAT_ATOMIC(struct icmpv6msg_mib_device, icmpv6msgdev);
    169};
    170
    171struct inet6_dev {
    172	struct net_device	*dev;
    173	netdevice_tracker	dev_tracker;
    174
    175	struct list_head	addr_list;
    176
    177	struct ifmcaddr6	__rcu *mc_list;
    178	struct ifmcaddr6	__rcu *mc_tomb;
    179
    180	unsigned char		mc_qrv;		/* Query Robustness Variable */
    181	unsigned char		mc_gq_running;
    182	unsigned char		mc_ifc_count;
    183	unsigned char		mc_dad_count;
    184
    185	unsigned long		mc_v1_seen;	/* Max time we stay in MLDv1 mode */
    186	unsigned long		mc_qi;		/* Query Interval */
    187	unsigned long		mc_qri;		/* Query Response Interval */
    188	unsigned long		mc_maxdelay;
    189
    190	struct delayed_work	mc_gq_work;	/* general query work */
    191	struct delayed_work	mc_ifc_work;	/* interface change work */
    192	struct delayed_work	mc_dad_work;	/* dad complete mc work */
    193	struct delayed_work	mc_query_work;	/* mld query work */
    194	struct delayed_work	mc_report_work;	/* mld report work */
    195
    196	struct sk_buff_head	mc_query_queue;		/* mld query queue */
    197	struct sk_buff_head	mc_report_queue;	/* mld report queue */
    198
    199	spinlock_t		mc_query_lock;	/* mld query queue lock */
    200	spinlock_t		mc_report_lock;	/* mld query report lock */
    201	struct mutex		mc_lock;	/* mld global lock */
    202
    203	struct ifacaddr6	*ac_list;
    204	rwlock_t		lock;
    205	refcount_t		refcnt;
    206	__u32			if_flags;
    207	int			dead;
    208
    209	u32			desync_factor;
    210	struct list_head	tempaddr_list;
    211
    212	struct in6_addr		token;
    213
    214	struct neigh_parms	*nd_parms;
    215	struct ipv6_devconf	cnf;
    216	struct ipv6_devstat	stats;
    217
    218	struct timer_list	rs_timer;
    219	__s32			rs_interval;	/* in jiffies */
    220	__u8			rs_probes;
    221
    222	unsigned long		tstamp; /* ipv6InterfaceTable update timestamp */
    223	struct rcu_head		rcu;
    224
    225	unsigned int		ra_mtu;
    226};
    227
    228static inline void ipv6_eth_mc_map(const struct in6_addr *addr, char *buf)
    229{
    230	/*
    231	 *	+-------+-------+-------+-------+-------+-------+
    232	 *      |   33  |   33  | DST13 | DST14 | DST15 | DST16 |
    233	 *      +-------+-------+-------+-------+-------+-------+
    234	 */
    235
    236	buf[0]= 0x33;
    237	buf[1]= 0x33;
    238
    239	memcpy(buf + 2, &addr->s6_addr32[3], sizeof(__u32));
    240}
    241
    242static inline void ipv6_arcnet_mc_map(const struct in6_addr *addr, char *buf)
    243{
    244	buf[0] = 0x00;
    245}
    246
    247static inline void ipv6_ib_mc_map(const struct in6_addr *addr,
    248				  const unsigned char *broadcast, char *buf)
    249{
    250	unsigned char scope = broadcast[5] & 0xF;
    251
    252	buf[0]  = 0;		/* Reserved */
    253	buf[1]  = 0xff;		/* Multicast QPN */
    254	buf[2]  = 0xff;
    255	buf[3]  = 0xff;
    256	buf[4]  = 0xff;
    257	buf[5]  = 0x10 | scope;	/* scope from broadcast address */
    258	buf[6]  = 0x60;		/* IPv6 signature */
    259	buf[7]  = 0x1b;
    260	buf[8]  = broadcast[8];	/* P_Key */
    261	buf[9]  = broadcast[9];
    262	memcpy(buf + 10, addr->s6_addr + 6, 10);
    263}
    264
    265static inline int ipv6_ipgre_mc_map(const struct in6_addr *addr,
    266				    const unsigned char *broadcast, char *buf)
    267{
    268	if ((broadcast[0] | broadcast[1] | broadcast[2] | broadcast[3]) != 0) {
    269		memcpy(buf, broadcast, 4);
    270	} else {
    271		/* v4mapped? */
    272		if ((addr->s6_addr32[0] | addr->s6_addr32[1] |
    273		     (addr->s6_addr32[2] ^ htonl(0x0000ffff))) != 0)
    274			return -EINVAL;
    275		memcpy(buf, &addr->s6_addr32[3], 4);
    276	}
    277	return 0;
    278}
    279
    280#endif