Fix a format string pointer diff specifier.
[l2tpns.git] / l2tpns.h
index 3ad2cf5..f38e9f3 100644 (file)
--- a/l2tpns.h
+++ b/l2tpns.h
@@ -1,5 +1,5 @@
 // L2TPNS Global Stuff
-// $Id: l2tpns.h,v 1.116 2006/04/27 14:37:28 bodea Exp $
+// $Id: l2tpns.h,v 1.121 2009/12/08 14:49:28 bodea Exp $
 
 #ifndef __L2TPNS_H__
 #define __L2TPNS_H__
 // Limits
 #define MAXTUNNEL      500             // could be up to 65535
 #define MAXBUNDLE      300             // could be up to 65535
-#define MAXBUNDLESES   10              // Maximum number of member links in bundle
+#define MAXBUNDLESES   12              // Maximum number of member links in bundle
 #define MAXADDRESS     20              // Maximum length for the Endpoint Discrminiator address
-#define MAXFRAGNUM     1500            // Maximum number of Multilink fragment in a bundle
-#define MAXFRAGLEN      1000           // Maximum length for Multilink fragment
 #define MAXSESSION     60000           // could be up to 65535
 #define MAXTBFS                6000            // Maximum token bucket filters. Might need up to 2 * session.
 
@@ -40,6 +38,7 @@
 #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 MAXHOSTNAME    256             // hostname
 #define MAXUSER                128             // username
 #define MAXPASS                128             // password
 #define MAXPLUGINS     20              // maximum number of plugins to load
 #define RINGBUFFER_SIZE        10000           // Number of ringbuffer entries to allocate
 #define MAX_LOG_LENGTH 512             // Maximum size of log message
 #define ECHO_TIMEOUT   10              // Time between last packet sent and LCP ECHO generation
-#define IDLE_TIMEOUT   240             // Time between last packet sent and LCP ECHO generation
+#define IDLE_TIMEOUT   240             // Time between last packet seen and session shutdown
 #define BUSY_WAIT_TIME 3000            // 5 minutes in 1/10th seconds to wait for radius to cleanup on shutdown
 
-#define MP_BEGIN       0x80            // This value is used when (b)egin bit is set in MP header
-#define MP_END         0x40            // This value is used when (e)nd bit is set in MP header
-#define MP_BOTH_BITS   0xC0            // This value is used when both bits (begin and end) are set in MP header
+#define MP_BEGIN        0x80            // This value is used when (b)egin bit is set in MP header
+#define MP_END          0x40            // This value is used when (e)nd bit is set in MP header
+#define MP_BOTH_BITS    0xC0            // This value is used when both bits (begin and end) are set in MP header
 
-#define DEFAULT_EPDIS_ADDRESS  "L2TPNetServer"         // Company name may goes here!
+#define MINFRAGLEN     64              // Minumum fragment length
+#define MAXFRAGLEN     750             // Maximum length for Multilink fragment (MTU / 2 sessions)
+#define MAXFRAGNUM     128             // Maximum number of Multilink fragment in a bundle (must be in the form of 2^X)
+                                       // it's not expected to have a space for more than 10 unassembled packets = 10 * MAXBUNDLESES
+#define        MAXFRAGNUM_MASK 127             // Must be equal to MAXFRAGNUM-1
 
 // Constants
 #ifndef ETCDIR
