Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
net
ip6_route.h
Go to the documentation of this file.
1
#ifndef _NET_IP6_ROUTE_H
2
#define _NET_IP6_ROUTE_H
3
4
#define IP6_RT_PRIO_USER 1024
5
#define IP6_RT_PRIO_ADDRCONF 256
6
7
struct
route_info
{
8
__u8
type
;
9
__u8
length
;
10
__u8
prefix_len
;
11
#if defined(__BIG_ENDIAN_BITFIELD)
12
__u8
reserved_h:3,
13
route_pref:2,
14
reserved_l:3;
15
#elif defined(__LITTLE_ENDIAN_BITFIELD)
16
__u8
reserved_l:3,
17
route_pref:2,
18
reserved_h:3;
19
#endif
20
__be32
lifetime
;
21
__u8
prefix
[0];
/* 0,8 or 16 */
22
};
23
24
#include <
net/flow.h
>
25
#include <
net/ip6_fib.h
>
26
#include <
net/sock.h
>
27
#include <linux/ip.h>
28
#include <linux/ipv6.h>
29
30
#define RT6_LOOKUP_F_IFACE 0x00000001
31
#define RT6_LOOKUP_F_REACHABLE 0x00000002
32
#define RT6_LOOKUP_F_HAS_SADDR 0x00000004
33
#define RT6_LOOKUP_F_SRCPREF_TMP 0x00000008
34
#define RT6_LOOKUP_F_SRCPREF_PUBLIC 0x00000010
35
#define RT6_LOOKUP_F_SRCPREF_COA 0x00000020
36
37
/*
38
* rt6_srcprefs2flags() and rt6_flags2srcprefs() translate
39
* between IPV6_ADDR_PREFERENCES socket option values
40
* IPV6_PREFER_SRC_TMP = 0x1
41
* IPV6_PREFER_SRC_PUBLIC = 0x2
42
* IPV6_PREFER_SRC_COA = 0x4
43
* and above RT6_LOOKUP_F_SRCPREF_xxx flags.
44
*/
45
static
inline
int
rt6_srcprefs2flags(
unsigned
int
srcprefs)
46
{
47
/* No need to bitmask because srcprefs have only 3 bits. */
48
return
srcprefs << 3;
49
}
50
51
static
inline
unsigned
int
rt6_flags2srcprefs(
int
flags
)
52
{
53
return
(flags >> 3) & 7;
54
}
55
56
extern
void
rt6_bind_peer
(
struct
rt6_info
*rt,
int
create
);
57
58
static
inline
struct
inet_peer
*__rt6_get_peer(
struct
rt6_info
*rt,
int
create
)
59
{
60
if
(rt6_has_peer(rt))
61
return
rt6_peer_ptr(rt);
62
63
rt6_bind_peer
(rt, create);
64
return
(rt6_has_peer(rt) ? rt6_peer_ptr(rt) :
NULL
);
65
}
66
67
static
inline
struct
inet_peer
*rt6_get_peer(
struct
rt6_info
*rt)
68
{
69
return
__rt6_get_peer(rt, 0);
70
}
71
72
static
inline
struct
inet_peer
*rt6_get_peer_create(
struct
rt6_info
*rt)
73
{
74
return
__rt6_get_peer(rt, 1);
75
}
76
77
extern
void
ip6_route_input
(
struct
sk_buff
*
skb
);
78
79
extern
struct
dst_entry
*
ip6_route_output
(
struct
net
*
net
,
80
const
struct
sock
*
sk
,
81
struct
flowi6
*fl6);
82
extern
struct
dst_entry
*
ip6_route_lookup
(
struct
net
*
net
,
83
struct
flowi6
*fl6,
int
flags);
84
85
extern
int
ip6_route_init
(
void
);
86
extern
void
ip6_route_cleanup
(
void
);
87
88
extern
int
ipv6_route_ioctl
(
struct
net
*
net
,
89
unsigned
int
cmd
,
90
void
__user *
arg
);
91
92
extern
int
ip6_route_add
(
struct
fib6_config
*
cfg
);
93
extern
int
ip6_ins_rt
(
struct
rt6_info
*);
94
extern
int
ip6_del_rt
(
struct
rt6_info
*);
95
96
extern
int
ip6_route_get_saddr
(
struct
net
*
net
,
97
struct
rt6_info
*rt,
98
const
struct
in6_addr
*
daddr
,
99
unsigned
int
prefs,
100
struct
in6_addr
*
saddr
);
101
102
extern
struct
rt6_info
*
rt6_lookup
(
struct
net
*
net
,
103
const
struct
in6_addr
*
daddr
,
104
const
struct
in6_addr
*
saddr
,
105
int
oif,
int
flags);
106
107
extern
struct
dst_entry
*
icmp6_dst_alloc
(
struct
net_device
*
dev
,
108
struct
neighbour
*neigh,
109
struct
flowi6
*fl6);
110
extern
int
icmp6_dst_gc
(
void
);
111
112
extern
void
fib6_force_start_gc
(
struct
net
*
net
);
113
114
extern
struct
rt6_info
*
addrconf_dst_alloc
(
struct
inet6_dev
*
idev
,
115
const
struct
in6_addr
*
addr
,
116
bool
anycast);
117
118
extern
int
ip6_dst_hoplimit
(
struct
dst_entry
*
dst
);
119
120
/*
121
* support functions for ND
122
*
123
*/
124
extern
struct
rt6_info
*
rt6_get_dflt_router
(
const
struct
in6_addr
*
addr
,
125
struct
net_device
*
dev
);
126
extern
struct
rt6_info
*
rt6_add_dflt_router
(
const
struct
in6_addr
*gwaddr,
127
struct
net_device
*
dev
,
128
unsigned
int
pref);
129
130
extern
void
rt6_purge_dflt_routers
(
struct
net
*
net
);
131
132
extern
int
rt6_route_rcv
(
struct
net_device
*
dev
,
133
u8
*
opt
,
int
len,
134
const
struct
in6_addr
*gwaddr);
135
136
extern
void
ip6_update_pmtu
(
struct
sk_buff
*
skb
,
struct
net
*
net
,
__be32
mtu,
137
int
oif,
u32
mark
);
138
extern
void
ip6_sk_update_pmtu
(
struct
sk_buff
*
skb
,
struct
sock
*
sk
,
139
__be32
mtu);
140
extern
void
ip6_redirect
(
struct
sk_buff
*
skb
,
struct
net
*
net
,
int
oif,
u32
mark
);
141
extern
void
ip6_sk_redirect
(
struct
sk_buff
*
skb
,
struct
sock
*
sk
);
142
143
struct
netlink_callback
;
144
145
struct
rt6_rtnl_dump_arg
{
146
struct
sk_buff
*
skb
;
147
struct
netlink_callback
*
cb
;
148
struct
net
*
net
;
149
};
150
151
extern
int
rt6_dump_route
(
struct
rt6_info
*rt,
void
*p_arg);
152
extern
void
rt6_ifdown
(
struct
net
*
net
,
struct
net_device
*
dev
);
153
extern
void
rt6_mtu_change
(
struct
net_device
*
dev
,
unsigned
int
mtu);
154
extern
void
rt6_remove_prefsrc
(
struct
inet6_ifaddr
*ifp);
155
156
157
/*
158
* Store a destination cache entry in a socket
159
*/
160
static
inline
void
__ip6_dst_store(
struct
sock
*
sk
,
struct
dst_entry
*
dst
,
161
const
struct
in6_addr
*
daddr
,
162
const
struct
in6_addr
*
saddr
)
163
{
164
struct
ipv6_pinfo
*np = inet6_sk(sk);
165
struct
rt6_info
*rt = (
struct
rt6_info
*) dst;
166
167
sk_setup_caps
(sk, dst);
168
np->
daddr_cache
=
daddr
;
169
#ifdef CONFIG_IPV6_SUBTREES
170
np->saddr_cache =
saddr
;
171
#endif
172
np->
dst_cookie
= rt->
rt6i_node
? rt->
rt6i_node
->fn_sernum : 0;
173
}
174
175
static
inline
void
ip6_dst_store(
struct
sock
*
sk
,
struct
dst_entry
*
dst
,
176
struct
in6_addr
*
daddr
,
struct
in6_addr
*
saddr
)
177
{
178
spin_lock(&sk->
sk_dst_lock
);
179
__ip6_dst_store(sk, dst, daddr, saddr);
180
spin_unlock(&sk->
sk_dst_lock
);
181
}
182
183
static
inline
bool
ipv6_unicast_destination(
const
struct
sk_buff
*
skb
)
184
{
185
struct
rt6_info
*rt = (
struct
rt6_info
*) skb_dst(skb);
186
187
return
rt->
rt6i_flags
&
RTF_LOCAL
;
188
}
189
190
int
ip6_fragment
(
struct
sk_buff
*skb,
int
(*output)(
struct
sk_buff
*));
191
192
static
inline
int
ip6_skb_dst_mtu(
struct
sk_buff
*skb)
193
{
194
struct
ipv6_pinfo
*np = skb->
sk
? inet6_sk(skb->
sk
) :
NULL
;
195
196
return
(np && np->
pmtudisc
==
IPV6_PMTUDISC_PROBE
) ?
197
skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));
198
}
199
200
#endif
Generated on Thu Jan 10 2013 14:53:06 for Linux Kernel by
1.8.2