Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / net / route.h @ 13

History | View | Annotate | Download (17.1 KB)

1 13 up20180614
/*        $NetBSD: route.h,v 1.96 2015/09/02 11:35:11 ozaki-r Exp $        */
2
3
/*
4
 * Copyright (c) 1980, 1986, 1993
5
 *        The Regents of the University of California.  All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. Neither the name of the University nor the names of its contributors
16
 *    may be used to endorse or promote products derived from this software
17
 *    without specific prior written permission.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
 * SUCH DAMAGE.
30
 *
31
 *        @(#)route.h        8.5 (Berkeley) 2/8/95
32
 */
33
34
#ifndef _NET_ROUTE_H_
35
#define _NET_ROUTE_H_
36
37
#include <sys/queue.h>
38
#include <sys/socket.h>
39
#include <sys/types.h>
40
#include <net/if.h>
41
42
#if !(defined(_KERNEL) || defined(_STANDALONE))
43
#include <stdbool.h>
44
#endif
45
46
/*
47
 * Kernel resident routing tables.
48
 *
49
 * The routing tables are initialized when interface addresses
50
 * are set by making entries for all directly connected interfaces.
51
 */
52
53
/*
54
 * A route consists of a destination address and a reference
55
 * to a routing entry.  These are often held by protocols
56
 * in their control blocks, e.g. inpcb.
57
 */
58
struct route {
59
        struct        rtentry                *_ro_rt;
60
        struct        sockaddr        *ro_sa;
61
        LIST_ENTRY(route)        ro_rtcache_next;
62
        bool                        ro_invalid;
63
};
64
65
/*
66
 * These numbers are used by reliable protocols for determining
67
 * retransmission behavior and are included in the routing structure.
68
 */
69
struct rt_metrics {
70
        uint64_t rmx_locks;        /* Kernel must leave these values alone */
71
        uint64_t rmx_mtu;        /* MTU for this path */
72
        uint64_t rmx_hopcount;        /* max hops expected */
73
        uint64_t rmx_recvpipe;        /* inbound delay-bandwidth product */
74
        uint64_t rmx_sendpipe;        /* outbound delay-bandwidth product */
75
        uint64_t rmx_ssthresh;        /* outbound gateway buffer limit */
76
        uint64_t rmx_rtt;        /* estimated round trip time */
77
        uint64_t rmx_rttvar;        /* estimated rtt variance */
78
        time_t        rmx_expire;        /* lifetime for route, e.g. redirect */
79
        time_t        rmx_pksent;        /* packets sent using this route */
80
};
81
82
/*
83
 * rmx_rtt and rmx_rttvar are stored as microseconds;
84
 * RTTTOPRHZ(rtt) converts to a value suitable for use
85
 * by a protocol slowtimo counter.
86
 */
87
#define        RTM_RTTUNIT        1000000        /* units for rtt, rttvar, as units per sec */
88
#define        RTTTOPRHZ(r)        ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
89
90
/*
91
 * We distinguish between routes to hosts and routes to networks,
92
 * preferring the former if available.  For each route we infer
93
 * the interface to use from the gateway address supplied when
94
 * the route was entered.  Routes that forward packets through
95
 * gateways are marked so that the output routines know to address the
96
 * gateway rather than the ultimate destination.
97
 */
98
#ifndef RNF_NORMAL
99
#include <net/radix.h>
100
#endif
101
struct rtentry {
102
        struct        radix_node rt_nodes[2];        /* tree glue, and other values */
103
#define        rt_mask(r)        ((const struct sockaddr *)((r)->rt_nodes->rn_mask))
104
        struct        sockaddr *rt_gateway;        /* value */
105
        int        rt_flags;                /* up/down?, host/net */
106
        int        rt_refcnt;                /* # held references */
107
        uint64_t rt_use;                        /* raw # packets forwarded */
108
        struct        ifnet *rt_ifp;                /* the answer: interface to use */
109
        struct        ifaddr *rt_ifa;                /* the answer: interface to use */
110
        uint32_t rt_ifa_seqno;
111
        void *        rt_llinfo;                /* pointer to link level info cache */
112
        struct        rt_metrics rt_rmx;        /* metrics used by rx'ing protocols */
113
        struct        rtentry *rt_gwroute;        /* implied entry for gatewayed routes */
114
        LIST_HEAD(, rttimer) rt_timer;  /* queue of timeouts for misc funcs */
115
        struct        rtentry *rt_parent;        /* parent of cloned route */
116
        struct        sockaddr *_rt_key;
117
        struct        sockaddr *rt_tag;        /* route tagging info */
118
};
119
120
static inline const struct sockaddr *
121
rt_getkey(const struct rtentry *rt)
122
{
123
        return rt->_rt_key;
124
}
125
126
/*
127
 * Following structure necessary for 4.3 compatibility;
128
 * We should eventually move it to a compat file.
129
 */
