X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/6adc660b4946e81de5f659ea4217fee43496a733..32f6edf2662e26ad6e5a9020483e4a6a49e4f95b:/l2tpns.h?ds=sidebyside diff --git a/l2tpns.h b/l2tpns.h index ce36a3c..bc7867f 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -1,5 +1,5 @@ // L2TPNS Global Stuff -// $Id: l2tpns.h,v 1.11 2004-07-08 16:54:35 bodea Exp $ +// $Id: l2tpns.h,v 1.30 2004-11-05 04:55:27 bodea Exp $ #ifndef __L2TPNS_H__ #define __L2TPNS_H__ @@ -15,7 +15,7 @@ #include #include -#define VERSION "2.0.1" +#define VERSION "2.0.3" // Limits #define MAXTUNNEL 500 // could be up to 65535 @@ -24,7 +24,7 @@ #define RADIUS_SHIFT 5 #define RADIUS_MASK ((unsigned short)(((unsigned short)~0) >> (16 - RADIUS_SHIFT))) -#define MAXRADIUS ((2 << (RADIUS_SHIFT - 1)) * 255) +#define MAXRADIUS ((unsigned long)(1L << RADIUS_SHIFT) * 255) #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. @@ -40,25 +40,37 @@ #define MAX_LOG_LENGTH 512 // Maximum size of log message #define ECHO_TIMEOUT 60 // Time between last packet sent and LCP ECHO generation #define IDLE_TIMEOUT 240 // Time between last packet sent and LCP ECHO generation +#define BUSY_WAIT_TIME 3000 // 5 minutes in 1/10th seconds to wait for radius to cleanup on shutdown // Constants -#include "config.h" -#ifndef PLUGINDIR -#define PLUGINDIR LIBDIR // Plugins +#ifndef ETCDIR +#define ETCDIR "/etc/l2tpns" #endif -#ifndef PLUGINCONF -#define PLUGINCONF ETCDIR // Plugin config dir +#ifndef LIBDIR +#define LIBDIR "/usr/lib/l2tpns" #endif -#ifndef DATADIR -#define DATADIR "/tmp" +#ifndef STATEDIR +#define STATEDIR "/var/lib/l2tpns" +#endif + +#ifndef PLUGINDIR +#define PLUGINDIR LIBDIR // Plugins +#endif + +#ifndef PLUGINCONF +#define PLUGINCONF ETCDIR // Plugin config dir #endif #ifndef FLASHDIR #define FLASHDIR ETCDIR #endif +#ifndef DATADIR +#define DATADIR STATEDIR +#endif + #define TUNDEVICE "/dev/net/tun" #define STATEFILE DATADIR "/state.dump" // State dump file #define CONFIGFILE FLASHDIR "/startup-config" // Configuration file @@ -67,7 +79,6 @@ #define ACCT_TIME 3000 // 5 minute accounting interval #define L2TPPORT 1701 // L2TP port #define RADPORT 1645 // old radius port... -#define RADAPORT 1646 // old radius accounting port #define PKTARP 0x0806 // ARP packet type #define PKTIP 0x0800 // IP packet type #define PSEUDOMAC 0x0200 // pseudo MAC prefix (local significant MAC) @@ -91,7 +102,8 @@ enum ProtocolRej, EchoReq, EchoReply, - DiscardRequest + DiscardRequest, + IdentRequest }; // Types @@ -110,7 +122,8 @@ struct cli_session_actions { char action; ipt snoop_ip; u16 snoop_port; - int throttle; + int throttle_in; + int throttle_out; }; #define CLI_SESS_KILL 0x01 @@ -120,7 +133,7 @@ struct cli_session_actions { #define CLI_SESS_NOTHROTTLE 0x10 struct cli_tunnel_actions { - char action; + char action; }; #define CLI_TUN_KILL 0x01 @@ -148,10 +161,10 @@ typedef struct sessions { sessionidt next; // next session in linked list sessionidt far; // far end session ID - tunnelidt tunnel; // tunnel ID + tunnelidt tunnel; // near end tunnel ID ipt ip; // IP of session set by RADIUS response (host byte order). int ip_pool_index; // index to IP pool - unsigned long sid; // session id for hsddb + unsigned long unique_id; // unique session id u16 nr; // next receive u16 ns; // next send u32 magic; // ppp magic number @@ -160,7 +173,8 @@ typedef struct sessions u32 total_cin; // This counter is never reset while a session is open u32 total_cout; // This counter is never reset while a session is open u32 id; // session id - u32 throttle; // non-zero if this session is throttled. + u16 throttle_in; // upstream throttle rate (kbps) + u16 throttle_out; // downstream throttle rate clockt opened; // when started clockt die; // being closed, when to finally free time_t last_packet; // Last packet from the user (used for idle timeouts) @@ -171,6 +185,7 @@ typedef struct sessions u16 tbf_in; // filter bucket for throttling in from the user. u16 tbf_out; // filter bucket for throttling out to the user. u8 l2tp_flags; // various bit flags from the ICCN on the l2tp tunnel. + u8 reserved_old_snoop; // No longer used - remove at some time u8 walled_garden; // is this session gardened? u8 flags1; // additional flags (currently unused); char random_vector[MAXTEL]; @@ -183,19 +198,21 @@ typedef struct sessions u32 flags; // Various session flags. ipt snoop_ip; // Interception destination IP u16 snoop_port; // Interception destination port - char reserved[28]; // Space to expand structure without changing HB_VERSION + u16 sid; // near end session id. + char reserved[20]; // Space to expand structure without changing HB_VERSION } sessiont; -#define SF_IPCP_ACKED (1<<0) // Has this session seen an IPCP Ack? +#define SF_IPCP_ACKED 1 // Has this session seen an IPCP Ack? +#define SF_LCP_ACKED 2 // LCP negotiated typedef struct { u32 cin; u32 cout; } sessioncountt; -#define SESSIONPFC 1 // PFC negotiated flags -#define SESSIONACFC 2 // ACFC negotiated flags +#define SESSIONPFC 1 // PFC negotiated flags +#define SESSIONACFC 2 // ACFC negotiated flags // 168 bytes per tunnel typedef struct tunnels @@ -380,6 +397,8 @@ struct configt int debug; // debugging level time_t start_time; // time when l2tpns was started char bandwidth[256]; // current bandwidth + char pid_file[256]; // file to write PID to on startup + int wrote_pid; clockt current_time; // 1/10ths of a second since the process started. // means that we can only run a given process // for 13 years without re-starting! @@ -396,15 +415,19 @@ struct configt char radiussecret[64]; int radius_accounting; ipt radiusserver[MAXRADSERVER]; // radius servers + u16 radiusport[MAXRADSERVER]; // radius base ports u8 numradiusservers; // radius server count short num_radfds; // Number of radius filehandles allocated ipt default_dns1, default_dns2; - unsigned long rl_rate; + unsigned long rl_rate; // default throttle rate + int num_tbfs; // number of throttle buckets + int save_state; char accounting_dir[128]; ipt bind_address; + ipt peer_address; int send_garp; // Set to true to garp for vip address on startup int target_uid; @@ -413,9 +436,9 @@ struct configt char old_plugins[64][MAXPLUGINS]; int next_tbf; // Next HTB id available to use - int scheduler_fifo; // If 1, will force scheduler to use SCHED_FIFO. - // Don't use this unless you have a dual processor machine! - int icmp_rate; // Max number of ICMP unreachable per second to send + int scheduler_fifo; // If the system has multiple CPUs, use FIFO scheduling policy for this process. + int lock_pages; // Lock pages into memory. + int icmp_rate; // Max number of ICMP unreachable per second to send> u32 cluster_address; // Multicast address of cluster. // Send to this address to have everyone hear. @@ -448,7 +471,7 @@ struct config_descriptt char *key; int offset; int size; - enum { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IP } type; + enum { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IP, MAC } type; }; // arp.c @@ -477,17 +500,6 @@ void radiusretry(u16 r); u16 radiusnew(sessionidt s); void radiusclear(u16 r, sessionidt s); -// throttle.c -int throttle_session(sessionidt s, int throttle); - - -// rl.c -void init_rl(); -u16 rl_create_tbf(); -u16 rl_get_tbf(); -void rl_done_tbf(u16 t); -void rl_destroy_tbf(u16 t); - // l2tpns.c clockt now(void); @@ -495,7 +507,7 @@ clockt backoff(u8 try); void routeset(sessionidt, ipt ip, ipt mask, ipt gw, u8 add); void inittun(void); void initudp(void); -void initdata(void); +void initdata(int optdebug, char *optconfig); void initippool(); sessionidt sessionbyip(ipt ip); sessionidt sessionbyuser(char *username); @@ -528,12 +540,14 @@ int cmd_show_ipcache(struct cli_def *cli, char *command, char **argv, int argc); int cmd_show_hist_idle(struct cli_def *cli, char *command, char **argv, int argc); int cmd_show_hist_open(struct cli_def *cli, char *command, char **argv, int argc); -#define log _log -#ifndef log_hex -#define log_hex(a,b,c,d) do{if (a <= config->debug) _log_hex(a,0,0,0,b,c,d);}while (0) -#endif +#undef LOG +#undef LOG_HEX +#define LOG(D, a, s, t, f, ...) ({ if (D <= config->debug) _log(D, a, s, t, f, ## __VA_ARGS__); }) +#define LOG_HEX(D, t, d, s) ({ if (D <= config->debug) _log_hex(D, t, d, s); }) + void _log(int level, ipt address, sessionidt s, tunnelidt t, const char *format, ...) __attribute__((format (printf, 5, 6))); -void _log_hex(int level, ipt address, sessionidt s, tunnelidt t, const char *title, const char *data, int maxsize); +void _log_hex(int level, const char *title, const char *data, int maxsize); + void build_chap_response(char *challenge, u8 id, u16 challenge_length, char **challenge_response); int sessionsetup(tunnelidt t, sessionidt s); int cluster_send_session(int s); @@ -556,7 +570,7 @@ void host_unreachable(ipt destination, u16 id, ipt source, char *packet, int pac void fix_address_pool(int sid); void rebuild_address_pool(void); void send_ipin(sessionidt s, u8 * buf, int len); -int throttle_session(sessionidt s, int throttle); +void throttle_session(sessionidt s, int rate_in, int rate_out); int load_session(sessionidt, sessiont *); void become_master(void); // We're the master; kick off any required master initializations. extern tunnelt *tunnel; @@ -570,12 +584,12 @@ if (count++ < max) { \ void *array[20]; \ char **strings; \ int size, i; \ - log(0, 0, 0, t, "Backtrace follows"); \ + LOG(0, 0, 0, t, "Backtrace follows"); \ size = backtrace(array, 10); \ strings = backtrace_symbols(array, size); \ if (strings) for (i = 0; i < size; i++) \ { \ - log(0, 0, 0, t, "%s\n", strings[i]); \ + LOG(0, 0, 0, t, "%s\n", strings[i]); \ } \ free(strings); \ } @@ -584,10 +598,11 @@ if (count++ < max) { \ extern struct configt *config; extern time_t basetime; // Time when this process started. extern time_t time_now; // Seconds since EPOCH. -extern u32 last_sid; +extern u32 last_id; extern struct Tstats *_statistics; extern ipt my_address; extern int tun_write(u8 *data, int size); +extern int clifd; #define TIME (config->current_time)