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