130
struct ortentry {
131
        uint32_t rt_hash;                /* to speed lookups */
132
        struct        sockaddr rt_dst;        /* key */
133
        struct        sockaddr rt_gateway;        /* value */
134
        int16_t        rt_flags;                /* up/down?, host/net */
135
        int16_t        rt_refcnt;                /* # held references */
136
        uint32_t rt_use;                /* raw # packets forwarded */
137
        struct        ifnet *rt_ifp;                /* the answer: interface to use */
138
};
139
140
#define        RTF_UP                0x1                /* route usable */
141
#define        RTF_GATEWAY        0x2                /* destination is a gateway */
142
#define        RTF_HOST        0x4                /* host entry (net otherwise) */
143
#define        RTF_REJECT        0x8                /* host or net unreachable */
144
#define        RTF_DYNAMIC        0x10                /* created dynamically (by redirect) */
145
#define        RTF_MODIFIED        0x20                /* modified dynamically (by redirect) */
146
#define RTF_DONE        0x40                /* message confirmed */
147
#define RTF_MASK        0x80                /* subnet mask present */
148
#define RTF_CLONING        0x100                /* generate new routes on use */
149
#define RTF_XRESOLVE        0x200                /* external daemon resolves name */
150
#define RTF_LLINFO        0x400                /* generated by ARP or NDP */
151
#define RTF_LLDATA        0x400                /* used by apps to add/del L2 entries */
152
#define RTF_STATIC        0x800                /* manually added */
153
#define RTF_BLACKHOLE        0x1000                /* just discard pkts (during updates) */
154
#define RTF_CLONED        0x2000                /* this is a cloned route */
155
#define RTF_PROTO2        0x4000                /* protocol specific routing flag */
156
#define RTF_PROTO1        0x8000                /* protocol specific routing flag */
157
#define RTF_SRC                0x10000                /* route has fixed source address */
158
#define RTF_ANNOUNCE        0x20000                /* announce new ARP or NDP entry */
159
#define RTF_LOCAL        0x40000                /* route represents a local address */
160
#define RTF_BROADCAST        0x80000                /* route represents a bcast address */
161
162
/*
163
 * Routing statistics.
164
 */
165
struct        rtstat {
166
        uint64_t rts_badredirect;        /* bogus redirect calls */
167
        uint64_t rts_dynamic;                /* routes created by redirects */
168
        uint64_t rts_newgateway;        /* routes modified by redirects */
169
        uint64_t rts_unreach;                /* lookups which failed */
170
        uint64_t rts_wildcard;                /* lookups satisfied by a wildcard */
171
};
172
173
/*
174
 * Structures for routing messages.  By forcing the first member to be aligned
175
 * at a 64-bit boundary, we also force the size to be a multiple of 64-bits.
176
 */
177
178
#if !defined(_KERNEL) || !defined(COMPAT_RTSOCK)
179
/*
180
 * If we aren't being compiled for backwards compatiblity, enforce 64-bit
181
 * alignment so any routing message is the same regardless if the kernel
182
 * is an ILP32 or LP64 kernel.
183
 */
