From 40a8b86ac05edb2a17b2d82eb70415379b7fb53b Mon Sep 17 00:00:00 2001 From: joerg Date: Sun, 11 May 1997 10:04:24 +0000 Subject: Make sppp's logging human-readable. Also, use log(9), as opposed to printf(9), so the log output doesn't clutter the console. While i was at it, KNFified some function definitions. This file was very inconsistent in this respect. --- sys/net/if_spppsubr.c | 396 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 262 insertions(+), 134 deletions(-) (limited to 'sys/net/if_spppsubr.c') diff --git a/sys/net/if_spppsubr.c b/sys/net/if_spppsubr.c index 61c266f..bc40e32 100644 --- a/sys/net/if_spppsubr.c +++ b/sys/net/if_spppsubr.c @@ -14,15 +14,15 @@ * * Version 1.9, Wed Oct 4 18:58:15 MSK 1995 * - * $Id: if_spppsubr.c,v 1.16 1997/02/22 09:41:09 peter Exp $ + * $Id: if_spppsubr.c,v 1.17 1997/03/24 11:33:16 bde Exp $ */ -#undef DEBUG #include #include #include #include #include +#include #include #include @@ -57,12 +57,6 @@ #include -#ifdef DEBUG -#define print(s) printf s -#else -#define print(s) {/*void*/} -#endif - #define MAXALIVECNT 3 /* max. alive packets */ #define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */ @@ -170,8 +164,8 @@ static void sppp_ipcp_open (struct sppp *sp); static int sppp_lcp_conf_parse_options (struct sppp *sp, struct lcp_header *h, int len, u_long *magic); static void sppp_cp_timeout (void *arg); -static char *sppp_lcp_type_name (u_char type); -static char *sppp_ipcp_type_name (u_char type); +static const char *sppp_lcp_type_name (u_char type); +static const char *sppp_ipcp_type_name (u_char type); static void sppp_print_bytes (u_char *p, u_short len); static int sppp_output (struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct rtentry *rt); @@ -179,7 +173,8 @@ static int sppp_output (struct ifnet *ifp, struct mbuf *m, /* * Flush interface queue. */ -static void qflush (struct ifqueue *ifq) +static void +qflush(struct ifqueue *ifq) { struct mbuf *m, *n; @@ -196,7 +191,8 @@ static void qflush (struct ifqueue *ifq) /* * Process the received packet. */ -void sppp_input (struct ifnet *ifp, struct mbuf *m) +void +sppp_input(struct ifnet *ifp, struct mbuf *m) { struct ppp_header *h; struct sppp *sp = (struct sppp*) ifp; @@ -210,8 +206,9 @@ void sppp_input (struct ifnet *ifp, struct mbuf *m) if (m->m_pkthdr.len <= PPP_HEADER_LEN) { /* Too small packet, drop it. */ if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: input packet is too small, %d bytes\n", - ifp->if_name, ifp->if_unit, m->m_pkthdr.len); + log(LOG_DEBUG, + "%s%d: input packet is too small, %d bytes\n", + ifp->if_name, ifp->if_unit, m->m_pkthdr.len); drop: ++ifp->if_iqdrops; m_freem (m); return; @@ -224,18 +221,22 @@ drop: ++ifp->if_iqdrops; switch (h->address) { default: /* Invalid PPP packet. */ invalid: if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid input packet <0x%x 0x%x 0x%x>\n", - ifp->if_name, ifp->if_unit, - h->address, h->control, ntohs (h->protocol)); + log(LOG_DEBUG, + "%s%d: invalid input packet " + "\n", + ifp->if_name, ifp->if_unit, + h->address, h->control, ntohs(h->protocol)); goto drop; case PPP_ALLSTATIONS: if (h->control != PPP_UI) goto invalid; if (sp->pp_flags & PP_CISCO) { if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: PPP packet in Cisco mode <0x%x 0x%x 0x%x>\n", - ifp->if_name, ifp->if_unit, - h->address, h->control, ntohs (h->protocol)); + log(LOG_DEBUG, + "%s%d: PPP packet in Cisco mode " + "\n", + ifp->if_name, ifp->if_unit, + h->address, h->control, ntohs(h->protocol)); goto drop; } switch (ntohs (h->protocol)) { @@ -245,9 +246,11 @@ invalid: if (ifp->if_flags & IFF_DEBUG) ++sp->pp_seq, m->m_pkthdr.len + 2, &h->protocol); if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid input protocol <0x%x 0x%x 0x%x>\n", - ifp->if_name, ifp->if_unit, - h->address, h->control, ntohs (h->protocol)); + log(LOG_DEBUG, + "%s%d: invalid input protocol " + "\n", + ifp->if_name, ifp->if_unit, + h->address, h->control, ntohs(h->protocol)); ++ifp->if_noproto; goto drop; case PPP_LCP: @@ -301,9 +304,11 @@ invalid: if (ifp->if_flags & IFF_DEBUG) /* Don't check the control field here (RFC 1547). */ if (! (sp->pp_flags & PP_CISCO)) { if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: Cisco packet in PPP mode <0x%x 0x%x 0x%x>\n", - ifp->if_name, ifp->if_unit, - h->address, h->control, ntohs (h->protocol)); + log(LOG_DEBUG, + "%s%d: Cisco packet in PPP mode " + "\n", + ifp->if_name, ifp->if_unit, + h->address, h->control, ntohs(h->protocol)); goto drop; } switch (ntohs (h->protocol)) { @@ -346,7 +351,7 @@ invalid: if (ifp->if_flags & IFF_DEBUG) IF_DROP (inq); splx (s); if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: protocol queue overflow\n", + log(LOG_DEBUG, "%s%d: protocol queue overflow\n", ifp->if_name, ifp->if_unit); goto drop; } @@ -358,7 +363,8 @@ invalid: if (ifp->if_flags & IFF_DEBUG) * Enqueue transmit packet. */ static int -sppp_output (struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct rtentry *rt) +sppp_output(struct ifnet *ifp, struct mbuf *m, + struct sockaddr *dst, struct rtentry *rt) { struct sppp *sp = (struct sppp*) ifp; struct ppp_header *h; @@ -397,7 +403,7 @@ sppp_output (struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct rte M_PREPEND (m, PPP_HEADER_LEN, M_DONTWAIT); if (! m) { if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: no memory for transmit header\n", + log(LOG_DEBUG, "%s%d: no memory for transmit header\n", ifp->if_name, ifp->if_unit); splx (s); return (ENOBUFS); @@ -475,7 +481,8 @@ nosupport: return (0); } -void sppp_attach (struct ifnet *ifp) +void +sppp_attach(struct ifnet *ifp) { struct sppp *sp = (struct sppp*) ifp; @@ -500,7 +507,7 @@ void sppp_attach (struct ifnet *ifp) } void -sppp_detach (struct ifnet *ifp) +sppp_detach(struct ifnet *ifp) { struct sppp **q, *p, *sp = (struct sppp*) ifp; @@ -520,7 +527,8 @@ sppp_detach (struct ifnet *ifp) /* * Flush the interface output queue. */ -void sppp_flush (struct ifnet *ifp) +void +sppp_flush(struct ifnet *ifp) { struct sppp *sp = (struct sppp*) ifp; @@ -532,7 +540,7 @@ void sppp_flush (struct ifnet *ifp) * Check if the output queue is empty. */ int -sppp_isempty (struct ifnet *ifp) +sppp_isempty(struct ifnet *ifp) { struct sppp *sp = (struct sppp*) ifp; int empty, s = splimp (); @@ -545,7 +553,8 @@ sppp_isempty (struct ifnet *ifp) /* * Get next packet to send. */ -struct mbuf *sppp_dequeue (struct ifnet *ifp) +struct mbuf * +sppp_dequeue(struct ifnet *ifp) { struct sppp *sp = (struct sppp*) ifp; struct mbuf *m; @@ -561,7 +570,8 @@ struct mbuf *sppp_dequeue (struct ifnet *ifp) /* * Send keepalive packets, every 10 seconds. */ -void sppp_keepalive (void *dummy) +static void +sppp_keepalive(void *dummy) { struct sppp *sp; int s = splimp (); @@ -612,52 +622,61 @@ void sppp_keepalive (void *dummy) /* * Handle incoming PPP Link Control Protocol packets. */ -void sppp_lcp_input (struct sppp *sp, struct mbuf *m) +static void +sppp_lcp_input(struct sppp *sp, struct mbuf *m) { struct lcp_header *h; struct ifnet *ifp = &sp->pp_if; - int len = m->m_pkthdr.len; + int len = m->m_pkthdr.len, debug = ifp->if_flags & IFF_DEBUG; u_char *p, opt[6]; u_long rmagic; if (len < 4) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid lcp packet length: %d bytes\n", - ifp->if_name, ifp->if_unit, len); + if (debug) + log(LOG_DEBUG, + "%s%d: invalid lcp packet length: %d bytes\n", + ifp->if_name, ifp->if_unit, len); return; } h = mtod (m, struct lcp_header*); - if (ifp->if_flags & IFF_DEBUG) { - char state = '?'; + if (debug) { + const char *state = "unknown"; switch (sp->lcp.state) { - case LCP_STATE_CLOSED: state = 'C'; break; - case LCP_STATE_ACK_RCVD: state = 'R'; break; - case LCP_STATE_ACK_SENT: state = 'S'; break; - case LCP_STATE_OPENED: state = 'O'; break; + case LCP_STATE_CLOSED: state = "closed"; break; + case LCP_STATE_ACK_RCVD: state = "ack-rcvd"; break; + case LCP_STATE_ACK_SENT: state = "ack-sent"; break; + case LCP_STATE_OPENED: state = "opened"; break; } - printf ("%s%d: lcp input(%c): %d bytes <%s id=%xh len=%xh", - ifp->if_name, ifp->if_unit, state, len, - sppp_lcp_type_name (h->type), h->ident, ntohs (h->len)); + log(LOG_DEBUG, + "%s%d: lcp input(%s): %d bytes <%s id=0x%x len=0x%x", + ifp->if_name, ifp->if_unit, state, len, + sppp_lcp_type_name (h->type), h->ident, ntohs (h->len)); if (len > 4) sppp_print_bytes ((u_char*) (h+1), len-4); - printf (">\n"); + addlog(">\n"); } if (len > ntohs (h->len)) len = ntohs (h->len); switch (h->type) { default: /* Unknown packet type -- send Code-Reject packet. */ + if (debug) + addlog("%s%d: sending lcp code rej\n", + ifp->if_name, ifp->if_unit); sppp_cp_send (sp, PPP_LCP, LCP_CODE_REJ, ++sp->pp_seq, m->m_pkthdr.len, h); break; case LCP_CONF_REQ: if (len < 4) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid lcp configure request packet length: %d bytes\n", - ifp->if_name, ifp->if_unit, len); + if (debug) + addlog("%s%d: invalid lcp configure request " + "packet length: %d bytes\n", + ifp->if_name, ifp->if_unit, len); break; } - if (len>4 && !sppp_lcp_conf_parse_options (sp, h, len, &rmagic)) + rmagic = 0xd00ddeed; /* in case LCP fails */ + if (len > 4 && + !sppp_lcp_conf_parse_options (sp, h, len, &rmagic)) goto badreq; if (rmagic == sp->lcp.magic) { /* Local and remote magics equal -- loopback? */ @@ -669,9 +688,11 @@ void sppp_lcp_input (struct sppp *sp, struct mbuf *m) if_down (ifp); qflush (&sp->pp_fastq); } - } else if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: conf req: magic glitch\n", - ifp->if_name, ifp->if_unit); + } else if (debug) { + addlog("%s%d: conf req: magic glitch, " + "sending config nak\n", + ifp->if_name, ifp->if_unit); + } ++sp->pp_loopcnt; /* MUST send Conf-Nack packet. */ @@ -684,7 +705,7 @@ void sppp_lcp_input (struct sppp *sp, struct mbuf *m) opt[5] = rmagic; sppp_cp_send (sp, PPP_LCP, LCP_CONF_NAK, h->ident, sizeof (opt), &opt); -badreq: + badreq: switch (sp->lcp.state) { case LCP_STATE_OPENED: /* Initiate renegotiation. */ @@ -698,6 +719,9 @@ badreq: break; } /* Send Configure-Ack packet. */ + if (debug) + addlog("%s%d: sending configure ack\n", + ifp->if_name, ifp->if_unit); sp->pp_loopcnt = 0; sppp_cp_send (sp, PPP_LCP, LCP_CONF_ACK, h->ident, len-4, h+1); @@ -722,8 +746,13 @@ badreq: } break; case LCP_CONF_ACK: - if (h->ident != sp->lcp.confid) + if (h->ident != sp->lcp.confid) { + if (debug) + addlog("%s%d: lcp id mismatch 0x%x != 0x%x\n", + ifp->if_name, ifp->if_unit, + h->ident, sp->lcp.confid); break; + } UNTIMO (sp); if (! (ifp->if_flags & IFF_UP) && (ifp->if_flags & IFF_RUNNING)) { @@ -743,16 +772,21 @@ badreq: } break; case LCP_CONF_NAK: - if (h->ident != sp->lcp.confid) + if (h->ident != sp->lcp.confid) { + if (debug) + addlog("%s%d: lcp id mismatch 0x%x != 0x%x\n", + ifp->if_name, ifp->if_unit, + h->ident, sp->lcp.confid); break; + } p = (u_char*) (h+1); if (len>=10 && p[0] == LCP_OPT_MAGIC && p[1] >= 4) { rmagic = (u_long)p[2] << 24 | (u_long)p[3] << 16 | p[4] << 8 | p[5]; if (rmagic == ~sp->lcp.magic) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: conf nak: magic glitch\n", - ifp->if_name, ifp->if_unit); + if (debug) + addlog("%s%d: conf nak: magic glitch\n", + ifp->if_name, ifp->if_unit); sp->lcp.magic += time.tv_sec + time.tv_usec; } else sp->lcp.magic = rmagic; @@ -764,14 +798,25 @@ badreq: } /* The link will be renegotiated after timeout, * to avoid endless req-nack loop. */ + if (debug) + addlog("%s%d: sleeping due to nak\n", + ifp->if_name, ifp->if_unit); UNTIMO (sp); TIMO (sp, 2); break; case LCP_CONF_REJ: - if (h->ident != sp->lcp.confid) + if (h->ident != sp->lcp.confid) { + if (debug) + addlog("%s%d: lcp id mismatch 0x%x != 0x%x\n", + ifp->if_name, ifp->if_unit, + h->ident, sp->lcp.confid); break; + } UNTIMO (sp); /* Initiate renegotiation. */ + if (debug) + addlog("%s%d: reopening lcp\n", + ifp->if_name, ifp->if_unit); sppp_lcp_open (sp); if (sp->lcp.state != LCP_STATE_ACK_SENT) { /* Go to closed state. */ @@ -782,6 +827,9 @@ badreq: case LCP_TERM_REQ: UNTIMO (sp); /* Send Terminate-Ack packet. */ + if (debug) + addlog("%s%d: sending terminate-ack\n", + ifp->if_name, ifp->if_unit); sppp_cp_send (sp, PPP_LCP, LCP_TERM_ACK, h->ident, 0, 0); /* Go to closed state. */ sp->lcp.state = LCP_STATE_CLOSED; @@ -792,18 +840,26 @@ badreq: case LCP_TERM_ACK: case LCP_CODE_REJ: case LCP_PROTO_REJ: + if (debug) + addlog("%s%d: ignoring lcp code 0x%x\n", + ifp->if_name, ifp->if_unit, h->type); /* Ignore for now. */ break; case LCP_DISC_REQ: /* Discard the packet. */ break; case LCP_ECHO_REQ: - if (sp->lcp.state != LCP_STATE_OPENED) + if (sp->lcp.state != LCP_STATE_OPENED) { + if (debug) + addlog("%s%d: lcp echo req but lcp close\n", + ifp->if_name, ifp->if_unit); break; + } if (len < 8) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid lcp echo request packet length: %d bytes\n", - ifp->if_name, ifp->if_unit, len); + if (debug) + addlog("%s%d: invalid lcp echo request " + "packet length: %d bytes\n", + ifp->if_name, ifp->if_unit, len); break; } if (ntohl (*(long*)(h+1)) == sp->lcp.magic) { @@ -821,19 +877,26 @@ badreq: break; } *(long*)(h+1) = htonl (sp->lcp.magic); + if (debug) + addlog("%s%d: got lcp echo req, sending echo rep\n", + ifp->if_name, ifp->if_unit); sppp_cp_send (sp, PPP_LCP, LCP_ECHO_REPLY, h->ident, len-4, h+1); break; case LCP_ECHO_REPLY: if (h->ident != sp->lcp.echoid) break; if (len < 8) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid lcp echo reply packet length: %d bytes\n", - ifp->if_name, ifp->if_unit, len); + if (debug) + addlog("%s%d: invalid lcp echo reply " + "packet length: %d bytes\n", + ifp->if_name, ifp->if_unit, len); break; } + if (debug) + addlog("%s%d: got lcp echo rep\n", + ifp->if_name, ifp->if_unit); if (ntohl (*(long*)(h+1)) != sp->lcp.magic) - sp->pp_alivecnt = 0; + sp->pp_alivecnt = 0; break; } } @@ -842,29 +905,33 @@ badreq: * Handle incoming Cisco keepalive protocol packets. */ static void -sppp_cisco_input (struct sppp *sp, struct mbuf *m) +sppp_cisco_input(struct sppp *sp, struct mbuf *m) { struct cisco_packet *h; struct ifaddr *ifa; struct ifnet *ifp = &sp->pp_if; + int debug = ifp->if_flags & IFF_DEBUG; if (m->m_pkthdr.len != CISCO_PACKET_LEN) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid cisco packet length: %d bytes\n", - ifp->if_name, ifp->if_unit, m->m_pkthdr.len); + if (debug) + log(LOG_DEBUG, + "%s%d: invalid cisco packet length: %d bytes\n", + ifp->if_name, ifp->if_unit, m->m_pkthdr.len); return; } h = mtod (m, struct cisco_packet*); - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: cisco input: %d bytes <%lxh %lxh %lxh %xh %xh-%xh>\n", - ifp->if_name, ifp->if_unit, m->m_pkthdr.len, - ntohl (h->type), h->par1, h->par2, h->rel, - h->time0, h->time1); + if (debug) + log(LOG_DEBUG, + "%s%d: cisco input: %d bytes " + "<0x%lx 0x%lx 0x%lx 0x%x 0x%x-0x%x>\n", + ifp->if_name, ifp->if_unit, m->m_pkthdr.len, + ntohl (h->type), h->par1, h->par2, h->rel, + h->time0, h->time1); switch (ntohl (h->type)) { default: - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: unknown cisco packet type: 0x%lx\n", - ifp->if_name, ifp->if_unit, ntohl (h->type)); + if (debug) + addlog("%s%d: unknown cisco packet type: 0x%lx\n", + ifp->if_name, ifp->if_unit, ntohl (h->type)); break; case CISCO_ADDR_REPLY: /* Reply on address request, ignore */ @@ -903,9 +970,9 @@ sppp_cisco_input (struct sppp *sp, struct mbuf *m) if (ifa->ifa_addr->sa_family == AF_INET) break; if (! ifa) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: unknown address for cisco request\n", - ifp->if_name, ifp->if_unit); + if (debug) + addlog("%s%d: unknown address for cisco request\n", + ifp->if_name, ifp->if_unit); return; } sppp_cisco_send (sp, CISCO_ADDR_REPLY, @@ -919,13 +986,14 @@ sppp_cisco_input (struct sppp *sp, struct mbuf *m) * Send PPP LCP packet. */ static void -sppp_cp_send (struct sppp *sp, u_short proto, u_char type, - u_char ident, u_short len, void *data) +sppp_cp_send(struct sppp *sp, u_short proto, u_char type, + u_char ident, u_short len, void *data) { struct ppp_header *h; struct lcp_header *lh; struct mbuf *m; struct ifnet *ifp = &sp->pp_if; + int debug = ifp->if_flags & IFF_DEBUG; if (len > MHLEN - PPP_HEADER_LEN - LCP_HEADER_LEN) len = MHLEN - PPP_HEADER_LEN - LCP_HEADER_LEN; @@ -947,8 +1015,8 @@ sppp_cp_send (struct sppp *sp, u_short proto, u_char type, if (len) bcopy (data, lh+1, len); - if (ifp->if_flags & IFF_DEBUG) { - printf ("%s%d: %s output <%s id=%xh len=%xh", + if (debug) { + log(LOG_DEBUG, "%s%d: %s output <%s id=%xh len=%xh", ifp->if_name, ifp->if_unit, proto==PPP_LCP ? "lcp" : "ipcp", proto==PPP_LCP ? sppp_lcp_type_name (lh->type) : @@ -956,7 +1024,7 @@ sppp_cp_send (struct sppp *sp, u_short proto, u_char type, ntohs (lh->len)); if (len) sppp_print_bytes ((u_char*) (lh+1), len); - printf (">\n"); + addlog(">\n"); } if (IF_QFULL (&sp->pp_fastq)) { IF_DROP (&ifp->if_snd); @@ -972,13 +1040,14 @@ sppp_cp_send (struct sppp *sp, u_short proto, u_char type, * Send Cisco keepalive packet. */ static void -sppp_cisco_send (struct sppp *sp, int type, long par1, long par2) +sppp_cisco_send(struct sppp *sp, int type, long par1, long par2) { struct ppp_header *h; struct cisco_packet *ch; struct mbuf *m; struct ifnet *ifp = &sp->pp_if; u_long t = (time.tv_sec - boottime.tv_sec) * 1000; + int debug = ifp->if_flags & IFF_DEBUG; MGETHDR (m, M_DONTWAIT, MT_DATA); if (! m) @@ -999,8 +1068,9 @@ sppp_cisco_send (struct sppp *sp, int type, long par1, long par2) ch->time0 = htons ((u_short) (t >> 16)); ch->time1 = htons ((u_short) t); - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: cisco output: <%lxh %lxh %lxh %xh %xh-%xh>\n", + if (debug) + log(LOG_DEBUG, + "%s%d: cisco output: <0x%lx 0x%lx 0x%lx 0x%x 0x%x-0x%x>\n", ifp->if_name, ifp->if_unit, ntohl (ch->type), ch->par1, ch->par2, ch->rel, ch->time0, ch->time1); @@ -1018,7 +1088,7 @@ sppp_cisco_send (struct sppp *sp, int type, long par1, long par2) * Process an ioctl request. Called on low priority level. */ int -sppp_ioctl (struct ifnet *ifp, int cmd, void *data) +sppp_ioctl(struct ifnet *ifp, int cmd, void *data) { struct ifreq *ifr = (struct ifreq*) data; struct sppp *sp = (struct sppp*) ifp; @@ -1026,7 +1096,7 @@ sppp_ioctl (struct ifnet *ifp, int cmd, void *data) switch (cmd) { default: - return (EINVAL); + return (ENOTTY); case SIOCAIFADDR: case SIOCSIFDSTADDR: @@ -1099,89 +1169,121 @@ sppp_ioctl (struct ifnet *ifp, int cmd, void *data) * send Configure-reject packet, containing only unknown options. */ static int -sppp_lcp_conf_parse_options (struct sppp *sp, struct lcp_header *h, - int len, u_long *magic) +sppp_lcp_conf_parse_options(struct sppp *sp, struct lcp_header *h, + int len, u_long *magic) { u_char *buf, *r, *p; - int rlen; + struct ifnet *ifp = &sp->pp_if; + int rlen, debug = ifp->if_flags & IFF_DEBUG; len -= 4; buf = r = malloc (len, M_TEMP, M_NOWAIT); if (! buf) return (0); + if (debug) + addlog("%s%d: lcp parse opts: ", ifp->if_name, ifp->if_unit); + p = (void*) (h+1); for (rlen=0; len>1 && p[1]; len-=p[1], p+=p[1]) { switch (*p) { case LCP_OPT_MAGIC: /* Magic number -- extract. */ + if (debug) + addlog(" magicnum: "); if (len >= 6 && p[1] == 6) { *magic = (u_long)p[2] << 24 | (u_long)p[3] << 16 | p[4] << 8 | p[5]; + if (debug) + addlog("0x%x", *magic); continue; } + if (debug) + addlog("invalid"); break; case LCP_OPT_ASYNC_MAP: /* Async control character map -- check to be zero. */ + if (debug) + addlog(" asyncmap: "); if (len >= 6 && p[1] == 6 && ! p[2] && ! p[3] && - ! p[4] && ! p[5]) + ! p[4] && ! p[5]) { + if (debug) + addlog("empty (ack)"); continue; + } + if (debug) + addlog("non-empty (rej)"); break; case LCP_OPT_MRU: /* Maximum receive unit -- always OK. */ + if (debug) + addlog(" mru (ignored)"); continue; default: /* Others not supported. */ + if (debug) + addlog(" unknown 0x%x", *p); break; } /* Add the option to rejected list. */ - bcopy (p, r, p[1]); - r += p[1]; + bcopy (p, r, p[1]); + r += p[1]; rlen += p[1]; } - if (rlen) - sppp_cp_send (sp, PPP_LCP, LCP_CONF_REJ, h->ident, rlen, buf); + if (rlen) { + if (debug) + addlog(", send lcp configure nak\n"); + sppp_cp_send (sp, PPP_LCP, LCP_CONF_NAK, h->ident, rlen, buf); + } else if (debug) + addlog("\n"); free (buf, M_TEMP); return (rlen == 0); } static void -sppp_ipcp_input (struct sppp *sp, struct mbuf *m) +sppp_ipcp_input(struct sppp *sp, struct mbuf *m) { struct lcp_header *h; struct ifnet *ifp = &sp->pp_if; - int len = m->m_pkthdr.len; + int len = m->m_pkthdr.len, debug = ifp->if_flags & IFF_DEBUG;; if (len < 4) { - /* if (ifp->if_flags & IFF_DEBUG) */ - printf ("%s%d: invalid ipcp packet length: %d bytes\n", - ifp->if_name, ifp->if_unit, len); + printf ("%s%d: invalid ipcp packet length: %d bytes\n", + ifp->if_name, ifp->if_unit, len); return; } h = mtod (m, struct lcp_header*); - if (ifp->if_flags & IFF_DEBUG) { - printf ("%s%d: ipcp input: %d bytes <%s id=%xh len=%xh", - ifp->if_name, ifp->if_unit, len, - sppp_ipcp_type_name (h->type), h->ident, ntohs (h->len)); + if (debug) { + log(LOG_DEBUG, + "%s%d: ipcp input: %d bytes <%s id=0x%x len=0x%x", + ifp->if_name, ifp->if_unit, len, + sppp_ipcp_type_name (h->type), h->ident, ntohs (h->len)); if (len > 4) sppp_print_bytes ((u_char*) (h+1), len-4); - printf (">\n"); + addlog(">\n"); } if (len > ntohs (h->len)) len = ntohs (h->len); switch (h->type) { default: /* Unknown packet type -- send Code-Reject packet. */ + if (debug) + addlog("%s%d: ipcp unknown type 0x%x, sending code rej\n", + ifp->if_name, ifp->if_unit, h->type); sppp_cp_send (sp, PPP_IPCP, IPCP_CODE_REJ, ++sp->pp_seq, len, h); break; case IPCP_CONF_REQ: if (len < 4) { - if (ifp->if_flags & IFF_DEBUG) - printf ("%s%d: invalid ipcp configure request packet length: %d bytes\n", - ifp->if_name, ifp->if_unit, len); + if (debug) + addlog("%s%d: invalid ipcp configure " + "request packet length: %d bytes\n", + ifp->if_name, ifp->if_unit, len); return; } if (len > 4) { + if (debug) + addlog("%s%d: rejecting ipcp conf req len=%d\n", + ifp->if_name, ifp->if_unit, len); sppp_cp_send (sp, PPP_IPCP, LCP_CONF_REJ, h->ident, len-4, h+1); @@ -1195,6 +1297,9 @@ sppp_ipcp_input (struct sppp *sp, struct mbuf *m) sp->ipcp.state = IPCP_STATE_CLOSED; } } else { + if (debug) + addlog("%s%d: sending ipcp conf ack\n", + ifp->if_name, ifp->if_unit); /* Send Configure-Ack packet. */ sppp_cp_send (sp, PPP_IPCP, IPCP_CONF_ACK, h->ident, 0, 0); @@ -1206,8 +1311,13 @@ sppp_ipcp_input (struct sppp *sp, struct mbuf *m) } break; case IPCP_CONF_ACK: - if (h->ident != sp->ipcp.confid) + if (h->ident != sp->ipcp.confid) { + if (debug) + addlog("%s%d: ipcp id mismatch 0x%x != 0x%x\n", + ifp->if_name, ifp->if_unit, + h->ident, sp->ipcp.confid); break; + } UNTIMO (sp); switch (sp->ipcp.state) { case IPCP_STATE_CLOSED: @@ -1221,8 +1331,17 @@ sppp_ipcp_input (struct sppp *sp, struct mbuf *m) break; case IPCP_CONF_NAK: case IPCP_CONF_REJ: - if (h->ident != sp->ipcp.confid) + if (h->ident != sp->ipcp.confid) { + if (debug) + addlog("%s%d: ipcp id mismatch 0x%x != 0x%x\n", + ifp->if_name, ifp->if_unit, + h->ident, sp->ipcp.confid); break; + } + if (debug) + addlog("%s%d: got ipcp conf %s, reopening ipcp\n", + ifp->if_name, ifp->if_unit, + (h->type == IPCP_CONF_NAK? "nak": "rej")); UNTIMO (sp); /* Initiate renegotiation. */ sppp_ipcp_open (sp); @@ -1232,6 +1351,9 @@ sppp_ipcp_input (struct sppp *sp, struct mbuf *m) break; case IPCP_TERM_REQ: /* Send Terminate-Ack packet. */ + if (debug) + addlog("%s%d: got ipcp term req\n", + ifp->if_name, ifp->if_unit); sppp_cp_send (sp, PPP_IPCP, IPCP_TERM_ACK, h->ident, 0, 0); /* Go to closed state. */ sp->ipcp.state = IPCP_STATE_CLOSED; @@ -1240,14 +1362,20 @@ sppp_ipcp_input (struct sppp *sp, struct mbuf *m) break; case IPCP_TERM_ACK: /* Ignore for now. */ + if (debug) + addlog("%s%d: ignoring ipcp term ack\n", + ifp->if_name, ifp->if_unit); case IPCP_CODE_REJ: /* Ignore for now. */ + if (debug) + addlog("%s%d: ignoring ipcp code rej\n", + ifp->if_name, ifp->if_unit); break; } } static void -sppp_lcp_open (struct sppp *sp) +sppp_lcp_open(struct sppp *sp) { char opt[6]; @@ -1266,7 +1394,7 @@ sppp_lcp_open (struct sppp *sp) } static void -sppp_ipcp_open (struct sppp *sp) +sppp_ipcp_open(struct sppp *sp) { sp->ipcp.confid = ++sp->pp_seq; sppp_cp_send (sp, PPP_IPCP, IPCP_CONF_REQ, sp->ipcp.confid, 0, 0); @@ -1277,7 +1405,7 @@ sppp_ipcp_open (struct sppp *sp) * Process PPP control protocol timeouts. */ static void -sppp_cp_timeout (void *arg) +sppp_cp_timeout(void *arg) { struct sppp *sp = (struct sppp*) arg; int s = splimp (); @@ -1326,10 +1454,10 @@ sppp_cp_timeout (void *arg) splx (s); } -static char -*sppp_lcp_type_name (u_char type) +static const char * +sppp_lcp_type_name(u_char type) { - static char buf [8]; + static char buf [12]; switch (type) { case LCP_CONF_REQ: return ("conf-req"); case LCP_CONF_ACK: return ("conf-ack"); @@ -1343,14 +1471,14 @@ static char case LCP_ECHO_REPLY: return ("echo-reply"); case LCP_DISC_REQ: return ("discard-req"); } - sprintf (buf, "%xh", type); + sprintf (buf, "0x%x", type); return (buf); } -static char -*sppp_ipcp_type_name (u_char type) +static const char * +sppp_ipcp_type_name(u_char type) { - static char buf [8]; + static char buf [12]; switch (type) { case IPCP_CONF_REQ: return ("conf-req"); case IPCP_CONF_ACK: return ("conf-ack"); @@ -1360,14 +1488,14 @@ static char case IPCP_TERM_ACK: return ("term-ack"); case IPCP_CODE_REJ: return ("code-rej"); } - sprintf (buf, "%xh", type); + sprintf (buf, "0x%x", type); return (buf); } static void -sppp_print_bytes (u_char *p, u_short len) +sppp_print_bytes(u_char *p, u_short len) { - printf (" %x", *p++); + addlog(" %x", *p++); while (--len > 0) - printf ("-%x", *p++); + addlog("-%x", *p++); } -- cgit v1.1