add DAE support (PoD/CoA) from Vladislav Bjelic
[l2tpns.git] / l2tpns.h
index 20ec1fe..03619a4 100644 (file)
--- a/l2tpns.h
+++ b/l2tpns.h
@@ -1,5 +1,5 @@
 // L2TPNS Global Stuff
-// $Id: l2tpns.h,v 1.62 2005/04/18 04:18:15 bodea Exp $
+// $Id: l2tpns.h,v 1.80 2005/06/28 14:48:27 bodea Exp $
 
 #ifndef __L2TPNS_H__
 #define __L2TPNS_H__
 #include <sys/types.h>
 #include <libcli.h>
 
-#define VERSION        "2.1.0"
+#define VERSION        "2.1.2"
 
 // Limits
 #define MAXTUNNEL      500             // could be up to 65535
 #define MAXSESSION     60000           // could be up to 65535
 #define MAXTBFS                6000            // Maximum token bucket filters. Might need up to 2 * session.
 
-#define RADIUS_SHIFT   5
-#define RADIUS_MASK    ((unsigned short)(((unsigned short)~0) >> (16 - RADIUS_SHIFT)))
-#define        MAXRADIUS       ((unsigned long)(1L << RADIUS_SHIFT) * 255)
+#define RADIUS_SHIFT   6
+#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.
@@ -43,6 +44,7 @@
 #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
+#define DEFAULT_MRU    1452            // maximum packet size to avoid fragmentation when LNS ethernet MTU is 1500
 
 // Constants
 #ifndef ETCDIR
@@ -74,6 +76,7 @@
 #define ACCT_SHUT_TIME 600             // 1 minute for counters of shutdown sessions
 #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
@@ -109,7 +112,13 @@ enum {
        AccessReject,
        AccountingRequest,
        AccountingResponse,
-       AccessChallenge = 11
+       AccessChallenge = 11,
+       DisconnectRequest = 40,
+       DisconnectACK,
+       DisconnectNAK,
+       CoARequest,
+       CoAACK,
+       CoANAK
 };
 
 // Types
@@ -164,48 +173,43 @@ 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;                  // Various session flags.
        in_addr_t ip;                   // IP of session set by RADIUS response (host byte order).
        int ip_pool_index;              // index to IP pool
-       unsigned long unique_id;        // unique session id
+       uint32_t unique_id;             // unique session id
        uint16_t nr;                    // next receive
        uint16_t ns;                    // next send
        uint32_t magic;                 // ppp magic number
-       uint32_t cin, cout;             // byte counts
        uint32_t pin, pout;             // packet counts
-       uint32_t total_cin;             // This counter is never reset while a session is open
-       uint32_t total_cout;            // This counter is never reset while a session is open
-       uint32_t id;                    // session id
+       uint32_t cin, cout;             // byte counts
+       uint32_t cin_wrap, cout_wrap;   // byte counter wrap count (RADIUS accounting giagawords)
+       uint32_t cin_delta, cout_delta; // byte count changes (for dump_session())
        uint16_t throttle_in;           // upstream throttle rate (kbps)
        uint16_t throttle_out;          // downstream throttle rate
+       uint8_t filter_in;              // input filter index (to ip_filters[N-1]; 0 if none)
+       uint8_t filter_out;             // output filter index
+       uint16_t mru;                   // maximum receive unit
        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)
        in_addr_t dns1, dns2;           // DNS servers
        routet route[MAXROUTE];         // static routes
-       uint16_t radius;                // which radius session is being used (0 for not waiting on authentication)
-       uint16_t mru;                   // maximum receive unit
        uint16_t tbf_in;                // filter bucket for throttling in from the user.
        uint16_t tbf_out;               // filter bucket for throttling out to the user.
-       uint8_t l2tp_flags;             // various bit flags from the ICCN on the l2tp tunnel.
-       uint8_t reserved_old_snoop;     // No longer used - remove at some time
-       uint8_t walled_garden;          // is this session gardened?
-       uint8_t flags1;                 // additional flags (currently unused);
-       char random_vector[MAXTEL];
        int random_vector_length;
+       char random_vector[MAXTEL];
        char user[MAXUSER];             // user (needed in seesion for radius stop messages)
        char called[MAXTEL];            // called number
        char calling[MAXTEL];           // calling number
        uint32_t tx_connect_speed;
        uint32_t rx_connect_speed;
-       uint32_t flags;                 // Various session flags.
        in_addr_t snoop_ip;             // Interception destination IP
        uint16_t snoop_port;            // Interception destination port
-       uint16_t sid;                   // near end session id.
-       uint8_t filter_in;              // input filter index (to ip_filters[N-1]; 0 if none)
-       uint8_t filter_out;             // output filter index
-       struct in6_addr ipv6route;      // Static IPv6 route
+       uint8_t walled_garden;          // is this session gardened?
        uint8_t ipv6prefixlen;          // IPv6 route prefix length
-       char reserved[1];               // Space to expand structure without changing HB_VERSION
+       struct in6_addr ipv6route;      // Static IPv6 route
+       char reserved[16];              // Space to expand structure without changing HB_VERSION
 }
 sessiont;
 
