// L2TPNS PPP Stuff
-char const *cvs_id_ppp = "$Id: ppp.c,v 1.90 2005/12/15 14:18:16 bodea Exp $";
+char const *cvs_id_ppp = "$Id: ppp.c,v 1.95 2006/02/17 14:35:54 bodea Exp $";
#include <stdio.h>
#include <string.h>
{
uint8_t b[MAXETHER];
uint8_t *q = NULL;
- uint32_t magicno = 0;
uint16_t hl;
CSTAT(processlcp);
if (mru >= MINMTU)
{
session[s].mru = mru;
+ cluster_send_session(s);
break;
}
}
break;
- case 5: // Magic-Number
- magicno = ntohl(*(uint32_t *)(o + 2));
- break;
-
case 4: // Quality-Protocol
+ case 5: // Magic-Number
case 7: // Protocol-Field-Compression
case 8: // Address-And-Control-Field-Compression
break;
break;
+ case 5: // Magic-Number
+ if (*p == ConfigNak)
+ {
+ session[s].magic = ntohl(*(uint32_t *)(o + 2));
+ LOG(3, s, t, " Remote requested magic-no %x\n", session[s].magic);
+ if (!session[s].magic) session[s].magic = time_now; // Netgear DG814 sends zero??
+ cluster_send_session(s);
+ break;
+ }
+ // ConfigRej: fallthrough
+
default:
LOG(2, s, t, "LCP: remote sent %s for type %u?\n", ppp_code(*p), type);
- break;
+ sessionshutdown(s, "Unable to negotiate LCP.", 3, 0);
+ return;
}
x -= length;
o += length;
while (length > 2)
{
+ if (!o[1] || o[1] > length) return;
+
switch (*o)
{
case 3: // ip address
gotip++; // seen address
- if (o[1] != 6 || o[1] > length) return;
+ if (o[1] != 6) return;
addr = htonl(session[s].ip);
if (memcmp(o + 2, &addr, (sizeof addr)))
break;
case 129: // primary DNS
- if (o[1] != 6 || o[1] > length) return;
+ if (o[1] != 6) return;
addr = htonl(session[s].dns1);
if (memcmp(o + 2, &addr, (sizeof addr)))
break;
case 131: // secondary DNS
- if (o[1] != 6 || o[1] > length) return;
+ if (o[1] != 6) return;
addr = htonl(session[s].dns2);
if (memcmp(o + 2, &addr, sizeof(addr)))
while (length > 2)
{
+ if (!o[1] || o[1] > length) return;
+
switch (*o)
{
case 1: // interface identifier
gotip++; // seen address
- if (o[1] != 10 || o[1] > length) return;
+ if (o[1] != 10) return;
*(uint32_t *) ident = htonl(session[s].ip);
*(uint32_t *) (ident + 4) = 0;