1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #ifndef _NET_ROUTE_H_
36 #define _NET_ROUTE_H_
37
38 #include <sys/queue.h>
39
40
41
42
43
44
45
46
47
48
49
50
51
52 struct route {
53 struct rtentry *ro_rt;
54 struct sockaddr ro_dst;
55 };
56
57
58
59
60
61 struct rt_kmetrics {
62 u_long rmx_locks;
63 u_long rmx_mtu;
64 u_long rmx_expire;
65 u_long rmx_pksent;
66 };
67
68
69
70
71 struct rt_metrics {
72 u_long rmx_locks;
73 u_long rmx_mtu;
74 u_long rmx_hopcount;
75 u_long rmx_expire;
76 u_long rmx_recvpipe;
77 u_long rmx_sendpipe;
78 u_long rmx_ssthresh;
79 u_long rmx_rtt;
80 u_long rmx_rttvar;
81 u_long rmx_pksent;
82 };
83
84 #define rmx_refcnt rmx_rttvar
85 #define rmx_rt_tableid rmx_rtt
86
87
88
89
90
91
92 #define RTM_RTTUNIT 1000000
93 #define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
94
95
96
97
98
99
100
101
102
103 #ifndef RNF_NORMAL
104 #include <net/radix.h>
105 #include <net/radix_mpath.h>
106 #endif
107 struct rtentry {
108 struct radix_node rt_nodes[2];
109 #define rt_key(r) ((struct sockaddr *)((r)->rt_nodes->rn_key))
110 #define rt_mask(r) ((struct sockaddr *)((r)->rt_nodes->rn_mask))
111 struct sockaddr *rt_gateway;
112 u_int rt_flags;
113 int rt_refcnt;
114 struct ifnet *rt_ifp;
115 struct ifaddr *rt_ifa;
116 struct sockaddr *rt_genmask;
117 caddr_t rt_llinfo;
118 struct rt_kmetrics rt_rmx;
119 struct rtentry *rt_gwroute;
120 struct rtentry *rt_parent;
121 LIST_HEAD(, rttimer) rt_timer;
122 u_int16_t rt_labelid;
123 };
124 #define rt_use rt_rmx.rmx_pksent
125
126 #define RTF_UP 0x1
127 #define RTF_GATEWAY 0x2
128 #define RTF_HOST 0x4
129 #define RTF_REJECT 0x8
130 #define RTF_DYNAMIC 0x10
131 #define RTF_MODIFIED 0x20
132 #define RTF_DONE 0x40
133 #define RTF_MASK 0x80
134 #define RTF_CLONING 0x100
135 #define RTF_XRESOLVE 0x200
136 #define RTF_LLINFO 0x400
137 #define RTF_STATIC 0x800
138 #define RTF_BLACKHOLE 0x1000
139 #define RTF_PROTO3 0x2000
140 #define RTF_PROTO2 0x4000
141 #define RTF_PROTO1 0x8000
142 #define RTF_CLONED 0x10000
143 #define RTF_SOURCE 0x20000
144 #define RTF_MPATH 0x40000
145 #define RTF_JUMBO 0x80000
146
147
148 #define RTF_FMASK \
149 (RTF_JUMBO | RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
150 RTF_REJECT | RTF_STATIC)
151
152 #ifndef _KERNEL
153
154 #define RTF_TUNNEL 0x100000
155 #endif
156
157
158
159
160 struct rtstat {
161 u_int32_t rts_badredirect;
162 u_int32_t rts_dynamic;
163 u_int32_t rts_newgateway;
164 u_int32_t rts_unreach;
165 u_int32_t rts_wildcard;
166 };
167
168
169
170
171 struct rt_msghdr {
172 u_short rtm_msglen;
173 u_char rtm_version;
174 u_char rtm_type;
175 u_short rtm_index;
176 int rtm_flags;
177 int rtm_addrs;
178 pid_t rtm_pid;
179 int rtm_seq;
180 int rtm_errno;
181 int rtm_use;
182 #define rtm_fmask rtm_use
183 u_long rtm_inits;
184 struct rt_metrics rtm_rmx;
185 };
186
187 #define rtm_tableid rtm_rmx.rmx_rt_tableid
188
189 #define RTM_VERSION 3
190
191 #define RTM_ADD 0x1
192 #define RTM_DELETE 0x2
193 #define RTM_CHANGE 0x3
194 #define RTM_GET 0x4
195 #define RTM_LOSING 0x5
196 #define RTM_REDIRECT 0x6
197 #define RTM_MISS 0x7
198 #define RTM_LOCK 0x8
199 #define RTM_RESOLVE 0xb
200 #define RTM_NEWADDR 0xc
201 #define RTM_DELADDR 0xd
202 #define RTM_IFINFO 0xe
203 #define RTM_IFANNOUNCE 0xf
204
205 #define RTV_MTU 0x1
206 #define RTV_HOPCOUNT 0x2
207 #define RTV_EXPIRE 0x4
208 #define RTV_RPIPE 0x8
209 #define RTV_SPIPE 0x10
210 #define RTV_SSTHRESH 0x20
211 #define RTV_RTT 0x40
212 #define RTV_RTTVAR 0x80
213
214
215
216
217 #define RTA_DST 0x1
218 #define RTA_GATEWAY 0x2
219 #define RTA_NETMASK 0x4
220 #define RTA_GENMASK 0x8
221 #define RTA_IFP 0x10
222 #define RTA_IFA 0x20
223 #define RTA_AUTHOR 0x40
224 #define RTA_BRD 0x80
225 #define RTA_SRC 0x100
226 #define RTA_SRCMASK 0x200
227 #define RTA_LABEL 0x400
228
229
230
231
232 #define RTAX_DST 0
233 #define RTAX_GATEWAY 1
234 #define RTAX_NETMASK 2
235 #define RTAX_GENMASK 3
236 #define RTAX_IFP 4
237 #define RTAX_IFA 5
238 #define RTAX_AUTHOR 6
239 #define RTAX_BRD 7
240 #define RTAX_SRC 8
241 #define RTAX_SRCMASK 9
242 #define RTAX_LABEL 10
243 #define RTAX_MAX 11
244
245 struct rt_addrinfo {
246 int rti_addrs;
247 struct sockaddr *rti_info[RTAX_MAX];
248 int rti_flags;
249 struct ifaddr *rti_ifa;
250 struct ifnet *rti_ifp;
251 struct rt_msghdr *rti_rtm;
252 };
253
254 struct route_cb {
255 int ip_count;
256 int ip6_count;
257 int any_count;
258 };
259
260
261
262
263
264
265
266 struct rttimer {
267 TAILQ_ENTRY(rttimer) rtt_next;
268 LIST_ENTRY(rttimer) rtt_link;
269 struct rttimer_queue *rtt_queue;
270 struct rtentry *rtt_rt;
271 void (*rtt_func)(struct rtentry *,
272 struct rttimer *);
273 time_t rtt_time;
274 };
275
276 struct rttimer_queue {
277 long rtq_timeout;
278 unsigned long rtq_count;
279 TAILQ_HEAD(, rttimer) rtq_head;
280 LIST_ENTRY(rttimer_queue) rtq_link;
281 };
282
283 #define RTLABEL_LEN 32
284
285 struct sockaddr_rtlabel {
286 u_int8_t sr_len;
287 sa_family_t sr_family;
288 char sr_label[RTLABEL_LEN];
289 };
290
291 #define RT_TABLEID_MAX 255
292
293 #ifdef _KERNEL
294 const char *rtlabel_id2name(u_int16_t);
295 u_int16_t rtlabel_name2id(char *);
296 void rtlabel_unref(u_int16_t);
297
298 #define RTFREE(rt) do { \
299 if ((rt)->rt_refcnt <= 1) \
300 rtfree(rt); \
301 else \
302 (rt)->rt_refcnt--; \
303 } while (0)
304
305
306
307
308 #define ALL_CLONING 0
309 #define ONNET_CLONING 1
310 #define NO_CLONING 2
311
312 extern struct route_cb route_cb;
313 extern struct rtstat rtstat;
314 extern const struct sockaddr_rtin rt_defmask4;
315
316 struct socket;
317 void route_init(void);
318 int rtable_add(u_int);
319 int rtable_exists(u_int);
320 int route_output(struct mbuf *, ...);
321 int route_usrreq(struct socket *, int, struct mbuf *,
322 struct mbuf *, struct mbuf *);
323 void rt_ifmsg(struct ifnet *);
324 void rt_ifannouncemsg(struct ifnet *, int);
325 void rt_maskedcopy(struct sockaddr *,
326 struct sockaddr *, struct sockaddr *);
327 void rt_missmsg(int, struct rt_addrinfo *, int, struct ifnet *, int,
328 u_int);
329 void rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
330 int rt_setgate(struct rtentry *, struct sockaddr *,
331 struct sockaddr *, u_int);
332 void rt_setmetrics(u_long, struct rt_metrics *, struct rt_kmetrics *);
333 void rt_getmetrics(struct rt_kmetrics *, struct rt_metrics *);
334 int rt_timer_add(struct rtentry *,
335 void(*)(struct rtentry *, struct rttimer *),
336 struct rttimer_queue *);
337 void rt_timer_init(void);
338 struct rttimer_queue *
339 rt_timer_queue_create(u_int);
340 void rt_timer_queue_change(struct rttimer_queue *, long);
341 void rt_timer_queue_destroy(struct rttimer_queue *, int);
342 void rt_timer_remove_all(struct rtentry *);
343 unsigned long rt_timer_count(struct rttimer_queue *);
344 void rt_timer_timer(void *);
345 void rtalloc(struct route *);
346 #ifdef SMALL_KERNEL
347 #define rtalloc_mpath(r, s, t) rtalloc(r)
348 #endif
349 struct rtentry *
350 rtalloc1(struct sockaddr *, int, u_int);
351 void rtalloc_noclone(struct route *, int);
352 struct rtentry *
353 rtalloc2(struct sockaddr *, int, int);
354 void rtfree(struct rtentry *);
355 int rt_getifa(struct rt_addrinfo *);
356 int rtinit(struct ifaddr *, int, int);
357 int rtioctl(u_long, caddr_t, struct proc *);
358 void rtredirect(struct sockaddr *, struct sockaddr *,
359 struct sockaddr *, int, struct sockaddr *,
360 struct rtentry **);
361 int rtrequest(int, struct sockaddr *,
362 struct sockaddr *, struct sockaddr *, int,
363 struct rtentry **, u_int);
364 int rtrequest1(int, struct rt_addrinfo *, struct rtentry **, u_int);
365 void rt_if_remove(struct ifnet *);
366
367 struct radix_node_head *rt_gettable(sa_family_t, u_int);
368 struct radix_node *rt_lookup(struct sockaddr *, struct sockaddr *, int);
369 #endif
370 #endif