@@ -221,6 +225,10 @@ sessiont;
 
 typedef struct
 {
+       // packet counters
+       uint32_t pin;
+       uint32_t pout;
+
        // byte counters
        uint32_t cin;
        uint32_t cout;
@@ -229,6 +237,12 @@ typedef struct
        clockt last_packet_out;
        uint32_t packets_out;
        uint32_t packets_dropped;
+
+       // RADIUS session in use
+       uint16_t radius;
+
+       // interim RADIUS
+       time_t last_interim;
 } sessionlocalt;
 
 #define        SESSIONPFC      1       // PFC negotiated flags
@@ -317,8 +331,8 @@ enum
        RADIUSIPCP,             // sending IPCP to end user
        RADIUSSTART,            // sending start accounting to RADIUS server
        RADIUSSTOP,             // sending stop accounting to RADIUS server
+       RADIUSINTERIM,          // sending interim accounting to RADIUS server
        RADIUSWAIT,             // waiting timeout before available, in case delayed replies
-       RADIUSDEAD,             // errored while talking to radius server.
 };
 
 struct Tstats
@@ -435,7 +449,6 @@ typedef struct
 
        char            config_file[128];
        int             reload_config;                  // flag to re-read config (set by cli)
-       int             cleanup_interval;               // interval between regular cleanups (in seconds)
        int             multi_read_count;               // amount of packets to read per fd in processing loop
 
        char            tundevice[10];                  // tun device name
@@ -446,15 +459,19 @@ typedef struct
 
        char            radiussecret[64];
        int             radius_accounting;
+       int             radius_interim;
        in_addr_t       radiusserver[MAXRADSERVER];     // radius servers
        uint16_t        radiusport[MAXRADSERVER];       // radius base ports
        uint8_t         numradiusservers;               // radius server count
-       short           num_radfds;                     // Number of radius filehandles allocated
+
+       uint16_t        radius_dae_port;                // local port for radius dae
 
        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
+
        in_addr_t       default_dns1, default_dns2;
 
        unsigned long   rl_rate;                        // default throttle rate
@@ -471,7 +488,8 @@ typedef struct
        char            old_plugins[64][MAXPLUGINS];
 
        int             next_tbf;                       // Next HTB id available to use
-       int             scheduler_fifo;                 // If the system has multiple CPUs, use FIFO scheduling policy for this process.
+       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
        int             max_packets;                    // DoS prevention: per session limit of packets/0.1s
@@ -490,6 +508,7 @@ typedef struct
        int             cluster_highest_sessionid;
        int             cluster_highest_tunnelid;
        clockt          cluster_last_hb;                // Last time we saw a heartbeat from the master.
+       int             cluster_last_hb_ver;            // Heartbeat version last seen from master
        int             cluster_num_changes;            // Number of changes queued.
 
        int             cluster_hb_interval;            // How often to send a heartbeat.
@@ -498,6 +517,10 @@ typedef struct
 
        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.
+
 #ifdef BGP
 #define BGP_NUM_PEERS  2
        uint16_t as_number;
@@ -586,7 +609,7 @@ void processipv6in(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l);
 void processccp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l);
 void sendchap(tunnelidt t, sessionidt s);
 uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, tunnelidt t, sessionidt s, uint16_t mtype);
-void initlcp(tunnelidt t, sessionidt s);
+void sendlcp(tunnelidt t, sessionidt s, int authtype);
 void send_ipin(sessionidt s, uint8_t *buf, int len);
 
 
@@ -597,6 +620,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);
 
 
 // l2tpns.c
@@ -606,14 +630,17 @@ void route6set(sessionidt s, struct in6_addr ip, int prefixlen, int add);
 sessionidt sessionbyip(in_addr_t ip);
 sessionidt sessionbyipv6(struct in6_addr ip);
 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 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 sendipcp(tunnelidt t, sessionidt s);
 void processudp(uint8_t *buf, int len, struct sockaddr_in *addr);
 void snoop_send_packet(char *packet, uint16_t size, in_addr_t destination, uint16_t port);
+int find_filter(char const *name, size_t len);
 int ip_filter(uint8_t *buf, int len, uint8_t 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);
@@ -657,12 +684,12 @@ if (count++ < max) { \
        void *array[20]; \
        char **strings; \
        int size, i; \
-       LOG(0, 0, t, "Backtrace follows"); \
+       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]); \
+               LOG(0, 0, t, " %s\n", strings[i]); \
        } \
        free(strings); \
 }
@@ -671,12 +698,27 @@ if (count++ < max) { \
 extern configt *config;
 extern time_t basetime;                // Time when this process started.
 extern time_t time_now;                // Seconds since EPOCH.
+extern char main_quit;
 extern uint32_t last_id;
 extern struct Tstats *_statistics;
 extern in_addr_t my_address;
 extern int tun_write(uint8_t *data, int size);
 extern int clifd;
-
+extern int epollfd;
+
+struct event_data {
+       enum {
+               FD_TYPE_CLI,
+               FD_TYPE_CLUSTER,
+               FD_TYPE_TUN,
+               FD_TYPE_UDP,
+               FD_TYPE_CONTROL,
+               FD_TYPE_DAE,
+               FD_TYPE_RADIUS,
+               FD_TYPE_BGP,
+       } type;
+       int index; // for RADIUS, BGP
+};
 
 #define TIME (config->current_time)