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