Subversion Repositories shark

Rev

Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
422 giacomo 1
#ifndef _IPV6_H
2
#define _IPV6_H
3
 
4
#include <linux/config.h>
5
#include <linux/in6.h>
6
#include <asm/byteorder.h>
7
 
8
/* The latest drafts declared increase in minimal mtu up to 1280. */
9
 
10
#define IPV6_MIN_MTU    1280
11
 
12
/*
13
 *      Advanced API
14
 *      source interface/address selection, source routing, etc...
15
 *      *under construction*
16
 */
17
 
18
 
19
struct in6_pktinfo {
20
        struct in6_addr ipi6_addr;
21
        int             ipi6_ifindex;
22
};
23
 
24
 
25
struct in6_ifreq {
26
        struct in6_addr ifr6_addr;
27
        __u32           ifr6_prefixlen;
28
        int             ifr6_ifindex;
29
};
30
 
31
#define IPV6_SRCRT_STRICT       0x01    /* this hop must be a neighbor  */
32
#define IPV6_SRCRT_TYPE_0       0       /* IPv6 type 0 Routing Header   */
33
 
34
/*
35
 *      routing header
36
 */
37
struct ipv6_rt_hdr {
38
        __u8            nexthdr;
39
        __u8            hdrlen;
40
        __u8            type;
41
        __u8            segments_left;
42
 
43
        /*
44
         *      type specific data
45
         *      variable length field
46
         */
47
};
48
 
49
 
50
struct ipv6_opt_hdr {
51
        __u8            nexthdr;
52
        __u8            hdrlen;
53
        /*
54
         * TLV encoded option data follows.
55
         */
56
};
57
 
58
#define ipv6_destopt_hdr ipv6_opt_hdr
59
#define ipv6_hopopt_hdr  ipv6_opt_hdr
60
 
61
#ifdef __KERNEL__
62
#define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
63
#endif
64
 
65
/*
66
 *      routing header type 0 (used in cmsghdr struct)
67
 */
68
 
69
struct rt0_hdr {
70
        struct ipv6_rt_hdr      rt_hdr;
71
        __u32                   bitmap;         /* strict/loose bit map */
72
        struct in6_addr         addr[0];
73
 
74
#define rt0_type                rt_hdr.type
75
};
76
 
77
struct ipv6_auth_hdr {
78
        __u8  nexthdr;
79
        __u8  hdrlen;           /* This one is measured in 32 bit units! */
80
        __u16 reserved;
81
        __u32 spi;
82
        __u32 seq_no;           /* Sequence number */
83
        __u8  auth_data[0];     /* Length variable but >=4. Mind the 64 bit alignment! */
84
};
85
 
86
struct ipv6_esp_hdr {
87
        __u32 spi;
88
        __u32 seq_no;           /* Sequence number */
89
        __u8  enc_data[0];      /* Length variable but >=8. Mind the 64 bit alignment! */
90
};
91
 
92
struct ipv6_comp_hdr {
93
        __u8 nexthdr;
94
        __u8 flags;
95
        __u16 cpi;
96
};
97
 
98
/*
99
 *      IPv6 fixed header
100
 *
101
 *      BEWARE, it is incorrect. The first 4 bits of flow_lbl
102
 *      are glued to priority now, forming "class".
103
 */
104
 
105
struct ipv6hdr {
106
#if defined(__LITTLE_ENDIAN_BITFIELD)
107
        __u8                    priority:4,
108
                                version:4;
109
#elif defined(__BIG_ENDIAN_BITFIELD)
110
        __u8                    version:4,
111
                                priority:4;
112
#else
113
#error  "Please fix <asm/byteorder.h>"
114
#endif
115
        __u8                    flow_lbl[3];
116
 
117
        __u16                   payload_len;
118
        __u8                    nexthdr;
119
        __u8                    hop_limit;
120
 
121
        struct  in6_addr        saddr;
122
        struct  in6_addr        daddr;
123
};
124
 
125
/*
126
 * This structure contains configuration options per IPv6 link.
127
 */
128
struct ipv6_devconf {
129
        __s32           forwarding;
130
        __s32           hop_limit;
131
        __s32           mtu6;
132
        __s32           accept_ra;
133
        __s32           accept_redirects;
134
        __s32           autoconf;
135
        __s32           dad_transmits;
136
        __s32           rtr_solicits;
137
        __s32           rtr_solicit_interval;
138
        __s32           rtr_solicit_delay;
139
#ifdef CONFIG_IPV6_PRIVACY
140
        __s32           use_tempaddr;
141
        __s32           temp_valid_lft;
142
        __s32           temp_prefered_lft;
143
        __s32           regen_max_retry;
144
        __s32           max_desync_factor;
145
#endif
146
        void            *sysctl;
147
};
148
 
