]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipxcp.c
Large patch from Frank Cusack <fcusack@fcusack.com> to add proper
[ppp.git] / pppd / ipxcp.c
index c93890493d42f88d79390cf775f8b8d49ccc1503..86124518c2f24529bb88b9737453fb76cba0a23c 100644 (file)
@@ -18,9 +18,8 @@
  */
 
 #ifdef IPX_CHANGE
-#ifndef lint
-static char rcsid[] = "$Id: ipxcp.c,v 1.15 1999/04/01 07:08:47 paulus Exp $";
-#endif
+
+#define RCSID  "$Id: ipxcp.c,v 1.20 2001/03/08 05:11:13 paulus Exp $"
 
 /*
  * TODO:
@@ -40,6 +39,8 @@ static char rcsid[] = "$Id: ipxcp.c,v 1.15 1999/04/01 07:08:47 paulus Exp $";
 #include "pathnames.h"
 #include "magic.h"
 
+static const char rcsid[] = RCSID;
+
 /* global vars */
 ipxcp_options ipxcp_wantoptions[NUM_PPP];      /* Options that we want to request */
 ipxcp_options ipxcp_gotoptions[NUM_PPP];       /* Options that peer ack'd */
@@ -90,43 +91,55 @@ static fsm_callbacks ipxcp_callbacks = { /* IPXCP callback routines */
  * Command-line options.
  */
 static int setipxnode __P((char **));
+static void printipxnode __P((option_t *,
+                             void (*)(void *, char *, ...), void *));
 static int setipxname __P((char **));
 
 static option_t ipxcp_option_list[] = {
     { "ipx", o_bool, &ipxcp_protent.enabled_flag,
-      "Enable IPXCP (and IPX)", 1 },
+      "Enable IPXCP (and IPX)", OPT_PRIO | 1 },
     { "+ipx", o_bool, &ipxcp_protent.enabled_flag,
-      "Enable IPXCP (and IPX)", 1 },
+      "Enable IPXCP (and IPX)", OPT_PRIOSUB | OPT_ALIAS | 1 },
     { "noipx", o_bool, &ipxcp_protent.enabled_flag,
-      "Disable IPXCP (and IPX)" },
+      "Disable IPXCP (and IPX)", OPT_PRIOSUB },
     { "-ipx", o_bool, &ipxcp_protent.enabled_flag,
-      "Disable IPXCP (and IPX)" } ,
+      "Disable IPXCP (and IPX)", OPT_PRIOSUB | OPT_ALIAS },
+
     { "ipx-network", o_uint32, &ipxcp_wantoptions[0].our_network,
-      "Set our IPX network number", 0, &ipxcp_wantoptions[0].neg_nn },
+      "Set our IPX network number", OPT_PRIO, &ipxcp_wantoptions[0].neg_nn },
+
     { "ipxcp-accept-network", o_bool, &ipxcp_wantoptions[0].accept_network,
       "Accept peer IPX network number", 1,
       &ipxcp_allowoptions[0].accept_network },
-    { "ipx-node", o_special, setipxnode,
-      "Set IPX node number" },
+
+    { "ipx-node", o_special, (void *)setipxnode,
+      "Set IPX node number", OPT_A2PRINTER, (void *)printipxnode },
+
     { "ipxcp-accept-local", o_bool, &ipxcp_wantoptions[0].accept_local,
       "Accept our IPX address", 1,
       &ipxcp_allowoptions[0].accept_local },
+
     { "ipxcp-accept-remote", o_bool, &ipxcp_wantoptions[0].accept_remote,
       "Accept peer's IPX address", 1,
       &ipxcp_allowoptions[0].accept_remote },
+
     { "ipx-routing", o_int, &ipxcp_wantoptions[0].router,
-      "Set IPX routing proto number", 0,
+      "Set IPX routing proto number", OPT_PRIO,
       &ipxcp_wantoptions[0].neg_router },
+
     { "ipx-router-name", o_special, setipxname,
-      "Set IPX router name" },
+      "Set IPX router name", OPT_PRIO | OPT_A2STRVAL | OPT_STATIC,
+       &ipxcp_wantoptions[0].name },
+
     { "ipxcp-restart", o_int, &ipxcp_fsm[0].timeouttime,
-      "Set timeout for IPXCP" },
+      "Set timeout for IPXCP", OPT_PRIO },
     { "ipxcp-max-terminate", o_int, &ipxcp_fsm[0].maxtermtransmits,
-      "Set max #xmits for IPXCP term-reqs" },
+      "Set max #xmits for IPXCP term-reqs", OPT_PRIO },
     { "ipxcp-max-configure", o_int, &ipxcp_fsm[0].maxconfreqtransmits,
-      "Set max #xmits for IPXCP conf-reqs" },
+      "Set max #xmits for IPXCP conf-reqs", OPT_PRIO },
     { "ipxcp-max-failure", o_int, &ipxcp_fsm[0].maxnakloops,
-      "Set max #conf-naks for IPXCP" },
+      "Set max #conf-naks for IPXCP", OPT_PRIO },
+
     { NULL }
 };
 
