]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipxcp.c
Rework options processing stuff to implement option priorities
[ppp.git] / pppd / ipxcp.c
index 9851e65713df6c1ff595409ccccd817c497200d1..f7b1a51ac2b5f75235be14568ed07995a2743502 100644 (file)
@@ -18,9 +18,8 @@
  */
 
 #ifdef IPX_CHANGE
-#ifndef lint
-static char rcsid[] = "$Id: ipxcp.c,v 1.12 1999/03/16 22:54:39 paulus Exp $";
-#endif
+
+#define RCSID  "$Id: ipxcp.c,v 1.19 2001/02/22 03:15:20 paulus Exp $"
 
 /*
  * TODO:
@@ -40,6 +39,8 @@ static char rcsid[] = "$Id: ipxcp.c,v 1.12 1999/03/16 22:54:39 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 */
@@ -101,13 +102,13 @@ static option_t ipxcp_option_list[] = {
       "Disable IPXCP (and IPX)" },
     { "-ipx", o_bool, &ipxcp_protent.enabled_flag,
       "Disable IPXCP (and IPX)" } ,
-    { "ipx-network", o_int, &ipxcp_wantoptions[0].our_network,
+    { "ipx-network", o_uint32, &ipxcp_wantoptions[0].our_network,
       "Set our IPX network number", 0, &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" },
+      "Set IPX node number", OPT_MULTIPART },
     { "ipxcp-accept-local", o_bool, &ipxcp_wantoptions[0].accept_local,
       "Accept our IPX address", 1,
       &ipxcp_allowoptions[0].accept_local },
@@ -181,6 +182,8 @@ struct protent ipxcp_protent = {
 
 static int ipxcp_is_up;
 
+static char *ipx_ntoa __P((u_int32_t));
+
 /* Used in printing the node number */
 #define NODE(base) base[0], base[1], base[2], base[3], base[4], base[5]
 
@@ -197,7 +200,7 @@ short int internal;
 {
     short int  external;
 
-    if (internal & IPX_NONE)
+    if (internal & BIT(IPX_NONE) )
         external = IPX_NONE;
     else
         external = RIP_SAP;
@@ -209,7 +212,7 @@ short int internal;
  * Make a string representation of a network IP address.
  */
 
-char *
+static char *
 ipx_ntoa(ipxaddr)
 u_int32_t ipxaddr;
 {
@@ -250,16 +253,30 @@ setipxnode(argv)
     char **argv;
 {
     char *end;
-
-    memset (&ipxcp_wantoptions[0].our_node[0], 0, 6);
-    memset (&ipxcp_wantoptions[0].his_node[0], 0, 6);
-
-    end = setipxnodevalue (*argv, &ipxcp_wantoptions[0].our_node[0]);
-    if (*end == ':')
-       end = setipxnodevalue (++end, &ipxcp_wantoptions[0].his_node[0]);
+    int have_his = 0;
+    u_char our_node[6];
+    u_char his_node[6];
+    static int prio_our, prio_his;
+
+    memset (our_node, 0, 6);
+    memset (his_node, 0, 6);
+
+    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 >= prio_our) {
+           memcpy(&ipxcp_wantoptions[0].our_node[0], our_node, 6);
+           prio_our = option_priority;
+       }
+       if (have_his && option_priority >= prio_his) {
+           memcpy(&ipxcp_wantoptions[0].his_node[0], his_node, 6);
+           prio_his = option_priority;
+       }
         return 1;
     }
 
@@ -664,9 +681,8 @@ ipxcp_ackci(f, p, len)
        ACKCINETWORK  (IPX_NETWORK_NUMBER,  go->neg_nn,     go->our_network);
        ACKCINODE     (IPX_NODE_NUMBER,     go->neg_node,   go->our_node);
        ACKCINAME     (IPX_ROUTER_NAME,     go->neg_name,   go->name);
-       ACKCIPROTO    (IPX_ROUTER_PROTOCOL, go->neg_router, go->router);
-       ACKCIPROTO    (IPX_ROUTER_PROTOCOL, go->neg_router, go->router);
-       ACKCIPROTO    (IPX_ROUTER_PROTOCOL, go->neg_router, go->router);
+       if (len > 0)
+               ACKCIPROTO    (IPX_ROUTER_PROTOCOL, go->neg_router, go->router);
 /*
  * This is the end of the record.
  */
@@ -770,10 +786,6 @@ ipxcp_nakci(f, p, len)
        p = next;
     }
 
-    /* If there is still anything left, this packet is bad. */
-    if (len != 0)
-       goto bad;
-
     /*
      * Do not permit the peer to force a router protocol which we do not
      * support. However, default to the condition that will accept "NONE".
@@ -787,6 +799,7 @@ ipxcp_nakci(f, p, len)
     
     /*
      * OK, the Nak is good.  Now we can update state.
+     * If there are any options left, we ignore them.
      */
     if (f->state != OPENED)
        *go = try;
@@ -1267,6 +1280,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)) {
@@ -1276,7 +1290,6 @@ ipxcp_up(f)
        return;
     }
 
