// L2TPNS PPP Stuff
-char const *cvs_id_ppp = "$Id: ppp.c,v 1.84 2005/09/16 13:20:39 bodea Exp $";
+char const *cvs_id_ppp = "$Id: ppp.c,v 1.87 2005/12/04 13:06:50 bodea Exp $";
#include <stdio.h>
#include <string.h>
switch (type)
{
case 1: // Maximum-Receive-Unit
- session[s].mru = ntohs(*(uint16_t *)(o + 2));
+ {
+ uint16_t mru = ntohs(*(uint16_t *)(o + 2));
+ if (mru >= 576)
+ {
+ session[s].mru = mru;
+ break;
+ }
+
+ LOG(3, s, t, " Remote requesting MRU of %u. Rejecting.\n", mru);
+ mru = htons(MRU);
+ q = ppp_conf_nak(s, b, sizeof(b), PPPLCP, &response, q, p, o, (uint8_t *) &mru, sizeof(mru));
+ }
break;
case 2: // Async-Control-Character-Map
change_state(s, ipcp, Opened);
- if (!session[s].walled_garden)
+ if (!(session[s].walled_garden || session[s].flags & SESSION_STARTED))
{
uint16_t r = radiusnew(s);
if (r)
+ {
radiussend(r, RADIUSSTART); // send radius start
+
+ // don't send further Start records if IPCP is restarted
+ session[s].flags |= SESSION_STARTED;
+ cluster_send_session(s);
+ }
}
// start IPv6 if configured and still in passive state
case 131: // secondary DNS
if (o[1] != 6 || o[1] > length) return;
- addr = htonl(session[s].dns1);
+ addr = htonl(session[s].dns2);
if (memcmp(o + 2, &addr, sizeof(addr)))
{
q = ppp_conf_nak(s, b, sizeof(b), PPPIPCP, &response, q, p, o, (uint8_t *) &addr, sizeof(addr));
*(uint16_t *) (b + 2) = htons(tunnel[t].far); // tunnel
*(uint16_t *) (b + 4) = htons(session[s].far); // session
b += 6;
- if (mtype == PPPLCP || !(session[s].l2tp_flags & SESSIONACFC))
+ if (mtype == PPPLCP || !(session[s].flags & SESSION_ACFC))
{
*(uint16_t *) b = htons(0xFF03); // HDLC header
b += 2;
}
- if (mtype < 0x100 && session[s].l2tp_flags & SESSIONPFC)
+ if (mtype < 0x100 && session[s].flags & SESSION_PFC)
*b++ = mtype;
else
{
if (config->debug > 3) dumplcp(q, l - q);
tunnelsend(b, (l - b), t);
+ restart_timer(s, lcp);
}
// Send CCP request for no compression
LOG_HEX(5, "PPPCCP", q, 4);
tunnelsend(b, (q - b) + 4 , t);
+ restart_timer(s, ccp);
}