X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/b5273cc1c65f9496c1a7c2135b61979dd98fcf08..3b6cfeb9a24f60d0cbfd83456124142594f3414a:/l2tpns.h?ds=sidebyside diff --git a/l2tpns.h b/l2tpns.h index 989ddd9..5dd854f 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -25,7 +25,6 @@ #define MAXSESSION 60000 // could be up to 65535 #define MAXTBFS 6000 // Maximum token bucket filters. Might need up to 2 * session. #define MAXSESSINGRP 12 // Maximum number of member links in grouped session -#define MAXGRPINSESS 12 // Maximum number of member links in session group #define MAXGROUPE 300 // could be up to 65535, Maximum number of grouped session #define MAXROUTEINGRP 15 // max static routes per group @@ -70,6 +69,15 @@ // it's not expected to have a space for more than 10 unassembled packets = 10 * MAXBUNDLESES #define MAXFRAGNUM_MASK (MAXFRAGNUM - 1) // Must be equal to MAXFRAGNUM-1 +// Multi bind address constants +#define MAX_UDPFD 4 +#define MAX_BINDADDR MAX_UDPFD +// + 1 for the LAC Hostname +#define MAX_NBHOSTNAME (MAX_UDPFD + 1) +// 4 + 1 for the udplac +#define INIT_TABUDPFD {-1, -1, -1, -1, -1} +#define INIT_TABUDPVAR {0, 0, 0, 0, 0} + // Constants #ifndef ETCDIR #define ETCDIR "/etc/l2tpns" @@ -252,10 +260,7 @@ typedef struct controls // control message { 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; @@ -330,40 +335,41 @@ typedef struct char class[MAXCLASS]; uint8_t ipv6prefixlen; // IPv6 route prefix length struct in6_addr ipv6route; // Static IPv6 route -#ifdef LAC sessionidt forwardtosession; // LNS id_session to forward uint8_t src_hwaddr[ETH_ALEN]; // MAC addr source (for pppoe sessions 6 bytes) - uint32_t coutgrp_delta; -#else - uint8_t src_hwaddr[ETH_ALEN]; // MAC addr source (for pppoe sessions 6 bytes) - uint32_t coutgrp_delta; - char reserved[2]; // Space to expand structure without changing HB_VERSION -#endif + char reserved[4]; // Space to expand structure without changing HB_VERSION } sessiont; typedef struct { uint32_t tx_rate; - time_t mark_time; + uint32_t prev_coutgrp; sessionidt sid; uint8_t weight; } -groupsessionidt; +groupsesslistt; typedef struct { - //uint16_t indexprevsessid; + int state; // current state (groupestate enum) uint32_t time_changed; - //time_t mark_time; groupidt prev; - groupsessionidt sesslist[MAXSESSINGRP]; + sessionidt smax; + sessionidt smin; + groupsesslistt sesslist[MAXSESSINGRP]; routet route[MAXROUTEINGRP]; // static routes uint8_t nbroutesgrp; uint8_t nbsession; } groupsesst; +union iphash +{ + sessionidt sess; + union iphash *idx; +}; // Mapping from IP address to session structures. + typedef struct { int state; // current state (bundlestate enum) @@ -480,12 +486,9 @@ typedef struct uint16_t controlc; // outstaind messages in queue controlt *controls; // oldest message controlt *controle; // newest message -#ifdef LAC uint16_t isremotelns; // != 0 if the tunnel is to remote LNS (== index on the conf remote lns) - char reserved[14]; // Space to expand structure without changing HB_VERSION -#else - char reserved[16]; // Space to expand structure without changing HB_VERSION -#endif + uint16_t indexudp; // Index UDP file handle (in udpfd[]) + char reserved[12]; // Space to expand structure without changing HB_VERSION } tunnelt; @@ -549,6 +552,13 @@ enum BUNDLEUNDEF, // Undefined }; +enum +{ + GROUPEFREE, // Not in use + GROUPEOPEN, // Active bundle + GROUPEUNDEF // Undefined +}; + enum { NULLCLASS = 0, //End Point Discriminator classes @@ -728,6 +738,7 @@ typedef struct int num_tbfs; // number of throttle buckets char accounting_dir[128]; + int account_all_origin; // Accouting all origin (LAC data + Remote LNS Data + PPPOE data) in_addr_t bind_address; in_addr_t peer_address; int send_garp; // Set to true to garp for vip address on startup @@ -756,8 +767,10 @@ typedef struct int cluster_undefined_sessions; // How many sessions we're yet to receive from the master. int cluster_undefined_bundles; // How many bundles we're yet to receive from the master. int cluster_undefined_tunnels; // How many tunnels we're yet to receive from the master. + int cluster_undefined_groupes; // How many groupes we're yet to receive from the master. int cluster_highest_sessionid; int cluster_highest_bundleid; + int cluster_highest_groupeid; 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 @@ -796,20 +809,28 @@ typedef struct int idle_echo_timeout; // Time between last packet seen and // Drop sessions who have not responded within IDLE_ECHO_TIMEOUT seconds 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 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 pppoe_only_equal_svc_name; // Accept only PADI with service-name equal to server int disable_sending_hello; // Disable l2tp sending HELLO message for Apple compatibility. int disable_no_spoof; // Disable no spoof (permit load balancing client --> internet) + int nbudpfd; // number UDP file handle + int nbmultiaddress; // number multi address to bind + int indexlacudpfd; // Index UDP LAC file handle (in udpfd[]) + int nbmultihostname; // number hostname, normally the same number as the nbudpfd int grp_txrate_average_time; // caculation txrate average time (default 10s) + in_addr_t bind_n_address[MAX_BINDADDR]; + in_addr_t iftun_n_address[MAX_BINDADDR]; + char bind_multi_address[256]; + char multi_hostname[512]; + char multi_n_hostname[MAX_NBHOSTNAME][MAXHOSTNAME]; // list hostname } configt; enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6 }; @@ -945,9 +966,7 @@ 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, struct in_addr *local); -#ifdef LAC int rad_tunnel_pwdecode(uint8_t *pl2tpsecret, size_t *pl2tpsecretlen, const char *radiussecret, const uint8_t * auth); -#endif // l2tpns.c clockt backoff(uint8_t try); @@ -967,7 +986,7 @@ int tun_write(uint8_t *data, int size); void adjust_tcp_mss(sessionidt s, tunnelidt t, uint8_t *buf, int len, uint8_t *tcp); void sendipcp(sessionidt s, tunnelidt t); void sendipv6cp(sessionidt s, tunnelidt t); -void processudp(uint8_t *buf, int len, struct sockaddr_in *addr); +void processudp(uint8_t *buf, int len, struct sockaddr_in *addr, uint16_t indexudpfd); void processipout(uint8_t *buf, int len); void snoop_send_packet(uint8_t *packet, uint16_t size, in_addr_t destination, uint16_t port); int find_filter(char const *name, size_t len); @@ -979,16 +998,14 @@ void netlink_addattr(struct nlmsghdr *nh, int type, const void *data, int alen); ssize_t netlink_send(struct nlmsghdr *nh); void cache_ipmap(in_addr_t ip, sessionidt s); -#ifdef LAC tunnelidt lac_new_tunnel(); void lac_tunnelclear(tunnelidt t); void lac_send_SCCRQ(tunnelidt t, uint8_t * auth, unsigned int auth_len); void lac_send_ICRQ(tunnelidt t, sessionidt s); void lac_tunnelshutdown(tunnelidt t, char *reason, int result, int error, char *msg); -#endif // grpsess.c -sessionidt grp_getnextsession(groupidt g, in_addr_t ip); +sessionidt grp_getnextsession(groupidt g, in_addr_t ip, in_addr_t ip_src); void grp_initdata(void); void grp_processvendorspecific(sessionidt s, uint8_t *pvs); groupidt grp_groupbysession(sessionidt s); @@ -996,6 +1013,7 @@ groupidt grp_groupbyip(in_addr_t ip); void grp_setgrouproute(groupidt g, int add); void grp_time_changed(void); void grp_removesession(groupidt g, sessionidt s); +int grp_cluster_load_groupe(groupidt g, groupsesst *new); #undef LOG #undef LOG_HEX @@ -1032,6 +1050,7 @@ extern sessiont *session; extern sessionlocalt *sess_local; extern ippoolt *ip_address_pool; extern groupsesst *grpsession; +extern groupidt gnextgrpid; #define sessionfree (session[0].next) @@ -1045,6 +1064,7 @@ extern in_addr_t my_address; extern int clifd; extern int epollfd; extern int tunidx; // ifr_ifindex of tun device +extern union iphash ip_hash[256]; struct event_data { enum { @@ -1057,13 +1077,10 @@ struct event_data { 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 + int index; // for RADIUS, BGP, UDP }; #define TIME (config->current_time)