X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/f00ae0afdcba10172e05c0c05767d53c6d76b03e..cf83e4727abf2deceb633820e40c0522b0ab3ae7:/ppp.c?ds=sidebyside diff --git a/ppp.c b/ppp.c index 0d9dc01..fd2f413 100644 --- a/ppp.c +++ b/ppp.c @@ -1,6 +1,6 @@ // L2TPNS PPP Stuff -char const *cvs_id_ppp = "$Id: ppp.c,v 1.40 2005/01/05 13:50:30 bodea Exp $"; +char const *cvs_id_ppp = "$Id: ppp.c,v 1.39.2.2 2005/02/14 05:55:49 bodea Exp $"; #include #include @@ -32,7 +32,7 @@ void processpap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) char pass[129]; uint16_t hl; - CSTAT(processpap); + CSTAT(call_processpap); LOG_HEX(5, "PAP", p, l); if (l < 4) @@ -60,13 +60,18 @@ void processpap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) { uint8_t *b = p; b += 4; + user[0] = pass[0] = 0; if (*b && *b < sizeof(user)) + { memcpy(user, b + 1, *b); - user[*b] = 0; - b += 1 + *b; - if (*b && *b < sizeof(pass)) - memcpy(pass, b + 1, *b); - pass[*b] = 0; + user[*b] = 0; + b += 1 + *b; + if (*b && *b < sizeof(pass)) + { + memcpy(pass, b + 1, *b); + pass[*b] = 0; + } + } LOG(3, s, t, "PAP login %s/%s\n", user, pass); } if (session[s].ip || !session[s].radius) @@ -132,7 +137,7 @@ void processchap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) uint16_t r; uint16_t hl; - CSTAT(processchap); + CSTAT(call_processchap); LOG_HEX(5, "CHAP", p, l); r = session[s].radius; @@ -224,13 +229,29 @@ void processchap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) radiussend(r, RADIUSAUTH); } +static char *ppp_lcp_types[] = { + NULL, + "ConfigReq", + "ConfigAck", + "ConfigNak", + "ConfigRej", + "TerminateReq", + "TerminateAck", + "CodeRej", + "ProtocolRej", + "EchoReq", + "EchoReply", + "DiscardRequest", + "IdentRequest", +}; + static void dumplcp(uint8_t *p, int l) { int x = l - 4; uint8_t *o = (p + 4); LOG_HEX(5, "PPP LCP Packet", p, l); - LOG(4, 0, 0, "PPP LCP Packet type %d (%s len %d)\n", *p, ppp_lcp_type((int)*p), ntohs( ((uint16_t *) p)[1]) ); + LOG(4, 0, 0, "PPP LCP Packet type %d (%s len %d)\n", *p, ppp_lcp_types[(int)*p], ntohs( ((uint16_t *) p)[1]) ); LOG(4, 0, 0, "Length: %d\n", l); if (*p != ConfigReq && *p != ConfigRej && *p != ConfigAck) return; @@ -255,48 +276,48 @@ static void dumplcp(uint8_t *p, int l) { case 1: // Maximum-Receive-Unit if (length == 4) - LOG(4, 0, 0, " %s %d\n", lcp_type(type), ntohs(*(uint16_t *)(o + 2))); + LOG(4, 0, 0, " %s %d\n", lcp_types[type], ntohs(*(uint16_t *)(o + 2))); else - LOG(4, 0, 0, " %s odd length %d\n", lcp_type(type), length); + LOG(4, 0, 0, " %s odd length %d\n", lcp_types[type], length); break; case 2: // Async-Control-Character-Map if (length == 6) { uint32_t asyncmap = ntohl(*(uint32_t *)(o + 2)); - LOG(4, 0, 0, " %s %x\n", lcp_type(type), asyncmap); + LOG(4, 0, 0, " %s %x\n", lcp_types[type], asyncmap); } else - LOG(4, 0, 0, " %s odd length %d\n", lcp_type(type), length); + LOG(4, 0, 0, " %s odd length %d\n", lcp_types[type], length); break; case 3: // Authentication-Protocol if (length == 4) { int proto = ntohs(*(uint16_t *)(o + 2)); - LOG(4, 0, 0, " %s 0x%x (%s)\n", lcp_type(type), proto, + LOG(4, 0, 0, " %s 0x%x (%s)\n", lcp_types[type], proto, proto == PPPCHAP ? "CHAP" : proto == PPPPAP ? "PAP" : "UNKNOWN"); } else - LOG(4, 0, 0, " %s odd length %d\n", lcp_type(type), length); + LOG(4, 0, 0, " %s odd length %d\n", lcp_types[type], length); break; case 4: // Quality-Protocol { uint32_t qp = ntohl(*(uint32_t *)(o + 2)); - LOG(4, 0, 0, " %s %x\n", lcp_type(type), qp); + LOG(4, 0, 0, " %s %x\n", lcp_types[type], qp); } break; case 5: // Magic-Number if (length == 6) { uint32_t magicno = ntohl(*(uint32_t *)(o + 2)); - LOG(4, 0, 0, " %s %x\n", lcp_type(type), magicno); + LOG(4, 0, 0, " %s %x\n", lcp_types[type], magicno); } else - LOG(4, 0, 0, " %s odd length %d\n", lcp_type(type), length); + LOG(4, 0, 0, " %s odd length %d\n", lcp_types[type], length); break; case 7: // Protocol-Field-Compression case 8: // Address-And-Control-Field-Compression - LOG(4, 0, 0, " %s\n", lcp_type(type)); + LOG(4, 0, 0, " %s\n", lcp_types[type]); break; default: LOG(2, 0, 0, " Unknown PPP LCP Option type %d\n", type); @@ -315,7 +336,7 @@ void processlcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) uint32_t magicno = 0; uint16_t hl; - CSTAT(processlcp); + CSTAT(call_processlcp); LOG_HEX(5, "LCP", p, l); if (l < 4) @@ -467,7 +488,7 @@ void processlcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) *q = ConfigAck; } - LOG(3, s, t, "Sending %s\n", ppp_lcp_type(*response)); + LOG(3, s, t, "Sending %s\n", ppp_lcp_types[*response]); tunnelsend(b, l + (q - b), t); if (!(session[s].flags & SF_LCP_ACKED)) @@ -551,7 +572,7 @@ void processipcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) { uint16_t hl; - CSTAT(processipcp); + CSTAT(call_processipcp); LOG_HEX(5, "IPCP", p, l); if (l < 5) @@ -693,7 +714,7 @@ void processipin(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) { in_addr_t ip; - CSTAT(processipin); + CSTAT(call_processipin); LOG_HEX(5, "IP", p, l); @@ -750,7 +771,7 @@ void processipin(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) session[s].cin += l - 4; session[s].total_cin += l - 4; - sess_count[s].cin += l - 4; + sess_local[s].cin += l - 4; session[s].pin++; eth_tx += l - 4; @@ -785,7 +806,7 @@ void send_ipin(sessionidt s, uint8_t *buf, int len) // Increment packet counters session[s].cin += len - 4; session[s].total_cin += len - 4; - sess_count[s].cin += len - 4; + sess_local[s].cin += len - 4; session[s].pin++; eth_tx += len - 4; @@ -801,7 +822,7 @@ void processccp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) uint8_t b[MAXCONTROL]; uint8_t *q; - CSTAT(processccp); + CSTAT(call_processccp); LOG_HEX(5, "CCP", p, l); switch (l > 1 ? *p : 0) @@ -853,24 +874,25 @@ void sendchap(tunnelidt t, sessionidt s) uint16_t r = session[s].radius; uint8_t *q; - CSTAT(sendchap); + CSTAT(call_sendchap); if (!r) { LOG(1, s, t, "No RADIUS to send challenge\n"); STAT(tunnel_tx_errors); - return; + return ; } - LOG(1, s, t, "Send CHAP challenge\n"); - - // new challenge - random_data(radius[r].auth, sizeof(radius[r].auth)); + { + // new challenge + int n; + for (n = 0; n < 15; n++) + radius[r].auth[n] = rand(); + } radius[r].chap = 1; // CHAP not PAP radius[r].id++; if (radius[r].state != RADIUSCHAP) radius[r].try = 0; - radius[r].state = RADIUSCHAP; radius[r].retry = backoff(radius[r].try++); if (radius[r].try > 5)