⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 routelib.c

📁 VXWORKS源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -