Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/net/if_inet6.h
10817 views
1
/*
2
* inet6 interface/address list definitions
3
* Linux INET6 implementation
4
*
5
* Authors:
6
* Pedro Roque <[email protected]>
7
*
8
*
9
* This program is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU General Public License
11
* as published by the Free Software Foundation; either version
12
* 2 of the License, or (at your option) any later version.
13
*/
14
15
#ifndef _NET_IF_INET6_H
16
#define _NET_IF_INET6_H
17
18
#include <net/snmp.h>
19
#include <linux/ipv6.h>
20
21
/* inet6_dev.if_flags */
22
23
#define IF_RA_OTHERCONF 0x80
24
#define IF_RA_MANAGED 0x40
25
#define IF_RA_RCVD 0x20
26
#define IF_RS_SENT 0x10
27
#define IF_READY 0x80000000
28
29
/* prefix flags */
30
#define IF_PREFIX_ONLINK 0x01
31
#define IF_PREFIX_AUTOCONF 0x02
32
33
enum {
34
INET6_IFADDR_STATE_DAD,
35
INET6_IFADDR_STATE_POSTDAD,
36
INET6_IFADDR_STATE_UP,
37
INET6_IFADDR_STATE_DEAD,
38
};
39
40
struct inet6_ifaddr {
41
struct in6_addr addr;
42
__u32 prefix_len;
43
44
__u32 valid_lft;
45
__u32 prefered_lft;
46
atomic_t refcnt;
47
spinlock_t lock;
48
spinlock_t state_lock;
49
50
int state;
51
52
__u8 probes;
53
__u8 flags;
54
55
__u16 scope;
56
57
unsigned long cstamp; /* created timestamp */
58
unsigned long tstamp; /* updated timestamp */
59
60
struct timer_list timer;
61
62
struct inet6_dev *idev;
63
struct rt6_info *rt;
64
65
struct hlist_node addr_lst;
66
struct list_head if_list;
67
68
#ifdef CONFIG_IPV6_PRIVACY
69
struct list_head tmp_list;
70
struct inet6_ifaddr *ifpub;
71
int regen_count;
72
#endif
73
struct rcu_head rcu;
74
};
75
76
struct ip6_sf_socklist {
77
unsigned int sl_max;
78
unsigned int sl_count;
79
struct in6_addr sl_addr[0];
80
};
81
82
#define IP6_SFLSIZE(count) (sizeof(struct ip6_sf_socklist) + \
83
(count) * sizeof(struct in6_addr))
84
85
#define IP6_SFBLOCK 10 /* allocate this many at once */
86
87
struct ipv6_mc_socklist {
88
struct in6_addr addr;
89
int ifindex;
90
struct ipv6_mc_socklist __rcu *next;
91
rwlock_t sflock;
92
unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */
93
struct ip6_sf_socklist *sflist;
94
struct rcu_head rcu;
95
};
96
97
struct ip6_sf_list {
98
struct ip6_sf_list *sf_next;
99
struct in6_addr sf_addr;
100
unsigned long sf_count[2]; /* include/exclude counts */
101
unsigned char sf_gsresp; /* include in g & s response? */
102
unsigned char sf_oldin; /* change state */
103
unsigned char sf_crcount; /* retrans. left to send */
104
};
105
106
#define MAF_TIMER_RUNNING 0x01
107
#define MAF_LAST_REPORTER 0x02
108
#define MAF_LOADED 0x04
109
#define MAF_NOREPORT 0x08
110
#define MAF_GSQUERY 0x10
111
112
struct ifmcaddr6 {
113
struct in6_addr mca_addr;
114
struct inet6_dev *idev;
115
struct ifmcaddr6 *next;
116
struct ip6_sf_list *mca_sources;
117
struct ip6_sf_list *mca_tomb;
118
unsigned int mca_sfmode;
119
unsigned char mca_crcount;
120
unsigned long mca_sfcount[2];
121
struct timer_list mca_timer;
122
unsigned mca_flags;
123
int mca_users;
124
atomic_t mca_refcnt;
125
spinlock_t mca_lock;
126
unsigned long mca_cstamp;
127
unsigned long mca_tstamp;
128
};
129
130
/* Anycast stuff */
131
132
struct ipv6_ac_socklist {
133
struct in6_addr acl_addr;
134
int acl_ifindex;
135
struct ipv6_ac_socklist *acl_next;
136
};
137
138
struct ifacaddr6 {
139
struct in6_addr aca_addr;
140
struct inet6_dev *aca_idev;
141
struct rt6_info *aca_rt;
142
struct ifacaddr6 *aca_next;
143
int aca_users;
144
atomic_t aca_refcnt;
145
spinlock_t aca_lock;
146
unsigned long aca_cstamp;
147
unsigned long aca_tstamp;
148
};
149
150
#define IFA_HOST IPV6_ADDR_LOOPBACK
151
#define IFA_LINK IPV6_ADDR_LINKLOCAL
152
#define IFA_SITE IPV6_ADDR_SITELOCAL
153
154
struct ipv6_devstat {
155
struct proc_dir_entry *proc_dir_entry;
156
DEFINE_SNMP_STAT(struct ipstats_mib, ipv6);
157
DEFINE_SNMP_STAT_ATOMIC(struct icmpv6_mib_device, icmpv6dev);
158
DEFINE_SNMP_STAT_ATOMIC(struct icmpv6msg_mib_device, icmpv6msgdev);
159
};
160
161
struct inet6_dev {
162
struct net_device *dev;
163
164
struct list_head addr_list;
165
166
struct ifmcaddr6 *mc_list;
167
struct ifmcaddr6 *mc_tomb;
168
spinlock_t mc_lock;
169
unsigned char mc_qrv;
170
unsigned char mc_gq_running;
171
unsigned char mc_ifc_count;
172
unsigned long mc_v1_seen;
173
unsigned long mc_maxdelay;
174
struct timer_list mc_gq_timer; /* general query timer */
175
struct timer_list mc_ifc_timer; /* interface change timer */
176
177
struct ifacaddr6 *ac_list;
178
rwlock_t lock;
179
atomic_t refcnt;
180
__u32 if_flags;
181
int dead;
182
183
#ifdef CONFIG_IPV6_PRIVACY
184
u8 rndid[8];
185
struct timer_list regen_timer;
186
struct list_head tempaddr_list;
187
#endif
188
189
struct neigh_parms *nd_parms;
190
struct inet6_dev *next;
191
struct ipv6_devconf cnf;
192
struct ipv6_devstat stats;
193
unsigned long tstamp; /* ipv6InterfaceTable update timestamp */
194
struct rcu_head rcu;
195
};
196
197
static inline void ipv6_eth_mc_map(const struct in6_addr *addr, char *buf)
198
{
199
/*
200
* +-------+-------+-------+-------+-------+-------+
201
* | 33 | 33 | DST13 | DST14 | DST15 | DST16 |
202
* +-------+-------+-------+-------+-------+-------+
203
*/
204
205
buf[0]= 0x33;
206
buf[1]= 0x33;
207
208
memcpy(buf + 2, &addr->s6_addr32[3], sizeof(__u32));
209
}
210
211
static inline void ipv6_tr_mc_map(const struct in6_addr *addr, char *buf)
212
{
213
/* All nodes FF01::1, FF02::1, FF02::1:FFxx:xxxx */
214
215
if (((addr->s6_addr[0] == 0xFF) &&
216
((addr->s6_addr[1] == 0x01) || (addr->s6_addr[1] == 0x02)) &&
217
(addr->s6_addr16[1] == 0) &&
218
(addr->s6_addr32[1] == 0) &&
219
(addr->s6_addr32[2] == 0) &&
220
(addr->s6_addr16[6] == 0) &&
221
(addr->s6_addr[15] == 1)) ||
222
((addr->s6_addr[0] == 0xFF) &&
223
(addr->s6_addr[1] == 0x02) &&
224
(addr->s6_addr16[1] == 0) &&
225
(addr->s6_addr32[1] == 0) &&
226
(addr->s6_addr16[4] == 0) &&
227
(addr->s6_addr[10] == 0) &&
228
(addr->s6_addr[11] == 1) &&
229
(addr->s6_addr[12] == 0xff)))
230
{
231
buf[0]=0xC0;
232
buf[1]=0x00;
233
buf[2]=0x01;
234
buf[3]=0x00;
235
buf[4]=0x00;
236
buf[5]=0x00;
237
/* All routers FF0x::2 */
238
} else if ((addr->s6_addr[0] ==0xff) &&
239
((addr->s6_addr[1] & 0xF0) == 0) &&
240
(addr->s6_addr16[1] == 0) &&
241
(addr->s6_addr32[1] == 0) &&
242
(addr->s6_addr32[2] == 0) &&
243
(addr->s6_addr16[6] == 0) &&
244
(addr->s6_addr[15] == 2))
245
{
246
buf[0]=0xC0;
247
buf[1]=0x00;
248
buf[2]=0x02;
249
buf[3]=0x00;
250
buf[4]=0x00;
251
buf[5]=0x00;
252
} else {
253
unsigned char i ;
254
255
i = addr->s6_addr[15] & 7 ;
256
buf[0]=0xC0;
257
buf[1]=0x00;
258
buf[2]=0x00;
259
buf[3]=0x01 << i ;
260
buf[4]=0x00;
261
buf[5]=0x00;
262
}
263
}
264
265
static inline void ipv6_arcnet_mc_map(const struct in6_addr *addr, char *buf)
266
{
267
buf[0] = 0x00;
268
}
269
270
static inline void ipv6_ib_mc_map(const struct in6_addr *addr,
271
const unsigned char *broadcast, char *buf)
272
{
273
unsigned char scope = broadcast[5] & 0xF;
274
275
buf[0] = 0; /* Reserved */
276
buf[1] = 0xff; /* Multicast QPN */
277
buf[2] = 0xff;
278
buf[3] = 0xff;
279
buf[4] = 0xff;
280
buf[5] = 0x10 | scope; /* scope from broadcast address */
281
buf[6] = 0x60; /* IPv6 signature */
282
buf[7] = 0x1b;
283
buf[8] = broadcast[8]; /* P_Key */
284
buf[9] = broadcast[9];
285
memcpy(buf + 10, addr->s6_addr + 6, 10);
286
}
287
288
static inline int ipv6_ipgre_mc_map(const struct in6_addr *addr,
289
const unsigned char *broadcast, char *buf)
290
{
291
if ((broadcast[0] | broadcast[1] | broadcast[2] | broadcast[3]) != 0) {
292
memcpy(buf, broadcast, 4);
293
} else {
294
/* v4mapped? */
295
if ((addr->s6_addr32[0] | addr->s6_addr32[1] |
296
(addr->s6_addr32[2] ^ htonl(0x0000ffff))) != 0)
297
return -EINVAL;
298
memcpy(buf, &addr->s6_addr32[3], 4);
299
}
300
return 0;
301
}
302
303
#endif
304
305