184
#define        __align64        __aligned(sizeof(uint64_t))
185
#else
186
#define        __align64
187
#endif
188
189
struct rt_msghdr {
190
        u_short        rtm_msglen __align64;
191
                                /* to skip over non-understood messages */
192
        u_char        rtm_version;        /* future binary compatibility */
193
        u_char        rtm_type;        /* message type */
194
        u_short        rtm_index;        /* index for associated ifp */
195
        int        rtm_flags;        /* flags, incl. kern & message, e.g. DONE */
196
        int        rtm_addrs;        /* bitmask identifying sockaddrs in msg */
197
        pid_t        rtm_pid;        /* identify sender */
198
        int        rtm_seq;        /* for sender to identify action */
199
        int        rtm_errno;        /* why failed */
200
        int        rtm_use;        /* from rtentry */
201
        int        rtm_inits;        /* which metrics we are initializing */
202
        struct        rt_metrics rtm_rmx __align64;
203
                                /* metrics themselves */
204
};
205
206
#undef __align64
207
208
#define RTM_VERSION        4        /* Up the ante and ignore older versions */
209
210
#define RTM_ADD                0x1        /* Add Route */
211
#define RTM_DELETE        0x2        /* Delete Route */
212
#define RTM_CHANGE        0x3        /* Change Metrics or flags */
213
#define RTM_GET                0x4        /* Report Metrics */
214
#define RTM_LOSING        0x5        /* Kernel Suspects Partitioning */
215
#define RTM_REDIRECT        0x6        /* Told to use different route */
216
#define RTM_MISS        0x7        /* Lookup failed on this address */
217
#define RTM_LOCK        0x8        /* fix specified metrics */
218
#define RTM_OLDADD        0x9        /* caused by SIOCADDRT */
219
#define RTM_OLDDEL        0xa        /* caused by SIOCDELRT */
220
#define RTM_RESOLVE        0xb        /* req to resolve dst to LL addr */
221
#define RTM_NEWADDR        0xc        /* address being added to iface */
222
#define RTM_DELADDR        0xd        /* address being removed from iface */
223
#define RTM_OOIFINFO        0xe        /* Old (pre-1.5) RTM_IFINFO message */
224
#define RTM_OIFINFO        0xf        /* Old (pre-64bit time) RTM_IFINFO message */
225
#define        RTM_IFANNOUNCE        0x10        /* iface arrival/departure */
226
#define        RTM_IEEE80211        0x11        /* IEEE80211 wireless event */
227
#define        RTM_SETGATE        0x12        /* set prototype gateway for clones
228
                                 * (see example in arp_rtrequest).
229
                                 */
230
#define        RTM_LLINFO_UPD        0x13        /* indication to ARP/NDP/etc. that link-layer
231
                                 * address has changed
232
                                 */
233
#define RTM_IFINFO        0x14        /* iface/link going up/down etc. */
234
#define RTM_CHGADDR        0x15        /* address properties changed */
235
236
#define RTV_MTU                0x1        /* init or lock _mtu */
237
#define RTV_HOPCOUNT        0x2        /* init or lock _hopcount */
238
#define RTV_EXPIRE        0x4        /* init or lock _expire */
239
#define RTV_RPIPE        0x8        /* init or lock _recvpipe */
240
#define RTV_SPIPE        0x10        /* init or lock _sendpipe */
241
#define RTV_SSTHRESH        0x20        /* init or lock _ssthresh */
242
#define RTV_RTT                0x40        /* init or lock _rtt */
243
#define RTV_RTTVAR        0x80        /* init or lock _rttvar */
244
245
/*
246
 * Bitmask values for rtm_addr.
247
 */
248
#define RTA_DST                0x1        /* destination sockaddr present */
249
#define RTA_GATEWAY        0x2        /* gateway sockaddr present */
250
#define RTA_NETMASK        0x4        /* netmask sockaddr present */
251
#define RTA_GENMASK        0x8        /* cloning mask sockaddr present */
252
#define RTA_IFP                0x10        /* interface name sockaddr present */
253
#define RTA_IFA                0x20        /* interface addr sockaddr present */
254
#define RTA_AUTHOR        0x40        /* sockaddr for author of redirect */
255
#define RTA_BRD                0x80        /* for NEWADDR, broadcast or p-p dest addr */
256
#define RTA_TAG                0x100        /* route tag */
257
258
/*
259
 * Index offsets for sockaddr array for alternate internal encoding.
260
 */
261
#define RTAX_DST        0        /* destination sockaddr present */
262
#define RTAX_GATEWAY        1        /* gateway sockaddr present */
263
#define RTAX_NETMASK        2        /* netmask sockaddr present */
264
#define RTAX_GENMASK        3        /* cloning mask sockaddr present */
265
#define RTAX_IFP        4        /* interface name sockaddr present */
266
#define RTAX_IFA        5        /* interface addr sockaddr present */
267
#define RTAX_AUTHOR        6        /* sockaddr for author of redirect */
268
#define RTAX_BRD        7        /* for NEWADDR, broadcast or p-p dest addr */
269
#define RTAX_TAG        8        /* route tag */
270
#define RTAX_MAX        9        /* size of array to allocate */
271
272
#define RT_ROUNDUP2(a, n)        ((a) > 0 ? (1 + (((a) - 1) | ((n) - 1))) : (n))
273
#define RT_ROUNDUP(a)                RT_ROUNDUP2((a), sizeof(uint64_t))
274
#define RT_ADVANCE(x, n)        (x += RT_ROUNDUP((n)->sa_len))
275
276
struct rt_addrinfo {
277
        int        rti_addrs;
278
        const struct        sockaddr *rti_info[RTAX_MAX];
279
        int        rti_flags;
280
        struct        ifaddr *rti_ifa;
281
        struct        ifnet *rti_ifp;
282
};
283
284
struct route_cb {
285
        int        ip_count;
286
        int        ip6_count;
287
        int        unused1;
288
        int        mpls_count;
289
        int        any_count;
290
};
291
292
/*
293
 * This structure, and the prototypes for the rt_timer_{init,remove_all,
294
 * add,timer} functions all used with the kind permission of BSDI.
295
 * These allow functions to be called for routes at specific times.
296
 */
