home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR3 / KA9Q212.ZIP / IPCMD.C < prev    next >
C/C++ Source or Header  |  1993-07-16  |  8KB  |  348 lines

  1. /* IP-related user commands
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4.  
  5. /****************************************************************************
  6. *    $Id: ipcmd.c 1.3 93/07/16 11:45:42 ROOT_DOS Exp $
  7. *    14 Jun 93    1.2        GT    Fix warnings.                                    *
  8. ****************************************************************************/
  9.  
  10. #include <stdio.h>
  11. #include "global.h"
  12. #include "mbuf.h"
  13. #include "internet.h"
  14. #include "timer.h"
  15. #include "netuser.h"
  16. #include "iface.h"
  17. #include "ip.h"
  18. #include "cmdparse.h"
  19. #include "commands.h"
  20. #include "rip.h"
  21.  
  22. int32 Ip_addr;
  23.  
  24. static int doadd __ARGS((int argc,char *argv[],void *p));
  25. static int dodrop __ARGS((int argc,char *argv[],void *p));
  26. static int doflush __ARGS((int argc,char *argv[],void *p));
  27. static int doipaddr __ARGS((int argc,char *argv[],void *p));
  28. static int doipstat __ARGS((int argc,char *argv[],void *p));
  29. static int dolook __ARGS((int argc,char *argv[],void *p));
  30. static int dortimer __ARGS((int argc,char *argv[],void *p));
  31. static int dottl __ARGS((int argc,char *argv[],void *p));
  32. static int dumproute __ARGS((struct route *rp));
  33.  
  34. static struct cmds Ipcmds[] = {
  35.     { "address",    doipaddr,    0,    0, NULLCHAR },
  36. #ifdef FILTER
  37.     { "filter",    doipfilter,    0,    3,
  38.         "ip filter <iface> <action> [<action dependent>]" },
  39. #endif
  40.     { "rtimer",    dortimer,    0,    0, NULLCHAR },
  41.     { "status",    doipstat,    0,    0, NULLCHAR },
  42.     { "ttl",        dottl,        0,    0, NULLCHAR },
  43.     { NULLCHAR },
  44. };
  45. /* "route" subcommands */
  46. static struct cmds Rtcmds[] = {
  47.     { "add",        doadd,        0,    3,
  48.     "route add <dest addr>[/<bits>] <if name> [gateway] [metric]" },
  49.  
  50.     { "addprivate",    doadd,        0,    3,
  51.     "route addprivate <dest addr>[/<bits>] <if name> [gateway] [metric]" },
  52.  
  53.     { "drop",        dodrop,        0,    2,
  54.     "route drop <dest addr>[/<bits>]" },
  55.  
  56.     { "flush",    doflush,    0,    0,
  57.     NULLCHAR },
  58.  
  59.     { "lookup",    dolook,        0,    2,
  60.     "route lookup <dest addr>" },
  61.  
  62.     { NULLCHAR },
  63. };
  64.  
  65. int
  66. doip(argc,argv,p)
  67. int argc;
  68. char *argv[];
  69. void *p;
  70. {
  71.     return subcmd(Ipcmds,argc,argv,p);
  72. }
  73. static int
  74. doipaddr(argc,argv,p)
  75. int argc;
  76. char *argv[];
  77. void *p;
  78. {
  79.     int32 n;
  80.  
  81.     if(argc < 2) {
  82.         tprintf("%s\n",inet_ntoa(Ip_addr));
  83.     } else if((n = resolve(argv[1])) == 0){
  84.         tprintf(Badhost,argv[1]);
  85.         return 1;
  86.     } else
  87.         Ip_addr = n;
  88.     return 0;
  89. }
  90. static int
  91. dortimer(argc,argv,p)
  92. int argc;
  93. char *argv[];
  94. void *p;
  95. {
  96.     return setlong(&ipReasmTimeout,"IP reasm timeout (sec)",argc,argv);
  97. }
  98. static int
  99. dottl(argc,argv,p)
  100. int argc;
  101. char *argv[];
  102. void *p;
  103. {
  104.     return setlong(&ipDefaultTTL,"IP Time-to-live",argc,argv);
  105. }
  106.  
  107.  
  108. /* Display and/or manipulate routing table */
  109. int
  110. doroute(argc,argv,p)
  111. int argc;
  112. char *argv[];
  113. void *p;
  114. {
  115.     register int i,bits;
  116.     register struct route *rp;
  117.  
  118.     if(argc >= 2)
  119.         return subcmd(Rtcmds,argc,argv,p);
  120.  
  121.     /* Dump IP routing table
  122.      * Dest            Len Interface    Gateway          Use
  123.      * 192.001.002.003 32  sl0          192.002.003.004  0
  124.      */
  125.     tprintf(
  126. "Dest            Len Interface    Gateway          Metric  P Timer  Use\n");
  127.  
  128.     for(bits=31;bits>=0;bits--){
  129.         for(i=0;i<HASHMOD;i++){
  130.             for(rp = Routes[bits][i];rp != NULLROUTE;rp = rp->next){
  131.                 if(dumproute(rp) == EOF)
  132.                     return 0;
  133.             }
  134.         }
  135.     }
  136.     if(R_default.iface != NULLIF)
  137.         dumproute(&R_default);
  138.  
  139.     return 0;
  140. }
  141. /* Add an entry to the routing table
  142.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  143.  */
  144. static int
  145. doadd(argc,argv,p)
  146. int argc;
  147. char *argv[];
  148. void *p;
  149. {
  150.     struct iface *ifp;
  151.     int32 dest,gateway;
  152.     unsigned bits;
  153.     char *bitp;
  154.     int32 metric;
  155.     char private;
  156.  
  157.     if(strncmp(argv[0],"addp",4) == 0)
  158.         private = 1;
  159.     else
  160.         private = 0;
  161.     if(strcmp(argv[1],"default") == 0){
  162.         dest = 0;
  163.         bits = 0;
  164.     } else {
  165.         /* If IP address is followed by an optional slash and
  166.          * a length field, (e.g., 128.96/16) get it;
  167.          * otherwise assume a full 32-bit address
  168.          */
  169.         if((bitp = strchr(argv[1],'/')) != NULLCHAR){
  170.             /* Terminate address token for resolve() call */
  171.             *bitp++ = '\0';
  172.             bits = atoi(bitp);
  173.         } else
  174.             bits = 32;
  175.  
  176.         if((dest = resolve(argv[1])) == 0){
  177.             tprintf(Badhost,argv[1]);
  178.             return 1;
  179.         }
  180.     }
  181.     if((ifp = if_lookup(argv[2])) == NULLIF){
  182.         tprintf("Interface \"%s\" unknown\n",argv[2]);
  183.         return 1;
  184.     }
  185.     if(argc > 3){
  186.         if((gateway = resolve(argv[3])) == 0){
  187.             tprintf(Badhost,argv[3]);
  188.             return 1;
  189.         }
  190.     } else {
  191.         gateway = 0;
  192.     }
  193.     if (argc > 4)
  194.         metric = atol(argv[4]);
  195.     else
  196.         metric = 1;
  197.  
  198.     if(rt_add(dest,bits,gateway,ifp,metric,0,private) == NULLROUTE)
  199.         tprintf("Can't add route\n");
  200.     return 0;
  201. }
  202. /* Drop an entry from the routing table
  203.  * E.g., "drop 128.96/16
  204.  */
  205. static int
  206. dodrop(argc,argv,p)
  207. int argc;
  208. char *argv[];
  209. void *p;
  210. {
  211.     char *bitp;
  212.     unsigned bits;
  213.     int32 n;
  214.  
  215.     if(strcmp(argv[1],"default") == 0){
  216.         n = 0;
  217.         bits = 0;
  218.     } else {
  219.         /* If IP address is followed by an optional slash and length field,
  220.          * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  221.          */
  222.         if((bitp = strchr(argv[1],'/')) != NULLCHAR){
  223.             /* Terminate address token for resolve() call */
  224.             *bitp++ = '\0';
  225.             bits = atoi(bitp);
  226.         } else
  227.             bits = 32;
  228.  
  229.         if((n = resolve(argv[1])) == 0){
  230.             tprintf(Badhost,argv[1]);
  231.             return 1;
  232.         }
  233.     }
  234.     return rt_drop(n,bits);
  235. }
  236. /* Force a timeout on all temporary routes */
  237. static int
  238. doflush(argc,argv,p)
  239. int argc;
  240. char *argv[];
  241. void *p;
  242. {
  243.     register struct route *rp;
  244.     struct route *rptmp;
  245.     int i,j;
  246.     
  247.     if(R_default.timer.state == TIMER_RUN){
  248.         rt_drop(0,0);    /* Drop default route */
  249.     }
  250.     for(i=0;i<HASHMOD;i++){
  251.         for(j=0;j<32;j++){
  252.             for(rp = Routes[j][i];rp != NULLROUTE;rp = rptmp){
  253.                 rptmp = rp->next;
  254.                 if(rp->timer.state == TIMER_RUN){
  255.                     rt_drop(rp->target,rp->bits);
  256.                 }
  257.             }
  258.         }
  259.     }
  260.     return 0;
  261. }
  262. /* Dump a routing table entry */
  263. static int
  264. dumproute(rp)
  265. register struct route *rp;
  266. {
  267.     char *cp;
  268.  
  269.     if(rp->target != 0)
  270.         cp = inet_ntoa(rp->target);
  271.     else
  272.         cp = "default";
  273.     tprintf("%-16s",cp);
  274.     tprintf("%-4u",rp->bits);
  275.     tprintf("%-13s",rp->iface->name);
  276.     if(rp->gateway != 0)
  277.         cp = inet_ntoa(rp->gateway);
  278.     else
  279.         cp = "";
  280.     tprintf("%-17s",cp);
  281.     tprintf("%-8lu",rp->metric);
  282.     tprintf("%c ",(rp->flags & RTPRIVATE) ? 'P' : ' ');
  283.     tprintf("%-7lu",
  284.      read_timer(&rp->timer) / 1000L);
  285.     return tprintf("%lu\n",rp->uses);
  286. }
  287.  
  288. static int
  289. dolook(argc,argv,p)
  290. int argc;
  291. char *argv[];
  292. void *p;
  293. {
  294.     struct route *rp;
  295.     int32 addr;
  296.  
  297.     addr = resolve(argv[1]);
  298.     if(addr == 0){
  299.         tprintf("Host %s unknown\n",argv[1]);
  300.         return 1;
  301.     }
  302.     if((rp = rt_lookup(addr)) == NULLROUTE){
  303.         tprintf("Host %s (%s) unreachable\n",argv[1],inet_ntoa(addr));
  304.         return 1;
  305.     }
  306.     dumproute(rp);
  307.     return 0;
  308. }
  309.  
  310. static int
  311. doipstat(argc,argv,p)
  312. int argc;
  313. char *argv[];
  314. void *p;
  315. {
  316.     register struct reasm *rp;
  317.     register struct frag *fp;
  318.     int i;
  319.  
  320.     for(i=1;i<=NUMIPMIB;i++){
  321.         tprintf("(%2u)%-20s%10lu",i,
  322.          Ip_mib[i].name,Ip_mib[i].value.integer);
  323.         if(i % 2)
  324.             tprintf("     ");
  325.         else
  326.             tprintf("\n");
  327.     }
  328.     if((i % 2) == 0)
  329.         tprintf("\n");
  330.  
  331.     if(Reasmq != NULLREASM)
  332.         tprintf("Reassembly fragments:\n");
  333.     for(rp = Reasmq;rp != NULLREASM;rp = rp->next){
  334.         tprintf("src %s",inet_ntoa(rp->source));
  335.         tprintf(" dest %s",inet_ntoa(rp->dest));
  336.         if(tprintf(" id %u pctl %u time %lu len %u\n",
  337.          rp->id,uchar(rp->protocol),read_timer(&rp->timer),
  338.          rp->length) == EOF)
  339.             break;
  340.         for(fp = rp->fraglist;fp != NULLFRAG;fp = fp->next){
  341.             if(tprintf(" offset %u last %u\n",fp->offset,
  342.             fp->last) == EOF)
  343.                 break;
  344.         }
  345.     }
  346.     return 0;
  347. }
  348.