// L2TPNS Global Stuff
-// $Id: l2tpns.h,v 1.95 2005/10/12 07:16:13 bodea Exp $
+// $Id: l2tpns.h,v 1.110 2006/03/27 03:01:08 bodea Exp $
#ifndef __L2TPNS_H__
#define __L2TPNS_H__
#include <netinet/in.h>
-#include <execinfo.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <libcli.h>
-#define VERSION "2.1.10"
+#define VERSION "2.1.17"
// Limits
#define MAXTUNNEL 500 // could be up to 65535
#define MAXTBFS 6000 // Maximum token bucket filters. Might need up to 2 * session.
#define RADIUS_SHIFT 6
-#define RADIUS_FDS (1 << RADIUS_SHIFT)
+#define RADIUS_FDS (1 << RADIUS_SHIFT)
#define RADIUS_MASK ((1 << RADIUS_SHIFT) - 1)
#define MAXRADIUS (1 << (8 + RADIUS_SHIFT))
#define T_UNDEF (0xffff) // A tunnel ID that won't ever be used. Mark session as undefined.
#define T_FREE (0) // A tunnel ID that won't ever be used. Mark session as free.
-#define MAXCONTROL 1000 // max length control message we ever send...
+#define MAXCONTROL 1000 // max length control message we ever send...
#define MINMTU 576 // minimum recommended MTU (rfc1063)
-#define PPPMTU 1500 // default PPP MTU
#define MAXMTU 2600 // arbitrary maximum MTU
-#define MAXETHER (MAXMTU+18) // max packet we try sending to tun
-#define MAXTEL 96 // telephone number
+#define PPPoE_MRU 1492 // maximum PPPoE MRU (rfc2516: 1500 less PPPoE header (6) and PPP protocol ID (2))
+#define MAXETHER (MAXMTU+18) // max packet we try sending to tun
+#define MAXTEL 96 // telephone number
#define MAXUSER 128 // username
#define MAXPASS 128 // password
#define MAXPLUGINS 20 // maximum number of plugins to load
#define MAXRADSERVER 10 // max radius servers
-#define MAXROUTE 10 // max static routes per session
+#define MAXROUTE 10 // max static routes per session
#define MAXIPPOOL 131072 // max number of ip addresses in pool
#define RINGBUFFER_SIZE 10000 // Number of ringbuffer entries to allocate
#define MAX_LOG_LENGTH 512 // Maximum size of log message
#define IPPOOLFILE FLASHDIR "/ip_pool" // Address pool configuration
#define ACCT_TIME 3000 // 5 minute accounting interval
#define ACCT_SHUT_TIME 600 // 1 minute for counters of shutdown sessions
-#define L2TPPORT 1701 // L2TP port
+#define L2TPPORT 1701 // L2TP port
#define RADPORT 1645 // old radius port...
#define DAEPORT 3799 // DAE port
-#define PKTARP 0x0806 // ARP packet type
-#define PKTIP 0x0800 // IPv4 packet type
-#define PKTIPV6 0x86DD // IPv6 packet type
-#define PPPPAP 0xC023
-#define PPPCHAP 0xC223
-#define PPPLCP 0xC021
-#define PPPIPCP 0x8021
-#define PPPIPV6CP 0x8057
-#define PPPCCP 0x80FD
+#define PKTARP 0x0806 // ARP packet type
+#define PKTIP 0x0800 // IPv4 packet type
+#define PKTIPV6 0x86DD // IPv6 packet type
+#define PPPPAP 0xC023
+#define PPPCHAP 0xC223
+#define PPPLCP 0xC021
+#define PPPIPCP 0x8021
+#define PPPIPV6CP 0x8057
+#define PPPCCP 0x80FD
#define PPPIP 0x0021
#define PPPIPV6 0x0057
#define PPPMP 0x003D
// reset state machine counters
#define initialise_restart_count(_s, _fsm) \
- sess_local[_s]._fsm.conf_sent = sess_local[_s]._fsm.nak_sent
+ sess_local[_s]._fsm.conf_sent = sess_local[_s]._fsm.nak_sent = 0
+
+// increment ConfReq counter and reset timer
+#define restart_timer(_s, _fsm) ({ \
+ sess_local[_s]._fsm.conf_sent++; \
+ sess_local[_s]._fsm.restart = \
+ time_now + config->ppp_restart_time; \
+})
// stop timer on change to state where timer does not run
#define change_state(_s, _fsm, _new) ({ \
sessionidt next; // next session in linked list
sessionidt far; // far end session ID
tunnelidt tunnel; // near end tunnel ID
- uint8_t l2tp_flags; // various bit flags from the ICCN on the l2tp tunnel.
+ uint8_t flags; // session flags: see SESSION_*
struct {
uint8_t phase; // PPP phase
uint8_t lcp:4; // LCP state
uint8_t ipcp:4; // IPCP state
uint8_t ipv6cp:4; // IPV6CP state
uint8_t ccp:4; // CCP state
- uint8_t pad; // unused
} ppp;
+ char reserved_1[2]; // unused: padding
in_addr_t ip; // IP of session set by RADIUS response (host byte order).
int ip_pool_index; // index to IP pool
uint32_t unique_id; // unique session id
- uint16_t nr; // next receive
- uint16_t ns; // next send
+ char reserved_2[4]; // unused: was ns/nr
uint32_t magic; // ppp magic number
uint32_t pin, pout; // packet counts
uint32_t cin, cout; // byte counts
uint8_t walled_garden; // is this session gardened?
uint8_t ipv6prefixlen; // IPv6 route prefix length
struct in6_addr ipv6route; // Static IPv6 route
- char reserved[11]; // Space to expand structure without changing HB_VERSION
+ char reserved_3[11]; // Space to expand structure without changing HB_VERSION
}
sessiont;
// interim RADIUS
time_t last_interim;
+
+ // last LCP Echo
+ time_t last_echo;
} sessionlocalt;
-#define SESSIONPFC 1 // PFC negotiated flags
-#define SESSIONACFC 2 // ACFC negotiated flags
+// session flags
+#define SESSION_PFC (1 << 0) // use Protocol-Field-Compression
+#define SESSION_ACFC (1 << 1) // use Address-and-Control-Field-Compression
+#define SESSION_STARTED (1 << 2) // RADIUS Start record sent
// 168 bytes per tunnel
typedef struct
#endif
} configt;
-enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6, MAC };
+enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6 };
typedef struct
{
char *key;
void sendlcp(sessionidt s, tunnelidt t);
void send_ipin(sessionidt s, uint8_t *buf, int len);
void sendccp(sessionidt s, tunnelidt t);
+void protoreject(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l, uint16_t proto);
// radius.c
void _log(int level, sessionidt s, tunnelidt t, const char *format, ...) __attribute__((format (printf, 4, 5)));
void _log_hex(int level, const char *title, const uint8_t *data, int maxsize);
+
int sessionsetup(sessionidt s, tunnelidt t);
int run_plugins(int plugin_type, void *data);
void rebuild_address_pool(void);
extern ippoolt *ip_address_pool;
#define sessionfree (session[0].next)
-#define log_backtrace(count, max) \
-if (count++ < max) { \
- void *array[20]; \
- char **strings; \
- int size, i; \
- LOG(0, 0, t, "Backtrace follows:\n"); \
- size = backtrace(array, 10); \
- strings = backtrace_symbols(array, size); \
- if (strings) for (i = 0; i < size; i++) \
- { \
- LOG(0, 0, t, " %s\n", strings[i]); \
- } \
- free(strings); \
-}
-
extern configt *config;
extern time_t basetime; // Time when this process started.