#include <sys/types.h>
#include <libcli.h>
-#define VERSION "2.2.1"
+#define VERSION "2.2.1-2sames3.14"
// Limits
#define MAXTUNNEL 500 // could be up to 65535
#define MAXSESSINGRP 12 // Maximum number of member links in grouped session
#define MAXGROUPE 300 // could be up to 65535, Maximum number of grouped session
#define MAXROUTEINGRP 15 // max static routes per group
+#define MAXROUTE6INGRP 15 // max static Ipv6 routes per group
// Tunnel Id reserved for pppoe
#define TUNNEL_ID_PPPOE 1
#define MAXPLUGINS 20 // maximum number of plugins to load
#define MAXRADSERVER 10 // max radius servers
#define MAXROUTE 10 // max static routes per session
+#define MAXROUTE6 5 // max static Ipv6 routes per session
#define MAXIPPOOL 131072 // max number of ip addresses in pool
#define RINGBUFFER_SIZE 10000 // Number of ringbuffer entries to allocate
#define MAX_LOG_LENGTH 512 // Maximum size of log message
}
routet;
+// structures
+typedef struct // route
+{
+ struct in6_addr ipv6route; // Static IPv6 route
+ uint8_t ipv6prefixlen; // IPv6 route prefix length
+}
+routet6;
+
typedef struct controls // control message
{
struct controls *next; // next in queue
uint8_t walled_garden; // is this session gardened?
uint8_t classlen; // class (needed for radius accounting messages)
char class[MAXCLASS];
- uint8_t ipv6prefixlen; // IPv6 route prefix length
- struct in6_addr ipv6route; // Static IPv6 route
sessionidt forwardtosession; // LNS id_session to forward
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
+ uint32_t dhcpv6_prefix_iaid; // prefix iaid requested by client
+ uint32_t dhcpv6_iana_iaid; // iaid of iana requested by client
+ struct in6_addr ipv6address; // Framed Ipv6 address
+ struct dhcp6_opt_clientid dhcpv6_client_id; // Size max (headers + DUID)
+ routet6 route6[MAXROUTE6]; // static IPv6 routes
+ char reserved[4]; // Space to expand structure without changing HB_VERSION
}
sessiont;
sessionidt smin;
groupsesslistt sesslist[MAXSESSINGRP];
routet route[MAXROUTEINGRP]; // static routes
+ routet6 route6[MAXROUTE6INGRP]; // static IPv6 routes
+ uint8_t ipv6cp_opened;
uint8_t nbroutesgrp;
+ uint8_t nbroutes6grp;
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)
uint32_t call_processudp;
uint32_t call_sessionbyip;
uint32_t call_sessionbyipv6;
+ uint32_t call_sessionbyipv6new;
uint32_t call_sessionbyuser;
uint32_t call_sendarp;
uint32_t call_sendipcp;
uint32_t call_radiussend;
uint32_t call_radiusretry;
uint32_t call_random_data;
+ uint32_t call_dhcpv6_process;
#endif
};
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)
+ int no_throttle_local_IP; // no throttle traffic from session to session
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
+ struct in6_addr default_ipv6_dns1;
+ struct in6_addr default_ipv6_dns2;
+ uint32_t dhcp6_preferred_lifetime; // preferred lifetime (see rfc3315)
+ uint32_t dhcp6_valid_lifetime; // valid lifetime (see rfc3315)
+ uint32_t dhcp6_server_duid; // DUID of dhcpv6 server (see rfc3315)
+ char default_ipv6_domain_list[255];
} configt;
enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6 };
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 sessionbyipv6new(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 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);
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);
-int cmd_show_hist_open(struct cli_def *cli, char *command, char **argv, int argc);
+int cmd_show_ipcache(struct cli_def *cli, const char *command, char **argv, int argc);
+int cmd_show_hist_idle(struct cli_def *cli, const char *command, char **argv, int argc);
+int cmd_show_hist_open(struct cli_def *cli, const char *command, char **argv, int argc);
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);
-
tunnelidt lac_new_tunnel();
void lac_tunnelclear(tunnelidt t);
void lac_send_SCCRQ(tunnelidt t, uint8_t * auth, unsigned int auth_len);
void lac_tunnelshutdown(tunnelidt t, char *reason, int result, int error, char *msg);
// grpsess.c
-sessionidt grp_getnextsession(groupidt g, in_addr_t ip, in_addr_t ip_src);
+sessionidt grp_getnextsession(groupidt g, void *p_ip, void *p_ip_src, int is_ipv6);
void grp_initdata(void);
void grp_processvendorspecific(sessionidt s, uint8_t *pvs);
groupidt grp_groupbysession(sessionidt s);
groupidt grp_groupbyip(in_addr_t ip);
+groupidt grp_groupbyipv6(struct in6_addr ip);
void grp_setgrouproute(groupidt g, int add);
+void grp_setgrouproute6(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);
extern int clifd;
extern int epollfd;
extern int tunidx; // ifr_ifindex of tun device
-extern union iphash ip_hash[256];
struct event_data {
enum {