]>
git.saurik.com Git - apple/xnu.git/blob - bsd/net/route.h
   2  * Copyright (c) 2000,2007 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29  * Copyright (c) 1980, 1986, 1993 
  30  *      The Regents of the University of California.  All rights reserved. 
  32  * Redistribution and use in source and binary forms, with or without 
  33  * modification, are permitted provided that the following conditions 
  35  * 1. Redistributions of source code must retain the above copyright 
  36  *    notice, this list of conditions and the following disclaimer. 
  37  * 2. Redistributions in binary form must reproduce the above copyright 
  38  *    notice, this list of conditions and the following disclaimer in the 
  39  *    documentation and/or other materials provided with the distribution. 
  40  * 3. All advertising materials mentioning features or use of this software 
  41  *    must display the following acknowledgement: 
  42  *      This product includes software developed by the University of 
  43  *      California, Berkeley and its contributors. 
  44  * 4. Neither the name of the University nor the names of its contributors 
  45  *    may be used to endorse or promote products derived from this software 
  46  *    without specific prior written permission. 
  48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
  49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
  52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  60  *      @(#)route.h     8.3 (Berkeley) 4/19/94 
  61  * $FreeBSD: src/sys/net/route.h,v 1.36.2.1 2000/08/16 06:14:23 jayanth Exp $ 
  66 #include <sys/appleapiopts.h> 
  67 #include <sys/types.h> 
  68 #include <sys/socket.h> 
  71  * Kernel resident routing tables. 
  73  * The routing tables are initialized when interface addresses 
  74  * are set by making entries for all directly connected interfaces. 
  78  * A route consists of a destination address and a reference 
  79  * to a routing entry.  These are often held by protocols 
  80  * in their control blocks, e.g. inpcb. 
  85         struct  rtentry 
*ro_rt
; 
  86         struct  sockaddr ro_dst
; 
  87         u_long  reserved
[2];    /* for future use if needed */ 
  94  * These numbers are used by reliable protocols for determining 
  95  * retransmission behavior and are included in the routing structure. 
  98         u_int32_t       rmx_locks
;      /* Kernel must leave these values alone */ 
  99         u_int32_t       rmx_mtu
;        /* MTU for this path */ 
 100         u_int32_t       rmx_hopcount
;   /* max hops expected */ 
 101         int32_t         rmx_expire
;     /* lifetime for route, e.g. redirect */ 
 102         u_int32_t       rmx_recvpipe
;   /* inbound delay-bandwidth product */ 
 103         u_int32_t       rmx_sendpipe
;   /* outbound delay-bandwidth product */ 
 104         u_int32_t       rmx_ssthresh
;   /* outbound gateway buffer limit */ 
 105         u_int32_t       rmx_rtt
;        /* estimated round trip time */ 
 106         u_int32_t       rmx_rttvar
;     /* estimated rtt variance */ 
 107         u_int32_t       rmx_pksent
;     /* packets sent using this route */ 
 108         u_int32_t       rmx_filler
[4];  /* will be used for T/TCP later */ 
 112  * rmx_rtt and rmx_rttvar are stored as microseconds; 
 114 #define RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per sec */ 
 117  * XXX kernel function pointer `rt_output' is visible to applications. 
 121  * We distinguish between routes to hosts and routes to networks, 
 122  * preferring the former if available.  For each route we infer 
 123  * the interface to use from the gateway address supplied when 
 124  * the route was entered.  Routes that forward packets through 
 125  * gateways are marked so that the output routines know to address the 
 126  * gateway rather than the ultimate destination. 
 130 #include <net/radix.h> 
 133         struct  radix_node rt_nodes
[2]; /* tree glue, and other values */ 
 134 #define rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key)) 
 135 #define rt_mask(r)      ((struct sockaddr *)((r)->rt_nodes->rn_mask)) 
 136         struct  sockaddr 
*rt_gateway
;   /* value */ 
 137         int32_t rt_refcnt
;              /* # held references */ 
 138         u_long  rt_flags
;               /* up/down?, host/net */ 
 139         struct  ifnet 
*rt_ifp
;          /* the answer: interface to use */ 
 140         u_long  rt_dlt
;                 /* DLIL dl_tag */ 
 141         struct  ifaddr 
*rt_ifa
;         /* the answer: interface to use */ 
 142         struct  sockaddr 
*rt_genmask
;   /* for generation of cloned routes */ 
 143         caddr_t rt_llinfo
;              /* pointer to link level info cache */ 
 144         struct  rt_metrics rt_rmx
;      /* metrics used by rx'ing protocols */ 
 145         struct  rtentry 
*rt_gwroute
;    /* implied entry for gatewayed routes */ 
 146         int     (*rt_output
)(struct ifnet 
*, struct mbuf 
*, 
 147                              struct sockaddr 
*, struct rtentry 
*); 
 148                                         /* output routine for this (rt,if) */ 
 149         struct  rtentry 
*rt_parent
;     /* cloning parent of this route */ 
 150         u_long  generation_id
;          /* route generation id */ 
 154 #ifdef __APPLE_API_OBSOLETE 
 156  * Following structure necessary for 4.3 compatibility; 
 157  * We should eventually move it to a compat file. 
 160         u_long  rt_hash
;                /* to speed lookups */ 
 161         struct  sockaddr rt_dst
;        /* key */ 
 162         struct  sockaddr rt_gateway
;    /* value */ 
 163         short   rt_flags
;               /* up/down?, host/net */ 
 164         short   rt_refcnt
;              /* # held references */ 
 165         u_long  rt_use
;                 /* raw # packets forwarded */ 
 166         struct  ifnet 
*rt_ifp
;          /* the answer: interface to use */ 
 168 #endif /* __APPLE_API_OBSOLETE */ 
 171 #define rt_use rt_rmx.rmx_pksent 
 174 #define RTF_UP          0x1             /* route usable */ 
 175 #define RTF_GATEWAY     0x2             /* destination is a gateway */ 
 176 #define RTF_HOST        0x4             /* host entry (net otherwise) */ 
 177 #define RTF_REJECT      0x8             /* host or net unreachable */ 
 178 #define RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */ 
 179 #define RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */ 
 180 #define RTF_DONE        0x40            /* message confirmed */ 
 181 #define RTF_DELCLONE    0x80            /* delete cloned route */ 
 182 #define RTF_CLONING     0x100           /* generate new routes on use */ 
 183 #define RTF_XRESOLVE    0x200           /* external daemon resolves name */ 
 184 #define RTF_LLINFO      0x400           /* generated by link layer (e.g. ARP) */ 
 185 #define RTF_STATIC      0x800           /* manually added */ 
 186 #define RTF_BLACKHOLE   0x1000          /* just discard pkts (during updates) */ 
 187 #define RTF_PROTO2      0x4000          /* protocol specific routing flag */ 
 188 #define RTF_PROTO1      0x8000          /* protocol specific routing flag */ 
 190 #define RTF_PRCLONING   0x10000         /* protocol requires cloning */ 
 191 #define RTF_WASCLONED   0x20000         /* route generated through cloning */ 
 192 #define RTF_PROTO3      0x40000         /* protocol specific routing flag */ 
 194 #define RTF_PINNED      0x100000        /* future use */ 
 195 #define RTF_LOCAL       0x200000        /* route represents a local address */ 
 196 #define RTF_BROADCAST   0x400000        /* route represents a bcast address */ 
 197 #define RTF_MULTICAST   0x800000        /* route represents a mcast address */ 
 198 #define RTF_TRACKREFS   0x1000000       /* Debug references and releases */ 
 199                                         /* 0x1000000 and up unassigned */ 
 202  * Routing statistics. 
 205         short   rts_badredirect
;        /* bogus redirect calls */ 
 206         short   rts_dynamic
;            /* routes created by redirects */ 
 207         short   rts_newgateway
;         /* routes modified by redirects */ 
 208         short   rts_unreach
;            /* lookups which failed */ 
 209         short   rts_wildcard
;           /* lookups satisfied by a wildcard */ 
 213  * Structures for routing messages. 
 216         u_short rtm_msglen
;             /* to skip over non-understood messages */ 
 217         u_char  rtm_version
;            /* future binary compatibility */ 
 218         u_char  rtm_type
;               /* message type */ 
 219         u_short rtm_index
;              /* index for associated ifp */ 
 220         int     rtm_flags
;              /* flags, incl. kern & message, e.g. DONE */ 
 221         int     rtm_addrs
;              /* bitmask identifying sockaddrs in msg */ 
 222         pid_t   rtm_pid
;                /* identify sender */ 
 223         int     rtm_seq
;                /* for sender to identify action */ 
 224         int     rtm_errno
;              /* why failed */ 
 225         int     rtm_use
;                /* from rtentry */ 
 226         u_int32_t rtm_inits
;            /* which metrics we are initializing */ 
 227         struct rt_metrics rtm_rmx
;      /* metrics themselves */ 
 231         u_short rtm_msglen
;             /* to skip over non-understood messages */ 
 232         u_char  rtm_version
;            /* future binary compatibility */ 
 233         u_char  rtm_type
;               /* message type */ 
 234         u_short rtm_index
;              /* index for associated ifp */ 
 235         int     rtm_flags
;              /* flags, incl. kern & message, e.g. DONE */ 
 236         int     rtm_addrs
;              /* bitmask identifying sockaddrs in msg */ 
 237         int32_t rtm_refcnt
;             /* reference count */ 
 238         int     rtm_parentflags
;        /* flags of the parent route */ 
 239         int     rtm_reserved
;           /* reserved field set to 0 */ 
 240         int     rtm_use
;                /* from rtentry */ 
 241         u_int32_t rtm_inits
;            /* which metrics we are initializing */ 
 242         struct rt_metrics rtm_rmx
;      /* metrics themselves */ 
 246 #define RTM_VERSION     5       /* Up the ante and ignore older versions */ 
 251 #define RTM_ADD         0x1     /* Add Route */ 
 252 #define RTM_DELETE      0x2     /* Delete Route */ 
 253 #define RTM_CHANGE      0x3     /* Change Metrics or flags */ 
 254 #define RTM_GET         0x4     /* Report Metrics */ 
 255 #define RTM_LOSING      0x5     /* Kernel Suspects Partitioning */ 
 256 #define RTM_REDIRECT    0x6     /* Told to use different route */ 
 257 #define RTM_MISS        0x7     /* Lookup failed on this address */ 
 258 #define RTM_LOCK        0x8     /* fix specified metrics */ 
 259 #define RTM_OLDADD      0x9     /* caused by SIOCADDRT */ 
 260 #define RTM_OLDDEL      0xa     /* caused by SIOCDELRT */ 
 261 #define RTM_RESOLVE     0xb     /* req to resolve dst to LL addr */ 
 262 #define RTM_NEWADDR     0xc     /* address being added to iface */ 
 263 #define RTM_DELADDR     0xd     /* address being removed from iface */ 
 264 #define RTM_IFINFO      0xe     /* iface going up/down etc. */ 
 265 #define RTM_NEWMADDR    0xf     /* mcast group membership being added to if */ 
 266 #define RTM_DELMADDR    0x10    /* mcast group membership being deleted */ 
 268 #define RTM_GET_SILENT  0x11 
 270 #define RTM_IFINFO2     0x12    /* */ 
 271 #define RTM_NEWMADDR2   0x13    /* */ 
 272 #define RTM_GET2        0x14    /* */ 
 275  * Bitmask values for rtm_inits and rmx_locks. 
 277 #define RTV_MTU         0x1     /* init or lock _mtu */ 
 278 #define RTV_HOPCOUNT    0x2     /* init or lock _hopcount */ 
 279 #define RTV_EXPIRE      0x4     /* init or lock _expire */ 
 280 #define RTV_RPIPE       0x8     /* init or lock _recvpipe */ 
 281 #define RTV_SPIPE       0x10    /* init or lock _sendpipe */ 
 282 #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */ 
 283 #define RTV_RTT         0x40    /* init or lock _rtt */ 
 284 #define RTV_RTTVAR      0x80    /* init or lock _rttvar */ 
 287  * Bitmask values for rtm_addrs. 
 289 #define RTA_DST         0x1     /* destination sockaddr present */ 
 290 #define RTA_GATEWAY     0x2     /* gateway sockaddr present */ 
 291 #define RTA_NETMASK     0x4     /* netmask sockaddr present */ 
 292 #define RTA_GENMASK     0x8     /* cloning mask sockaddr present */ 
 293 #define RTA_IFP         0x10    /* interface name sockaddr present */ 
 294 #define RTA_IFA         0x20    /* interface addr sockaddr present */ 
 295 #define RTA_AUTHOR      0x40    /* sockaddr for author of redirect */ 
 296 #define RTA_BRD         0x80    /* for NEWADDR, broadcast or p-p dest addr */ 
 299  * Index offsets for sockaddr array for alternate internal encoding. 
 301 #define RTAX_DST        0       /* destination sockaddr present */ 
 302 #define RTAX_GATEWAY    1       /* gateway sockaddr present */ 
 303 #define RTAX_NETMASK    2       /* netmask sockaddr present */ 
 304 #define RTAX_GENMASK    3       /* cloning mask sockaddr present */ 
 305 #define RTAX_IFP        4       /* interface name sockaddr present */ 
 306 #define RTAX_IFA        5       /* interface addr sockaddr present */ 
 307 #define RTAX_AUTHOR     6       /* sockaddr for author of redirect */ 
 308 #define RTAX_BRD        7       /* for NEWADDR, broadcast or p-p dest addr */ 
 309 #define RTAX_MAX        8       /* size of array to allocate */ 
 313         struct  sockaddr 
*rti_info
[RTAX_MAX
]; 
 325 #ifdef KERNEL_PRIVATE 
 326 #define RTFREE(rt)      rtfree(rt) 
 327 extern struct route_cb route_cb
; 
 328 extern struct radix_node_head 
*rt_tables
[AF_MAX
+1]; 
 333 __private_extern__ 
int rttrash
; 
 335 extern void route_init(void) __attribute__((section("__TEXT, initcode"))); 
 336 extern void rt_ifmsg(struct ifnet 
*); 
 337 extern void rt_missmsg(int, struct rt_addrinfo 
*, int, int); 
 338 extern void rt_newaddrmsg(int, struct ifaddr 
*, int, struct rtentry 
*); 
 339 extern void rt_newmaddrmsg(int, struct ifmultiaddr 
*); 
 340 extern int rt_setgate(struct rtentry 
*, struct sockaddr 
*, struct sockaddr 
*); 
 341 extern void rtalloc(struct route 
*); 
 342 extern void rtalloc_ign(struct route 
*, u_long
); 
 343 extern void rtalloc_ign_locked(struct route 
*, u_long 
); 
 344 extern struct rtentry 
*rtalloc1(struct sockaddr 
*, int, u_long
); 
 345 extern struct rtentry 
*rtalloc1_locked(struct sockaddr 
*, int, u_long
); 
 346 extern void rtfree(struct rtentry 
*); 
 347 extern void rtfree_locked(struct rtentry 
*); 
 348 extern void rtref(struct rtentry 
*); 
 350  * rtunref will decrement the refcount, rtfree will decrement and free if 
 351  * the refcount has reached zero and the route is not up. 
 352  * Unless you have good reason to do otherwise, use rtfree. 
 354 extern void rtunref(struct rtentry 
*); 
 355 extern void rtsetifa(struct rtentry 
*, struct ifaddr 
*); 
 356 extern int rtinit(struct ifaddr 
*, int, int); 
 357 extern int rtinit_locked(struct ifaddr 
*, int, int); 
 358 extern int rtioctl(int, caddr_t
, struct proc 
*); 
 359 extern void rtredirect(struct sockaddr 
*, struct sockaddr 
*, 
 360     struct sockaddr 
*, int, struct sockaddr 
*, struct rtentry 
**); 
 361 extern int rtrequest(int, struct sockaddr 
*, 
 362     struct sockaddr 
*, struct sockaddr 
*, int, struct rtentry 
**); 
 363 extern int rtrequest_locked(int, struct sockaddr 
*, 
 364     struct sockaddr 
*, struct sockaddr 
*, int, struct rtentry 
**); 
 365 extern struct rtentry 
*rte_alloc(void); 
 366 extern void rte_free(struct rtentry 
*); 
 367 #endif KERNEL_PRIVATE