home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / ARP / c / arpcmd < prev    next >
Text File  |  1994-06-24  |  6KB  |  185 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <time.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "domain.h"
  8. #include "timer.h"
  9. #include "ax25.h"
  10. #include "misc.h"
  11. #include "arp.h"
  12. #include "cmdparse.h"
  13. #include "netuser.h"
  14.  
  15. extern char badhost[];
  16. extern char nospace[];
  17.  
  18. static int doarpadd(int, char **);
  19. static int doarpdrop(int, char **);
  20. static int dumparp(void);
  21.  
  22. struct cmds arpcmds[] = {
  23.         "add", doarpadd, 4,
  24.         "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  25.         "arp add failed",
  26.  
  27.         "drop", doarpdrop, 3,
  28.         "arp drop <hostid> ether|ax25|netrom",
  29.         "not in table",
  30.  
  31.         "publish", doarpadd, 4,
  32.         "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  33.         "arp add failed",
  34.  
  35.         NULLCHAR, NULLFP, 0,
  36.         "arp subcommands: add, drop, publish",
  37.         NULLCHAR, 
  38. };
  39. char *arptypes[] = {
  40.         "NET/ROM",
  41.         "10 Mb Ethernet",
  42.         "3 Mb Ethernet",
  43.         "AX.25",
  44.         "Pronet",
  45.         "Chaos",
  46.         "Arcnet",
  47.         "Appletalk"
  48. };
  49.  
  50. int doarp(int argc, char **argv)
  51. {
  52.         if(argc < 2){
  53.                 dumparp();
  54.                 return 0;
  55.         }
  56.         return subcmd(arpcmds,argc,argv);
  57. }
  58. static int doarpadd(int argc, char **argv)
  59. {
  60.         int16 hwalen,hardware,naddr;
  61.         int32 addr;
  62.         char *hwaddr;
  63.         struct arp_tab *ap;
  64.         struct arp_type *at;
  65.         int pub = 0;
  66.  
  67.         if(argv[0][0] == 'p')   /* Is this entry published? */
  68.                 pub = 1;
  69.         if((addr = resolve(argv[1])) == 0){
  70.                 cwprintf(NULL, badhost,argv[1]);
  71.                 return 1;
  72.         }
  73.         /* This is a kludge. It really ought to be table driven */
  74.         switch(tolower(argv[2][0])){
  75.         case 'n':       /* Net/Rom pseudo-type */
  76.                 hardware = ARP_NETROM;
  77.                 naddr = argc - 3 ;
  78.                 if (naddr != 1) {
  79.                         cwprintf(NULL, "No digipeaters in NET/ROM arp entries - ") ;
  80.                         cwprintf(NULL, "use netrom route add\r\n") ;
  81.                         return 1 ;
  82.                 }
  83.                 break;
  84.         case 'a':       /* "ax25" */
  85.                 hardware = ARP_AX25;
  86.                 naddr = argc - 3;
  87.                 break;
  88.         default:
  89.                 cwprintf(NULL, "unknown hardware type \"%s\"\r\n",argv[2]);
  90.                 return -1;
  91.         }
  92.         /* If an entry already exists, clear it */
  93.         if((ap = arp_lookup(hardware,addr)) != NULLARP)
  94.                 arp_drop(ap);
  95.  
  96.         at = &arp_type[hardware];
  97.         if(at->scan == NULLFP){
  98.                 cwprintf(NULL, "Attach device first\r\n");
  99.                 return 1;
  100.         }
  101.         /* Allocate buffer for hardware address and fill with remaining args */
  102.         hwalen = at->hwalen * naddr;
  103.         if((hwaddr = malloc(hwalen)) == NULLCHAR){
  104.                 cwprintf(NULL, nospace);
  105.                 return 0;
  106.         }
  107.         /* Destination address */
  108.         (*at->scan)(hwaddr,&argv[3],argc - 3);
  109.         ap = arp_add(addr,hardware,hwaddr,hwalen,pub);  /* Put in table */
  110.         free(hwaddr);                                   /* Clean up */
  111.         stop_timer(&ap->timer);                 /* Make entry permanent */
  112.         ap->timer.count = ap->timer.start = 0;
  113.         return 0;
  114. }
  115. /* Remove an ARP entry */
  116. static int doarpdrop(int argc, char **argv)
  117. {
  118.         int16 hardware;
  119.         int32 addr;
  120.         struct arp_tab *ap;
  121.  
  122.         argc = argc;
  123.  
  124.         if((addr = resolve(argv[1])) == 0){
  125.                 cwprintf(NULL, badhost,argv[1]);
  126.                 return 1;
  127.         }
  128.         /* This is a kludge. It really ought to be table driven */
  129.         switch(tolower(argv[2][0])){
  130.         case 'n':
  131.                 hardware = ARP_NETROM;
  132.                 break;
  133.         case 'a':       /* "ax25" */
  134.                 hardware = ARP_AX25;
  135.                 break;
  136.         default:
  137.                 hardware = 0;
  138.                 break;
  139.         }
  140.         if((ap = arp_lookup(hardware,addr)) == NULLARP)
  141.                 return -1;
  142.         arp_drop(ap);
  143.         return 0;       
  144. }
  145. /* Dump ARP table */
  146. static int dumparp(void)
  147. {
  148.         register int i;
  149.         extern struct arp_stat arp_stat;
  150.         register struct arp_tab *ap;
  151.         char e[128];
  152.         extern char *arptypes[];
  153.  
  154.         cwprintf(NULL, "received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\r\n",
  155.          arp_stat.recv,arp_stat.badtype,arp_stat.badaddr,arp_stat.inreq,
  156.          arp_stat.replies,arp_stat.outreq);
  157.  
  158.         cwprintf(NULL, "IP addr         Type           Time Q Addr\r\n");
  159.         for(i=0;i<ARPSIZE;i++){
  160.                 for(ap = arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  161.                         cwprintf(NULL, "%-16s",inet_ntoa(ap->ip_addr));
  162.                         cwprintf(NULL, "%-15s",arptypes[ap->hardware]);
  163.                         cwprintf(NULL, "%-5ld",ap->timer.count*(long)MSPTICK/1000);
  164.                         if(ap->state == ARP_PENDING)
  165.                                 cwprintf(NULL, "%-2u",len_q(ap->pending));
  166.                         else
  167.                                 cwprintf(NULL, "  ");
  168.                         if(ap->state == ARP_VALID){
  169.                                 if(arp_type[ap->hardware].format != NULLFP){
  170.                                         (*arp_type[ap->hardware].format)(e,ap->hw_addr);
  171.                                 } else {
  172.                                         e[0] = '\0';
  173.                                 }
  174.                                 cwprintf(NULL, "%s",e);
  175.                         } else {
  176.                                 cwprintf(NULL, "[unknown]");
  177.                         }
  178.                         if(ap->pub)
  179.                                 cwprintf(NULL, " (published)");
  180.                         cwprintf(NULL, "\r\n");
  181.                 }
  182.         }
  183.         return 0;
  184. }
  185.