X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/b84553c1d79a351e87d3b287822d0bf81b608f15..810e88371a3a238b859adff9969a1f16454d77ad:/ppp.c diff --git a/ppp.c b/ppp.c index d7770e5..6af5066 100644 --- a/ppp.c +++ b/ppp.c @@ -1,6 +1,6 @@ // L2TPNS PPP Stuff -char const *cvs_id_ppp = "$Id: ppp.c,v 1.87 2005/12/04 13:06:50 bodea Exp $"; +char const *cvs_id_ppp = "$Id: ppp.c,v 1.91 2005/12/15 14:23:03 bodea Exp $"; #include #include @@ -449,6 +449,7 @@ static void ppp_code_rej(sessionidt s, tunnelidt t, uint16_t proto, { uint8_t *q; int mru = session[s].mru; + if (mru < MINMTU) mru = MINMTU; if (mru > size) mru = size; l += 4; @@ -498,7 +499,9 @@ void processlcp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l) if (session[s].die) // going down... return; - LOG(*p == EchoReq ? 4 : 3, s, t, "LCP: recv %s\n", ppp_code(*p)); + LOG((*p == EchoReq || *p == EchoReply) ? 4 : 3, s, t, + "LCP: recv %s\n", ppp_code(*p)); + if (config->debug > 3) dumplcp(p, l); if (*p == ConfigAck) @@ -577,7 +580,7 @@ void processlcp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l) case 1: // Maximum-Receive-Unit { uint16_t mru = ntohs(*(uint16_t *)(o + 2)); - if (mru >= 576) + if (mru >= MINMTU) { session[s].mru = mru; break; @@ -793,6 +796,7 @@ void processlcp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l) default: LOG(2, s, t, "LCP: remote sent %s for type %u?\n", ppp_code(*p), type); + sessionshutdown(s, "Unable to negotiate LCP.", 3, 0); break; } x -= length; @@ -1754,9 +1758,7 @@ uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, sessionidt s, tunnelid { if (size < 12) // Need more space than this!! { - static int backtrace_count = 0; LOG(0, s, t, "makeppp buffer too small for L2TP header (size=%d)\n", size); - log_backtrace(backtrace_count, 5) return NULL; } @@ -1779,9 +1781,7 @@ uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, sessionidt s, tunnelid if (l + 12 > size) { - static int backtrace_count = 0; LOG(2, s, t, "makeppp would overflow buffer (size=%d, header+payload=%d)\n", size, l + 12); - log_backtrace(backtrace_count, 5) return NULL; } @@ -1877,3 +1877,33 @@ void sendccp(sessionidt s, tunnelidt t) tunnelsend(b, (q - b) + 4 , t); restart_timer(s, ccp); } + +// Reject unknown/unconfigured protocols +void protoreject(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l, uint16_t proto) +{ + + uint8_t buf[MAXETHER]; + uint8_t *q; + int mru = session[s].mru; + if (mru < MINMTU) mru = MINMTU; + if (mru > sizeof(buf)) mru = sizeof(buf); + + l += 6; + if (l > mru) l = mru; + + q = makeppp(buf, sizeof(buf), 0, 0, s, t, PPPLCP); + if (!q) return; + + *q = ProtocolRej; + *(q + 1) = ++sess_local[s].lcp_ident; + *(uint16_t *)(q + 2) = htons(l); + *(uint16_t *)(q + 4) = htons(proto); + memcpy(q + 6, p, l - 6); + + if (proto == PPPIPV6CP) + LOG(3, s, t, "LCP: send ProtocolRej (IPV6CP: not configured)\n"); + else + LOG(2, s, t, "LCP: sent ProtocolRej (0x%04X: unsupported)\n", proto); + + tunnelsend(buf, l + (q - buf), t); +}