📄 arplib.c
字号:
/* arpLib.c - Address Resolution Protocol (ARP) table manipulation library *//* Copyright 1984 - 2002 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------02q,10may02,kbw making man page edits02p,24apr02,rae Added note about arp flooding to arpResolve(), etc. (SPR #69412)02o,07dec01,rae merge from synth ver 02x (SPR #69889)02n,15oct01,rae merge from truestack ver 02w base 02j (SPRs 69405, 65783, etc.)02m,07feb01,spm added merge record for 30jan01 update from version 02l of tor2_0_x branch (base 02j) and fixed modification history; fixed code conventions and updated documentation; replaced printed error message with errno value02l,30jan01,ijm merged SPR# 28602 fixes: proxy ARP services are obsolete 02k,05feb99,dgp document errno values02j,16apr97,vin changed SOCK_DGRAM to SOCK_RAW as udp can be scaled out.02i,11aug93,jmm Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h02h,21sep92,jdi documentation cleanup. 02g,14aug92,elh documentation changes. 02f,11jun92,elh changed parameter to arpCmd. Moved arpShow to netShow.02e,26may92,rrr the tree shuffle -changed includes to have absolute path from h/02d,19apr92,elh added spl pair around arpFlush.02c,04apr92,elh added arpFlush.02b,03jan92,elh ansi-fied.02a,18nov91,elh major overhaul. Rewrote to comply with WRS standards and coding conventions, added error handling and documentation.01a,06jun91,jrb written.*//*DESCRIPTIONThis library provides direct access to the address translation tablemaintained by the Address Resolution Protocol (ARP). Each entry inthe table maps an Internet Protocol (IP) address to a physical hardware address. This library supports only those entries that translate between IP and Ethernet addresses. It is linked into the VxWorks image if INCLUDE_ARP is defined at the time the image is built. The underlying ARP protocol, which creates and maintains the table, is included automatically as part of the IP component.RELATED INTERFACESThe arpShow() routine (in the netShow library) displays the current contents of the ARP table.A low -evel interface to the ARP table is available with the socket-specific SIOCSARP, SIOCDARP and SIOCGARP ioctl functions.INTERNALThe structure chart for this module looks like: arpAdd arpDelete | \ / | v v | arpCmd vetherAsciiToEnetINCLUDE FILES: arpLib.hSEE ALSO: inetLib, routeLib, netShow*//* includes */#include "vxWorks.h"#include "sys/types.h"#include "sys/socket.h"#include "sys/ioctl.h"#include "net/if.h"#include "netinet/if_ether.h"#include "net/if_arp.h"#include "net/unixLib.h"#include "errno.h"#include "arpLib.h"#include "inetLib.h"#include "stdio.h"#include "string.h"#include "sockLib.h"#include "ioLib.h"#include "unistd.h"#include "hostLib.h"#include "netShow.h"#include "taskLib.h"#ifdef VIRTUAL_STACK#ifdef _WRS_VXWORKS_5_X#include "memPartLib.h"#endif /* _WRS_VXWORKS_5_X */#include "netinet/vsLib.h"#include "netinet/vsArp.h"extern void arptimer (int);#endif/* defines */#define ENET_SIZE 6 /* Ethernet address size *//* forward static functions */LOCAL STATUS etherAsciiToEnet (char * asciiAddr, u_char * retEnet);IMPORT void arptfree ();#ifndef VIRTUAL_STACKIMPORT struct llinfo_arp llinfo_arp;#endif/********************************************************************************* arpLibInit - ARP table manipulation library initialization** This routine is called during system startup if INCLUDE_ARP_API is defined. * Normally, its only purpose is to automatically link this module into the* runtime image. The virtual stack modifications extend this routine to* initialize the required variables and start the appropriate timer.** RETURNS: N/A** ERRNO: N/A** NOMANUAL*/void arpLibInit (void) {#ifdef VIRTUAL_STACK /* * Make sure arpLibInit has not been called before. This can happen * when INCLUDE_ARP_API has been included in a build. */ if (arptimerWd == NULL) { _llinfo_arp.la_next = &_llinfo_arp; _llinfo_arp.la_prev = &_llinfo_arp; arpRxmitTicks = -1; arptimerWd = wdCreate (); arptimer(myStackNum); }#endif /* VIRTUAL_STACK */ return; }/********************************************************************************* arpAdd - create or modify an ARP table entry** This routine assigns an Ethernet address to an IP address in the ARP table.* The <pHost> parameter specifies the host by name or by Internet address * using standard dotted decimal notation. The <pEther> parameter provides the * Ethernet address as six hexadecimal bytes (between 0 and ff) separated by * colons. A new entry is created for the specified host if necessary.* Otherwise, the existing entry is changed to use the given Ethernet address.** The <flags> parameter combines any of the following options: * .iP "ATF_PERM (0x04)"* Create a permanent ARP entry which will not time out.* .iP "ATF_PUBL (0x08)"* Publish this entry. The host will respond to ARP requests even if the* <pHost> parameter does not match a local IP address. This setting provides * a limited form of proxy ARP.* .iP "ATF_PROXY (0x10)"* Use a "wildcard" hardware address. The proxy server uses this setting to* support multiple proxy networks. The entry always supplies the hardware* address of the sending interface.* * EXAMPLE* Create a permanent ARP table entry for the host named "myHost" with* Ethernet address 0:80:f9:1:2:3:* .CS* arpAdd ("myHost", "0:80:f9:1:2:3", 0x4);* .CE** Assuming "myHost" has the Internet address "90.0.0.3", the following call* changes the Ethernet address to 0:80:f9:1:2:4. No additional flags are set * for that entry.* .CS* arpAdd ("90.0.0.3", "0:80:f9:1:2:4", 0);* .CE** RETURNS: OK, or ERROR if unsuccessful.** ERRNO:* S_arpLib_INVALID_ARGUMENT* S_arpLib_INVALID_HOST* S_arpLib_INVALID_ENET_ADDRESS* S_arpLib_INVALID_FLAG* or results of low-level ioctl call.*/STATUS arpAdd ( char * pHost, /* host name or IP address */ char * pEther, /* Ethernet address */ int flags /* ARP flags */ ) { struct in_addr hostAddr; /* host address */ u_char ea [ENET_SIZE]; /* Ethernet address */#ifdef VIRTUAL_STACK virtualStackIdCheck();#endif /* VIRTUAL_STACK */ if ((pHost == NULL) || (pEther == NULL)) /* validate parameters */ { errno = S_arpLib_INVALID_ARGUMENT; return (ERROR); } /* convert address from ascii */ if (((hostAddr.s_addr = inet_addr (pHost)) == ERROR) && ((hostAddr.s_addr = hostGetByName (pHost)) == ERROR)) { errno = S_arpLib_INVALID_HOST; return (ERROR); } /* convert enet from ascii */ if (etherAsciiToEnet (pEther, ea) != OK) return (ERROR); /* validate flags */ if (flags & ~(ATF_PERM | ATF_PUBL | ATF_INCOMPLETE | ATF_PROXY)) { errno = S_arpLib_INVALID_FLAG; return (ERROR); } if (arpCmd (SIOCSARP, &hostAddr, ea, &flags) == ERROR) return (ERROR); return (OK); }/********************************************************************************* arpDelete - remove an ARP table entry** This routine deletes an ARP table entry. The <pHost> parameter indicates* the target entry using the host name or Internet address.** EXAMPLE* .CS* arpDelete ("91.0.0.3")* arpDelete ("myHost")* .CE** RETURNS: OK, or ERROR if unsuccessful.** ERRNO* S_arpLib_INVALID_ARGUMENT* S_arpLib_INVALID_HOST*/STATUS arpDelete ( char * pHost /* host name or IP address */ ) { struct in_addr hostAddr; /* host address */ char addrInAscii [ INET_ADDR_LEN ]; /* IP in ascii */#ifdef VIRTUAL_STACK virtualStackIdCheck();#endif /* VIRTUAL_STACK */ if (pHost == NULL) /* validate argument */ { errno = S_arpLib_INVALID_ARGUMENT; return (ERROR); } /* convert addr from ascii */ if (((hostAddr.s_addr = inet_addr (pHost)) == ERROR) && ((hostAddr.s_addr = hostGetByName (pHost)) == ERROR)) { errno = S_arpLib_INVALID_HOST; return (ERROR); } inet_ntoa_b (hostAddr, addrInAscii); /* convert to printable fmt */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -