home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / h / if / IP / c / ipcmd < prev    next >
Encoding:
Text File  |  1995-02-04  |  5.5 KB  |  262 lines

  1. /* IP-related user commands */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "domain.h"
  8. #include "internet.h"
  9. #include "timer.h"
  10. #include "netuser.h"
  11. #include "iface.h"
  12. #include "ip.h"
  13. #include "cmdparse.h"
  14. #include "icmp.h"
  15. #include "misc.h"
  16.  
  17. extern char badhost[];
  18. struct cmds ipcmds[] = {
  19.   "address",      doipaddr,       0,      NULLCHAR,       NULLCHAR,
  20.   "status",       doipstat,       0,      NULLCHAR,       NULLCHAR,
  21.   "ttl",          dottl,          0,      NULLCHAR,       NULLCHAR,
  22.   NULLCHAR,       NULLFP,         0,
  23.   "ip subcommands: address status ttl",   NULLCHAR,
  24. };
  25.  
  26.  
  27. int doip(int argc, char **argv)
  28. {
  29.   return subcmd(ipcmds,argc,argv);
  30. }
  31.  
  32.  
  33. int doipaddr(int argc, char **argv)
  34. {
  35.   int32 n;
  36.  
  37.   if (argc < 2)
  38.   {
  39.     cwprintf(NULL, "%s\r\n",ntoa(ip_addr));
  40.   }
  41.   else if ((n = resolve(argv[1])) == 0)
  42.   {
  43.     cwprintf(NULL, badhost,argv[1]);
  44.     return 1;
  45.   }
  46.   else
  47.       ip_addr = n;
  48.   return 0;
  49. }
  50.  
  51.  
  52. int dottl(int argc, char **argv)
  53. {
  54.   if (argc < 2)
  55.     cwprintf(NULL, "%u\r\n",uchar(ip_ttl));
  56.   else
  57.       ip_ttl = atoi(argv[1]);
  58.   return 0;
  59. }
  60.  
  61. /* "route" subcommands */
  62. static struct cmds rtcmds[] = {
  63.   "add", doadd, 3,
  64.   "route add <dest addr>[/<bits>] <if name> [gateway] [metric]",
  65.   "Add failed",
  66.  
  67.   "drop", dodrop, 2,
  68.   "route drop <dest addr>[/<bits>]",
  69.   "Not in table",
  70.  
  71.   NULLCHAR, NULLFP, 0,
  72.   "route subcommands: add, drop",
  73.   NULLCHAR, 
  74. };
  75.  
  76. /* Display and/or manipulate routing table */
  77. int doroute(int argc, char **argv)
  78. {
  79.   if (argc < 2)
  80.   {
  81.     dumproute();
  82.     return 0;
  83.   }
  84.   return subcmd(rtcmds,argc,argv);
  85. }
  86. /* Add an entry to the routing table
  87.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  88.  */
  89. int doadd(int argc, char **argv)
  90. {
  91.   struct interface *ifp;
  92.   int32 dest,gateway;
  93.   unsigned bits;
  94.   char *bitp;
  95.   int metric;
  96.  
  97.   if (strcmp(argv[1],"default") == 0)
  98.   {
  99.     dest = 0;
  100.     bits = 0;
  101.   }
  102.   else
  103.   {
  104.     if ((dest = resolve(argv[1])) == 0)
  105.     {
  106.       cwprintf(NULL, badhost,argv[1]);
  107.       return 1;
  108.     }
  109.  
  110.     /* If IP address is followed by an optional slash and
  111.                      * a length field, (e.g., 128.96/16) get it;
  112.                      * otherwise assume a full 32-bit address
  113.                      */
  114.     if ((bitp = strchr(argv[1],'/')) != NULLCHAR)
  115.     {
  116.       bitp++;
  117.       bits = atoi(bitp);
  118.     }
  119.     else
  120.       bits = 32;
  121.   }
  122.   for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next)
  123.   {
  124.     if (strcmp(argv[2],ifp->name) == 0)
  125.       break;
  126.   }
  127.   if (ifp == NULLIF)
  128.   {
  129.     cwprintf(NULL, "Interface \"%s\" unknown\r\n",argv[2]);
  130.     return 1;
  131.   }
  132.   if (argc > 3)
  133.   {
  134.     if ((gateway = resolve(argv[3])) == 0)
  135.     {
  136.       cwprintf(NULL, badhost,argv[3]);
  137.       return 1;
  138.     }
  139.   }
  140.   else
  141.   {
  142.     gateway = 0;
  143.   }
  144.   if (argc > 4)
  145.     metric = atoi(argv[4]);
  146.   else
  147.       metric = 0;
  148.  
  149.   rt_add(dest,bits,gateway,metric,ifp);
  150.   return 0;
  151. }
  152. /* Drop an entry from the routing table
  153.  * E.g., "drop 128.96/16
  154.  */
  155. int dodrop(int argc, char **argv)
  156. {
  157.   char *bitp;
  158.   unsigned bits;
  159.   int32 n;
  160.  
  161.   argc = argc;
  162.  
  163.   if (strcmp(argv[1],"default") == 0)
  164.   {
  165.     n = 0;
  166.     bits = 0;
  167.   }
  168.   else
  169.   {
  170.     /* If IP address is followed by an optional slash and length field,
  171.                      * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  172.                      */
  173.     if ((bitp = strchr(argv[1],'/')) != NULLCHAR)
  174.     {
  175.       bitp++;
  176.       bits = atoi(bitp);
  177.     }
  178.     else
  179.       bits = 32;
  180.  
  181.     if ((n = resolve(argv[1])) == 0)
  182.     {
  183.       cwprintf(NULL, badhost,argv[1]);
  184.       return 1;
  185.     }
  186.   }
  187.   return rt_drop(n,bits);
  188. }
  189.  
  190. /* Dump IP routing table
  191.  * Dest              Length    Interface    Gateway          Metric
  192.  * 192.001.002.003   32        sl0          192.002.003.004       4
  193.  */
  194. int dumproute(void)
  195. {
  196.   register unsigned int i,bits;
  197.   register struct route *rp;
  198.  
  199.   cwprintf(NULL, "Dest              Length    Interface    Gateway          Metric\r\n");
  200.   if (r_default.interface != NULLIF)
  201.   {
  202.     cwprintf(NULL, "default           0         %-13s",
  203.     r_default.interface->name);
  204.     if (r_default.gateway != 0)
  205.       cwprintf(NULL, "%-17s",inet_ntoa(r_default.gateway));
  206.     else
  207.         cwprintf(NULL, "%-17s","");
  208.     cwprintf(NULL, "%6u\r\n",r_default.metric);
  209.   }
  210.   for(bits=1;bits<=32;bits++)
  211.   {
  212.     for(i=0;i<NROUTE;i++)
  213.     {
  214.       for(rp = routes[bits-1][i];rp != NULLROUTE;rp = rp->next)
  215.       {
  216.         cwprintf(NULL, "%-18s",inet_ntoa(rp->target));
  217.         cwprintf(NULL, "%-10u",bits);
  218.         cwprintf(NULL, "%-13s",rp->interface->name);
  219.         if (rp->gateway != 0)
  220.           cwprintf(NULL, "%-17s",inet_ntoa(rp->gateway));
  221.         else
  222.             cwprintf(NULL, "%-17s","");
  223.         cwprintf(NULL, "%6u\r\n",rp->metric);
  224.       }
  225.     }
  226.   }
  227.   return 0;
  228. }
  229.  
  230. int doipstat(int argc, char **argv)
  231. {
  232.   extern struct ip_stats ip_stats;
  233.   extern struct reasm *reasmq;
  234.   register struct reasm *rp;
  235.   register struct frag *fp;
  236.  
  237.   argc = argc;
  238.   argv = argv;
  239.  
  240.   cwprintf(NULL, "IP: total %ld runt %u len err %u vers err %u",
  241.   ip_stats.total,ip_stats.runt,ip_stats.length,ip_stats.version);
  242.   cwprintf(NULL, " chksum err %u badproto %u\r\n",
  243.   ip_stats.checksum,ip_stats.badproto);
  244.  
  245.   if (reasmq != NULLREASM)
  246.     cwprintf(NULL, "Reassembly fragments:\r\n");
  247.   for(rp = reasmq;rp != NULLREASM;rp = rp->next)
  248.   {
  249.     cwprintf(NULL, "src %s",inet_ntoa(rp->source));
  250.     cwprintf(NULL, " dest %s",inet_ntoa(rp->dest));
  251.     cwprintf(NULL, " id %u pctl %u time %lu len %u\r\n",
  252.     rp->id,uchar(rp->protocol),rp->timer.count,rp->length);
  253.     for(fp = rp->fraglist;fp != NULLFRAG;fp = fp->next)
  254.     {
  255.       cwprintf(NULL, " offset %u last %u\r\n",fp->offset,fp->last);
  256.     }
  257.   }
  258.   doicmpstat();
  259.   return 0;
  260. }
  261.  
  262.