// L2TPNS PPP Stuff
-char const *cvs_id_ppp = "$Id: ppp.c,v 1.68 2005/08/10 11:25:56 bodea Exp $";
+char const *cvs_id_ppp = "$Id: ppp.c,v 1.72 2005/08/12 08:18:46 bodea Exp $";
#include <stdio.h>
#include <string.h>
LOG(3, s, t, "PAP login %s/%s\n", user, pass);
}
- r = radiusnew(s);
- if (session[s].ip || !r)
+ if (session[s].ip || !(r = radiusnew(s)))
{
// respond now, either no RADIUS available or already authenticated
uint8_t b[MAXCONTROL];
// transition to Authentication or Network phase:
session[s].ppp.phase = sess_local[s].lcp_authtype ? Authenticate : Network;
+ LOG(3, s, t, "LCP: Opened, phase %s\n", ppp_phase(session[s].ppp.phase));
+
// LCP now Opened
change_state(s, lcp, Opened);
if (session[s].die) // going down...
return;
+ LOG(*p == EchoReq ? 4 : 3, s, t, "LCP: recv %s\n", ppp_code(*p));
+ if (config->debug > 3) dumplcp(p, l);
+
if (*p == ConfigAck)
{
int x = l - 4;
uint8_t *o = (p + 4);
int authtype = 0;
- LOG(3, s, t, "LCP: ConfigAck (%d bytes)...\n", l);
- if (config->debug > 3) dumplcp(p, l);
-
while (x > 2)
{
int type = o[0];
static uint8_t asyncmap[4] = { 0, 0, 0, 0 }; // all zero
static uint8_t authproto[5];
- LOG(3, s, t, "LCP: ConfigReq (%d bytes)...\n", l);
- if (config->debug > 3) dumplcp(p, l);
-
while (x > 2)
{
int type = o[0];
if (!ntohl(*(uint32_t *)(o + 2))) // all bits zero is OK
break;
- LOG(2, s, t, " Remote requesting asyncmap. Rejecting.\n");
+ LOG(3, s, t, " Remote requesting asyncmap. Rejecting.\n");
q = ppp_nak(s, b, sizeof(b), PPPLCP, &response, q, p, o, asyncmap, sizeof(asyncmap));
break;
else
sprintf(proto_name, "%#4.4x", proto);
- LOG(2, s, t, " Remote requesting %s authentication. Rejecting.\n", proto_name);
+ LOG(3, s, t, " Remote requesting %s authentication. Rejecting.\n", proto_name);
alen = add_lcp_auth(authproto, sizeof(authproto), config->radius_authprefer);
if (alen < 2) break; // paranoia
break;
default: // Reject any unknown options
- LOG(2, s, t, " Rejecting PPP LCP Option type %d\n", type);
+ LOG(3, s, t, " Rejecting unknown PPP LCP option %d\n", type);
q = ppp_rej(s, b, sizeof(b), PPPLCP, &response, q, p, o);
}
x -= length;
return;
}
- LOG(3, s, t, "LCP: Sending %s\n", ppp_code(*response));
+ LOG(3, s, t, "LCP: send %s\n", ppp_code(*response));
+ if (config->debug > 3) dumplcp(response, l);
+
tunnelsend(b, l + (response - b), t);
}
else if (*p == ConfigNak)
uint8_t *o = (p + 4);
int authtype = -1;
- LOG(3, s, t, "LCP: ConfigNak (%d bytes)...\n", l);
- if (config->debug > 3) dumplcp(p, l);
-
while (x > 2)
{
int type = o[0];
if (!response) return;
*response = TerminateAck;
*((uint16_t *) (response + 2)) = htons(l = 4);
+
+ LOG(3, s, t, "LCP: send %s\n", ppp_code(*response));
+ if (config->debug > 3) dumplcp(response, l);
+
tunnelsend(b, l + (response - b), t);
}
break;
}
else if (*p == TerminateReq)
{
- LOG(3, s, t, "LCP: Received TerminateReq. Sending TerminateAck\n");
*p = TerminateAck; // close
q = makeppp(b, sizeof(b), p, l, s, t, PPPLCP);
if (!q) return;
+
+ LOG(3, s, t, "LCP: send %s\n", ppp_code(*q));
+ if (config->debug > 3) dumplcp(q, l);
+
tunnelsend(b, l + (q - b), t); // send it
sessionshutdown(s, "Remote end closed connection.", 3, 0);
}
}
else if (*p == EchoReq)
{
- LOG(5, s, t, "LCP: Received EchoReq. Sending EchoReply\n");
*p = EchoReply; // reply
*(uint32_t *) (p + 4) = htonl(session[s].magic); // our magic number
q = makeppp(b, sizeof(b), p, l, s, t, PPPLCP);
if (!q) return;
+
+ LOG(4, s, t, "LCP: send %s\n", ppp_code(*q));
+ if (config->debug > 3) dumplcp(q, l);
+
tunnelsend(b, l + (q - b), t); // send it
}
else if (*p == EchoReply)
q = makeppp(b, sizeof(b), p, l, s, t, PPPLCP);
if (!q) return;
- LOG(3, s, t, "Unexpected LCP code %s\n", ppp_code(code));
+ LOG(2, s, t, "Unexpected LCP code %s\n", ppp_code(code));
+ LOG(3, s, t, "LCP: send %s\n", ppp_code(*q));
+ if (config->debug > 3) dumplcp(q, l);
+
tunnelsend(b, l + (q - b), t);
}
}
return;
}
+ LOG(3, s, t, "IPCP: recv %s\n", ppp_code(*p));
+
if (*p == ConfigAck)
{
switch (session[s].ppp.ipcp)
int gotip = 0;
in_addr_t addr;
- LOG(3, s, t, "IPCP: ConfigReq received\n");
-
while (length > 2)
{
switch (*o)
return;
}
- LOG(3, s, t, "IPCP: Sending %s\n", ppp_code(*response));
+ LOG(3, s, t, "IPCP: send %s\n", ppp_code(*response));
tunnelsend(b, l + (response - b), t);
}
else if (*p == TerminateReq)
{
- LOG(3, s, t, "IPCP: Received TerminateReq. Sending TerminateAck\n");
*p = TerminateAck;
q = makeppp(b, sizeof(b), p, l, s, t, PPPIPCP);
if (!q) return;
+ LOG(3, s, t, "IPCP: send %s\n", ppp_code(*q));
tunnelsend(b, l + (q - b), t);
change_state(s, ipcp, Stopped);
}
q = makeppp(b, sizeof(b), p, l, s, t, PPPIPCP);
if (!q) return;
- LOG(3, s, t, "Unexpected IPCP code %s\n", ppp_code(code));
+ LOG(2, s, t, "Unexpected IPCP code %s\n", ppp_code(code));
+ LOG(3, s, t, "IPCP: send %s\n", ppp_code(*q));
tunnelsend(b, l + (q - b), t);
}
}
return;
}
+ LOG(3, s, t, "IPV6CP: recv %s\n", ppp_code(*p));
+
if (!config->ipv6_prefix.s6_addr[0])
{
LOG(2, s, t, "IPV6CP: %s rejected (not configured)\n", ppp_code(*p));
int gotip = 0;
uint8_t ident[8];
- LOG(3, s, t, "IPV6CP: ConfigReq received\n");
-
while (length > 2)
{
switch (*o)
return;
}
- LOG(3, s, t, "IPV6CP: Sending %s\n", ppp_code(*response));
+ LOG(3, s, t, "IPV6CP: send %s\n", ppp_code(*response));
tunnelsend(b, l + (response - b), t);
}
else if (*p == TerminateReq)
{
- LOG(3, s, t, "IPV6CP: Received TerminateReq. Sending TerminateAck\n");
*p = TerminateAck;
q = makeppp(b, sizeof(b), p, l, s, t, PPPIPV6CP);
if (!q) return;
+ LOG(3, s, t, "IPV6CP: send %s\n", ppp_code(*q));
tunnelsend(b, l + (q - b), t);
change_state(s, ipv6cp, Stopped);
}
q = makeppp(b, sizeof(b), p, l, s, t, PPPIPV6CP);
if (!q) return;
- LOG(3, s, t, "Unexpected IPV6CP code %s\n", ppp_code(code));
+ LOG(2, s, t, "Unexpected IPV6CP code %s\n", ppp_code(code));
+ LOG(3, s, t, "IPV6CP: send %s\n", ppp_code(*q));
tunnelsend(b, l + (q - b), t);
}
}
STAT(tunnel_rx_errors);
}
+ LOG(3, s, t, "CCP: recv %s\n", ppp_code(*p));
if (*p == ConfigAck)
{
switch (session[s].ppp.ccp)
return;
}
- LOG(3, s, t, "CCP: Sending %s\n", ppp_code(*q));
+ LOG(3, s, t, "CCP: send %s\n", ppp_code(*q));
tunnelsend(b, l + (q - b), t);
}
else if (*p == TerminateReq)
{
- LOG(3, s, t, "CCP: Received TerminateReq. Sending TerminateAck\n");
*p = TerminateAck;
q = makeppp(b, sizeof(b), p, l, s, t, PPPCCP);
if (!q) return;
+ LOG(3, s, t, "CCP: send %s\n", ppp_code(*q));
tunnelsend(b, l + (q - b), t);
change_state(s, ccp, Stopped);
}
q = makeppp(b, sizeof(b), p, l, s, t, PPPCCP);
if (!q) return;
- LOG(3, s, t, "Unexpected CCP code %s\n", ppp_code(code));
+ LOG(2, s, t, "Unexpected CCP code %s\n", ppp_code(code));
+ LOG(3, s, t, "CCP: send %s\n", ppp_code(*q));
tunnelsend(b, l + (q - b), t);
}
}
if (!(q = makeppp(b, sizeof(b), NULL, 0, s, t, PPPLCP)))
return;
- LOG(4, s, t, "Sending LCP ConfigReq%s%s\n",
- authtype ? " for " : "",
- authtype ? (authtype == AUTHCHAP ? "CHAP" : "PAP") : "");
+ LOG(3, s, t, "LCP: send ConfigReq%s%s%s\n",
+ authtype ? " (" : "",
+ authtype ? (authtype == AUTHCHAP ? "CHAP" : "PAP") : "",
+ authtype ? ")" : "");
if (!session[s].mru)
session[s].mru = DEFAULT_MRU;
*(uint16_t *)(q + 2) = htons(l - q); // Length
LOG_HEX(5, "PPPLCP", q, l - q);
+ if (config->debug > 3) dumplcp(q, l - q);
+
tunnelsend(b, (l - b), t);
}
if (!(q = makeppp(b, sizeof(b), NULL, 0, s, t, PPPCCP)))
return;
- LOG(4, s, t, "Sending CCP ConfigReq for no compression\n");
+ LOG(3, s, t, "CCP: send ConfigReq (no compression)\n");
+
*q = ConfigReq;
*(uint8_t *)(q + 1) = (time_now % 255) + 1; // ID
*(uint16_t *)(q + 2) = htons(4); // Length