-    ipxcp_is_up = 1;
     np_up(f->unit, PPP_IPX);
 
     /*
@@ -1300,11 +1313,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);
 }
@@ -1340,38 +1354,34 @@ ipxcp_script(f, script)
     strproto_lcl[0] = '\0';
     if (go->neg_router && ((go->router & BIT(IPX_NONE)) == 0)) {
        if (go->router & BIT(RIP_SAP))
-           strlcpy (strproto_lcl, sizeof(strproto_lcl), "RIP ");
+           strlcpy (strproto_lcl, "RIP ", sizeof(strproto_lcl));
        if (go->router & BIT(NLSP))
-           strlcat (strproto_lcl, sizeof(strproto_lcl), "NLSP ");
+           strlcat (strproto_lcl, "NLSP ", sizeof(strproto_lcl));
     }
 
     if (strproto_lcl[0] == '\0')
-       strlcpy (strproto_lcl, sizeof(strproto_lcl), "NONE ");
+       strlcpy (strproto_lcl, "NONE ", sizeof(strproto_lcl));
 
     strproto_lcl[strlen (strproto_lcl)-1] = '\0';
 
     strproto_rmt[0] = '\0';
     if (ho->neg_router && ((ho->router & BIT(IPX_NONE)) == 0)) {
        if (ho->router & BIT(RIP_SAP))
-           strlcpy (strproto_rmt, sizeof(strproto_rmt), "RIP ");
+           strlcpy (strproto_rmt, "RIP ", sizeof(strproto_rmt));
        if (ho->router & BIT(NLSP))
-           strlcat (strproto_rmt, sizeof(strproto_rmt), "NLSP ");
+           strlcat (strproto_rmt, "NLSP ", sizeof(strproto_rmt));
     }
 
     if (strproto_rmt[0] == '\0')
-       strlcpy (strproto_rmt, sizeof(strproto_rmt), "NONE ");
+       strlcpy (strproto_rmt, "NONE ", sizeof(strproto_rmt));
 
     strproto_rmt[strlen (strproto_rmt)-1] = '\0';
 
-    strlcpy (strnetwork, sizeof(strnetwork), ipx_ntoa (go->network));
+    strlcpy (strnetwork, ipx_ntoa (go->network), sizeof(strnetwork));
 
-    slprintf (strlocal, sizeof(strlocal),
-             "%02X%02X%02X%02X%02X%02X",
-             NODE(go->our_node));
+    slprintf (strlocal, sizeof(strlocal), "%0.6B", go->our_node);
 
-    slprintf (strremote, sizeof(strremote),
-             "%02X%02X%02X%02X%02X%02X",
-             NODE(ho->his_node));
+    slprintf (strremote, sizeof(strremote), "%0.6B", ho->his_node);
 
     argv[0]  = script;
     argv[1]  = ifname;