arpcmd.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:5k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* ARP commands
  2.  * Copyright 1991, Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "timer.h"
  9. #include "enet.h"
  10. #include "ax25.h"
  11. #include "arp.h"
  12. #include "netuser.h"
  13. #include "cmdparse.h"
  14. #include "commands.h"
  15. static int doarpadd(int argc,char *argv[],void *p);
  16. static int doarpdrop(int argc,char *argv[],void *p);
  17. static int doarpflush(int argc,char *argv[],void *p);
  18. static void dumparp(void);
  19. static struct cmds Arpcmds[] = {
  20. "add", doarpadd, 0, 4,
  21. "arp add <hostid> ether|ax25|netrom|arcnet <ether addr|callsign>",
  22. "drop", doarpdrop, 0, 3,
  23. "arp drop <hostid> ether|ax25|netrom|arcnet",
  24. "flush", doarpflush, 0, 0,
  25. NULL,
  26. "publish", doarpadd, 0, 4,
  27. "arp publish <hostid> ether|ax25|netrom|arcnet <ether addr|callsign>",
  28. NULL,
  29. };
  30. char *Arptypes[] = {
  31. "NET/ROM",
  32. "10 Mb Ethernet",
  33. "3 Mb Ethernet",
  34. "AX.25",
  35. "Pronet",
  36. "Chaos",
  37. "",
  38. "Arcnet",
  39. "Appletalk"
  40. };
  41. int
  42. doarp(argc,argv,p)
  43. int argc;
  44. char *argv[];
  45. void *p;
  46. {
  47. if(argc < 2){
  48. dumparp();
  49. return 0;
  50. }
  51. return subcmd(Arpcmds,argc,argv,p);
  52. }
  53. static
  54. doarpadd(argc,argv,p)
  55. int argc;
  56. char *argv[];
  57. void *p;
  58. {
  59. uint16 hardware;
  60. int32 addr;
  61. uint8 *hwaddr;
  62. struct arp_tab *ap;
  63. struct arp_type *at;
  64. int pub = 0;
  65. if(argv[0][0] == 'p') /* Is this entry published? */
  66. pub = 1;
  67. if((addr = resolve(argv[1])) == 0){
  68. printf(Badhost,argv[1]);
  69. return 1;
  70. }
  71. /* This is a kludge. It really ought to be table driven */
  72. switch(tolower(argv[2][0])){
  73. case 'n': /* Net/Rom pseudo-type */
  74. hardware = ARP_NETROM;
  75. break;
  76. case 'e': /* "ether" */
  77. hardware = ARP_ETHER;
  78. break;
  79. case 'a': /* "ax25" */
  80. switch(tolower(argv[2][1])) {
  81. case 'x':
  82. hardware = ARP_AX25;
  83. break;
  84. case 'r':
  85. hardware = ARP_ARCNET;
  86. break;
  87. default:
  88. printf("unknown hardware type "%s"n",argv[2]);
  89. return -1;
  90. }
  91. break;
  92. case 'm': /* "mac appletalk" */
  93. hardware = ARP_APPLETALK;
  94. break;
  95. default:
  96. printf("unknown hardware type "%s"n",argv[2]);
  97. return -1;
  98. }
  99. /* If an entry already exists, clear it */
  100. if((ap = arp_lookup(hardware,addr)) != NULL)
  101. arp_drop(ap);
  102. at = &Arp_type[hardware];
  103. if(at->scan == NULL){
  104. printf("Attach device firstn");
  105. return 1;
  106. }
  107. /* Allocate buffer for hardware address and fill with remaining args */
  108. hwaddr = mallocw(at->hwalen);
  109. /* Destination address */
  110. (*at->scan)(hwaddr,argv[3]);
  111. ap = arp_add(addr,hardware,hwaddr,pub); /* Put in table */
  112. free(hwaddr); /* Clean up */
  113. stop_timer(&ap->timer); /* Make entry permanent */
  114. set_timer(&ap->timer,0L);
  115. return 0;
  116. }
  117. /* Remove an ARP entry */
  118. static
  119. doarpdrop(argc,argv,p)
  120. int argc;
  121. char *argv[];
  122. void *p;
  123. {
  124. uint16 hardware;
  125. int32 addr;
  126. struct arp_tab *ap;
  127. if((addr = resolve(argv[1])) == 0){
  128. printf(Badhost,argv[1]);
  129. return 1;
  130. }
  131. /* This is a kludge. It really ought to be table driven */
  132. switch(tolower(argv[2][0])){
  133. case 'n':
  134. hardware = ARP_NETROM;
  135. break;
  136. case 'e': /* "ether" */
  137. hardware = ARP_ETHER;
  138. break;
  139. case 'a': /* "ax25" */
  140. switch(tolower(argv[2][1])) {
  141. case 'x':
  142. hardware = ARP_AX25;
  143. break;
  144. case 'r':
  145. hardware = ARP_ARCNET;
  146. break;
  147. default:
  148. hardware = 0;
  149. break;
  150. }
  151. break;
  152. case 'm': /* "mac appletalk" */
  153. hardware = ARP_APPLETALK;
  154. break;
  155. default:
  156. hardware = 0;
  157. break;
  158. }
  159. if((ap = arp_lookup(hardware,addr)) == NULL)
  160. return -1;
  161. arp_drop(ap);
  162. return 0;
  163. }
  164. /* Flush all automatic entries in the arp cache */
  165. static int
  166. doarpflush(argc,argv,p)
  167. int argc;
  168. char *argv[];
  169. void *p;
  170. {
  171. register struct arp_tab *ap;
  172. struct arp_tab *aptmp;
  173. int i;
  174. for(i=0;i<HASHMOD;i++){
  175. for(ap = Arp_tab[i];ap != NULL;ap = aptmp){
  176. aptmp = ap->next;
  177. if(dur_timer(&ap->timer) != 0)
  178. arp_drop(ap);
  179. }
  180. }
  181. return 0;
  182. }
  183. /* Dump ARP table */
  184. static void
  185. dumparp()
  186. {
  187. register int i;
  188. register struct arp_tab *ap;
  189. char e[128];
  190. printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %un",
  191.  Arp_stat.recv,Arp_stat.badtype,Arp_stat.badaddr,Arp_stat.inreq,
  192.  Arp_stat.replies,Arp_stat.outreq);
  193. printf("IP addr         Type           Time Q Addrn");
  194. for(i=0;i<HASHMOD;i++){
  195. for(ap = Arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  196. printf("%-16s",inet_ntoa(ap->ip_addr));
  197. printf("%-15s",smsg(Arptypes,NHWTYPES,ap->hardware));
  198. printf("%-5ld",read_timer(&ap->timer)/1000L);
  199. if(ap->state == ARP_PENDING)
  200. printf("%-2u",len_q(ap->pending));
  201. else
  202. printf("  ");
  203. if(ap->state == ARP_VALID){
  204. if(Arp_type[ap->hardware].format != NULL){
  205. (*Arp_type[ap->hardware].format)(e,ap->hw_addr);
  206. } else {
  207. e[0] = '';
  208. }
  209. printf("%s",e);
  210. } else {
  211. printf("[unknown]");
  212. }
  213. if(ap->pub)
  214. printf(" (published)");
  215. printf("n");
  216. }
  217. }
  218. }