X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fipxcp.c;h=f7b1a51ac2b5f75235be14568ed07995a2743502;hb=f7ee87797ae1851c7bfb57752185b66f127326e8;hp=840daf5ae3ae95d79c1894a9da1f2ecfd2069c57;hpb=9e64a7b4c1918fd3927f80832a97f747eac214de;p=ppp.git diff --git a/pppd/ipxcp.c b/pppd/ipxcp.c index 840daf5..f7b1a51 100644 --- a/pppd/ipxcp.c +++ b/pppd/ipxcp.c @@ -18,9 +18,8 @@ */ #ifdef IPX_CHANGE -#ifndef lint -static char rcsid[] = "$Id: ipxcp.c,v 1.13 1999/03/19 01:22:09 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.13 1999/03/19 01:22:09 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 }, @@ -199,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; @@ -252,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; } @@ -666,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. */ @@ -1266,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)) { @@ -1275,7 +1290,6 @@ ipxcp_up(f) return; } - ipxcp_is_up = 1; np_up(f->unit, PPP_IPX); /* @@ -1299,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); }