Fix Warning: dereferencing type-punned pointer will break strict...
[l2tpns.git] / l2tpns.h
index ba9a56f..092c683 100644 (file)
--- a/l2tpns.h
+++ b/l2tpns.h
@@ -9,6 +9,7 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <netinet/in.h>
 #include <signal.h>
 #include <stdlib.h>
 #include <netinet/in.h>
+#include <net/ethernet.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
 #include <sys/types.h>
@@ -24,6 +25,9 @@
 #define MAXSESSION     60000           // could be up to 65535
 #define MAXTBFS                6000            // Maximum token bucket filters. Might need up to 2 * session.
 
 #define MAXSESSION     60000           // could be up to 65535
 #define MAXTBFS                6000            // Maximum token bucket filters. Might need up to 2 * session.
 
+// Tunnel Id reserved for pppoe
+#define TUNNEL_ID_PPPOE        1
+
 #define RADIUS_SHIFT   6
 #define RADIUS_FDS     (1 << RADIUS_SHIFT)
 #define RADIUS_MASK    ((1 << RADIUS_SHIFT) - 1)
 #define RADIUS_SHIFT   6
 #define RADIUS_FDS     (1 << RADIUS_SHIFT)
 #define RADIUS_MASK    ((1 << RADIUS_SHIFT) - 1)
@@ -60,7 +64,7 @@
 #define MAXFRAGLEN     1496    // Maximum length for Multilink fragment (The multilink may contain only one link)
 #define MAXFRAGNUM     512             // 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 MAXFRAGLEN     1496    // Maximum length for Multilink fragment (The multilink may contain only one link)
 #define MAXFRAGNUM     512             // 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 511             // Must be equal to MAXFRAGNUM-1
+#define        MAXFRAGNUM_MASK (MAXFRAGNUM - 1)                // Must be equal to MAXFRAGNUM-1
 
 // Constants
 #ifndef ETCDIR
 
 // Constants
 #ifndef ETCDIR
@@ -243,10 +247,7 @@ typedef struct controls            // control message
 {
        struct controls *next;  // next in queue
        uint16_t length;        // length
 {
        struct controls *next;  // next in queue
        uint16_t length;        // length
-       union {
-               uint8_t buf[MAXCONTROL];
-               uint16_t buf16[MAXCONTROL/2];
-       } __attribute__ ((__transparent_union__));
+       uint8_t buf[MAXCONTROL];
 }
 controlt;
 
 }
 controlt;
 
@@ -323,9 +324,11 @@ typedef struct
        struct in6_addr ipv6route;      // Static IPv6 route
 #ifdef LAC
        sessionidt forwardtosession;    // LNS id_session to forward
        struct in6_addr ipv6route;      // Static IPv6 route
 #ifdef LAC
        sessionidt forwardtosession;    // LNS id_session to forward
-       char reserved[10];              // Space to expand structure without changing HB_VERSION
+       uint8_t src_hwaddr[ETH_ALEN];   // MAC addr source (for pppoe sessions 6 bytes)
+       char reserved[4];               // Space to expand structure without changing HB_VERSION
 #else
 #else
-       char reserved[12];              // Space to expand structure without changing HB_VERSION
+       uint8_t src_hwaddr[ETH_ALEN];   // MAC addr source (for pppoe sessions 6 bytes)
+       char reserved[6];               // Space to expand structure without changing HB_VERSION
 #endif
 }
 sessiont;
 #endif
 }
 sessiont;
@@ -350,9 +353,9 @@ bundlet;
 
 typedef struct
 {
 
 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
        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
@@ -764,10 +767,17 @@ typedef struct
        in_addr_t iftun_address;
 #ifdef LAC
        int disable_lac_func;
        in_addr_t iftun_address;
 #ifdef LAC
        int disable_lac_func;
+       int auth_tunnel_change_addr_src;
        int highest_rlnsid;
        uint16_t bind_portremotelns;
        in_addr_t bind_address_remotelns;
 #endif
        int highest_rlnsid;
        uint16_t bind_portremotelns;
        in_addr_t bind_address_remotelns;
 #endif
+       char pppoe_if_to_bind[IFNAMSIZ];        // Name pppoe interface to bind
+       char pppoe_service_name[64];    // pppoe service name
+       char pppoe_ac_name[64];
+       uint8_t pppoe_hwaddr[ETH_ALEN]; // MAC addr of interface pppoe to bind
+       int disable_sending_hello; // Disable l2tp sending HELLO message for Apple compatibility.
+       int disable_no_spoof; // Disable no spoof (permit load balancing client --> internet)
 } configt;
 
 enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6 };
 } configt;
 
 enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6 };
@@ -887,6 +897,7 @@ void processipv6in(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
 void processccp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
 void sendchap(sessionidt s, tunnelidt t);
 uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, sessionidt s, tunnelidt t, uint16_t mtype, uint8_t prio, bundleidt bid, uint8_t mp_bits);
 void processccp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
 void sendchap(sessionidt s, tunnelidt t);
 uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, sessionidt s, tunnelidt t, uint16_t mtype, uint8_t prio, bundleidt bid, uint8_t mp_bits);
+uint8_t *opt_makeppp(uint8_t *p, int l, sessionidt s, tunnelidt t, uint16_t mtype, uint8_t prio, bundleidt bid, uint8_t mp_bits);
 void sendlcp(sessionidt s, tunnelidt t);
 void send_ipin(sessionidt s, uint8_t *buf, int len);
 void sendccp(sessionidt s, tunnelidt t);
 void sendlcp(sessionidt s, tunnelidt t);
 void send_ipin(sessionidt s, uint8_t *buf, int len);
 void sendccp(sessionidt s, tunnelidt t);
@@ -989,18 +1000,20 @@ extern int epollfd;
 
 struct event_data {
        enum {
 
 struct event_data {
        enum {
-               FD_TYPE_CLI,
-               FD_TYPE_CLUSTER,
-               FD_TYPE_TUN,
-               FD_TYPE_UDP,
-               FD_TYPE_CONTROL,
-               FD_TYPE_DAE,
+               FD_TYPE_CLI,
+               FD_TYPE_CLUSTER,
+               FD_TYPE_TUN,
+               FD_TYPE_UDP,
+               FD_TYPE_CONTROL,
+               FD_TYPE_DAE,
                FD_TYPE_RADIUS,
                FD_TYPE_BGP,
                FD_TYPE_NETLINK,
 #ifdef LAC
                FD_TYPE_UDPLAC,
 #endif
                FD_TYPE_RADIUS,
                FD_TYPE_BGP,
                FD_TYPE_NETLINK,
 #ifdef LAC
                FD_TYPE_UDPLAC,
 #endif
+               FD_TYPE_PPPOEDISC,
+               FD_TYPE_PPPOESESS
        } type;
        int index; // for RADIUS, BGP
 };
        } type;
        int index; // for RADIUS, BGP
 };