xref: /haiku/headers/posix/net/route.h (revision 52a380120846174213ccce9c4aab0dda17c72083)
1*52a38012Sejakowatz /* route.h */
2*52a38012Sejakowatz 
3*52a38012Sejakowatz #ifndef NET_ROUTE_H
4*52a38012Sejakowatz #define NET_ROUTE_H
5*52a38012Sejakowatz 
6*52a38012Sejakowatz #include "net/radix.h"
7*52a38012Sejakowatz #include "sys/socket.h" /* for AF_MAX */
8*52a38012Sejakowatz /*
9*52a38012Sejakowatz  * A route consists of a destination address and a reference
10*52a38012Sejakowatz  * to a routing entry.  These are often held by protocols
11*52a38012Sejakowatz  * in their control blocks, e.g. inpcb.
12*52a38012Sejakowatz  */
13*52a38012Sejakowatz struct route {
14*52a38012Sejakowatz         struct  rtentry *ro_rt;
15*52a38012Sejakowatz         struct  sockaddr ro_dst;
16*52a38012Sejakowatz };
17*52a38012Sejakowatz 
18*52a38012Sejakowatz /*
19*52a38012Sejakowatz  * These numbers are used by reliable protocols for determining
20*52a38012Sejakowatz  * retransmission behavior and are included in the routing structure.
21*52a38012Sejakowatz  */
22*52a38012Sejakowatz struct rt_metrics {
23*52a38012Sejakowatz         uint32  rmx_locks;      /* Kernel must leave these values alone */
24*52a38012Sejakowatz         uint32  rmx_mtu;        /* MTU for this path */
25*52a38012Sejakowatz         uint32  rmx_hopcount;   /* max hops expected */
26*52a38012Sejakowatz         uint32  rmx_expire;     /* lifetime for route, e.g. redirect */
27*52a38012Sejakowatz         u_long  rmx_recvpipe;   /* inbound delay-bandwith product */
28*52a38012Sejakowatz         u_long  rmx_sendpipe;   /* outbound delay-bandwith product */
29*52a38012Sejakowatz         u_long  rmx_ssthresh;   /* outbound gateway buffer limit */
30*52a38012Sejakowatz         u_long  rmx_rtt;        /* estimated round trip time */
31*52a38012Sejakowatz         u_long  rmx_rttvar;     /* estimated rtt variance */
32*52a38012Sejakowatz         u_long  rmx_pksent;     /* packets sent using this route */
33*52a38012Sejakowatz };
34*52a38012Sejakowatz 
35*52a38012Sejakowatz /*
36*52a38012Sejakowatz  * rmx_rtt and rmx_rttvar are stored as microseconds;
37*52a38012Sejakowatz  * RTTTOPRHZ(rtt) converts to a value suitable for use
38*52a38012Sejakowatz  * by a protocol slowtimo counter.
39*52a38012Sejakowatz  */
40*52a38012Sejakowatz #define	RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per sec */
41*52a38012Sejakowatz #define	RTTTOPRHZ(r)	((r) / (RTM_RTTUNIT / PR_SLOWHZ))
42*52a38012Sejakowatz 
43*52a38012Sejakowatz struct rtentry {
44*52a38012Sejakowatz         struct  radix_node rt_nodes[2]; /* tree glue, and other values */
45*52a38012Sejakowatz         struct  sockaddr *rt_gateway;   /* value */
46*52a38012Sejakowatz         uint	rt_flags;               /* up/down?, host/net */
47*52a38012Sejakowatz         int     rt_refcnt;              /* # held references */
48*52a38012Sejakowatz         uint32	rt_use;                 /* raw # packets forwarded */
49*52a38012Sejakowatz         struct  ifnet  *rt_ifp;         /* the answer: interface to use */
50*52a38012Sejakowatz         struct  ifaddr *rt_ifa;         /* the answer: interface to use */
51*52a38012Sejakowatz         struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
52*52a38012Sejakowatz         caddr_t rt_llinfo;              /* pointer to link level info cache */
53*52a38012Sejakowatz         struct  rt_metrics rt_rmx;      /* metrics used by rx'ing protocols */
54*52a38012Sejakowatz         struct  rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
55*52a38012Sejakowatz         struct  rtentry *rt_parent;     /* If cloned, parent of this route. */
56*52a38012Sejakowatz 	/* XXX - add this! */
57*52a38012Sejakowatz         // rt_timer;  * queue of timeouts for misc funcs *
58*52a38012Sejakowatz };
59*52a38012Sejakowatz #define rt_use          rt_rmx.rmx_pksent
60*52a38012Sejakowatz #define rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
61*52a38012Sejakowatz #define rt_mask(r)      ((struct sockaddr *)((r)->rt_nodes->rn_mask))
62*52a38012Sejakowatz 
63*52a38012Sejakowatz #define RTF_UP          0x1             /* route usable */
64*52a38012Sejakowatz #define RTF_GATEWAY     0x2             /* destination is a gateway */
65*52a38012Sejakowatz #define RTF_HOST        0x4             /* host entry (net otherwise) */
66*52a38012Sejakowatz #define RTF_REJECT      0x8             /* host or net unreachable */
67*52a38012Sejakowatz #define RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
68*52a38012Sejakowatz #define RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
69*52a38012Sejakowatz #define RTF_DONE        0x40            /* message confirmed */
70*52a38012Sejakowatz #define RTF_MASK        0x80            /* subnet mask present */
71*52a38012Sejakowatz #define RTF_CLONING     0x100           /* generate new routes on use */
72*52a38012Sejakowatz #define RTF_XRESOLVE    0x200           /* external daemon resolves name */
73*52a38012Sejakowatz #define RTF_LLINFO      0x400           /* generated by ARP or ESIS */
74*52a38012Sejakowatz #define RTF_STATIC      0x800           /* manually added */
75*52a38012Sejakowatz #define RTF_BLACKHOLE   0x1000          /* just discard pkts (during updates) */
76*52a38012Sejakowatz #define RTF_PROTO3      0x2000          /* protocol specific routing flag */
77*52a38012Sejakowatz #define RTF_PROTO2      0x4000          /* protocol specific routing flag */
78*52a38012Sejakowatz #define RTF_PROTO1      0x8000          /* protocol specific routing flag */
79*52a38012Sejakowatz 
80*52a38012Sejakowatz #define RTM_VERSION     3       /* Up the ante and ignore older versions */
81*52a38012Sejakowatz 
82*52a38012Sejakowatz #define RTM_ADD         0x1     /* Add Route */
83*52a38012Sejakowatz #define RTM_DELETE      0x2     /* Delete Route */
84*52a38012Sejakowatz #define RTM_CHANGE      0x3     /* Change Metrics or flags */
85*52a38012Sejakowatz #define RTM_GET         0x4     /* Report Metrics */
86*52a38012Sejakowatz #define RTM_LOSING      0x5     /* Kernel Suspects Partitioning */
87*52a38012Sejakowatz #define RTM_REDIRECT    0x6     /* Told to use different route */
88*52a38012Sejakowatz #define RTM_MISS        0x7     /* Lookup failed on this address */
89*52a38012Sejakowatz #define RTM_LOCK        0x8     /* fix specified metrics */
90*52a38012Sejakowatz #define RTM_OLDADD      0x9     /* caused by SIOCADDRT */
91*52a38012Sejakowatz #define RTM_OLDDEL      0xa     /* caused by SIOCDELRT */
92*52a38012Sejakowatz #define RTM_RESOLVE     0xb     /* req to resolve dst to LL addr */
93*52a38012Sejakowatz #define RTM_NEWADDR     0xc     /* address being added to iface */
94*52a38012Sejakowatz #define RTM_DELADDR     0xd     /* address being removed from iface */
95*52a38012Sejakowatz #define RTM_IFINFO      0xe     /* iface going up/down etc. */
96*52a38012Sejakowatz 
97*52a38012Sejakowatz #define RTV_MTU         0x1     /* init or lock _mtu */
98*52a38012Sejakowatz #define RTV_HOPCOUNT    0x2     /* init or lock _hopcount */
99*52a38012Sejakowatz #define RTV_EXPIRE      0x4     /* init or lock _hopcount */
100*52a38012Sejakowatz #define RTV_RPIPE       0x8     /* init or lock _recvpipe */
101*52a38012Sejakowatz #define RTV_SPIPE       0x10    /* init or lock _sendpipe */
102*52a38012Sejakowatz #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */
103*52a38012Sejakowatz #define RTV_RTT         0x40    /* init or lock _rtt */
104*52a38012Sejakowatz #define RTV_RTTVAR      0x80    /* init or lock _rttvar */
105*52a38012Sejakowatz 
106*52a38012Sejakowatz /*
107*52a38012Sejakowatz  * Bitmask values for rtm_addr.
108*52a38012Sejakowatz  */
109*52a38012Sejakowatz #define RTA_DST         0x1     /* destination sockaddr present */
110*52a38012Sejakowatz #define RTA_GATEWAY     0x2     /* gateway sockaddr present */
111*52a38012Sejakowatz #define RTA_NETMASK     0x4     /* netmask sockaddr present */
112*52a38012Sejakowatz #define RTA_GENMASK     0x8     /* cloning mask sockaddr present */
113*52a38012Sejakowatz #define RTA_IFP         0x10    /* interface name sockaddr present */
114*52a38012Sejakowatz #define RTA_IFA         0x20    /* interface addr sockaddr present */
115*52a38012Sejakowatz #define RTA_AUTHOR      0x40    /* sockaddr for author of redirect */
116*52a38012Sejakowatz #define RTA_BRD         0x80    /* for NEWADDR, broadcast or p-p dest addr */
117*52a38012Sejakowatz 
118*52a38012Sejakowatz /*
119*52a38012Sejakowatz  * Index offsets for sockaddr array for alternate internal encoding.
120*52a38012Sejakowatz  */
121*52a38012Sejakowatz #define RTAX_DST        0       /* destination sockaddr present */
122*52a38012Sejakowatz #define RTAX_GATEWAY    1       /* gateway sockaddr present */
123*52a38012Sejakowatz #define RTAX_NETMASK    2       /* netmask sockaddr present */
124*52a38012Sejakowatz #define RTAX_GENMASK    3       /* cloning mask sockaddr present */
125*52a38012Sejakowatz #define RTAX_IFP        4       /* interface name sockaddr present */
126*52a38012Sejakowatz #define RTAX_IFA        5       /* interface addr sockaddr present */
127*52a38012Sejakowatz #define RTAX_AUTHOR     6       /* sockaddr for author of redirect */
128*52a38012Sejakowatz #define RTAX_BRD        7       /* for NEWADDR, broadcast or p-p dest addr */
129*52a38012Sejakowatz #define RTAX_MAX        8       /* size of array to allocate */
130*52a38012Sejakowatz 
131*52a38012Sejakowatz struct rt_msghdr {
132*52a38012Sejakowatz 	uint16 rtm_msglen;
133*52a38012Sejakowatz 	uint8 rtm_version;
134*52a38012Sejakowatz 	uint8 rtm_type;
135*52a38012Sejakowatz 
136*52a38012Sejakowatz 	uint16 rtm_index;
137*52a38012Sejakowatz 	int rtm_flags;
138*52a38012Sejakowatz 	int rtm_addrs;
139*52a38012Sejakowatz 	int rtm_seq;
140*52a38012Sejakowatz 	int rtm_errno;
141*52a38012Sejakowatz 	int rtm_use;
142*52a38012Sejakowatz 	uint32 rtm_inits;
143*52a38012Sejakowatz 	struct rt_metrics rtm_rmx;
144*52a38012Sejakowatz };
145*52a38012Sejakowatz 
146*52a38012Sejakowatz struct rt_addrinfo {
147*52a38012Sejakowatz         int     rti_addrs;
148*52a38012Sejakowatz         struct  sockaddr *rti_info[RTAX_MAX];
149*52a38012Sejakowatz         int     rti_flags;
150*52a38012Sejakowatz         struct  ifaddr *rti_ifa;
151*52a38012Sejakowatz         struct  ifnet *rti_ifp;
152*52a38012Sejakowatz         struct  rt_msghdr *rti_rtm;
153*52a38012Sejakowatz };
154*52a38012Sejakowatz 
155*52a38012Sejakowatz struct route_cb {
156*52a38012Sejakowatz 	int32 ip_count;     /* how many AF_INET structures we have */
157*52a38012Sejakowatz 	int32 any_count;    /* total of all above... */
158*52a38012Sejakowatz };
159*52a38012Sejakowatz 
160*52a38012Sejakowatz struct walkarg {
161*52a38012Sejakowatz 	int w_op;
162*52a38012Sejakowatz 	int w_arg;
163*52a38012Sejakowatz 	int w_given;
164*52a38012Sejakowatz 	int w_needed;
165*52a38012Sejakowatz 	int w_tmemsize;
166*52a38012Sejakowatz 	caddr_t w_where;
167*52a38012Sejakowatz 	caddr_t w_tmem;
168*52a38012Sejakowatz };
169*52a38012Sejakowatz 
170*52a38012Sejakowatz /*
171*52a38012Sejakowatz  * Routing statistics.
172*52a38012Sejakowatz  */
173*52a38012Sejakowatz struct  rtstat {
174*52a38012Sejakowatz         int32 rts_badredirect;      /* bogus redirect calls */
175*52a38012Sejakowatz         int32 rts_dynamic;          /* routes created by redirects */
176*52a38012Sejakowatz         int32 rts_newgateway;               /* routes modified by redirects */
177*52a38012Sejakowatz         int32 rts_unreach;          /* lookups which failed */
178*52a38012Sejakowatz         int32 rts_wildcard;         /* lookups satisfied by a wildcard */
179*52a38012Sejakowatz };
180*52a38012Sejakowatz 
181*52a38012Sejakowatz #define RTFREE(rt) do { \
182*52a38012Sejakowatz         if ((rt)->rt_refcnt <= 1) \
183*52a38012Sejakowatz                 rtfree(rt); \
184*52a38012Sejakowatz         else \
185*52a38012Sejakowatz                 (rt)->rt_refcnt--; \
186*52a38012Sejakowatz } while (0)
187*52a38012Sejakowatz 
188*52a38012Sejakowatz struct  rtstat  rtstat;
189*52a38012Sejakowatz struct  radix_node_head *rt_tables[AF_MAX+1];
190*52a38012Sejakowatz 
191*52a38012Sejakowatz void	route_init(void);
192*52a38012Sejakowatz 
193*52a38012Sejakowatz int	rtinit (struct ifaddr *, int, int);
194*52a38012Sejakowatz void	rtalloc (struct route *);
195*52a38012Sejakowatz struct rtentry *rtalloc1 (struct sockaddr *, int);
196*52a38012Sejakowatz void	rtfree (struct rtentry *);
197*52a38012Sejakowatz int	rtrequest (int, struct sockaddr *,
198*52a38012Sejakowatz                         struct sockaddr *, struct sockaddr *, int,
199*52a38012Sejakowatz                         struct rtentry **);
200*52a38012Sejakowatz void	rt_maskedcopy(struct sockaddr *src,
201*52a38012Sejakowatz                 struct sockaddr *dst,
202*52a38012Sejakowatz                 struct sockaddr *netmask);
203*52a38012Sejakowatz int	rt_setgate (struct rtentry *, struct sockaddr *,
204*52a38012Sejakowatz                          struct sockaddr *);
205*52a38012Sejakowatz 
206*52a38012Sejakowatz struct radix_node_head ** get_rt_tables(void);
207*52a38012Sejakowatz 
208*52a38012Sejakowatz #endif /* NET_ROUTE_H */
209