149
/* index values for the variables in ipv6_devconf */
150
enum {
151
        DEVCONF_FORWARDING = 0,
152
        DEVCONF_HOPLIMIT,
153
        DEVCONF_MTU6,
154
        DEVCONF_ACCEPT_RA,
155
        DEVCONF_ACCEPT_REDIRECTS,
156
        DEVCONF_AUTOCONF,
157
        DEVCONF_DAD_TRANSMITS,
158
        DEVCONF_RTR_SOLICITS,
159
        DEVCONF_RTR_SOLICIT_INTERVAL,
160
        DEVCONF_RTR_SOLICIT_DELAY,
161
#ifdef CONFIG_IPV6_PRIVACY
162
        DEVCONF_USE_TEMPADDR,
163
        DEVCONF_TEMP_VALID_LFT,
164
        DEVCONF_TEMP_PREFERED_LFT,
165
        DEVCONF_REGEN_MAX_RETRY,
166
        DEVCONF_MAX_DESYNC_FACTOR,
167
#endif
168
        DEVCONF_MAX
169
};
170
 
171
#ifdef __KERNEL__
172
#include <linux/in6.h>          /* struct sockaddr_in6 */
173
#include <linux/icmpv6.h>
174
#include <net/if_inet6.h>       /* struct ipv6_mc_socklist */
175
#include <linux/tcp.h>
176
#include <linux/udp.h>
177
 
178
/*
179
   This structure contains results of exthdrs parsing
180
   as offsets from skb->nh.
181
 */
182
 
183
struct inet6_skb_parm
184
{
185
        int                     iif;
186
        __u16                   ra;
187
        __u16                   hop;
188
        __u16                   auth;
189
        __u16                   dst0;
190
        __u16                   srcrt;
191
        __u16                   dst1;
192
};
193
 
194
struct ipv6_pinfo {
195
        struct in6_addr         saddr;
196
        struct in6_addr         rcv_saddr;
197
        struct in6_addr         daddr;
198
        struct in6_addr         *daddr_cache;
199
 
200
        __u32                   flow_label;
201
        __u32                   frag_size;
202
        int                     hop_limit;
203
        int                     mcast_hops;
204
        int                     mcast_oif;
205
 
206
        /* pktoption flags */
207
        union {
208
                struct {
209
                        __u8    srcrt:2,
210
                                rxinfo:1,
211
                                rxhlim:1,
212
                                hopopts:1,
213
                                dstopts:1,
214
                                authhdr:1,
215
                                rxflow:1;
216
                } bits;
217
                __u8            all;
218
        } rxopt;
219
 
220
        /* sockopt flags */
221
        __u8                    mc_loop:1,
222
                                recverr:1,
223
                                sndflow:1,
224
                                pmtudisc:2,
225
                                ipv6only:1;
226
 
227
        struct ipv6_mc_socklist *ipv6_mc_list;
228
        struct ipv6_ac_socklist *ipv6_ac_list;
229
        struct ipv6_fl_socklist *ipv6_fl_list;
230
        __u32                   dst_cookie;
231
 
232
        struct ipv6_txoptions   *opt;
233
        struct sk_buff          *pktoptions;
234
        struct {
235
                struct ipv6_txoptions *opt;
236
                struct rt6_info *rt;
237
                int hop_limit;
238
        } cork;
239
};
240
 
241
struct raw6_opt {
242
        __u32                   checksum;       /* perform checksum */
243
        __u32                   offset;         /* checksum offset  */
244
 
245
        struct icmp6_filter     filter;
246
};
247
 
248
/* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
249
struct raw6_sock {
250
        struct sock       sk;
251
        struct ipv6_pinfo *pinet6;
252
        struct inet_opt   inet;
253
        struct raw6_opt   raw6;
254
        struct ipv6_pinfo inet6;
255
};
256
 
257
struct udp6_sock {
258
        struct sock       sk;
259
        struct ipv6_pinfo *pinet6;
260
        struct inet_opt   inet;
261
        struct udp_opt    udp;
262
        struct ipv6_pinfo inet6;
263
};
264
 
265
struct tcp6_sock {
266
        struct sock       sk;
267
        struct ipv6_pinfo *pinet6;
268
        struct inet_opt   inet;
269
        struct tcp_opt    tcp;
270
        struct ipv6_pinfo inet6;
271
};
272
 
273
#define inet6_sk(__sk) ((struct raw6_sock *)__sk)->pinet6
274
#define raw6_sk(__sk) (&((struct raw6_sock *)__sk)->raw6)
275
 
276
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
277
#define __ipv6_only_sock(sk)    (inet6_sk(sk)->ipv6only)
278
#define ipv6_only_sock(sk)      ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
279
#else
280
#define __ipv6_only_sock(sk)    0
281
#define ipv6_only_sock(sk)      0
282
#endif
283
 
284
#endif
285
 
286
#endif