@@ -247,21 +260,36 @@ u_char *src, *dst;
     return src;
 }
 
+static int ipx_prio_our, ipx_prio_his;
+
 static int
 setipxnode(argv)
     char **argv;
 {
     char *end;
+    int have_his = 0;
+    u_char our_node[6];
+    u_char his_node[6];
 
-    memset (&ipxcp_wantoptions[0].our_node[0], 0, 6);
-    memset (&ipxcp_wantoptions[0].his_node[0], 0, 6);
+    memset (our_node, 0, 6);
+    memset (his_node, 0, 6);
 
-    end = setipxnodevalue (*argv, &ipxcp_wantoptions[0].our_node[0]);
-    if (*end == ':')
-       end = setipxnodevalue (++end, &ipxcp_wantoptions[0].his_node[0]);
+    end = setipxnodevalue (*argv, our_node);
+    if (*end == ':') {
+       have_his = 1;
+       end = setipxnodevalue (++end, his_node);
+    }
 
     if (*end == '\0') {
         ipxcp_wantoptions[0].neg_node = 1;
+       if (option_priority >= ipx_prio_our) {
+           memcpy(&ipxcp_wantoptions[0].our_node[0], our_node, 6);
+           ipx_prio_our = option_priority;
+       }
+       if (have_his && option_priority >= ipx_prio_his) {
+           memcpy(&ipxcp_wantoptions[0].his_node[0], his_node, 6);
+           ipx_prio_his = option_priority;
+       }
         return 1;
     }
 
@@ -269,6 +297,25 @@ setipxnode(argv)
     return 0;
 }
 
+static void
+printipxnode(opt, printer, arg)
+    option_t *opt;
+    void (*printer) __P((void *, char *, ...));
+    void *arg;
+{
+       unsigned char *p;
+
+       p = ipxcp_wantoptions[0].our_node;
+       if (ipx_prio_our)
+               printer(arg, "%.2x%.2x%.2x%.2x%.2x%.2x",
+                       p[0], p[1], p[2], p[3], p[4], p[5]);
+       printer(arg, ":");
+       p = ipxcp_wantoptions[0].his_node;
+       if (ipx_prio_his)
+               printer(arg, "%.2x%.2x%.2x%.2x%.2x%.2x",
+                       p[0], p[1], p[2], p[3], p[4], p[5]);
+}
+
 static int
 setipxname (argv)
     char **argv;
@@ -290,7 +337,7 @@ setipxname (argv)
            return 0;
        }
 
-       if (count >= sizeof (ipxcp_wantoptions[0].name)) {
+       if (count >= sizeof (ipxcp_wantoptions[0].name) - 1) {
            option_error("IPX router name is limited to %d characters",
                         sizeof (ipxcp_wantoptions[0].name) - 1);
            return 0;
@@ -298,6 +345,7 @@ setipxname (argv)
 
        dest[count++] = toupper (ch);
     }
+    dest[count] = 0;
 
     return 1;
 }
@@ -1265,6 +1313,7 @@ ipxcp_up(f)
        ipxcp_close(unit, "Interface configuration failed");
        return;
     }
+    ipxcp_is_up = 1;
 
     /* set the network number for IPX */
     if (!sipxfaddr(unit, go->network, go->our_node)) {
@@ -1274,7 +1323,6 @@ ipxcp_up(f)
        return;
     }
 
-    ipxcp_is_up = 1;
     np_up(f->unit, PPP_IPX);
 
     /*
@@ -1298,11 +1346,12 @@ ipxcp_down(f)
 {
     IPXCPDEBUG(("ipxcp: down"));
 
-    if (ipxcp_is_up) {
-       ipxcp_is_up = 0;
-       np_down(f->unit, PPP_IPX);
-    }
-    cipxfaddr (f->unit);
+    if (!ipxcp_is_up)
+       return;
+    ipxcp_is_up = 0;
+    np_down(f->unit, PPP_IPX);
+    cipxfaddr(f->unit);
+    sifnpmode(f->unit, PPP_IPX, NPMODE_DROP);
     sifdown(f->unit);
     ipxcp_script (f, _PATH_IPXDOWN);
 }