297
298
struct rttimer {
299
        TAILQ_ENTRY(rttimer)        rtt_next;  /* entry on timer queue */
300
        LIST_ENTRY(rttimer)         rtt_link;  /* multiple timers per rtentry */
301
        struct rttimer_queue   *rtt_queue; /* back pointer to queue */
302
        struct rtentry         *rtt_rt;    /* Back pointer to the route */
303
        void                      (*rtt_func)(struct rtentry *, struct rttimer *);
304
        time_t                  rtt_time;  /* When this timer was registered */
305
};
306
307
struct rttimer_queue {
308
        long                                rtq_timeout;
309
        unsigned long                        rtq_count;
310
        TAILQ_HEAD(, rttimer)                rtq_head;
311
        LIST_ENTRY(rttimer_queue)        rtq_link;
312
};
313
314
315
struct rtbl;
316
typedef struct rtbl rtbl_t;
317
318
#ifdef _KERNEL
319
320
struct rtbl {
321
        struct radix_node_head t_rnh;
322
};
323
324
struct rt_walkarg {
325
        int        w_op;
326
        int        w_arg;
327
        int        w_given;
328
        int        w_needed;
329
        void *        w_where;
330
        int        w_tmemsize;
331
        int        w_tmemneeded;
332
        void *        w_tmem;
333
};
334
335
#if 0
336
#define        RT_DPRINTF(__fmt, ...)        do { } while (/*CONSTCOND*/0)
337
#else
338
#define        RT_DPRINTF(__fmt, ...)        /* do nothing */
339
#endif
340
341
struct rtwalk {
342
        int (*rw_f)(struct rtentry *, void *);
343
        void *rw_v;
344
};
345
346
/*
347
 * Global data specific to the routing socket.
348
 */
349
struct route_info {
350
        struct sockaddr ri_dst;
351
        struct sockaddr ri_src;
352
        struct route_cb ri_cb;
353
        int ri_maxqlen;
354
        struct ifqueue ri_intrq;
355
        void *ri_sih;
356
};
357
358
extern        struct        route_info route_info;
359
extern        struct        rtstat        rtstat;
360
361
struct socket;
362
363
void        rt_init(void);
364
365
int        rt_timer_add(struct rtentry *,
366
            void(*)(struct rtentry *, struct rttimer *),
367
            struct rttimer_queue *);
368
unsigned long
369
        rt_timer_count(struct rttimer_queue *);
370
void        rt_timer_init(void);
371
void        rt_timer_queue_change(struct rttimer_queue *, long);
372
struct rttimer_queue *
373
        rt_timer_queue_create(u_int);
374
void        rt_timer_queue_destroy(struct rttimer_queue *, int);
375
void        rt_timer_queue_remove_all(struct rttimer_queue *, int);
376
void        rt_timer_remove_all(struct rtentry *, int);
377
void        rt_timer_timer(void *);
378
379
void        rt_newmsg(int, struct rtentry *);
380
struct rtentry *
381
        rtalloc1(const struct sockaddr *, int);
382
void        rtfree(struct rtentry *);
383
int        rtinit(struct ifaddr *, int, int);
384
void        rtredirect(const struct sockaddr *, const struct sockaddr *,
385
            const struct sockaddr *, int, const struct sockaddr *,
386
            struct rtentry **);
387
int        rtrequest(int, const struct sockaddr *,
388
            const struct sockaddr *, const struct sockaddr *, int,
389
            struct rtentry **);
390
int        rtrequest1(int, struct rt_addrinfo *, struct rtentry **);
391
int        rtrequest_newmsg(const int, const struct sockaddr *,
392
            const struct sockaddr *, const struct sockaddr *, const int);
393
394
int        rt_ifa_addlocal(struct ifaddr *);
395
int        rt_ifa_remlocal(struct ifaddr *, struct ifaddr *);
396
struct ifaddr *
397
        rt_get_ifa(struct rtentry *);
398
int        rt_getifa(struct rt_addrinfo *);
399
void        rt_replace_ifa(struct rtentry *, struct ifaddr *);
400
int        rt_setgate(struct rtentry *, const struct sockaddr *);
401
402
const struct sockaddr *
403
        rt_settag(struct rtentry *, const struct sockaddr *);