@@ -231,7 +234,7 @@ struct cli_tunnel_actions {
 typedef struct                 // route
 {
        in_addr_t ip;
-       in_addr_t mask;
+       int prefixlen;
 }
 routet;
 
@@ -239,7 +242,10 @@ typedef struct controls            // control message
 {
        struct controls *next;  // next in queue
        uint16_t length;        // length
-       uint8_t buf[MAXCONTROL];
+       union {
+               uint8_t buf[MAXCONTROL];
+               uint16_t buf16[MAXCONTROL/2];
+       } __attribute__ ((__transparent_union__));
 }
 controlt;
 
@@ -250,8 +256,11 @@ typedef struct {
 } epdist;
 
 typedef struct {
-       uint16_t length;                // Fragment length
-       uint8_t data[MAXFRAGLEN];       // Fragment data
+       sessionidt sid;                 // Fragment originating session
+       uint8_t flags;                  // MP frame flags
+       uint32_t seq;                   // fragment seq num
+        uint16_t length;                // Fragment length
+        uint8_t data[MAXFRAGLEN];       // Fragment data
 } fragmentt;
 
 typedef struct
@@ -284,7 +293,10 @@ typedef struct
        uint16_t mru;                   // maximum receive unit
        clockt opened;                  // when started
        clockt die;                     // being closed, when to finally free
+       uint32_t session_timeout;       // Maximum session time in seconds
+       uint32_t idle_timeout;          // Maximum idle time in seconds
        time_t last_packet;             // Last packet from the user (used for idle timeouts)
+       time_t last_data;               // Last data packet to/from the user (used for idle timeouts)
        in_addr_t dns1, dns2;           // DNS servers
        routet route[MAXROUTE];         // static routes
        uint16_t tbf_in;                // filter bucket for throttling in from the user.
@@ -296,11 +308,11 @@ typedef struct
        char calling[MAXTEL];           // calling number
        uint32_t tx_connect_speed;
        uint32_t rx_connect_speed;
-       clockt timeout;                 // Session timeout
-       uint32_t mrru;                  // Multilink Max-Receive-Reconstructed-Unit
-       uint8_t mssf;                   // Multilink Short Sequence Number Header Format
-       epdist epdis;                   // Multilink Endpoint Discriminator
-       bundleidt bundle;               // Multilink Bundle Identifier
+       clockt timeout;                 // Session timeout
+        uint32_t mrru;                  // Multilink Max-Receive-Reconstructed-Unit
+        uint8_t mssf;                   // Multilink Short Sequence Number Header Format
+        epdist epdis;                   // Multilink Endpoint Discriminator
+        bundleidt bundle;               // Multilink Bundle Identifier
        in_addr_t snoop_ip;             // Interception destination IP
        uint16_t snoop_port;            // Interception destination port
        uint8_t walled_garden;          // is this session gardened?
@@ -312,28 +324,31 @@ sessiont;
 
 typedef struct
 {
-       int state;                              // current state (bundlestate enum)
-       uint32_t seq_num_t;                     // Sequence Number (transmission)
-       uint32_t seq_num_m;                     // Last received frame sequence number (bearing B bit)
-       uint32_t offset;                        // Offset between sequence number and array index
-       uint8_t pending_frag;                   // Indicate that there is pending fragments to reassemble
-       uint8_t num_of_links;                   // Number of links joint to this bundle
-       uint32_t online_time;                   // The time this bundle is online
-       clockt last_check;                      // Last time the timeout is checked
-       uint32_t mrru;                          // Multilink Max-Receive-Reconstructed-Unit
-       uint8_t mssf;                           // Multilink Short Sequence Number Header Format
-       epdist epdis;                           // Multilink Endpoint Discriminator
-       char user[MAXUSER];                     // Needed for matching member links
-       sessionidt current_ses;                 // Current session to use for sending (used in RR load-balancing)
-       sessionidt members[MAXBUNDLESES];       // Array for member links sessions
+        int state;                              // current state (bundlestate enum)
+        uint32_t seq_num_t;                     // Sequence Number (transmission)
+        uint32_t timeout;                       // Session-Timeout for bundle
+       uint32_t max_seq;                       // Max value of sequence number field
+        uint8_t num_of_links;                   // Number of links joint to this bundle
+        uint32_t online_time;                   // The time this bundle is online
+        clockt last_check;                      // Last time the timeout is checked
+        uint32_t mrru;                          // Multilink Max-Receive-Reconstructed-Unit
+        uint8_t mssf;                           // Multilink Short Sequence Number Header Format
+        epdist epdis;                           // Multilink Endpoint Discriminator
+        char user[MAXUSER];                     // Needed for matching member links
+        sessionidt current_ses;                 // Current session to use for sending (used in RR load-balancing)
+        sessionidt members[MAXBUNDLESES];       // Array for member links sessions
 }
 bundlet;
 
 typedef struct
 {
-       fragmentt fragment[MAXFRAGNUM];
-       uint8_t reassembled_frame[MAXETHER];    // The reassembled frame
-       uint16_t re_frame_len;                  // The reassembled frame length
+        fragmentt fragment[MAXFRAGNUM];
+        uint8_t reassembled_frame[MAXETHER];    // The reassembled frame
+        uint16_t re_frame_len;                  // The reassembled frame length
+       uint16_t re_frame_begin_index, re_frame_end_index;      // reassembled frame begin index, end index respectively
+       uint16_t start_index, end_index;        // start and end sequence numbers available on the fragments array respectively
+       uint32_t M;                             // Minumum frame sequence number received over all bundle members
+       uint32_t start_seq;                     // Last received frame sequence number (bearing B bit)
 }
 fragmentationt;
 
@@ -388,6 +403,9 @@ typedef struct
 
        // last LCP Echo
        time_t last_echo;
+
+       // Last Multilink frame sequence number received
+       uint32_t last_seq;
 } sessionlocalt;
 
 // session flags
