home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 024 / psi110g.zip / RIPCMD.C < prev    next >
C/C++ Source or Header  |  1994-07-05  |  10KB  |  424 lines

  1. /* RIP-related user commands
  2.  *   Al Broscious, N3FCT
  3.  *   Phil Karn, KA9Q
  4.  *
  5.  *  Changes Copyright (c) 1993 Jeff White - N0POY, All Rights Reserved.
  6.  *  Permission granted for non-commercial copying and use, provided
  7.  *  this notice is retained.
  8.  *
  9.  * Rehack for RIP-2 (RFC1388) by N0POY 4/1993
  10.  *
  11.  * Beta release 11/10/93 V0.91
  12.  *
  13.  * 2/19/94 release V1.0
  14.  *
  15.  */
  16.   
  17. #include <stdio.h>
  18. #include "global.h"
  19. #ifdef RIP
  20. #include "mbuf.h"
  21. #include "netuser.h"
  22. #include "internet.h"
  23. #include "cmdparse.h"
  24. #include "timer.h"
  25. #include "iface.h"
  26. #include "udp.h"
  27. #include "rip.h"
  28. #include "commands.h"
  29.   
  30. static struct cmds DFAR Ripcmds[] = {
  31.     "accept",   dodroprefuse,  0, 2,
  32.     "rip accept <gateway> ",
  33.     "add",      doripadd,      0, 3,
  34.     "rip add <dest> <interval> [<flags>] [<ripver>] [AUTH <password>] [RD <routing domain>]",
  35.     "proxy",    doripproxy,    0, 4,
  36.     "rip proxy <src> <dest> <interval> [<flags>] [AUTH <password>] [RD <routing domain>]",
  37.     "drop",     doripdrop,     0, 2,
  38.     "rip drop <dest> [<domain>]",
  39.     "authadd",  doripauthadd,  0, 3,
  40.     "rip authadd <interface> <routing domain> [<password>]",
  41.     "authdrop", doripauthdrop, 0, 3,
  42.     "rip authdrop <interface> <routing domain>",
  43.     "reject",   doripreject,   0, 2,
  44.     "rip reject <version>",
  45.     "filter",   doripfilter,   0, 0, NULLCHAR,
  46.     "kick",     doripkick,     0, 0, NULLCHAR,
  47.     "merge",    doripmerge,    0, 0, NULLCHAR,
  48.     "refuse",   doaddrefuse,   0, 2,
  49.     "rip refuse <gateway>",
  50.     "request",  doripreq,      0, 2, NULLCHAR,
  51.     "status",   doripstat,     0, 0, NULLCHAR,
  52.     "trace",    doriptrace,    0, 0, NULLCHAR,
  53.     "ttl",      doripttl,      0, 0, NULLCHAR,
  54.     NULLCHAR,
  55. };
  56.   
  57. // rip add 192.133.30.15 360 SUBPA 2 AUTH password RD 2 RT 0
  58. // rip add <dest> <interval> <ripver> [<flags>] [AUTH <password>]
  59. //    [RD <routing domain>]
  60. // rip proxy <src> <dest> <interval> [<flags>] [AUTH <password>]
  61. //    [RD <routing domain>]
  62. // rip authadd <ifc> <rd> [<password>]
  63. // rip authdrop <ifc> <rd>
  64. // rip reject <ifc> <version>
  65. // rip filter <on|off>
  66. // rip drop <dest> <domain>
  67.   
  68. int
  69. dorip(argc,argv,p)
  70. int argc;
  71. char *argv[];
  72. void *p;
  73. {
  74.     return subcmd(Ripcmds,argc,argv,p);
  75. }
  76.   
  77. /* Add an entry to the RIP output list */
  78.   
  79. int
  80. doripadd(argc,argv,p)
  81. int argc;
  82. char *argv[];
  83. void *p;
  84. {
  85.     int x;
  86.     char flags = RIP_SPLIT | RIP_BROADCAST | RIP_POISON;
  87.     char ripver = 1;
  88.     char rip_auth[RIP_AUTH_SIZE+1];
  89.     int16 domain = 0;
  90.     int16 route_tag = 0;
  91.     int32 dest;
  92.   
  93.     for (x = 0; x < RIP_AUTH_SIZE+1; x++)    /* Null out the string */
  94.         rip_auth[x] = '\0';
  95.   
  96.     strcpy(rip_auth, RIP_NO_AUTH);
  97.   
  98.     if (argc > 3)
  99.         flags = htoi(argv[3]);
  100.     if (argc > 4)
  101.         ripver = atoi(argv[4]);
  102.     if (argc > 5) {
  103.         for (x = 5; x < argc; x++) {
  104.             if (!strcmp(argv[x], "AUTH")) {
  105.                 x++;
  106.                 strcpy(rip_auth,argv[x]);
  107.             } else if (!strcmp(argv[x], "RD")) {
  108.                 x++;
  109.                 domain = atoi(argv[x]);
  110.             }
  111.         }
  112.     }
  113.   
  114.     dest = resolve(argv[1]);
  115.     if (rip_add(dest,atol(argv[2]),flags,ripver,rip_auth,domain,route_tag,0)) {
  116.         return 0;
  117. //      if (ripver > RIP_VERSION_1) {
  118. //         struct route *rp;
  119. //
  120. //         rp = rt_lookup(dest);
  121. //         return(ripauthadd(rp->iface->name,domain,rip_auth));
  122. //      }
  123.     } else {
  124.         return 1;
  125.     }
  126. //  return 0;
  127. }
  128.   
  129. /* Add a proxy entry to the RIP output list */
  130.   
  131. int
  132. doripproxy(argc,argv,p)
  133. int argc;
  134. char *argv[];
  135. void *p;
  136. {
  137.     int x;
  138.     char flags = RIP_SPLIT | RIP_BROADCAST | RIP_POISON;
  139.     char ripver = RIP_VERSION_2;
  140.     char rip_auth[RIP_AUTH_SIZE];
  141.     int16 domain = 0;
  142.     int16 route_tag = 0;
  143.     int32 dest;
  144.     int32 proxy;
  145.     struct route *rp;
  146.   
  147.     for (x = 0; x < RIP_AUTH_SIZE+1; x++)    /* Null out the string */
  148.         rip_auth[x] = '\0';
  149.   
  150.     strcpy(rip_auth, RIP_NO_AUTH);
  151.   
  152.     if (argc > 4)
  153.         flags = htoi(argv[4]);
  154.     if (argc > 5) {
  155.         for (x = 5; x < argc; x++) {
  156.             if (!strcmp(argv[x], "AUTH")) {
  157.                 x++;
  158.                 strcpy(rip_auth,argv[x]);
  159.             } else if (!strcmp(argv[x], "RD")) {
  160.                 x++;
  161.                 domain = atoi(argv[x]);
  162.             }
  163.         }
  164.     }
  165.   
  166.     dest = resolve(argv[2]);
  167.     proxy = resolve(argv[1]);
  168.     if (rip_add(dest,atol(argv[3]),flags,ripver,rip_auth,domain,route_tag,proxy)) {
  169. //      rp = rt_lookup(dest);
  170. //      return(ripauthadd(rp->iface->name,domain,rip_auth));
  171.     }
  172.     return 1;
  173. }
  174.   
  175. /* Add an entry to the RIP refuse list */
  176.   
  177. int
  178. doaddrefuse(argc,argv,p)
  179. int argc;
  180. char *argv[];
  181. void *p;
  182. {
  183.     return riprefadd(resolve(argv[1]));
  184. }
  185.   
  186. /* Drop an entry from the RIP output list */
  187.   
  188. int
  189. doripdrop(argc,argv,p)
  190. int argc;
  191. char *argv[];
  192. void *p;
  193. {
  194.     int16 domain = 0;
  195.   
  196.     if (argc > 2)
  197.         domain = atoi(argv[2]);
  198.   
  199.     return rip_drop(resolve(argv[1]),domain);
  200. }
  201.   
  202. /* Add an entry to the RIP authentication list */
  203.   
  204. int
  205. doripauthadd(argc,argv,p)
  206. int argc;
  207. char *argv[];
  208. void *p;
  209. {
  210.     if (argc > 3) {
  211.         return ripauthadd(argv[1],atoi(argv[2]),argv[3]);
  212.     } else {
  213.         return ripauthadd(argv[1],atoi(argv[2]),RIP_NO_AUTH);
  214.     }
  215. }
  216.   
  217. /* Drop an entry from the RIP authentication list */
  218.   
  219. int
  220. doripauthdrop(argc,argv,p)
  221. int argc;
  222. char *argv[];
  223. void *p;
  224. {
  225.     return ripauthdrop(argv[1],atoi(argv[2]));
  226. }
  227.   
  228. int
  229. doripkick(argc,argv,p)
  230. int argc;
  231. char *argv[];
  232. void *p;
  233. {
  234.     register struct rip_list *rl;
  235.   
  236.     rl = (struct rip_list *)Rip_list;
  237.     if(Rip_list != NULLRL)
  238.         for(rl = Rip_list; rl != NULLRL; rl = rl->next)
  239.             rip_shout(rl);
  240.     return 0;
  241. }
  242.   
  243. /* Drop an entry from the RIP refuse list */
  244.   
  245. int
  246. dodroprefuse(argc,argv,p)
  247. int argc;
  248. char *argv[];
  249. void *p;
  250. {
  251.     return riprefdrop(resolve(argv[1]));
  252. }
  253.   
  254. /* Initialize the RIP listener */
  255.   
  256. int
  257. doripinit(argc,argv,p)
  258. int argc;
  259. char *argv[];
  260. void *p;
  261. {
  262.     return rip_init();
  263. }
  264.   
  265. int
  266. doripstop(argc,argv,p)
  267. int argc;
  268. char *argv[];
  269. void *p;
  270. {
  271.     del_udp(Rip_cb);
  272.     Rip_cb = NULLUDP;
  273.     return 0;
  274. }
  275.   
  276. int
  277. doripreq(argc,argv,p)
  278. int argc;
  279. char *argv[];
  280. void *p;
  281. {
  282.     int16 replyport;
  283.     int16 version;
  284.   
  285.     if (argc > 2)
  286.         version = atoi(argv[2]);
  287.     else
  288.         version = 2;
  289.   
  290.     if(argc > 3)
  291.         replyport = atoi(argv[3]);
  292.     else
  293.         replyport = RIP_PORT;
  294.     return ripreq(resolve(argv[1]),replyport,version);
  295. }
  296.   
  297. /* Dump RIP statistics */
  298. int
  299. doripstat(argc,argv,p)
  300. int argc;
  301. char *argv[];
  302. void *p;
  303. {
  304.     struct rip_list *rl;
  305.     struct rip_refuse *rfl;
  306.     struct rip_auth *ra;
  307.     int cnt;
  308.   
  309.     for (cnt = 1; cnt < RIP_VERSIONS; cnt++) {
  310.         tprintf("RIP V%d: sent %lu rcvd %lu reqst %lu resp %lu unk %lu\n",
  311.         cnt, Rip_stat.vdata[cnt].output, Rip_stat.vdata[cnt].rcvd,
  312.         Rip_stat.vdata[cnt].request, Rip_stat.vdata[cnt].response,
  313.         Rip_stat.vdata[cnt].unknown);
  314.     }
  315.   
  316.     tprintf("Version Errors:            %lu   ",Rip_stat.version);
  317.     tprintf("Address Family Errors:     %lu\n",Rip_stat.addr_family);
  318.     tprintf("Rip refusals:              %lu   ",Rip_stat.refusals);
  319.     tprintf("Wrong Domain on Interface: %lu\n",Rip_stat.wrong_domain);
  320.     tprintf("Authentication failures:   %lu   ",Rip_stat.auth_fail);
  321.     tprintf("Unknown Authentication:    %lu\n",Rip_stat.unknown_auth);
  322.   
  323.     if(Rip_list != NULLRL){
  324.         tprintf("Active RIP output interfaces:\n");
  325.         tprintf("Ver Dest Addr       Int  Flags Domain Proxy           Authentication\n");
  326.         for(rl=Rip_list; rl != NULLRL; rl = rl->next){
  327.             tprintf("%-4d%-16s%-5lu0x%-4X%-7u", rl->rip_version,
  328.             inet_ntoa(rl->dest),rl->interval, rl->flags,rl->domain);
  329.             tprintf("%-16s%-16s\n", inet_ntoa(rl->proxy_route), rl->rip_auth_code);
  330.         }
  331.     }
  332.     if(Rip_refuse != NULLREF){
  333.         tprintf("Refusing announcements from gateways:\n");
  334.         for(rfl=Rip_refuse; rfl != NULLREF;rfl = rfl->next){
  335.             if(tprintf("%s\n",inet_ntoa(rfl->target)) == EOF)
  336.                 break;
  337.         }
  338.     }
  339.     if (Rip_auth != NULLAUTH) {
  340.         tprintf("\nAuthentications accepted:\n");
  341.         tprintf("Interface           Domain   Password\n");
  342.         for (ra = Rip_auth; ra != NULLAUTH; ra = ra->next) {
  343.             tprintf("%-20s%-9u%-16s\n",ra->ifc_name,ra->domain,ra->rip_auth_code);
  344.         }
  345.     }
  346.     tprintf("Refusing versions less than or equal to V%d\n",Rip_ver_refuse);
  347.   
  348.     return 0;
  349. }
  350.   
  351. int
  352. doriptrace(argc,argv,p)
  353. int argc;
  354. char *argv[];
  355. void *p;
  356. {
  357.     if (argc > 1) {
  358.         Rip_trace = atoi(argv[1]);
  359.         if ((Rip_trace == 0) && (Rip_trace_file != NULLFILE)) {  // Turn off tracing
  360.             fclose(Rip_trace_file);
  361.             Rip_trace_file = NULLFILE;
  362.             if (Rip_trace_fname != NULLCHAR) {
  363.                 free(Rip_trace_fname);
  364.                 Rip_trace_fname = NULLCHAR;
  365.             }
  366.         }
  367.         if (argc > 2) {
  368.             if ((Rip_trace_file = fopen(argv[2],APPEND_TEXT)) == NULLFILE) {
  369.                 tprintf("Cannot write to %s\n",argv[2]);
  370.             } else {
  371.                 Rip_trace_fname = strdup(argv[2]);
  372.             }
  373.             fclose(Rip_trace_file);
  374.         }
  375.     } else {
  376.         if (Rip_trace_file != NULLFILE) {
  377.             tprintf("Tracing RIP status level %d to file %s\n", Rip_trace,
  378.             Rip_trace_fname);
  379.         } else {
  380.             tprintf("Tracing RIP status level %d\n", Rip_trace);
  381.         }
  382.     }
  383.     return 0;
  384. }
  385.   
  386. int
  387. doripttl(argc,argv,p)
  388. int argc;
  389. char *argv[];
  390. void *p;
  391. {
  392.     return setlong(&Rip_ttl,"RIP route ttl",argc,argv);
  393. }
  394.   
  395. int
  396. doripreject(argc,argv,p)
  397. int argc;
  398. char *argv[];
  399. void *p;
  400. {
  401.     return setshort(&Rip_ver_refuse,"RIP version refusal level",argc,argv);
  402. }
  403.   
  404. int
  405. doripmerge(argc,argv,p)
  406. int argc;
  407. char *argv[];
  408. void *p;
  409. {
  410.     return setbool((int *)&Rip_merge,"RIP merging",argc,argv);
  411. }
  412.   
  413. int
  414. doripfilter(argc,argv,p)
  415. int argc;
  416. char *argv[];
  417. void *p;
  418. {
  419.     return setbool((int *)&Rip_default_refuse,"RIP default refusal",argc,argv);
  420. }
  421.   
  422. #endif
  423.   
  424.