routeLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:26k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* routeLib.c - network route manipulation library */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 03c,10may02,kbw  making man page edits
  8. 03b,07dec01,rae  merge from synth ver 03h, (SPR #69690)
  9. 03a,15oct01,rae  merge from truestack ver 03g, base 02z (update)
  10. 02z,16mar99,spm  recovered orphaned code from tor1_0_1.sens1_1 (SPR #25770)
  11. 02y,29sep98,spm  added mPrivRouteEntryDelete for held kernel routes (SPR #9374)
  12. 02x,14dec97,jdi  doc: cleanup.
  13. 02w,05dec97,rjc  added RTF_CLONING flag to mRoute routines. 
  14. 02v,25oct97,kbw  making minor man page fixes 
  15. 02u,22aug97,rjc  modifed return vals for mRoute* calls.
  16. 02t,08aug97,vin  fixed SPR9121.
  17. 02s,04aug97,kwb  fixed man page problems found in beta review
  18. 02r,07jul97,rjc  route proto field moved to dest sockaddr.
  19. 02q,30jun97,rjc  restored old rtentry size, added socktrim.
  20. 02p,04jun97,rjc  fixed route proto priority glitches.
  21. 02o,03jun97,rjc  fixed mask and RTF_HOST combinations.
  22. 02n,29may97,rjc  fixed byte orders in mRoute routines
  23. 02m,09may97,rjc  fixed mRoute{*} man pages
  24. 02l,30apr97,kbw  fiddle man page text
  25. 02k,28apr97,gnn  fixed some of the documentation.
  26. 02j,20apr97,kbw  fixed minor format errors in man page text
  27. 02i,15apr97,kbw  fixed minor format errors in man page text
  28. 02h,14apr97,gnn  added documentation for new mRoute calls.
  29. 02g,11apr97,rjc  added routing interface support, routing priority stuff.
  30. 02f,13feb97,rjc  added masking of destination in mRoute--- stuff.
  31. 02e,13feb97,rjc  updated mRouteEntryAdd/delete.
  32. 02d,07feb97,rjc  newer  versions of route add/delete etc.
  33. 02c,05feb97,rjc  new versions of route add/delete etc.
  34. 02b,18jan95,jdi  doc tweaks for routeNetAdd().
  35. 02a,08jul94,dzb  Added routeNetAdd() for adding subnet routes (SPR #3395).
  36. 01z,14feb94,elh  made rtEntryFill global and NOMANUAL.
  37. 01y,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h
  38. 01x,20jan93,jdi  documentation cleanup for 5.1.
  39. 01w,28jul92,elh  moved routeShow to netShow.c
  40. 01v,26may92,rrr  the tree shuffle
  41.   -changed includes to have absolute path from h/
  42. 01u,01mar92,elh  added routeCmd.
  43. 01t,16dec91,gae  added includes for ANSI.
  44. 01s,02dec91,elh  moved error handling to lower level (sys_socket).
  45. 01r,26nov91,llk  changed include of errnoLib.h to errno.h.
  46. 01q,12nov91,elh  changed routes to interfaces to be direct routes,
  47.  made routeChange set errno (rtioctl returns errno instead of -1)
  48. 01p,07nov91,elh  changed inet_ntoa to inet_ntoa_b so memory isn't lost.
  49. 01o,04oct91,rrr  passed through the ansification filter
  50.                   -changed functions to ansi style
  51.   -changed includes to have absolute path from h/
  52.   -changed VOID to void
  53.   -changed copyright notice
  54. 01n,21may91,jdi  documentation tweaks.
  55. 01m,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  56.  doc review by dnw.
  57. 01l,22feb91,jaa  documentation cleanup.
  58. 01k,10aug90,kdl  added forward declarations for functions returning void.
  59. 01j,07may90,hjb  added documentation to routeAdd about adding the default route,
  60.  explanation of the route specific flags, and made the
  61.  output more unix compatible.
  62. 01i,07mar90,jdi  documentation cleanup.
  63. 01h,02sep89,hjb  fixed a big in routeShow() - instead of using RTHASHSIZ
  64.  we now use the global rthashsize which is always set to
  65.  the correct value in route.c.  (When GATEWAY is undefined,
  66.  the route.h include file defines RTHASHSIZ to smaller value.)
  67. 01g,07aug89,gae  fixed in_lnaof call in routeEntryFill for SPARC.
  68. 01g,20aug88,gae  documentation.
  69. 01f,30may88,dnw  changed to v4 names.
  70. 01e,28may88,dnw  replace call to netGetInetAddr with calls to remGetHostByName
  71.    and inet_addr.
  72. 01d,18feb88,dnw  changed to handle subnet masks correctly (by calling in_lnaof()
  73.    instead of inet_lnaof() in routeChange).
  74. 01c,16nov87,jlf  documentation
  75. 01b,16nov87,llk  documentation.
  76. 01a,01nov87,llk  written.
  77. */
  78. /*
  79. DESCRIPTION
  80. This library contains the routines for inspecting the routing table,
  81. as well as routines for adding and deleting routes from that table.  
  82. If you do not configure VxWorks to include a routing protocol, such 
  83. as RIP or OSPF, you can use these routines to maintain the routing 
  84. tables manually.  
  85. To use this feature, include the following component:
  86. INCLUDE_NETWRS_ROUTELIB
  87. INCLUDE FILES: routeLib.h
  88. SEE ALSO: hostLib
  89. */
  90. #include "vxWorks.h"
  91. #include "net/mbuf.h"
  92. #include "sys/socket.h"
  93. #include "sockLib.h"
  94. #include "unistd.h"
  95. #include "net/if.h"
  96. #include "net/route.h"
  97. #include "netinet/in.h"
  98. #include "sys/ioctl.h"
  99. #include "inetLib.h"
  100. #include "errno.h"
  101. #include "hostLib.h"
  102. #include "stdio.h"
  103. #include "ioLib.h"
  104. #include "routeLib.h"
  105. #include "m2Lib.h"
  106. #include "routeEnhLib.h"
  107. #ifdef VIRTUAL_STACK
  108. #include "netinet/vsLib.h"
  109. #endif /* VIRTUAL_STACK */
  110. /* forward static functions */
  111. static STATUS routeChange (char *destination, char *gateway, int ioctlCmd);
  112. void routeEntryFill (struct ortentry *pRoute, int destInetAddr, int
  113. gateInetAddr, BOOL hostAddr);
  114. /*******************************************************************************
  115. *
  116. * routeAdd - add a route
  117. *
  118. * This routine adds gateways to the network routing tables.
  119. * It is called from a VxWorks machine that needs
  120. * to establish a gateway to a destination network (or machine).
  121. *
  122. * You can specify both <destination> and <gateway> in standard Internet
  123. * address format (for example, 90.0.0.2), or you can specify them using
  124. * their host names, as specified with hostAdd().
  125. *
  126. * This routine can be used to add multiple routes to the same destination
  127. * differing by the gateway.
  128. *
  129. * EXAMPLE
  130. * Consider the following example:
  131. * .CS
  132. *     -> routeAdd "90.0.0.0", "gate"
  133. * .CE
  134. * This call tells VxWorks that the machine with the host name "gate" is 
  135. * the gateway to network 90.0.0.0.  The host "gate" must already have 
  136. * been created by hostAdd().
  137. *
  138. * Consider the following example:
  139. * .CS
  140. *     -> routeAdd "90.0.0.0", "91.0.0.3"
  141. * .CE
  142. * This call tells VxWorks that the machine with the Internet 
  143. * address 91.0.0.3 is the gateway to network 90.0.0.0.
  144. *
  145. * Consider the following example:
  146. * .CS
  147. *     -> routeAdd "destination", "gate"
  148. * .CE
  149. * This call tells VxWorks that the machine with the host name "gate" is 
  150. * the gateway to the machine named "destination".  The host names "gate" and 
  151. * "destination" must already have been created by hostAdd().
  152. *
  153. * Consider the following example:
  154. * .CS
  155. *     -> routeAdd "0", "gate"
  156. * .CE
  157. * This call tells VxWorks that the machine with the host name "gate" is 
  158. * the default gateway.  The host "gate" must already have been created 
  159. * by hostAdd().  A default gateway is where Internet Protocol (IP) 
  160. * datagrams are routed when there is no specific routing table entry 
  161. * available for the destination IP network or host.
  162. *
  163. * RETURNS: OK or ERROR.
  164. */
  165. STATUS routeAdd
  166.     (
  167.     char *destination,  /* inet addr or name of route destination      */
  168.     char *gateway       /* inet addr or name of gateway to destination */
  169.     )
  170.     {
  171.     return (routeChange (destination, gateway, (int) SIOCADDRT));
  172.     }
  173. /*******************************************************************************
  174. *
  175. * routeNetAdd - add a route to a destination that is a network
  176. *
  177. * This routine is equivalent to routeAdd(), except that the destination
  178. * address is assumed to be a network.  This is useful for adding a route
  179. * to a sub-network that is not on the same overall network as the
  180. * local network.
  181. * This routine can be used to add multiple routes to the same destination
  182. * differing by the gateway.
  183. *
  184. * RETURNS: OK or ERROR.
  185. */
  186. STATUS routeNetAdd
  187.     (
  188.     char *destination,  /* inet addr or name of network destination */
  189.     char *gateway       /* inet addr or name of gateway to destination */
  190.     )
  191.     {
  192.     int destInetAddr; /* destination internet adrs */
  193.     int gateInetAddr; /* gateway internet adrs */
  194.     struct ortentry route; /* route entry */
  195.     int sock; /* socket */
  196.     int status; /* return status */
  197.     if ((((destInetAddr = hostGetByName (destination)) == ERROR) &&
  198.  ((destInetAddr = (int) inet_addr (destination)) == ERROR)) ||
  199.         (((gateInetAddr = hostGetByName (gateway)) == ERROR) &&
  200.  ((gateInetAddr = (int) inet_addr (gateway)) == ERROR)))
  201. {
  202. return (ERROR);
  203. }
  204.     routeEntryFill (&route, destInetAddr, gateInetAddr, FALSE);
  205.     /* add the route */
  206.     sock = socket (AF_INET, SOCK_RAW, 0);
  207.     status = ioctl (sock, SIOCADDRT, (int) &route);
  208.     (void) close (sock);
  209.     return (status);
  210.     }
  211. /*******************************************************************************
  212. *
  213. * routeDelete - delete a route
  214. *
  215. * This routine deletes a specified route from the network routing tables.
  216. *
  217. * RETURNS: OK or ERROR.
  218. *
  219. * SEE ALSO: routeAdd()
  220. */
  221. STATUS routeDelete
  222.     (
  223.     char *destination,  /* inet addr or name of route destination      */
  224.     char *gateway       /* inet addr or name of gateway to destination */
  225.     )
  226.     {
  227.     return (routeChange (destination, gateway, (int) SIOCDELRT));
  228.     }
  229. /*******************************************************************************
  230. *
  231. * routeChange - change the routing tables
  232. *
  233. * This routine makes changes to the routing tables by using an ioctl() call
  234. * to add or delete a route.
  235. *
  236. * This is a local routine which should not be used directly.
  237. * Instead, routeAdd() and routeDelete() should be used as interfaces
  238. * to this routine.
  239. *
  240. * The <destination> and <gateway> parameters may be specified either by their
  241. * Internet addresses in standard internet address format (e.g., "90.0.0.2"),
  242. * or by their names (their host names) which have already been added to the
  243. * remote host table (with hostAdd()).
  244. *
  245. * RETURNS: OK or ERROR.
  246. *
  247. * SEE ALSO: routeAdd()
  248. */
  249. LOCAL STATUS routeChange
  250.     (
  251.     char *destination,  /* inet address or name of route destination      */
  252.     char *gateway,      /* inet address or name of gateway to destination */
  253.     int ioctlCmd        /* addition or deletion of a route                */
  254.     )
  255.     {
  256.     int destInetAddr; /* destination internet adrs */
  257.     int gateInetAddr; /* gateway internet adrs */
  258.     if ((((destInetAddr = hostGetByName (destination)) == ERROR) &&
  259.  ((destInetAddr = (int) inet_addr (destination)) == ERROR)) ||
  260.         (((gateInetAddr = hostGetByName (gateway)) == ERROR) &&
  261.  ((gateInetAddr = (int) inet_addr (gateway)) == ERROR)))
  262. {
  263. return (ERROR);
  264. }
  265.     return (routeCmd (destInetAddr, gateInetAddr, ioctlCmd));
  266.     }
  267. /*******************************************************************************
  268. *
  269. * routeCmd - change the routing tables
  270. *
  271. * routeCmd is the same as routeChange except it provides a non-string
  272. * interface.
  273. *
  274. * NOMANUAL
  275. */
  276. STATUS routeCmd
  277.     (
  278.     int destInetAddr, /* destination adrs */
  279.     int gateInetAddr, /* gateway adrs */
  280.     int ioctlCmd /* route command */
  281.     )
  282.     {
  283.     struct ortentry route; /* route entry */
  284.     int     sock; /* socket  */
  285.     int     status; /* return status */
  286.     routeEntryFill (&route, destInetAddr, gateInetAddr, TRUE);
  287.     /* add or delete the route */
  288.     sock = socket (AF_INET, SOCK_RAW, 0);
  289.     if (sock == ERROR)
  290.         return (ERROR);
  291.     status = ioctl (sock, ioctlCmd, (int) &route);
  292.     (void) close (sock);
  293.     return (status);
  294.     }
  295. /*******************************************************************************
  296. *
  297. * routeEntryFill - fill in a route entry (struct ortentry)
  298. *
  299. * Fills in a route entry (struct ortentry) with destination and
  300. * gateway information.
  301. *
  302. * RETURNS: N/A.
  303. *
  304. * NOMANUAL
  305. */
  306. void routeEntryFill
  307.     (
  308.     struct ortentry *pRoute,     /* pointer to route entry */
  309.     int destInetAddr,           /* destination internet address */
  310.     int gateInetAddr,           /* gateway internet address */
  311.     BOOL hostAddr /* check host part of address */
  312.     )
  313.     {
  314.     struct sockaddr_in *sin;
  315.     struct in_addr di;
  316.     /* zero out route entry */
  317.     bzero ((caddr_t) pRoute, sizeof (struct ortentry));
  318.     /* zero out sockaddr_in, fill in destination info */
  319.     /* XXX rt_dst really a struct sockaddr */
  320.     sin = (struct sockaddr_in *) &(pRoute->rt_dst);
  321.     bzero ((caddr_t) sin, sizeof (struct sockaddr_in));
  322.     sin->sin_family = AF_INET;
  323.     sin->sin_len = sizeof (struct sockaddr_in);
  324.     sin->sin_addr.s_addr = (u_long)destInetAddr;
  325.     /* zero out sockaddr_in, fill in gateway info */
  326.     /* XXX rt_gateway really a struct sockaddr */
  327.     sin = (struct sockaddr_in *) &(pRoute->rt_gateway);
  328.     bzero ((caddr_t) sin, sizeof (struct sockaddr_in));
  329.     sin->sin_family = AF_INET;
  330.     sin->sin_len = sizeof (struct sockaddr_in);
  331.     sin->sin_addr.s_addr = (u_long)gateInetAddr;
  332.     pRoute->rt_flags = RTF_UP;
  333.     di.s_addr = (u_long)destInetAddr;
  334.     /*
  335.      *  if host part of address filled in, then it's a host route
  336.      */
  337.     if ((hostAddr) && (in_lnaof (di) != INADDR_ANY))
  338. pRoute->rt_flags |= RTF_HOST;
  339.     /*
  340.      *  if the gateway addr is not a local interface,
  341.      *  then it is an indirect route - send it to a gateway.
  342.      */
  343.     if (ifa_ifwithaddr (&(pRoute->rt_gateway)) == NULL)
  344.         pRoute->rt_flags |= RTF_GATEWAY;
  345.     }
  346. /*******************************************************************************
  347. *
  348. * mRouteAdd - add multiple routes to the same destination  
  349. *
  350. * This routine is similar to routeAdd(), except that you can use multiple
  351. * mRouteAdd() calls to add multiple routes to the same location.  Use  
  352. * <pDest> to specify the destination, <pGate> to specify the gateway to
  353. * that destination, <mask> to specify destination mask, and <tos> to specify
  354. * the type of service.  For <tos>, netinet/ip.h defines the following 
  355. * constants as valid values: 
  356. *     IPTOS_LOWDELAY
  357. *     IPTOS_THROUGHPUT
  358. *     IPTOS_RELIABILITY
  359. *     IPTOS_MINCOST
  360. *
  361. * Use <flags> to specify any flags 
  362. * you want to associate with this entry.  The valid non-zero values 
  363. * are RTF_HOST and RTF_CLONING defined in net/route.h.
  364. *
  365. * EXAMPLE
  366. * To add a route to the 90.0.0.0 network through 91.0.0.3: 
  367. * .CS
  368. *     -> mRouteAdd ("90.0.0.0", "91.0.0.3", 0xffffff00, 0, 0);
  369. * .CE
  370. *
  371. * Using mRouteAdd(), you could create multiple routes to the same destination.
  372. * VxWorks would distinguish among these routes based on factors such as the 
  373. * netmask or the type of service.  Thus, it is perfectly legal to say:
  374. * .CS
  375. *     -> mRouteAdd ("90.0.0.0", "91.0.0.3", 0xffffff00, 0, 0);
  376. *     -> mRouteAdd ("90.0.0.0", "91.0.0.254", 0xffff0000, 0, 0);
  377. * .CE
  378. * This adds two routes to the same network, "90.0.0.0", that go by two
  379. * different gateways.  The differentiating factor is the netmask.
  380. *
  381. * This routine adds a route of type `M2_ipRouteProto_other', which is a
  382. * static route.  This route will not be modified or deleted until a
  383. * call to mRouteDelete() removes it.
  384. *
  385. * RETURNS: OK or ERROR.
  386. *
  387. * SEE ALSO: mRouteEntryAdd(), mRouteDelete(), routeAdd()
  388. */
  389. STATUS mRouteAdd 
  390.     (
  391.     char *           pDest,    /* destination addr in internet dot notation */
  392.     char *           pGate,    /* gateway address in internet dot notation */
  393.     long             mask,     /* mask for destination */
  394.     int              tos,      /* type of service */
  395.     int              flags     /* route flags */ 
  396.     )
  397.     {
  398.     long          destIp;
  399.     long          gateIp;
  400.     if (((destIp = (long) inet_addr (pDest)) == ERROR) ||
  401.  ((gateIp = (long) inet_addr (pGate)) == ERROR))
  402.         {
  403.         return (ERROR);
  404.         }
  405.     mask = htonl (mask);
  406.     return (mRouteEntryAdd (destIp, gateIp, mask, tos, flags,
  407.                             M2_ipRouteProto_other));
  408.     }
  409.     
  410. /*******************************************************************************
  411. *
  412. * mPrivRouteEntryAdd - add a route to the routing table 
  413. *
  414. * A route to the destination <pDest> with gateway <pGate>, destination mask
  415. * <mask>, and the type of service <tos> is added to the routing table.  <flags>
  416. * specifies any flags associated with this entry.  Valid  values for <flags> 
  417. * are 0, RTF_HOST and RTF_CLONING as  defined in net/route.h.  The <proto> 
  418. * parameter identifies the protocol that generated this route.  Values for 
  419. * <proto> may be found in m2Lib.h and <tos> is one of following values defined 
  420. * in netinet/ip.h:
  421. *     IPTOS_LOWDELAY
  422. *     IPTOS_THROUGHPUT
  423. *     IPTOS_RELIABILITY
  424. *     IPTOS_MINCOST
  425. *
  426. * This routine is the internal version of mRouteEntryAdd() and allows
  427. * you to get a ptr to the routing entry added, which is not available
  428. * with mRouteEntryAdd().
  429. *
  430. * RETURNS: OK or ERROR.
  431. *
  432. * NOMANUAL
  433. */
  434. STATUS mPrivRouteEntryAdd 
  435.     (
  436.     long             destIp,    /* destination address, network order */
  437.     long             gateIp,    /* gateway address, network order */
  438.     long             mask,      /* mask for destination, network order */
  439.     int              tos,       /* type of service */
  440.     int              flags,     /* route flags */ 
  441.     int              proto,      /* routing protocol */
  442.     struct rtentry ** ppRtEntry  /* for returning ptr to new entry added */
  443.     )
  444.     {
  445.     struct sockaddr_in      destSock;  /* destination socket */
  446.     struct sockaddr_in      gateSock;  /* gateway socket */
  447.     struct sockaddr_in      maskSock;  /* destination  mask socket */
  448.     if ((mask != 0) && (flags & RTF_HOST)) 
  449. {
  450.         return (ERROR);
  451. }
  452.     bzero ((caddr_t)  & destSock, sizeof (destSock));
  453.     bzero ((caddr_t)  & gateSock, sizeof (gateSock));
  454.     bzero ((caddr_t)  & maskSock, sizeof (maskSock));
  455.     destSock.sin_addr.s_addr = (mask != 0) ?  (destIp & mask) :
  456.        destIp;
  457.     gateSock.sin_addr.s_addr = gateIp;
  458.     destSock.sin_family = gateSock.sin_family = maskSock.sin_family = AF_INET;
  459.     destSock.sin_len = gateSock.sin_len = maskSock.sin_len = sizeof (destSock);
  460.     /* set gateway flag if not a direct route */
  461.     if (ifa_ifwithaddr ((struct sockaddr *) & gateSock) == NULL)
  462.         flags |= RTF_GATEWAY;
  463.     if (mask == 0xffffffff)
  464.         flags |= RTF_GATEWAY;
  465.     maskSock.sin_addr.s_addr = mask;
  466.     TOS_SET (&maskSock, 0x1f);
  467.     in_socktrim (&maskSock);
  468.     TOS_SET (&destSock, tos);
  469.     RT_PROTO_SET (&destSock, proto);
  470.     /*
  471.      * Add the static route using the default weight value. Report the
  472.      * change using both routing socket messages and direct callbacks.
  473.      */
  474.     return (rtrequestAddEqui ((struct sockaddr*) &destSock,
  475.       (struct sockaddr*) &maskSock,
  476.       (struct sockaddr*) &gateSock, flags, proto, 0,
  477.       TRUE, TRUE, (ROUTE_ENTRY**)ppRtEntry));
  478.     }
  479. /*******************************************************************************
  480. *
  481. * mRouteEntryAdd - add a protocol-specific route to the routing table 
  482. *
  483. * For a single destination <destIp>, this routine can add additional 
  484. * routes <gateIp> to the routing table.  The different routes are 
  485. * distinguished by the gateway, a destination mask <mask>, 
  486. * the type of service <tos> and associated flag values <flags>.  
  487. * Valid values for <flags> are 0, RTF_HOST, RTF_CLONING (defined in net/route.h).
  488. * The <proto> parameter identifies the protocol that generated this route.  
  489. * Values for <proto> may be found in m2Lib.h.  The <tos> parameter takes one of 
  490. * following values (defined in netinet/ip.h): 
  491. *     IPTOS_LOWDELAY
  492. *     IPTOS_THROUGHPUT
  493. *     IPTOS_RELIABILITY
  494. *     IPTOS_MINCOST
  495. *
  496. * RETURNS: OK or ERROR.
  497. *
  498. * SEE ALSO: m2Lib.h, mRouteAdd(), mRouteDelete()
  499. */
  500. STATUS mRouteEntryAdd 
  501.     (
  502.     long             destIp,    /* destination address, network order */
  503.     long             gateIp,    /* gateway address, network order */
  504.     long             mask,      /* mask for destination, network order */
  505.     int              tos,       /* type of service */
  506.     int              flags,     /* route flags */ 
  507.     int              proto      /* routing protocol */
  508.     )
  509.     {
  510.     return (mPrivRouteEntryAdd (destIp, gateIp, mask, tos, flags, proto,
  511.                                 NULL));
  512.     }
  513. /*******************************************************************************
  514. *
  515. * mRouteEntryDelete - delete route from the routing table 
  516. *
  517. * This routine deletes a protocol-specific route from the routing 
  518. * table.  Specify the route using a destination <pDest>, a gateway <pGate>, 
  519. * a destination mask <mask>, the type of service <tos>, a <flags> value, 
  520. * and a <proto> value that identifies the routing protocol that added the 
  521. * route.  The valid values for <flags> are 0 and RTF_HOST  (defined 
  522. * in net/route.h).  Values for <proto> may be found in m2Lib.h and <tos> 
  523. * is one of the following values defined in netinet/ip.h:
  524. *
  525. *     IPTOS_LOWDELA
  526. *     IPTOS_THROUGHPU
  527. *     IPTOS_RELIABILIT
  528. *     IPTOS_MINCOST
  529. *
  530. * An existing route is deleted only if it is owned by the protocol specified 
  531. * by <proto>.
  532. *
  533. * RETURNS: OK or ERROR.
  534. *
  535. */
  536. STATUS mRouteEntryDelete
  537.     (
  538.     long             destIp,    /* destination address, network order */
  539.     long             gateIp,    /* gateway address, network order */
  540.     long             mask,      /* mask for destination, network order */
  541.     int              tos,       /* type of service */
  542.     int              flags,     /* route flags */ 
  543.     int              proto      /* routing protocol */
  544.     )
  545.     {
  546.     struct sockaddr_in      destSock;  /* destination socket */
  547.     struct sockaddr_in      gateSock;  /* gateway socket */
  548.     struct sockaddr_in      maskSock;  /* destination  mask socket */
  549.     if ((mask != 0) && (flags & RTF_HOST)) 
  550. {
  551.         return (ERROR);
  552. }
  553.     bzero ((caddr_t)  & destSock, sizeof (destSock));
  554.     bzero ((caddr_t)  & gateSock, sizeof (gateSock));
  555.     bzero ((caddr_t)  & maskSock, sizeof (maskSock));
  556.     destSock.sin_addr.s_addr = (mask != 0) ?  (destIp & mask) :
  557.        destIp;
  558.     gateSock.sin_addr.s_addr = gateIp;
  559.     destSock.sin_family = gateSock.sin_family = maskSock.sin_family = AF_INET;
  560.     destSock.sin_len = gateSock.sin_len = maskSock.sin_len = sizeof (destSock);
  561.     /* set gateway flag if not a direct route */
  562.     if (ifa_ifwithaddr ((struct sockaddr *) & gateSock) == NULL)
  563.         flags |= RTF_GATEWAY;
  564.     maskSock.sin_addr.s_addr = mask;
  565.     TOS_SET (&maskSock, 0x1f);
  566.     in_socktrim (&maskSock);
  567.     if (mask == 0xffffffff)
  568.         flags |= RTF_GATEWAY;
  569.     TOS_SET (&destSock, tos);
  570.     /*
  571.      * Remove the matching route. Report the change using
  572.      * both routing socket messages and direct callbacks.
  573.      */
  574.     /* check required to support: mRouteDelete() with routing extensions */
  575.     if(gateIp==0)
  576.         {
  577.         return(rtrequestDelEqui((struct sockaddr*) &destSock,
  578.                                 (struct sockaddr*) &maskSock,
  579.                                 0, flags, proto, TRUE, TRUE, NULL));
  580.         }
  581.     else
  582.         {
  583.         return(rtrequestDelEqui((struct sockaddr*) &destSock,
  584.                                 (struct sockaddr*) &maskSock,
  585.                                 (struct sockaddr*) &gateSock, flags, proto,
  586.                                 TRUE, TRUE, NULL));
  587.         }
  588.     }
  589. /*******************************************************************************
  590. *
  591. * mPrivRouteEntryDelete - delete a held route from the routing table 
  592. *
  593. * This routine deletes a protocol-specific route from the routing 
  594. * table when mPrivRouteEntryAdd retained a copy of the new route
  595. * with the <pRoute> pointer. The routine calls rtfree to adjust the
  596. * reference count then passes the remaining arguments to the 
  597. * mRouteEntryDelete routine to remove the route. 
  598. *
  599. * RETURNS: OK or ERROR.
  600. *
  601. * NOMANUAL
  602. */
  603. STATUS mPrivRouteEntryDelete
  604.     (
  605.     long             destIp,    /* destination address, network order */
  606.     long             gateIp,    /* gateway address, network order */
  607.     long             mask,      /* mask for destination, network order */
  608.     int              tos,       /* type of service */
  609.     int              flags,     /* route flags */ 
  610.     int              proto,     /* routing protocol */
  611.     struct rtentry * pRoute
  612.     )
  613.     {
  614.     int  s;
  615.     STATUS  result;
  616.     s = splnet ();
  617.     if (pRoute)
  618.         rtfree (pRoute);
  619.     result = mRouteEntryDelete (destIp, gateIp, mask, tos, flags, proto);
  620.     splx (s);
  621.     return (result);
  622.     }
  623. /*******************************************************************************
  624. *
  625. * mRouteDelete - delete a route from the routing table 
  626. *
  627. * This routine deletes a routing table entry as specified by the
  628. * destination, <pDest>, the destination mask, <mask>, and type of service,
  629. * <tos>.  The <tos> values are as defined in the reference entry for
  630. * mRouteAdd().
  631. *
  632. * EXAMPLE
  633. * Consider the case of a route added in the following manner:
  634. * .CS
  635. *     -> mRouteAdd ("90.0.0.0", "91.0.0.3", 0xffffff00, 0, 0);
  636. * .CE
  637. * To delete a route that was added in the above manner, call mRouteDelete()
  638. * as follows:
  639. * .CS
  640. *     -> mRouteDelete("90.0.0.0", 0xffffff00, 0);
  641. * .CE
  642. *
  643. * If the netmask and or type of service do not match, the route
  644. * is not deleted.
  645. *
  646. * The value of <flags> should be RTF_HOST for host routes, RTF_CLONING for
  647. * routes which need to be cloned, and 0 in all other cases.
  648. *
  649. * RETURNS: OK or ERROR.  
  650. *
  651. * SEE ALSO: mRouteAdd()
  652. */
  653. STATUS mRouteDelete
  654.     (
  655.     char *           pDest,    /* destination address */
  656.     long             mask,     /* mask for destination */
  657.     int              tos,      /* type of service */
  658.     int              flags     /* either 0 or RTF_HOST */
  659.     )
  660.     {
  661.     struct sockaddr_in      destSock;  /* destination socket */
  662.     struct sockaddr_in      maskSock;  /* destination  mask socket */
  663.     if ((mask != 0) && (flags & RTF_HOST)) 
  664. {
  665.         return (ERROR);
  666. }
  667.     bzero ((caddr_t)  & destSock, sizeof (destSock));
  668.     bzero ((caddr_t)  & maskSock, sizeof (maskSock));
  669.     if ((destSock.sin_addr.s_addr = (long) inet_addr (pDest)) == ERROR)
  670.         {
  671.         return (ERROR);
  672.         }
  673.     mask = htonl (mask);
  674.     if (mask != 0)
  675.         destSock.sin_addr.s_addr &= mask;
  676.     destSock.sin_family  = maskSock.sin_family = AF_INET;
  677.     destSock.sin_len =  maskSock.sin_len = sizeof (destSock);
  678.     maskSock.sin_addr.s_addr = mask;
  679.     TOS_SET (&maskSock, 0x1f);
  680.     in_socktrim (&maskSock);
  681.     TOS_SET (&destSock, tos);
  682.     /*
  683.      * Remove the matching route. Report the change using
  684.      * both routing socket messages and direct callbacks.
  685.      */
  686.     return(rtrequestDelEqui((struct sockaddr*) &destSock,
  687.                             (struct sockaddr*) &maskSock, NULL, flags,
  688.                             M2_ipRouteProto_other, TRUE, TRUE, NULL));
  689.     }