X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/9f4e77cdac49f08e320e0d8ae9e66876fa51dedf..57a847d9a36386aefb1d61bdb40399d9e8f5b463:/l2tpns.h?ds=inline diff --git a/l2tpns.h b/l2tpns.h index e901d04..8997f78 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -1,11 +1,10 @@ // L2TPNS Global Stuff -// $Id: l2tpns.h,v 1.95 2005-10-12 07:16:13 bodea Exp $ +// $Id: l2tpns.h,v 1.114 2006-04-23 23:18:32 bodea Exp $ #ifndef __L2TPNS_H__ #define __L2TPNS_H__ #include -#include #include #include #include @@ -15,7 +14,7 @@ #include #include -#define VERSION "2.1.10" +#define VERSION "2.1.19" // Limits #define MAXTUNNEL 500 // could be up to 65535 @@ -23,24 +22,24 @@ #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 @@ -76,18 +75,18 @@ #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 @@ -148,7 +147,23 @@ enum { // 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 + +// 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) ({ \ + 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) ({ \ @@ -221,20 +236,19 @@ typedef struct 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 @@ -264,7 +278,7 @@ typedef struct 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; @@ -307,10 +321,15 @@ typedef struct // 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 @@ -335,7 +354,7 @@ typedef struct } tunnelt; -// 160 bytes per radius session +// 164 bytes per radius session typedef struct // outstanding RADIUS requests { sessionidt session; // which session this applies to @@ -346,6 +365,8 @@ typedef struct // outstanding RADIUS requests 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; @@ -603,7 +624,7 @@ 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; @@ -664,6 +685,36 @@ typedef struct 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); @@ -683,6 +734,7 @@ uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, sessionidt s, tunnelid 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 @@ -692,7 +744,7 @@ void processrad(uint8_t *buf, int len, char socket_index); 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 @@ -705,7 +757,7 @@ sessionidt sessionbyuser(char *username); 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); @@ -729,6 +781,7 @@ int cmd_show_hist_open(struct cli_def *cli, char *command, char **argv, int argc 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); @@ -754,21 +807,6 @@ extern sessionlocalt *sess_local; 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.