📄 routelib.c
字号:
/* routeLib.c - network route manipulation library *//* Copyright 1984 - 2001 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------03c,10may02,kbw making man page edits03b,07dec01,rae merge from synth ver 03h, (SPR #69690)03a,15oct01,rae merge from truestack ver 03g, base 02z (update)02z,16mar99,spm recovered orphaned code from tor1_0_1.sens1_1 (SPR #25770)02y,29sep98,spm added mPrivRouteEntryDelete for held kernel routes (SPR #9374)02x,14dec97,jdi doc: cleanup.02w,05dec97,rjc added RTF_CLONING flag to mRoute routines. 02v,25oct97,kbw making minor man page fixes 02u,22aug97,rjc modifed return vals for mRoute* calls.02t,08aug97,vin fixed SPR9121.02s,04aug97,kwb fixed man page problems found in beta review02r,07jul97,rjc route proto field moved to dest sockaddr.02q,30jun97,rjc restored old rtentry size, added socktrim.02p,04jun97,rjc fixed route proto priority glitches.02o,03jun97,rjc fixed mask and RTF_HOST combinations.02n,29may97,rjc fixed byte orders in mRoute routines02m,09may97,rjc fixed mRoute{*} man pages02l,30apr97,kbw fiddle man page text02k,28apr97,gnn fixed some of the documentation.02j,20apr97,kbw fixed minor format errors in man page text02i,15apr97,kbw fixed minor format errors in man page text02h,14apr97,gnn added documentation for new mRoute calls.02g,11apr97,rjc added routing interface support, routing priority stuff.02f,13feb97,rjc added masking of destination in mRoute--- stuff.02e,13feb97,rjc updated mRouteEntryAdd/delete.02d,07feb97,rjc newer versions of route add/delete etc.02c,05feb97,rjc new versions of route add/delete etc.02b,18jan95,jdi doc tweaks for routeNetAdd().02a,08jul94,dzb Added routeNetAdd() for adding subnet routes (SPR #3395).01z,14feb94,elh made rtEntryFill global and NOMANUAL.01y,11aug93,jmm Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h01x,20jan93,jdi documentation cleanup for 5.1.01w,28jul92,elh moved routeShow to netShow.c01v,26may92,rrr the tree shuffle -changed includes to have absolute path from h/01u,01mar92,elh added routeCmd.01t,16dec91,gae added includes for ANSI.01s,02dec91,elh moved error handling to lower level (sys_socket).01r,26nov91,llk changed include of errnoLib.h to errno.h.01q,12nov91,elh changed routes to interfaces to be direct routes, made routeChange set errno (rtioctl returns errno instead of -1)01p,07nov91,elh changed inet_ntoa to inet_ntoa_b so memory isn't lost.01o,04oct91,rrr passed through the ansification filter -changed functions to ansi style -changed includes to have absolute path from h/ -changed VOID to void -changed copyright notice01n,21may91,jdi documentation tweaks.01m,05apr91,jdi documentation -- removed header parens and x-ref numbers; doc review by dnw.01l,22feb91,jaa documentation cleanup.01k,10aug90,kdl added forward declarations for functions returning void.01j,07may90,hjb added documentation to routeAdd about adding the default route, explanation of the route specific flags, and made the output more unix compatible.01i,07mar90,jdi documentation cleanup.01h,02sep89,hjb fixed a big in routeShow() - instead of using RTHASHSIZ we now use the global rthashsize which is always set to the correct value in route.c. (When GATEWAY is undefined, the route.h include file defines RTHASHSIZ to smaller value.)01g,07aug89,gae fixed in_lnaof call in routeEntryFill for SPARC.01g,20aug88,gae documentation.01f,30may88,dnw changed to v4 names.01e,28may88,dnw replace call to netGetInetAddr with calls to remGetHostByName and inet_addr.01d,18feb88,dnw changed to handle subnet masks correctly (by calling in_lnaof() instead of inet_lnaof() in routeChange).01c,16nov87,jlf documentation01b,16nov87,llk documentation.01a,01nov87,llk written.*//*DESCRIPTIONThis library contains the routines for inspecting the routing table,as well as routines for adding and deleting routes from that table. If you do not configure VxWorks to include a routing protocol, such as RIP or OSPF, you can use these routines to maintain the routing tables manually. To use this feature, include the following component:INCLUDE_NETWRS_ROUTELIBINCLUDE FILES: routeLib.hSEE ALSO: hostLib*/#include "vxWorks.h"#include "net/mbuf.h"#include "sys/socket.h"#include "sockLib.h"#include "unistd.h"#include "net/if.h"#include "net/route.h"#include "netinet/in.h"#include "sys/ioctl.h"#include "inetLib.h"#include "errno.h"#include "hostLib.h"#include "stdio.h"#include "ioLib.h"#include "routeLib.h"#include "m2Lib.h"#include "routeEnhLib.h"#ifdef VIRTUAL_STACK#include "netinet/vsLib.h"#endif /* VIRTUAL_STACK *//* forward static functions */static STATUS routeChange (char *destination, char *gateway, int ioctlCmd);void routeEntryFill (struct ortentry *pRoute, int destInetAddr, int gateInetAddr, BOOL hostAddr);/********************************************************************************* routeAdd - add a route** This routine adds gateways to the network routing tables.* It is called from a VxWorks machine that needs* to establish a gateway to a destination network (or machine).** You can specify both <destination> and <gateway> in standard Internet* address format (for example, 90.0.0.2), or you can specify them using* their host names, as specified with hostAdd().** This routine can be used to add multiple routes to the same destination* differing by the gateway.** EXAMPLE* Consider the following example:* .CS* -> routeAdd "90.0.0.0", "gate"* .CE* This call tells VxWorks that the machine with the host name "gate" is * the gateway to network 90.0.0.0. The host "gate" must already have * been created by hostAdd().** Consider the following example:* .CS* -> routeAdd "90.0.0.0", "91.0.0.3"* .CE* This call tells VxWorks that the machine with the Internet * address 91.0.0.3 is the gateway to network 90.0.0.0.** Consider the following example:* .CS* -> routeAdd "destination", "gate"* .CE* This call tells VxWorks that the machine with the host name "gate" is * the gateway to the machine named "destination". The host names "gate" and * "destination" must already have been created by hostAdd().** Consider the following example:* .CS* -> routeAdd "0", "gate"* .CE* This call tells VxWorks that the machine with the host name "gate" is * the default gateway. The host "gate" must already have been created * by hostAdd(). A default gateway is where Internet Protocol (IP) * datagrams are routed when there is no specific routing table entry * available for the destination IP network or host.** RETURNS: OK or ERROR.*/STATUS routeAdd ( char *destination, /* inet addr or name of route destination */ char *gateway /* inet addr or name of gateway to destination */ ) { return (routeChange (destination, gateway, (int) SIOCADDRT)); }/********************************************************************************* routeNetAdd - add a route to a destination that is a network** This routine is equivalent to routeAdd(), except that the destination* address is assumed to be a network. This is useful for adding a route* to a sub-network that is not on the same overall network as the* local network.* * This routine can be used to add multiple routes to the same destination* differing by the gateway.** RETURNS: OK or ERROR.*/STATUS routeNetAdd ( char *destination, /* inet addr or name of network destination */ char *gateway /* inet addr or name of gateway to destination */ ) { int destInetAddr; /* destination internet adrs */ int gateInetAddr; /* gateway internet adrs */ struct ortentry route; /* route entry */ int sock; /* socket */ int status; /* return status */ if ((((destInetAddr = hostGetByName (destination)) == ERROR) && ((destInetAddr = (int) inet_addr (destination)) == ERROR)) || (((gateInetAddr = hostGetByName (gateway)) == ERROR) && ((gateInetAddr = (int) inet_addr (gateway)) == ERROR))) { return (ERROR); } routeEntryFill (&route, destInetAddr, gateInetAddr, FALSE); /* add the route */ sock = socket (AF_INET, SOCK_RAW, 0); status = ioctl (sock, SIOCADDRT, (int) &route); (void) close (sock); return (status); }/********************************************************************************* routeDelete - delete a route** This routine deletes a specified route from the network routing tables.** RETURNS: OK or ERROR.** SEE ALSO: routeAdd()*/STATUS routeDelete ( char *destination, /* inet addr or name of route destination */ char *gateway /* inet addr or name of gateway to destination */ ) { return (routeChange (destination, gateway, (int) SIOCDELRT)); }/********************************************************************************* routeChange - change the routing tables** This routine makes changes to the routing tables by using an ioctl() call* to add or delete a route.** This is a local routine which should not be used directly.* Instead, routeAdd() and routeDelete() should be used as interfaces* to this routine.** The <destination> and <gateway> parameters may be specified either by their* Internet addresses in standard internet address format (e.g., "90.0.0.2"),* or by their names (their host names) which have already been added to the* remote host table (with hostAdd()).** RETURNS: OK or ERROR.** SEE ALSO: routeAdd()*/LOCAL STATUS routeChange ( char *destination, /* inet address or name of route destination */ char *gateway, /* inet address or name of gateway to destination */ int ioctlCmd /* addition or deletion of a route */ ) { int destInetAddr; /* destination internet adrs */ int gateInetAddr; /* gateway internet adrs */ if ((((destInetAddr = hostGetByName (destination)) == ERROR) && ((destInetAddr = (int) inet_addr (destination)) == ERROR)) || (((gateInetAddr = hostGetByName (gateway)) == ERROR) && ((gateInetAddr = (int) inet_addr (gateway)) == ERROR))) { return (ERROR); } return (routeCmd (destInetAddr, gateInetAddr, ioctlCmd)); }/********************************************************************************* routeCmd - change the routing tables** routeCmd is the same as routeChange except it provides a non-string* interface.** NOMANUAL*/STATUS routeCmd ( int destInetAddr, /* destination adrs */ int gateInetAddr, /* gateway adrs */ int ioctlCmd /* route command */ ) { struct ortentry route; /* route entry */ int sock; /* socket */ int status; /* return status */ routeEntryFill (&route, destInetAddr, gateInetAddr, TRUE); /* add or delete the route */ sock = socket (AF_INET, SOCK_RAW, 0); if (sock == ERROR) return (ERROR); status = ioctl (sock, ioctlCmd, (int) &route); (void) close (sock); return (status); }/********************************************************************************* routeEntryFill - fill in a route entry (struct ortentry)** Fills in a route entry (struct ortentry) with destination and* gateway information.** RETURNS: N/A.** NOMANUAL*/void routeEntryFill ( struct ortentry *pRoute, /* pointer to route entry */ int destInetAddr, /* destination internet address */ int gateInetAddr, /* gateway internet address */ BOOL hostAddr /* check host part of address */ ) { struct sockaddr_in *sin; struct in_addr di; /* zero out route entry */ bzero ((caddr_t) pRoute, sizeof (struct ortentry)); /* zero out sockaddr_in, fill in destination info */ /* XXX rt_dst really a struct sockaddr */ sin = (struct sockaddr_in *) &(pRoute->rt_dst); bzero ((caddr_t) sin, sizeof (struct sockaddr_in)); sin->sin_family = AF_INET; sin->sin_len = sizeof (struct sockaddr_in); sin->sin_addr.s_addr = (u_long)destInetAddr; /* zero out sockaddr_in, fill in gateway info */ /* XXX rt_gateway really a struct sockaddr */ sin = (struct sockaddr_in *) &(pRoute->rt_gateway); bzero ((caddr_t) sin, sizeof (struct sockaddr_in)); sin->sin_family = AF_INET; sin->sin_len = sizeof (struct sockaddr_in); sin->sin_addr.s_addr = (u_long)gateInetAddr; pRoute->rt_flags = RTF_UP; di.s_addr = (u_long)destInetAddr; /* * if host part of address filled in, then it's a host route */ if ((hostAddr) && (in_lnaof (di) != INADDR_ANY)) pRoute->rt_flags |= RTF_HOST; /* * if the gateway addr is not a local interface, * then it is an indirect route - send it to a gateway. */ if (ifa_ifwithaddr (&(pRoute->rt_gateway)) == NULL) pRoute->rt_flags |= RTF_GATEWAY; }/********************************************************************************* mRouteAdd - add multiple routes to the same destination ** This routine is similar to routeAdd(), except that you can use multiple* mRouteAdd() calls to add multiple routes to the same location. Use * <pDest> to specify the destination, <pGate> to specify the gateway to* that destination, <mask> to specify destination mask, and <tos> to specify* the type of service. For <tos>, netinet/ip.h defines the following
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -