X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fipxcp.c;h=47d7af7f633f8cfa303959a0701d500c8aadf294;hp=9de3462f61d8e2c2ebc270000707ffa9e17481d2;hb=7a4dc0ff500aaa176a41965d8d4ad15a97a70904;hpb=0f2f62bd2cb9ac4f8757c2ec365cdb62657ef3b8 diff --git a/pppd/ipxcp.c b/pppd/ipxcp.c index 9de3462..47d7af7 100644 --- a/pppd/ipxcp.c +++ b/pppd/ipxcp.c @@ -19,7 +19,7 @@ #ifdef IPX_CHANGE #ifndef lint -static char rcsid[] = "$Id: ipxcp.c,v 1.5 1997/03/04 03:39:32 paulus Exp $"; +static char rcsid[] = "$Id: ipxcp.c,v 1.10 1999/03/16 03:15:15 paulus Exp $"; #endif /* @@ -28,7 +28,8 @@ static char rcsid[] = "$Id: ipxcp.c,v 1.5 1997/03/04 03:39:32 paulus Exp $"; #include #include -#include +#include +#include #include #include #include @@ -37,6 +38,7 @@ static char rcsid[] = "$Id: ipxcp.c,v 1.5 1997/03/04 03:39:32 paulus Exp $"; #include "fsm.h" #include "ipxcp.h" #include "pathnames.h" +#include "magic.h" /* global vars */ ipxcp_options ipxcp_wantoptions[NUM_PPP]; /* Options that we want to request */ @@ -83,6 +85,50 @@ static fsm_callbacks ipxcp_callbacks = { /* IPXCP callback routines */ "IPXCP" /* String name of protocol */ }; +/* + * Command-line options. + */ +static int setipxnode __P((char **)); +static int setipxname __P((char **)); + +static option_t ipxcp_option_list[] = { + { "ipx", o_bool, &ipxcp_protent.enabled_flag, + "Enable IPXCP (and IPX)", 1 }, + { "+ipx", o_bool, &ipxcp_protent.enabled_flag, + "Enable IPXCP (and IPX)", 1 }, + { "noipx", o_bool, &ipxcp_protent.enabled_flag, + "Disable IPXCP (and IPX)" }, + { "-ipx", o_bool, &ipxcp_protent.enabled_flag, + "Disable IPXCP (and IPX)" } , + { "ipx-network", o_int, &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" }, + { "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, + &ipxcp_wantoptions[0].neg_router }, + { "ipx-router-name", o_special, setipxname, + "Set IPX router name" }, + { "ipxcp-restart", o_int, &ipxcp_fsm[0].timeouttime, + "Set timeout for IPXCP" }, + { "ipxcp-max-terminate", o_int, &ipxcp_fsm[0].maxtermtransmits, + "Set max #xmits for IPXCP term-reqs" }, + { "ipxcp-max-configure", o_int, &ipxcp_fsm[0].maxconfreqtransmits, + "Set max #xmits for IPXCP conf-reqs" }, + { "ipxcp-max-failure", o_int, &ipxcp_fsm[0].maxnakloops, + "Set max #conf-naks for IPXCP" }, + { NULL } +}; + /* * Protocol entry points. */ @@ -110,6 +156,7 @@ struct protent ipxcp_protent = { NULL, 0, "IPXCP", + ipxcp_option_list, NULL, NULL, NULL @@ -163,11 +210,92 @@ ipx_ntoa(ipxaddr) u_int32_t ipxaddr; { static char b[64]; - sprintf(b, "%lx", ipxaddr); + slprintf(b, sizeof(b), "%x", ipxaddr); return b; } +static u_char * +setipxnodevalue(src,dst) +u_char *src, *dst; +{ + int indx; + int item; + + for (;;) { + if (!isxdigit (*src)) + break; + + for (indx = 0; indx < 5; ++indx) { + dst[indx] <<= 4; + dst[indx] |= (dst[indx + 1] >> 4) & 0x0F; + } + + item = toupper (*src) - '0'; + if (item > 9) + item -= 7; + + dst[5] = (dst[5] << 4) | item; + ++src; + } + return src; +} + +static int +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]); + + if (*end == '\0') { + ipxcp_wantoptions[0].neg_node = 1; + return 1; + } + + option_error("invalid parameter '%s' for ipx-node option", *argv); + return 0; +} + +static int +setipxname (argv) + char **argv; +{ + char *dest = ipxcp_wantoptions[0].name; + char *src = *argv; + int count; + char ch; + + ipxcp_wantoptions[0].neg_name = 1; + ipxcp_allowoptions[0].neg_name = 1; + memset (dest, '\0', sizeof (ipxcp_wantoptions[0].name)); + + count = 0; + while (*src) { + ch = *src++; + if (! isalnum (ch) && ch != '_') { + option_error("IPX router name must be alphanumeric or _"); + return 0; + } + + if (count >= sizeof (ipxcp_wantoptions[0].name)) { + option_error("IPX router name is limited to %d characters", + sizeof (ipxcp_wantoptions[0].name) - 1); + return 0; + } + + dest[count++] = toupper (ch); + } + + return 1; +} + /* * ipxcp_init - Initialize IPXCP. */ @@ -336,9 +464,6 @@ static void ipxcp_resetci(f) fsm *f; { - u_int32_t network; - int unit = f->unit; - wo->req_node = wo->neg_node && ao->neg_node; wo->req_nn = wo->neg_nn && ao->neg_nn; @@ -387,7 +512,6 @@ static int ipxcp_cilen(f) fsm *f; { - int unit = f->unit; int len; len = go->neg_nn ? CILEN_NETN : 0; @@ -411,8 +535,6 @@ ipxcp_addci(f, ucp, lenp) u_char *ucp; int *lenp; { - int len = *lenp; - int unit = f->unit; /* * Add the options to the record. */ @@ -462,7 +584,6 @@ ipxcp_ackci(f, p, len) u_char *p; int len; { - int unit = f->unit; u_short cilen, citype, cishort; u_char cichar; u_int32_t cilong; @@ -551,7 +672,7 @@ ipxcp_ackci(f, p, len) /* * The frame is invalid */ - IPXCPDEBUG((LOG_INFO, "ipxcp_ackci: received bad Ack!")); + IPXCPDEBUG(("ipxcp_ackci: received bad Ack!")); return (0); } @@ -571,7 +692,6 @@ ipxcp_nakci(f, p, len) u_char *p; int len; { - int unit = f->unit; u_char citype, cilen, *next; u_short s; u_int32_t l; @@ -596,7 +716,6 @@ ipxcp_nakci(f, p, len) no.neg_nn = 1; GETLONG(l, p); - IPXCPDEBUG((LOG_INFO, "local IP address %d", l)); if (l && ao->accept_network) try.our_network = l; break; @@ -606,10 +725,6 @@ ipxcp_nakci(f, p, len) goto bad; no.neg_node = 1; - IPXCPDEBUG((LOG_INFO, - "local node number %02X%02X%02X%02X%02X%02X", - NODE(p))); - if (!zero_node (p) && ao->accept_local && ! compare_node (p, ho->his_node)) copy_node (p, try.our_node); @@ -637,8 +752,6 @@ ipxcp_nakci(f, p, len) no.router |= s; try.router |= s; try.neg_router = 1; - - IPXCPDEBUG((LOG_INFO, "Router protocol number %d", s)); break; /* These, according to the RFC, must never be NAKed. */ @@ -677,7 +790,7 @@ ipxcp_nakci(f, p, len) return 1; bad: - IPXCPDEBUG((LOG_INFO, "ipxcp_nakci: received bad Nak!")); + IPXCPDEBUG(("ipxcp_nakci: received bad Nak!")); return 0; } @@ -690,7 +803,6 @@ ipxcp_rejci(f, p, len) u_char *p; int len; { - int unit = f->unit; u_short cilen, citype, cishort; u_char cichar; u_int32_t cilong; @@ -708,7 +820,6 @@ ipxcp_rejci(f, p, len) GETLONG(cilong, p); \ if (cilong != val) \ break; \ - IPXCPDEBUG((LOG_INFO,"ipxcp_rejci rejected long opt %d", opt)); \ neg = 0; \ } @@ -730,7 +841,6 @@ ipxcp_rejci(f, p, len) }\ if (indx != count) \ break; \ - IPXCPDEBUG((LOG_INFO,"ipxcp_rejci rejected opt %d", opt)); \ neg = 0; \ } @@ -745,7 +855,6 @@ ipxcp_rejci(f, p, len) GETCHAR(cilen, p); \ if (cilen != CILEN_VOID || citype != opt) \ break; \ - IPXCPDEBUG((LOG_INFO, "ipxcp_rejci rejected void opt %d", opt)); \ neg = 0; \ } @@ -762,7 +871,6 @@ ipxcp_rejci(f, p, len) GETSHORT(cishort, p); \ if (cishort != to_external (val) || cishort == RIP_SAP) \ break; \ - IPXCPDEBUG((LOG_INFO, "ipxcp_rejci short opt %d", opt)); \ neg = 0; \ } /* @@ -789,7 +897,7 @@ ipxcp_rejci(f, p, len) /* * The frame is invalid at this point. */ - IPXCPDEBUG((LOG_INFO, "ipxcp_rejci: received bad Reject!")); + IPXCPDEBUG(("ipxcp_rejci: received bad Reject!")); return 0; } @@ -807,17 +915,15 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) int *len; /* Length of requested CIs */ int reject_if_disagree; { - int unit = f->unit; u_char *cip, *next; /* Pointer to current and next CIs */ u_short cilen, citype; /* Parsed len, type */ - u_short cishort, ts; /* Parsed short value */ - u_int32_t tl, cinetwork, outnet;/* Parsed address values */ + u_short cishort; /* Parsed short value */ + u_int32_t cinetwork; /* Parsed address values */ int rc = CONFACK; /* Final packet return code */ int orc; /* Individual option return code */ u_char *p; /* Pointer to next char to parse */ u_char *ucp = inp; /* Pointer to current output char */ int l = *len; /* Length left */ - u_char maxslotindex, cflag; /* * Reset all his options. @@ -834,7 +940,7 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) if (l < 2 || /* Not enough data for CI header or */ p[1] < 2 || /* CI length too small or */ p[1] > l) { /* CI length too big? */ - IPXCPDEBUG((LOG_INFO, "ipxcp_reqci: bad CI length!")); + IPXCPDEBUG(("ipxcp_reqci: bad CI length!")); orc = CONFREJ; /* Reject bad CI */ cilen = l; /* Reject till end of packet */ l = 0; /* Don't loop again */ @@ -850,8 +956,6 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) * The network number must match. Choose the larger of the two. */ case IPX_NETWORK_NUMBER: - IPXCPDEBUG((LOG_INFO, "ipxcp: received Network Number request")); - /* if we wont negotiate the network number or the length is wrong then reject the option */ if ( !ao->neg_nn || cilen != CILEN_NETN ) { @@ -859,7 +963,6 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) break; } GETLONG(cinetwork, p); - IPXCPDEBUG((LOG_INFO,"Remote proposed IPX network number is %8Lx",tl)); /* If the network numbers match then acknowledge them. */ if (cinetwork != 0) { @@ -896,8 +999,6 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) * The node number is required */ case IPX_NODE_NUMBER: - IPXCPDEBUG((LOG_INFO, "ipxcp: received Node Number request")); - /* if we wont negotiate the node number or the length is wrong then reject the option */ if ( cilen != CILEN_NODEN ) { @@ -955,7 +1056,6 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) * Compression is not desired at this time. It is always rejected. */ case IPX_COMPRESSION_PROTOCOL: - IPXCPDEBUG((LOG_INFO, "ipxcp: received Compression Protocol request ")); orc = CONFREJ; break; /* @@ -970,9 +1070,6 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) } GETSHORT (cishort, p); - IPXCPDEBUG((LOG_INFO, - "Remote router protocol number 0x%04x", - cishort)); if (wo->neg_router == 0) { wo->neg_router = 1; @@ -1017,7 +1114,6 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) * The router name is advisorary. Just accept it if it is not too large. */ case IPX_ROUTER_NAME: - IPXCPDEBUG((LOG_INFO, "ipxcp: received Router Name request")); if (cilen >= CILEN_NAME) { int name_size = cilen - CILEN_NAME; if (name_size > sizeof (ho->name)) @@ -1035,7 +1131,6 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) * This is advisorary. */ case IPX_COMPLETE: - IPXCPDEBUG((LOG_INFO, "ipxcp: received Complete request")); if (cilen != CILEN_COMPLETE) orc = CONFREJ; else { @@ -1047,14 +1142,10 @@ ipxcp_reqci(f, inp, len, reject_if_disagree) * All other entries are not known at this time. */ default: - IPXCPDEBUG((LOG_INFO, "ipxcp: received Complete request")); orc = CONFREJ; break; } - endswitch: - IPXCPDEBUG((LOG_INFO, " (%s)\n", CODENAME(orc))); - if (orc == CONFACK && /* Good CI */ rc != CONFACK) /* but prior CI wasnt? */ continue; /* Don't send this one */ @@ -1094,7 +1185,6 @@ endswitch: if (rc != CONFREJ && !ho->neg_node && wo->req_nn && !reject_if_disagree) { - u_char *ps; if (rc == CONFACK) { rc = CONFNAK; wo->req_nn = 0; /* don't ask again */ @@ -1111,7 +1201,7 @@ endswitch: } *len = ucp - inp; /* Compute output length */ - IPXCPDEBUG((LOG_INFO, "ipxcp: returning Configure-%s", CODENAME(rc))); + IPXCPDEBUG(("ipxcp: returning Configure-%s", CODENAME(rc))); return (rc); /* Return final code */ } @@ -1127,7 +1217,7 @@ ipxcp_up(f) { int unit = f->unit; - IPXCPDEBUG((LOG_INFO, "ipxcp: up")); + IPXCPDEBUG(("ipxcp: up")); /* The default router protocol is RIP/SAP. */ if (ho->router == 0) @@ -1148,7 +1238,8 @@ ipxcp_up(f) if (zero_node (go->our_node)) { static char errmsg[] = "Could not determine local IPX node address"; - IPXCPDEBUG((LOG_ERR, errmsg)); + if (debug) + error(errmsg); ipxcp_close(f->unit, errmsg); return; } @@ -1159,21 +1250,24 @@ ipxcp_up(f) if (go->network == 0) { static char errmsg[] = "Can not determine network number"; - IPXCPDEBUG((LOG_ERR, errmsg)); + if (debug) + error(errmsg); ipxcp_close (unit, errmsg); return; } /* bring the interface up */ if (!sifup(unit)) { - IPXCPDEBUG((LOG_WARNING, "sifup failed")); + if (debug) + warn("sifup failed (IPX)"); ipxcp_close(unit, "Interface configuration failed"); return; } /* set the network number for IPX */ if (!sipxfaddr(unit, go->network, go->our_node)) { - IPXCPDEBUG((LOG_WARNING, "sipxfaddr failed")); + if (debug) + warn("sipxfaddr failed"); ipxcp_close(unit, "Interface configuration failed"); return; } @@ -1197,9 +1291,7 @@ static void ipxcp_down(f) fsm *f; { - u_int32_t ournn, network; - - IPXCPDEBUG((LOG_INFO, "ipxcp: down")); + IPXCPDEBUG(("ipxcp: down")); cipxfaddr (f->unit); sifdown(f->unit); @@ -1216,49 +1308,48 @@ ipxcp_script(f, script) fsm *f; char *script; { - int unit = f->unit; char strspeed[32], strlocal[32], strremote[32]; char strnetwork[32], strpid[32]; char *argv[14], strproto_lcl[32], strproto_rmt[32]; - sprintf (strpid, "%d", getpid()); - sprintf (strspeed, "%d", baud_rate); + slprintf(strpid, sizeof(strpid), "%d", getpid()); + slprintf(strspeed, sizeof(strspeed),"%d", baud_rate); strproto_lcl[0] = '\0'; if (go->neg_router && ((go->router & BIT(IPX_NONE)) == 0)) { if (go->router & BIT(RIP_SAP)) - strcpy (strproto_lcl, "RIP "); + strlcpy (strproto_lcl, sizeof(strproto_lcl), "RIP "); if (go->router & BIT(NLSP)) - strcat (strproto_lcl, "NLSP "); + strlcat (strproto_lcl, sizeof(strproto_lcl), "NLSP "); } if (strproto_lcl[0] == '\0') - strcpy (strproto_lcl, "NONE "); + strlcpy (strproto_lcl, sizeof(strproto_lcl), "NONE "); 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)) - strcpy (strproto_rmt, "RIP "); + strlcpy (strproto_rmt, sizeof(strproto_rmt), "RIP "); if (ho->router & BIT(NLSP)) - strcat (strproto_rmt, "NLSP "); + strlcat (strproto_rmt, sizeof(strproto_rmt), "NLSP "); } if (strproto_rmt[0] == '\0') - strcpy (strproto_rmt, "NONE "); + strlcpy (strproto_rmt, sizeof(strproto_rmt), "NONE "); strproto_rmt[strlen (strproto_rmt)-1] = '\0'; - strcpy (strnetwork, ipx_ntoa (go->network)); + strlcpy (strnetwork, sizeof(strnetwork), ipx_ntoa (go->network)); - sprintf (strlocal, - "%02X%02X%02X%02X%02X%02X", - NODE(go->our_node)); + slprintf (strlocal, sizeof(strlocal), + "%02X%02X%02X%02X%02X%02X", + NODE(go->our_node)); - sprintf (strremote, - "%02X%02X%02X%02X%02X%02X", - NODE(ho->his_node)); + slprintf (strremote, sizeof(strremote), + "%02X%02X%02X%02X%02X%02X", + NODE(ho->his_node)); argv[0] = script; argv[1] = ifname; @@ -1274,7 +1365,7 @@ ipxcp_script(f, script) argv[11] = ipparam; argv[12] = strpid; argv[13] = NULL; - run_program(script, argv, 0); + run_program(script, argv, 0, NULL, NULL); } /*