// L2TPNS Global Stuff
-// $Id: l2tpns.h,v 1.106 2005-12-09 00:43:17 bodea Exp $
+// $Id: l2tpns.h,v 1.114 2006-04-23 23:18:32 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.14"
+#define VERSION "2.1.19"
// Limits
#define MAXTUNNEL 500 // could be up to 65535
#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 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
// reset state machine counters
#define initialise_restart_count(_s, _fsm) \
- sess_local[_s]._fsm.conf_sent = sess_local[_s]._fsm.nak_sent = 0
+ sess_local[_s]._fsm.conf_sent = \
+ sess_local[_s]._fsm.nak_sent = 0
+
+// no more attempts
+#define zero_restart_count(_s, _fsm) ({ \
+ sess_local[_s]._fsm.conf_sent = \
+ config->ppp_max_configure; \
+ sess_local[_s]._fsm.restart = \
+ time_now + config->ppp_restart_time; \
+})
// increment ConfReq counter and reset timer
#define restart_timer(_s, _fsm) ({ \
}
tunnelt;
-// 160 bytes per radius session
+// 164 bytes per radius session
typedef struct // outstanding RADIUS requests
{
sessionidt session; // which session this applies to
uint8_t try; // which try we are on
uint8_t state; // state of radius requests
uint8_t chap; // set if CHAP used (is CHAP identifier)
+ uint8_t term_cause; // Stop record: Acct-Terminate-Cause
+ char const *term_msg; // terminate reason
}
radiust;
int used; // session ref count
} ip_filtert;
+// CDN result/error codes
+#define CDN_NONE 0, 0
+#define CDN_TRY_ANOTHER 2, 7
+#define CDN_ADMIN_DISC 3, 0
+#define CDN_UNAVAILABLE 4, 0
+
+// RADIUS Acct-Terminate-Cause values
+#define TERM_USER_REQUEST 1
+#define TERM_LOST_CARRIER 2
+#define TERM_LOST_SERVICE 3
+#define TERM_IDLE_TIMEOUT 4
+#define TERM_SESSION_TIMEOUT 5
+#define TERM_ADMIN_RESET 6
+#define TERM_ADMIN_REBOOT 7
+#define TERM_PORT_ERROR 8
+#define TERM_NAS_ERROR 9
+#define TERM_NAS_REQUEST 10
+#define TERM_NAS_REBOOT 11
+#define TERM_PORT_UNNEEDED 12
+#define TERM_PORT_PREEMPTED 13
+#define TERM_PORT_SUSPENDED 14
+#define TERM_SERVICE_UNAVAILABLE 15
+#define TERM_CALLBACK 16
+#define TERM_USER_ERROR 17
+#define TERM_HOST_REQUEST 18
+#define TERM_SUPPLICANT_RESTART 19
+#define TERM_REAUTHENTICATION_FAILURE 20
+#define TERM_PORT_REINIT 21
+#define TERM_PORT_DISABLED 22
+
// arp.c
void sendarp(int ifr_idx, const unsigned char* mac, in_addr_t ip);
void radiusretry(uint16_t r);
uint16_t radiusnew(sessionidt s);
void radiusclear(uint16_t r, sessionidt s);
-void processdae(uint8_t *buf, int len, struct sockaddr_in *addr, int alen);
+void processdae(uint8_t *buf, int len, struct sockaddr_in *addr, int alen, struct in_addr *local);
// l2tpns.c
void increment_counter(uint32_t *counter, uint32_t *wrap, uint32_t delta);
void random_data(uint8_t *buf, int len);
void sessionkill(sessionidt s, char *reason);
-void sessionshutdown(sessionidt s, char *reason, int result, int error);
+void sessionshutdown(sessionidt s, char const *reason, int cdn_result, int cdn_error, int term_cause);
void filter_session(sessionidt s, int filter_in, int filter_out);
void send_garp(in_addr_t ip);
void tunnelsend(uint8_t *buf, uint16_t l, tunnelidt t);
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.