xref: /haiku/headers/posix/net/route.h (revision 6bbdd797fa1c03a92ba47ca0818f972dbf14f6d2)
152a38012Sejakowatz /* route.h */
252a38012Sejakowatz 
3*6bbdd797SDavid Reid #ifndef _NET_ROUTE_H
4*6bbdd797SDavid Reid #define _NET_ROUTE_H
552a38012Sejakowatz 
6*6bbdd797SDavid Reid #include <net/radix.h>
7*6bbdd797SDavid Reid #include <sys/socket.h> /* for AF_MAX */
852a38012Sejakowatz /*
952a38012Sejakowatz  * A route consists of a destination address and a reference
1052a38012Sejakowatz  * to a routing entry.  These are often held by protocols
1152a38012Sejakowatz  * in their control blocks, e.g. inpcb.
1252a38012Sejakowatz  */
1352a38012Sejakowatz struct route {
1452a38012Sejakowatz         struct  rtentry *ro_rt;
1552a38012Sejakowatz         struct  sockaddr ro_dst;
1652a38012Sejakowatz };
1752a38012Sejakowatz 
1852a38012Sejakowatz /*
1952a38012Sejakowatz  * These numbers are used by reliable protocols for determining
2052a38012Sejakowatz  * retransmission behavior and are included in the routing structure.
2152a38012Sejakowatz  */
2252a38012Sejakowatz struct rt_metrics {
2352a38012Sejakowatz         uint32  rmx_locks;      /* Kernel must leave these values alone */
2452a38012Sejakowatz         uint32  rmx_mtu;        /* MTU for this path */
2552a38012Sejakowatz         uint32  rmx_hopcount;   /* max hops expected */
2652a38012Sejakowatz         uint32  rmx_expire;     /* lifetime for route, e.g. redirect */
2752a38012Sejakowatz         u_long  rmx_recvpipe;   /* inbound delay-bandwith product */
2852a38012Sejakowatz         u_long  rmx_sendpipe;   /* outbound delay-bandwith product */
2952a38012Sejakowatz         u_long  rmx_ssthresh;   /* outbound gateway buffer limit */
3052a38012Sejakowatz         u_long  rmx_rtt;        /* estimated round trip time */
3152a38012Sejakowatz         u_long  rmx_rttvar;     /* estimated rtt variance */
3252a38012Sejakowatz         u_long  rmx_pksent;     /* packets sent using this route */
3352a38012Sejakowatz };
3452a38012Sejakowatz 
3552a38012Sejakowatz /*
3652a38012Sejakowatz  * rmx_rtt and rmx_rttvar are stored as microseconds;
3752a38012Sejakowatz  * RTTTOPRHZ(rtt) converts to a value suitable for use
3852a38012Sejakowatz  * by a protocol slowtimo counter.
3952a38012Sejakowatz  */
4052a38012Sejakowatz #define	RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per sec */
4152a38012Sejakowatz #define	RTTTOPRHZ(r)	((r) / (RTM_RTTUNIT / PR_SLOWHZ))
4252a38012Sejakowatz 
4352a38012Sejakowatz struct rtentry {
4452a38012Sejakowatz         struct  radix_node rt_nodes[2]; /* tree glue, and other values */
4552a38012Sejakowatz         struct  sockaddr *rt_gateway;   /* value */
4652a38012Sejakowatz         uint	rt_flags;               /* up/down?, host/net */
4752a38012Sejakowatz         int     rt_refcnt;              /* # held references */
4852a38012Sejakowatz         uint32	rt_use;                 /* raw # packets forwarded */
4952a38012Sejakowatz         struct  ifnet  *rt_ifp;         /* the answer: interface to use */
5052a38012Sejakowatz         struct  ifaddr *rt_ifa;         /* the answer: interface to use */
5152a38012Sejakowatz         struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
52*6bbdd797SDavid Reid         char *  rt_llinfo;              /* pointer to link level info cache */
5352a38012Sejakowatz         struct  rt_metrics rt_rmx;      /* metrics used by rx'ing protocols */
5452a38012Sejakowatz         struct  rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
5552a38012Sejakowatz         struct  rtentry *rt_parent;     /* If cloned, parent of this route. */
5652a38012Sejakowatz 	/* XXX - add this! */
5752a38012Sejakowatz         // rt_timer;  * queue of timeouts for misc funcs *
5852a38012Sejakowatz };
5952a38012Sejakowatz #define rt_use          rt_rmx.rmx_pksent
6052a38012Sejakowatz #define rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
6152a38012Sejakowatz #define rt_mask(r)      ((struct sockaddr *)((r)->rt_nodes->rn_mask))
6252a38012Sejakowatz 
6352a38012Sejakowatz #define RTF_UP          0x1             /* route usable */
6452a38012Sejakowatz #define RTF_GATEWAY     0x2             /* destination is a gateway */
6552a38012Sejakowatz #define RTF_HOST        0x4             /* host entry (net otherwise) */
6652a38012Sejakowatz #define RTF_REJECT      0x8             /* host or net unreachable */
6752a38012Sejakowatz #define RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
6852a38012Sejakowatz #define RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
6952a38012Sejakowatz #define RTF_DONE        0x40            /* message confirmed */
7052a38012Sejakowatz #define RTF_MASK        0x80            /* subnet mask present */
7152a38012Sejakowatz #define RTF_CLONING     0x100           /* generate new routes on use */
7252a38012Sejakowatz #define RTF_XRESOLVE    0x200           /* external daemon resolves name */
7352a38012Sejakowatz #define RTF_LLINFO      0x400           /* generated by ARP or ESIS */
7452a38012Sejakowatz #define RTF_STATIC      0x800           /* manually added */
7552a38012Sejakowatz #define RTF_BLACKHOLE   0x1000          /* just discard pkts (during updates) */
7652a38012Sejakowatz #define RTF_PROTO3      0x2000          /* protocol specific routing flag */
7752a38012Sejakowatz #define RTF_PROTO2      0x4000          /* protocol specific routing flag */
7852a38012Sejakowatz #define RTF_PROTO1      0x8000          /* protocol specific routing flag */
7952a38012Sejakowatz 
8052a38012Sejakowatz #define RTM_VERSION     3       /* Up the ante and ignore older versions */
8152a38012Sejakowatz 
8252a38012Sejakowatz #define RTM_ADD         0x1     /* Add Route */
8352a38012Sejakowatz #define RTM_DELETE      0x2     /* Delete Route */
8452a38012Sejakowatz #define RTM_CHANGE      0x3     /* Change Metrics or flags */
8552a38012Sejakowatz #define RTM_GET         0x4     /* Report Metrics */
8652a38012Sejakowatz #define RTM_LOSING      0x5     /* Kernel Suspects Partitioning */
8752a38012Sejakowatz #define RTM_REDIRECT    0x6     /* Told to use different route */
8852a38012Sejakowatz #define RTM_MISS        0x7     /* Lookup failed on this address */
8952a38012Sejakowatz #define RTM_LOCK        0x8     /* fix specified metrics */
9052a38012Sejakowatz #define RTM_OLDADD      0x9     /* caused by SIOCADDRT */
9152a38012Sejakowatz #define RTM_OLDDEL      0xa     /* caused by SIOCDELRT */
9252a38012Sejakowatz #define RTM_RESOLVE     0xb     /* req to resolve dst to LL addr */
9352a38012Sejakowatz #define RTM_NEWADDR     0xc     /* address being added to iface */
9452a38012Sejakowatz #define RTM_DELADDR     0xd     /* address being removed from iface */
9552a38012Sejakowatz #define RTM_IFINFO      0xe     /* iface going up/down etc. */
9652a38012Sejakowatz 
9752a38012Sejakowatz #define RTV_MTU         0x1     /* init or lock _mtu */
9852a38012Sejakowatz #define RTV_HOPCOUNT    0x2     /* init or lock _hopcount */
9952a38012Sejakowatz #define RTV_EXPIRE      0x4     /* init or lock _hopcount */
10052a38012Sejakowatz #define RTV_RPIPE       0x8     /* init or lock _recvpipe */
10152a38012Sejakowatz #define RTV_SPIPE       0x10    /* init or lock _sendpipe */
10252a38012Sejakowatz #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */
10352a38012Sejakowatz #define RTV_RTT         0x40    /* init or lock _rtt */
10452a38012Sejakowatz #define RTV_RTTVAR      0x80    /* init or lock _rttvar */
10552a38012Sejakowatz 
10652a38012Sejakowatz /*
10752a38012Sejakowatz  * Bitmask values for rtm_addr.
10852a38012Sejakowatz  */
10952a38012Sejakowatz #define RTA_DST         0x1     /* destination sockaddr present */
11052a38012Sejakowatz #define RTA_GATEWAY     0x2     /* gateway sockaddr present */
11152a38012Sejakowatz #define RTA_NETMASK     0x4     /* netmask sockaddr present */
11252a38012Sejakowatz #define RTA_GENMASK     0x8     /* cloning mask sockaddr present */
11352a38012Sejakowatz #define RTA_IFP         0x10    /* interface name sockaddr present */
11452a38012Sejakowatz #define RTA_IFA         0x20    /* interface addr sockaddr present */
11552a38012Sejakowatz #define RTA_AUTHOR      0x40    /* sockaddr for author of redirect */
11652a38012Sejakowatz #define RTA_BRD         0x80    /* for NEWADDR, broadcast or p-p dest addr */
11752a38012Sejakowatz 
11852a38012Sejakowatz /*
11952a38012Sejakowatz  * Index offsets for sockaddr array for alternate internal encoding.
12052a38012Sejakowatz  */
12152a38012Sejakowatz #define RTAX_DST        0       /* destination sockaddr present */
12252a38012Sejakowatz #define RTAX_GATEWAY    1       /* gateway sockaddr present */
12352a38012Sejakowatz #define RTAX_NETMASK    2       /* netmask sockaddr present */
12452a38012Sejakowatz #define RTAX_GENMASK    3       /* cloning mask sockaddr present */
12552a38012Sejakowatz #define RTAX_IFP        4       /* interface name sockaddr present */
12652a38012Sejakowatz #define RTAX_IFA        5       /* interface addr sockaddr present */
12752a38012Sejakowatz #define RTAX_AUTHOR     6       /* sockaddr for author of redirect */
12852a38012Sejakowatz #define RTAX_BRD        7       /* for NEWADDR, broadcast or p-p dest addr */
12952a38012Sejakowatz #define RTAX_MAX        8       /* size of array to allocate */
13052a38012Sejakowatz 
13152a38012Sejakowatz struct rt_msghdr {
13252a38012Sejakowatz 	uint16 rtm_msglen;
13352a38012Sejakowatz 	uint8 rtm_version;
13452a38012Sejakowatz 	uint8 rtm_type;
13552a38012Sejakowatz 
13652a38012Sejakowatz 	uint16 rtm_index;
13752a38012Sejakowatz 	int rtm_flags;
13852a38012Sejakowatz 	int rtm_addrs;
13952a38012Sejakowatz 	int rtm_seq;
14052a38012Sejakowatz 	int rtm_errno;
14152a38012Sejakowatz 	int rtm_use;
14252a38012Sejakowatz 	uint32 rtm_inits;
14352a38012Sejakowatz 	struct rt_metrics rtm_rmx;
14452a38012Sejakowatz };
14552a38012Sejakowatz 
14652a38012Sejakowatz struct rt_addrinfo {
14752a38012Sejakowatz         int     rti_addrs;
14852a38012Sejakowatz         struct  sockaddr *rti_info[RTAX_MAX];
14952a38012Sejakowatz         int     rti_flags;
15052a38012Sejakowatz         struct  ifaddr *rti_ifa;
15152a38012Sejakowatz         struct  ifnet *rti_ifp;
15252a38012Sejakowatz         struct  rt_msghdr *rti_rtm;
15352a38012Sejakowatz };
15452a38012Sejakowatz 
15552a38012Sejakowatz struct route_cb {
15652a38012Sejakowatz 	int32 ip_count;     /* how many AF_INET structures we have */
15752a38012Sejakowatz 	int32 any_count;    /* total of all above... */
15852a38012Sejakowatz };
15952a38012Sejakowatz 
16052a38012Sejakowatz struct walkarg {
16152a38012Sejakowatz 	int w_op;
16252a38012Sejakowatz 	int w_arg;
16352a38012Sejakowatz 	int w_given;
16452a38012Sejakowatz 	int w_needed;
16552a38012Sejakowatz 	int w_tmemsize;
166*6bbdd797SDavid Reid 	char * w_where;
167*6bbdd797SDavid Reid 	char * w_tmem;
16852a38012Sejakowatz };
16952a38012Sejakowatz 
17052a38012Sejakowatz /*
17152a38012Sejakowatz  * Routing statistics.
17252a38012Sejakowatz  */
17352a38012Sejakowatz struct  rtstat {
17452a38012Sejakowatz         int32 rts_badredirect;      /* bogus redirect calls */
17552a38012Sejakowatz         int32 rts_dynamic;          /* routes created by redirects */
17652a38012Sejakowatz         int32 rts_newgateway;               /* routes modified by redirects */
17752a38012Sejakowatz         int32 rts_unreach;          /* lookups which failed */
17852a38012Sejakowatz         int32 rts_wildcard;         /* lookups satisfied by a wildcard */
17952a38012Sejakowatz };
18052a38012Sejakowatz 
18152a38012Sejakowatz #define RTFREE(rt) do { \
18252a38012Sejakowatz         if ((rt)->rt_refcnt <= 1) \
18352a38012Sejakowatz                 rtfree(rt); \
18452a38012Sejakowatz         else \
18552a38012Sejakowatz                 (rt)->rt_refcnt--; \
18652a38012Sejakowatz } while (0)
18752a38012Sejakowatz 
18852a38012Sejakowatz struct  rtstat  rtstat;
18952a38012Sejakowatz struct  radix_node_head *rt_tables[AF_MAX+1];
19052a38012Sejakowatz 
19152a38012Sejakowatz void	route_init(void);
19252a38012Sejakowatz 
19352a38012Sejakowatz int	rtinit (struct ifaddr *, int, int);
19452a38012Sejakowatz void	rtalloc (struct route *);
19552a38012Sejakowatz struct rtentry *rtalloc1 (struct sockaddr *, int);
19652a38012Sejakowatz void	rtfree (struct rtentry *);
19752a38012Sejakowatz int	rtrequest (int, struct sockaddr *,
19852a38012Sejakowatz                         struct sockaddr *, struct sockaddr *, int,
19952a38012Sejakowatz                         struct rtentry **);
20052a38012Sejakowatz void	rt_maskedcopy(struct sockaddr *src,
20152a38012Sejakowatz                 struct sockaddr *dst,
20252a38012Sejakowatz                 struct sockaddr *netmask);
20352a38012Sejakowatz int	rt_setgate (struct rtentry *, struct sockaddr *,
20452a38012Sejakowatz                          struct sockaddr *);
20552a38012Sejakowatz 
20652a38012Sejakowatz struct radix_node_head ** get_rt_tables(void);
20752a38012Sejakowatz 
20852a38012Sejakowatz #endif /* NET_ROUTE_H */
209