CHAP support from Jordan Hrycaj (work in progress)
[l2tpns.git] / l2tpns.h
index 1229096..d29c547 100644 (file)
--- a/l2tpns.h
+++ b/l2tpns.h
@@ -1,5 +1,5 @@
 // L2TPNS Global Stuff
 // L2TPNS Global Stuff
-// $Id: l2tpns.h,v 1.48 2004/12/16 23:40:31 bodea Exp $
+// $Id: l2tpns.h,v 1.51 2005/01/07 07:17:13 bodea Exp $
 
 #ifndef __L2TPNS_H__
 #define __L2TPNS_H__
 
 #ifndef __L2TPNS_H__
 #define __L2TPNS_H__
@@ -15,7 +15,7 @@
 #include <sys/types.h>
 #include <libcli.h>
 
 #include <sys/types.h>
 #include <libcli.h>
 
-#define VERSION        "2.0.13"
+#define VERSION        "2.1.0"
 
 // Limits
 #define MAXTUNNEL      500             // could be up to 65535
 
 // Limits
 #define MAXTUNNEL      500             // could be up to 65535
@@ -72,6 +72,7 @@
 #endif
 
 #define TUNDEVICE      "/dev/net/tun"
 #endif
 
 #define TUNDEVICE      "/dev/net/tun"
+#define RANDOMDEVICE   "/dev/urandom"                  // default, not as secure as /dev/random but non-blocking
 #define STATEFILE      DATADIR "/state.dump"           // State dump file
 #define CONFIGFILE     FLASHDIR "/startup-config"      // Configuration file
 #define CLIUSERS       FLASHDIR "/users"               // CLI Users file
 #define STATEFILE      DATADIR "/state.dump"           // State dump file
 #define CONFIGFILE     FLASHDIR "/startup-config"      // Configuration file
 #define CLIUSERS       FLASHDIR "/users"               // CLI Users file
 #define        L2TPPORT        1701            // L2TP port
 #define RADPORT                1645            // old radius port...
 #define        PKTARP          0x0806          // ARP packet type
 #define        L2TPPORT        1701            // L2TP port
 #define RADPORT                1645            // old radius port...
 #define        PKTARP          0x0806          // ARP packet type
-#define        PKTIP           0x0800          // IP packet type
-#define PSEUDOMAC      0x0200          // pseudo MAC prefix (local significant MAC)
+#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        PPPPAP          0xC023
 #define        PPPCHAP         0xC223
 #define        PPPLCP          0xC021
 #define        PPPIPCP         0x8021
+#define        PPPIPV6CP       0x8057
 #define        PPPCCP          0x80FD
 #define PPPIP          0x0021
 #define        PPPCCP          0x80FD
 #define PPPIP          0x0021
+#define PPPIPV6                0x0057
 #define PPPMP          0x003D
 #define MIN_IP_SIZE    0x19
 #define PPPMP          0x003D
 #define MIN_IP_SIZE    0x19
-enum
-{
+
+enum {
        ConfigReq = 1,
        ConfigAck,
        ConfigNak,
        ConfigReq = 1,
        ConfigAck,
        ConfigNak,
@@ -107,6 +110,15 @@ enum
        IdentRequest
 };
 
        IdentRequest
 };
 
+enum {
+       AccessRequest = 1,
+       AccessAccept,
+       AccessReject,
+       AccountingRequest,
+       AccountingResponse,
+       AccessChallenge = 11
+};
+
 // Types
 typedef uint16_t sessionidt;
 typedef uint16_t tunnelidt;
 // Types
 typedef uint16_t sessionidt;
 typedef uint16_t tunnelidt;
@@ -208,6 +220,11 @@ sessiont;
 #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
 #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
+#define SF_IPV6CP_ACKED        8       // IPv6 negotiated
+#define SF_IPV6_NACKED 16      // IPv6 rejected
+
+#define AUTHPAP                1       // allow PAP
+#define AUTHCHAP       2       // allow CHAP
 
 typedef struct
 {
 
 typedef struct
 {
@@ -346,9 +363,9 @@ struct Tstats
     uint32_t   c_forwarded;
     uint32_t   recv_forward;
 
     uint32_t   c_forwarded;
     uint32_t   recv_forward;
 
-    uint32_t   select_called;          // number of times select called
-    uint32_t   select_ready;           // number of fds returned by select
-    uint32_t   select_processed;       // number of read/writes handled per select
+    uint32_t   select_called;
+    uint32_t   multi_read_used;
+    uint32_t   multi_read_exceeded;
 
 #ifdef STATISTICS
     uint32_t   call_processtun;
 
 #ifdef STATISTICS
     uint32_t   call_processtun;
@@ -377,13 +394,14 @@ struct Tstats
     uint32_t   call_processrad;
     uint32_t   call_radiussend;
     uint32_t   call_radiusretry;
     uint32_t   call_processrad;
     uint32_t   call_radiussend;
     uint32_t   call_radiusretry;
+    uint32_t    call_random_data;
 #endif
 };
 
 #ifdef STATISTICS
 
 #ifdef STAT_CALLS
 #endif
 };
 
 #ifdef STATISTICS
 
 #ifdef STAT_CALLS
-#define CSTAT(x)       STAT(x)
+#define CSTAT(x)       STAT(call_ ## x)
 #else
 #define CSTAT(x)
 #endif
 #else
 #define CSTAT(x)
 #endif
@@ -420,6 +438,8 @@ typedef struct
        char            log_filename[128];
        char            l2tpsecret[64];
 
        char            log_filename[128];
        char            l2tpsecret[64];
 
+       char            random_device[256];             // random device path, defaults to RANDOMDEVICE
+
        char            radiussecret[64];
        int             radius_accounting;
        in_addr_t       radiusserver[MAXRADSERVER];     // radius servers
        char            radiussecret[64];
        int             radius_accounting;
        in_addr_t       radiusserver[MAXRADSERVER];     // radius servers
@@ -427,6 +447,10 @@ typedef struct
        uint8_t         numradiusservers;               // radius server count
        short           num_radfds;                     // Number of radius filehandles allocated
 
        uint8_t         numradiusservers;               // radius server count
        short           num_radfds;                     // Number of radius filehandles allocated
 
+       char            radius_authtypes_s[32];         // list of valid authentication types (chap, pap) in order of preference
+       int             radius_authtypes;
+       int             radius_authprefer;
+
        in_addr_t       default_dns1, default_dns2;
 
        unsigned long   rl_rate;                        // default throttle rate
        in_addr_t       default_dns1, default_dns2;
 
        unsigned long   rl_rate;                        // default throttle rate
@@ -480,7 +504,7 @@ typedef struct
 #endif
 } configt;
 
 #endif
 } configt;
 
-enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IP, MAC };
+enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6, MAC };
 typedef struct
 {
        char *key;
 typedef struct
 {
        char *key;
@@ -571,6 +595,7 @@ void radiusclear(uint16_t r, sessionidt s);
 clockt backoff(uint8_t try);
 sessionidt sessionbyip(in_addr_t ip);
 sessionidt sessionbyuser(char *username);
 clockt backoff(uint8_t try);
 sessionidt sessionbyip(in_addr_t ip);
 sessionidt sessionbyuser(char *username);
+void random_data(uint8_t *buf, int len);
 void sessionshutdown(sessionidt s, char *reason);
 void send_garp(in_addr_t ip);
 void tunnelsend(uint8_t *buf, uint16_t l, tunnelidt t);
 void sessionshutdown(sessionidt s, char *reason);
 void send_garp(in_addr_t ip);
 void tunnelsend(uint8_t *buf, uint16_t l, tunnelidt t);