X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/c66fc8c6b90e65da770cfd71d362f19e7357d491..7d7afb67c88904839a7b331152b8c3f2cf784adf:/l2tpns.c diff --git a/l2tpns.c b/l2tpns.c index a265507..13a2565 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -4,7 +4,7 @@ // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // vim: sw=8 ts=8 -char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.40 2004-11-04 05:08:36 bodea Exp $"; +char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.42 2004-11-05 02:25:25 bodea Exp $"; #include #include @@ -1668,39 +1668,23 @@ void processudp(u8 * buf, int len, struct sockaddr_in *addr) case 27: // last send lcp { // find magic number u8 *p = b, *e = p + n; - while (p < e && p[1]) + while (p + 1 < e && p[1] && p + p[1] <= e) { - if (*p == 5 && p[1] == 6) + if (*p == 5 && p[1] == 6) // Magic-Number amagic = ntohl(*(u32 *) (p + 2)); - else if (*p == 3 && p[1] == 5 && *(u16 *) (p + 2) == htons(PPPCHAP) && p[4] == 5) + else if (*p == 3 && p[1] == 5 && *(u16 *) (p + 2) == htons(PPPCHAP) && p[4] == 5) // Authentication-Protocol chap = 1; - else if (*p == 7) + else if (*p == 7) // Protocol-Field-Compression aflags |= SESSIONPFC; - else if (*p == 8) + else if (*p == 8) // Address-and-Control-Field-Compression aflags |= SESSIONACFC; p += p[1]; } - - { - char tmp[500] = {0}; - tmp[0] = ConfigReq; - memcpy((tmp + 1), b, n); - } } break; case 28: // last recv lcp confreq - { - char tmp[500] = {0}; - tmp[0] = ConfigReq; - memcpy((tmp + 1), b, n); - break; - } + break; case 26: // Initial Received LCP CONFREQ - { - char tmp[500] = {0}; - tmp[0] = ConfigReq; - memcpy((tmp + 1), b, n); - } break; case 39: // seq required - we control it as an LNS anyway... break; @@ -1924,27 +1908,12 @@ void processudp(u8 * buf, int len, struct sockaddr_in *addr) } else if (prot == PPPIP) { - if (!config->cluster_iam_master) + session[s].last_packet = time_now; + if (session[s].walled_garden && !config->cluster_iam_master) { - // We're a slave. Should we forward this packet to the master? - - // Is this a walled garden session, or something that needs it's - // idle time updated?? - - // Maintain the idle timeouts on the master. If this would - // significantly reset the idletimeout, run it via the master - // to refresh the master's idle timer. - // Not sure this is ideal: It may re-order packets. - - if (session[s].walled_garden || (session[s].last_packet + (ECHO_TIMEOUT/2)) < time_now) - { - master_forward_packet(buf, len, addr->sin_addr.s_addr, addr->sin_port); - session[s].last_packet = time_now; - return; - } - // fall through to processipin. - } else - session[s].last_packet = time_now; + master_forward_packet(buf, len, addr->sin_addr.s_addr, addr->sin_port); + return; + } processipin(t, s, p, l); } else @@ -3588,15 +3557,14 @@ int sessionsetup(tunnelidt t, sessionidt s) if (!session[s].ip || session[s].ip == 0xFFFFFFFE) { assign_ip_address(s); - if (session[s].ip) - log(3, 0, s, t, " No IP allocated. Assigned %s from pool\n", - inet_toa(htonl(session[s].ip))); - else + if (!session[s].ip) { log(0, 0, s, t, " No IP allocated. The IP address pool is FULL!\n"); sessionshutdown(s, "No IP addresses available"); return 0; } + log(3, 0, s, t, " No IP allocated. Assigned %s from pool\n", + inet_toa(htonl(session[s].ip))); }