@@ -497,6 +515,7 @@ enum
        RADIUSSTOP,             // sending stop accounting to RADIUS server
        RADIUSINTERIM,          // sending interim accounting to RADIUS server
        RADIUSWAIT,             // waiting timeout before available, in case delayed replies
+       RADIUSJUSTAUTH,         // sending auth to RADIUS server, just authentication, no ip assigning
 };
 
 struct Tstats
@@ -601,6 +620,10 @@ struct Tstats
 #define SET_STAT(x, y)
 #endif
 
+#ifndef IFNAMSIZ
+# define IFNAMSIZ 16
+#endif
+
 typedef struct
 {
        int             debug;                          // debugging level
@@ -616,7 +639,7 @@ typedef struct
        int             reload_config;                  // flag to re-read config (set by cli)
        int             multi_read_count;               // amount of packets to read per fd in processing loop
 
-       char            tundevice[10];                  // tun device name
+       char            tundevice[IFNAMSIZ];            // tun device name
        char            log_filename[128];
 
        char            l2tp_secret[64];                // L2TP shared secret
@@ -635,14 +658,16 @@ typedef struct
        uint16_t        radiusport[MAXRADSERVER];       // radius base ports
        uint8_t         numradiusservers;               // radius server count
 
-       uint16_t        radius_dae_port;                // local port for radius dae
+       uint16_t        radius_dae_port;                // port for radius DAE
+       uint16_t        radius_bind_min;                // port range for udp sockets used to send/recv radius packets
+       uint16_t        radius_bind_max;
 
        char            radius_authtypes_s[32];         // list of valid authentication types (chap, pap) in order of preference
        int             radius_authtypes;
        int             radius_authprefer;
 
        int             allow_duplicate_users;          // allow multiple logins with the same username
-       char            guest_user[MAXUSER];            // allow multiple logins to guest account username
+       int             kill_timedout_sessions;         // kill authenticated sessions with "session_timeout == 0"
 
        in_addr_t       default_dns1, default_dns2;
 
@@ -689,11 +714,17 @@ typedef struct
        int             cluster_hb_interval;            // How often to send a heartbeat.
        int             cluster_hb_timeout;             // How many missed heartbeats trigger an election.
        uint64_t        cluster_table_version;          // # state changes processed by cluster
-       int             cluster_master_min_adv;         // Master advertises routes while the number of up to date
-                                                       // slaves is less than this value.
 
        struct in6_addr ipv6_prefix;                    // Our IPv6 network pool.
 
+
+       int             cluster_master_min_adv;         // Master advertises routes while the number of up to date
+                                                       // slaves is less than this value.
+       in_addr_t       cli_bind_address;               // bind address for CLI
+       char            hostname[MAXHOSTNAME];  // hostname (overridden by -h on command line)
+       // Guest change
+       char            guest_user[MAXUSER];            // Guest account username
+
 #ifdef BGP
 #define BGP_NUM_PEERS  2
        uint16_t as_number;
@@ -702,7 +733,10 @@ typedef struct
                uint16_t as;
                int keepalive;
                int hold;
+               struct in_addr update_source;
        } neighbour[BGP_NUM_PEERS];
+       in_addr_t       nexthop_address;
+       struct in6_addr nexthop6_address;
 #endif
 } configt;
 
@@ -876,7 +910,8 @@ void become_master(void);   // We're the master; kick off any required master init
 
 
 // cli.c
-void init_cli(char *hostname);
+void init_cli();
+void cli_init_hostname(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, ...);
@@ -914,6 +949,7 @@ struct event_data {
                FD_TYPE_DAE,
                FD_TYPE_RADIUS,
                FD_TYPE_BGP,
+               FD_TYPE_NETLINK,
        } type;
        int index; // for RADIUS, BGP
 };