404
struct sockaddr *
405
        rt_gettag(struct rtentry *);
406
407
static inline struct rtentry *
408
rt_get_gwroute(struct rtentry *rt)
409
{
410
        if (rt->rt_gwroute == NULL)
411
                return NULL;
412
        rt->rt_gwroute->rt_refcnt++;
413
        return rt->rt_gwroute;
414
}
415
416
static inline void
417
rt_set_gwroute(struct rtentry *rt, struct rtentry *gwrt)
418
{
419
420
        rt->rt_gwroute = gwrt;
421
        if (rt->rt_gwroute != NULL)
422
                rt->rt_gwroute->rt_refcnt++;
423
}
424
425
static inline void
426
rt_assert_referenced(const struct rtentry *rt)
427
{
428
429
        KASSERT(rt->rt_refcnt > 0);
430
}
431
432
void        rtcache_copy(struct route *, const struct route *);
433
void        rtcache_free(struct route *);
434
struct rtentry *
435
        rtcache_init(struct route *);
436
struct rtentry *
437
        rtcache_init_noclone(struct route *);
438
struct rtentry *
439
        rtcache_lookup2(struct route *, const struct sockaddr *, int,
440
            int *);
441
int        rtcache_setdst(struct route *, const struct sockaddr *);
442
struct rtentry *
443
        rtcache_update(struct route *, int);
444
445
static inline void
446
rtcache_invariants(const struct route *ro)
447
{
448
        KASSERT(ro->ro_sa != NULL || ro->_ro_rt == NULL);
449
        KASSERT(!ro->ro_invalid || ro->_ro_rt != NULL);
450
        KASSERT(ro->_ro_rt == NULL || ro->_ro_rt->rt_refcnt > 0);
451
}
452
453
static inline struct rtentry *
454
rtcache_lookup1(struct route *ro, const struct sockaddr *dst, int clone)
455
{
456
        int hit;
457
458
        return rtcache_lookup2(ro, dst, clone, &hit);
459
}
460
461
static inline struct rtentry *
462
rtcache_lookup_noclone(struct route *ro, const struct sockaddr *dst)
463
{
464
        return rtcache_lookup1(ro, dst, 0);
465
}
466
467
static inline struct rtentry *
468
rtcache_lookup(struct route *ro, const struct sockaddr *dst)
469
{
470
        return rtcache_lookup1(ro, dst, 1);
471
}
472
473
static inline const struct sockaddr *
474
rtcache_getdst(const struct route *ro)
475
{
476
        rtcache_invariants(ro);
477
        return ro->ro_sa;
478
}
479
480
/* If the cache is not empty, and the cached route is still present
481
 * in the routing table, return the cached route.  Otherwise, return
482
 * NULL.
483
 */
484
static inline struct rtentry *
485
rtcache_validate(const struct route *ro)
486
{
487
        struct rtentry *rt = ro->_ro_rt;
488
489
        rtcache_invariants(ro);
490
491
        if (ro->ro_invalid)
492
                return NULL;
493
494
        if (rt != NULL && (rt->rt_flags & RTF_UP) != 0 && rt->rt_ifp != NULL)
495
                return rt;
496
        return NULL;
497
498
}
499
500
/* rtsock */
501
void        rt_ieee80211msg(struct ifnet *, int, void *, size_t);
502
void        rt_ifannouncemsg(struct ifnet *, int);
503
void        rt_ifmsg(struct ifnet *);
504
void        rt_missmsg(int, const struct rt_addrinfo *, int, int);
505
struct mbuf *
506
        rt_msg1(int, struct rt_addrinfo *, void *, int);
507
void        rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
508
void        route_enqueue(struct mbuf *, int);
509
510
/* rtbl */
511
int        rt_addaddr(rtbl_t *, struct rtentry *, const struct sockaddr *);
512
void        rt_assert_inactive(const struct rtentry *);
513
struct rtentry *
514
        rt_deladdr(rtbl_t *, const struct sockaddr *,
515
            const struct sockaddr *);
516
rtbl_t *rt_gettable(sa_family_t);
517
int        rt_inithead(rtbl_t **, int);
518
struct rtentry *
519
        rt_lookup(rtbl_t *, const struct sockaddr *,
520
            const struct sockaddr *);
521
struct rtentry *
522
        rt_matchaddr(rtbl_t *, const struct sockaddr *);
523
int        rt_walktree(sa_family_t, int (*)(struct rtentry *, void *), void *);
524
void        rtbl_init(void);
525
526
#endif /* _KERNEL */
527
528
#endif /* !_NET_ROUTE_H_ */