// L2TPNS PPP Stuff
-char const *cvs_id_ppp = "$Id: ppp.c,v 1.6 2004-06-28 02:43:13 fred_nerk Exp $";
+char const *cvs_id_ppp = "$Id: ppp.c,v 1.9 2004-08-02 03:38:01 fred_nerk Exp $";
#include <stdio.h>
#include <string.h>
extern tunnelt *tunnel;
extern sessiont *session;
extern radiust *radius;
-extern int tapfd;
+extern int tunfd;
extern char hostname[];
extern u32 eth_tx;
extern time_t time_now;
{
int type = o[0];
int length = o[1];
- if (length == 0)
+ if (length < 2)
{
- log(4, 0, 0, 0, " Option length is 0...\n");
+ log(4, 0, 0, 0, " Option length is %d...\n", length);
break;
}
if (type == 0)
switch (type)
{
case 1: // Maximum-Receive-Unit
+ if (length == 4)
log(4, 0, 0, 0, " %s %d\n", lcp_types[type], ntohs(*(u16 *)(o + 2)));
+ else
+ log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break;
case 3: // Authentication-Protocol
{
+ if (length == 4)
+ {
int proto = ntohs(*(u16 *)(o + 2));
- log(4, 0, 0, 0, " %s %s\n", lcp_types[type],
- proto == 0xC223 ? "CHAP" : "PAP");
+ log(4, 0, 0, 0, " %s 0x%x (%s)\n", lcp_types[type], proto,
+ proto == 0xC223 ? "CHAP" :
+ proto == 0xC023 ? "PAP" : "UNKNOWN");
+ }
+ else
+ log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break;
}
case 4: // Quality-Protocol
}
case 5: // Magic-Number
{
+ if (length == 6)
+ {
u32 magicno = ntohl(*(u32 *)(o + 2));
log(4, 0, 0, 0, " %s %x\n", lcp_types[type], magicno);
+ }
+ else
+ log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break;
}
case 7: // Protocol-Field-Compression
{
- u32 pfc = ntohl(*(u32 *)(o + 2));
- log(4, 0, 0, 0, " %s %x\n", lcp_types[type], pfc);
+ log(4, 0, 0, 0, " %s\n", lcp_types[type]);
break;
}
case 8: // Address-And-Control-Field-Compression
{
- u32 afc = ntohl(*(u32 *)(o + 2));
- log(4, 0, 0, 0, " %s %x\n", lcp_types[type], afc);
+ log(4, 0, 0, 0, " %s\n", lcp_types[type]);
break;
}
default:
if (*p == ConfigAck)
{
log(3, session[s].ip, s, t, "LCP: Discarding ConfigAck\n");
+ session[s].flags |= SESSIONLCPACK;
}
else if (*p == ConfigReq)
{
// Already built a ConfigNak... send it
log(3, session[s].ip, s, t, "Sending ConfigNak\n");
tunnelsend(b, l + (q - b), t);
-
- log(3, session[s].ip, s, t, "Sending ConfigReq, requesting PAP login\n");
- q = makeppp(b, sizeof(b), NULL, 0, t, s, PPPLCP);
- *q++ = ConfigReq;
- *(u8 *)(q++) = 3;
- *(u8 *)(q++) = 4;
- *(u16 *)(q += 2) = htons(0xC023);
- tunnelsend(b, l + (q - b), t);
}
+
+ if (!(session[s].flags & SESSIONLCPACK))
+ initlcp(t, s);
}
else if (*p == ConfigNak)
{
sessionshutdown(s, "Remote end closed connection.");
tunnelsend(b, l + (q - b), t); // send it
}
- else if (*p == TerminateReq)
+ else if (*p == TerminateAck)
{
- sessionshutdown(s, "Remote end closed connection.");
+ sessionshutdown(s, "Connection closed.");
}
else if (*p == EchoReq)
{
// Snooping this session, send it to ASIO
snoop_send_packet(p, l, session[s].snoop_ip, session[s].snoop_port);
}
- STAT(tap_tx_packets);
- INC_STAT(tap_tx_bytes, l);
+ STAT(tun_tx_packets);
+ INC_STAT(tun_tx_bytes, l);
if (session[s].tbf_in && config->cluster_iam_master) { // Are we throttled and a master?? actually handle the throttled packets.
tbf_queue_packet(session[s].tbf_in, p, l);
// send to ethernet
if (tun_write(p, l) < 0)
{
- STAT(tap_tx_errors);
- log(0, 0, s, t, "Error writing %d bytes to TAP device: %s (tapfd=%d, p=%p)\n",
- l, strerror(errno), tapfd, p);
+ STAT(tun_tx_errors);
+ log(0, 0, s, t, "Error writing %d bytes to TUN device: %s (tunfd=%d, p=%p)\n",
+ l, strerror(errno), tunfd, p);
}
}
void send_ipin(sessionidt s, u8 *buf, int len)
{
log_hex(5, "IP in throttled", buf, len);
- if (write(tapfd, buf, len) < 0)
+ if (write(tunfd, buf, len) < 0)
{
- STAT(tap_tx_errors);
- log(0, 0, 0, 0, "Error writing %d bytes to TAP device: %s (tapfd=%d, p=%p)\n",
- len, strerror(errno), tapfd, buf);
+ STAT(tun_tx_errors);
+ log(0, 0, 0, 0, "Error writing %d bytes to TUN device: %s (tunfd=%d, p=%p)\n",
+ len, strerror(errno), tunfd, buf);
}
// Increment packet counters