X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/def1dfd3ccaafe0b50d1bd0c24a04aa990414ebe..53ea63b3266d2cce5ab6fe9f02264dfc2eea2a6d:/l2tpns.h?ds=sidebyside diff --git a/l2tpns.h b/l2tpns.h index da49b25..a0026ae 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -1,5 +1,5 @@ // L2TPNS Global Stuff -// $Id: l2tpns.h,v 1.10 2004/07/07 09:09:53 bodea Exp $ +// $Id: l2tpns.h,v 1.45 2004/12/03 06:40:02 bodea Exp $ #ifndef __L2TPNS_H__ #define __L2TPNS_H__ @@ -15,7 +15,7 @@ #include #include -#define VERSION "2.0.0" +#define VERSION "2.0.13" // Limits #define MAXTUNNEL 500 // could be up to 65535 @@ -24,13 +24,13 @@ #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. #define MAXCONTROL 1000 // max length control message we ever send... -#define MAXETHER (1500+18) // max packet we try sending to tap +#define MAXETHER (1500+18) // max packet we try sending to tun #define MAXTEL 96 // telephone number #define MAXPLUGINS 20 // maximum number of plugins to load #define MAXRADSERVER 10 // max radius servers @@ -40,26 +40,38 @@ #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 -#define TAPDEVICE "/dev/net/tun" +#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 #define CLIUSERS FLASHDIR "/users" // CLI Users 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,12 +102,14 @@ enum ProtocolRej, EchoReq, EchoReply, - DiscardRequest + DiscardRequest, + IdentRequest }; // Types typedef unsigned short u16; typedef unsigned int u32; +typedef unsigned long long u64; typedef unsigned char u8; typedef u32 ipt; typedef u16 portt; @@ -105,11 +118,36 @@ typedef u16 tunnelidt; typedef u32 clockt; typedef u8 hasht[16]; +// CLI actions +struct cli_session_actions { + char action; + ipt snoop_ip; + u16 snoop_port; + int throttle_in; + int throttle_out; + int filter_in; + int filter_out; +}; + +#define CLI_SESS_KILL 0x01 +#define CLI_SESS_SNOOP 0x02 +#define CLI_SESS_NOSNOOP 0x04 +#define CLI_SESS_THROTTLE 0x08 +#define CLI_SESS_NOTHROTTLE 0x10 +#define CLI_SESS_FILTER 0x20 +#define CLI_SESS_NOFILTER 0x40 + +struct cli_tunnel_actions { + char action; +}; + +#define CLI_TUN_KILL 0x01 + // dump header: update number if internal format changes #define DUMP_MAGIC "L2TPNS#" VERSION "#" // structures -typedef struct routes // route +typedef struct // route { ipt ip; ipt mask; @@ -124,14 +162,14 @@ typedef struct controls // control message } controlt; -typedef struct sessions +typedef struct { 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 @@ -140,7 +178,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) @@ -151,6 +190,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]; @@ -163,22 +203,28 @@ 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. + u8 filter_in; // input filter index (to ip_filters[N-1]; 0 if none) + u8 filter_out; // output filter index + char reserved[18]; // 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 +#define SF_CCP_ACKED 4 // CCP negotiated -typedef struct { +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 +typedef struct { tunnelidt far; // far end tunnel ID ipt ip; // Ip for far end @@ -201,7 +247,7 @@ typedef struct tunnels tunnelt; // 180 bytes per radius session -typedef struct radiuss // outstanding RADIUS requests +typedef struct // outstanding RADIUS requests { sessionidt session; // which session this applies to hasht auth; // request authenticator @@ -232,7 +278,6 @@ struct Tringbuffer char level; sessionidt session; tunnelidt tunnel; - ipt address; char message[MAX_LOG_LENGTH]; } buffer[RINGBUFFER_SIZE]; int head; @@ -270,12 +315,12 @@ struct Tstats time_t start_time; time_t last_reset; - unsigned long tap_rx_packets; - unsigned long tap_tx_packets; - unsigned long tap_rx_bytes; - unsigned long tap_tx_bytes; - unsigned long tap_rx_errors; - unsigned long tap_tx_errors; + unsigned long tun_rx_packets; + unsigned long tun_tx_packets; + unsigned long tun_rx_bytes; + unsigned long tun_tx_bytes; + unsigned long tun_rx_errors; + unsigned long tun_tx_errors; unsigned long tunnel_rx_packets; unsigned long tunnel_tx_packets; @@ -287,11 +332,7 @@ struct Tstats unsigned long tunnel_retries; unsigned long radius_retries; - unsigned long arp_errors; - unsigned long arp_replies; - unsigned long arp_discarded; unsigned long arp_sent; - unsigned long arp_recv; unsigned long packets_snooped; @@ -310,8 +351,7 @@ struct Tstats unsigned long c_forwarded; unsigned long recv_forward; #ifdef STATISTICS - unsigned long call_processtap; - unsigned long call_processarp; + unsigned long call_processtun; unsigned long call_processipout; unsigned long call_processudp; unsigned long call_sessionbyip; @@ -360,11 +400,13 @@ struct Tstats #define SET_STAT(x, y) #endif -struct configt +typedef struct { 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! @@ -374,22 +416,26 @@ struct configt int cleanup_interval; // interval between regular cleanups (in seconds) int multi_read_count; // amount of packets to read per fd in processing loop - char tapdevice[10]; // tap device name + char tundevice[10]; // tun device name char log_filename[128]; char l2tpsecret[64]; 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; @@ -398,9 +444,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. @@ -420,21 +466,80 @@ struct configt int cluster_hb_interval; // How often to send a heartbeat. int cluster_hb_timeout; // How many missed heartbeats trigger an election. + u64 cluster_table_version; // # state changes processed by cluster #ifdef BGP +#define BGP_NUM_PEERS 2 u16 as_number; - char bgp_peer[2][64]; - u16 bgp_peer_as[2]; + struct { + char name[64]; + u16 as; + int keepalive; + int hold; + } neighbour[BGP_NUM_PEERS]; #endif -}; +} configt; -struct config_descriptt +enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IP, MAC }; +typedef struct { char *key; int offset; int size; - enum { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IP } type; -}; + enum config_typet type; +} config_descriptt; + +typedef struct +{ + u8 op; // operation +#define FILTER_PORT_OP_NONE 0 // all ports match +#define FILTER_PORT_OP_EQ 1 +#define FILTER_PORT_OP_NEQ 2 +#define FILTER_PORT_OP_GT 3 +#define FILTER_PORT_OP_LT 4 +#define FILTER_PORT_OP_RANGE 5 + portt port; // port (host byte order) + portt port2; // range +} ip_filter_portt; + +typedef struct +{ + int action; // permit/deny +#define FILTER_ACTION_DENY 1 +#define FILTER_ACTION_PERMIT 2 + u8 proto; // protocol: IPPROTO_* (netinet/in.h) + ipt src_ip; // source ip (network byte order) + ipt src_wild; + ip_filter_portt src_ports; + ipt dst_ip; // dest ip + ipt dst_wild; + ip_filter_portt dst_ports; + u8 frag; // apply to non-initial fragments + u8 tcp_flag_op; // match type: any, all, established +#define FILTER_FLAG_OP_ANY 1 +#define FILTER_FLAG_OP_ALL 2 +#define FILTER_FLAG_OP_EST 3 + u8 tcp_sflags; // flags set + u8 tcp_cflags; // flags clear + u32 counter; // match count +} ip_filter_rulet; + +#define TCP_FLAG_FIN 0x01 +#define TCP_FLAG_SYN 0x02 +#define TCP_FLAG_RST 0x04 +#define TCP_FLAG_PSH 0x08 +#define TCP_FLAG_ACK 0x10 +#define TCP_FLAG_URG 0x20 + +#define MAXFILTER 32 +#define MAXFILTER_RULES 32 +typedef struct +{ + char name[32]; // ACL name + int extended; // type: 0 = standard, 1 = extended + ip_filter_rulet rules[MAXFILTER_RULES]; + int used; // session ref count +} ip_filtert; // arp.c void sendarp(int ifr_idx, const unsigned char* mac, ipt ip); @@ -449,9 +554,8 @@ void processipin(tunnelidt t, sessionidt s, u8 * p, u16 l); void processccp(tunnelidt t, sessionidt s, u8 * p, u16 l); void sendchap(tunnelidt t, sessionidt s); u8 *makeppp(u8 * b, int size, u8 * p, int l, tunnelidt t, sessionidt s, u16 mtype); -u8 *findppp(u8 * b, u8 mtype); void initlcp(tunnelidt t, sessionidt s); -void dumplcp(u8 *p, int l); +void send_ipin(sessionidt s, u8 * buf, int len); // radius.c @@ -462,88 +566,49 @@ 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); clockt backoff(u8 try); -void routeset(sessionidt, ipt ip, ipt mask, ipt gw, u8 add); -void inittap(void); -void initudp(void); -void initdata(void); -void initippool(); sessionidt sessionbyip(ipt ip); sessionidt sessionbyuser(char *username); void sessionshutdown(sessionidt s, char *reason); -void sessionsendarp(sessionidt s); void send_garp(ipt ip); -void sessionkill(sessionidt s, char *reason); -void control16(controlt * c, u16 avp, u16 val, u8 m); -void control32(controlt * c, u16 avp, u32 val, u8 m); -void controls(controlt * c, u16 avp, char *val, u8 m); -void controlb(controlt * c, u16 avp, char *val, unsigned int len, u8 m); -controlt *controlnew(u16 mtype); -void controlnull(tunnelidt t); -void controladd(controlt * c, tunnelidt t, sessionidt s); void tunnelsend(u8 * buf, u16 l, tunnelidt t); -void tunnelkill(tunnelidt t, char *reason); -void tunnelshutdown(tunnelidt t, char *reason); void sendipcp(tunnelidt t, sessionidt s); -void processipout(u8 * buf, int len); -void processarp(u8 * buf, int len); void processudp(u8 * buf, int len, struct sockaddr_in *addr); -void processtap(u8 * buf, int len); -void processcontrol(u8 * buf, int len, struct sockaddr_in *addr); -int assign_ip_address(sessionidt s); -void free_ip_address(sessionidt s); void snoop_send_packet(char *packet, u16 size, ipt destination, u16 port); -void dump_acct_info(); -void mainloop(void); +int ip_filter(u8 *buf, int len, u8 filter); 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 -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 build_chap_response(char *challenge, u8 id, u16 challenge_length, char **challenge_response); +#undef LOG +#undef LOG_HEX +#define LOG(D, s, t, f, ...) ({ if (D <= config->debug) _log(D, 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, sessionidt s, tunnelidt t, const char *format, ...) __attribute__((format (printf, 4, 5))); +void _log_hex(int level, const char *title, const char *data, int maxsize); + int sessionsetup(tunnelidt t, sessionidt s); -int cluster_send_session(int s); -int cluster_send_tunnel(int t); -int cluster_send_goodbye(); +int run_plugins(int plugin_type, void *data); +void rebuild_address_pool(void); +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. + + +// cli.c void init_cli(char *hostname); void cli_do_file(FILE *fh); void cli_do(int sockfd); int cli_arg_help(struct cli_def *cli, int cr_ok, char *entry, ...); -#ifdef RINGBUFFER -void ringbuffer_dump(FILE *stream); -#endif -void initplugins(void); -int run_plugins(int plugin_type, void *data); -void add_plugin(char *plugin_name); -void remove_plugin(char *plugin_name); -void plugins_done(void); -void tunnelclear(tunnelidt t); + + +// icmp.c void host_unreachable(ipt destination, u16 id, ipt source, char *packet, int packet_len); -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); -int load_session(sessionidt, sessiont *); -void become_master(void); // We're the master; kick off any required master initializations. + + extern tunnelt *tunnel; extern sessiont *session; extern sessioncountt *sess_count; @@ -555,24 +620,25 @@ if (count++ < max) { \ void *array[20]; \ char **strings; \ int size, i; \ - log(0, 0, 0, t, "Backtrace follows"); \ + LOG(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, t, "%s\n", strings[i]); \ } \ free(strings); \ } -extern struct configt *config; +extern 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)