mirror of
https://github.com/ntop/n2n.git
synced 2024-04-21 16:31:34 +00:00
Merge branch 'dev' into prepReg
This commit is contained in:
+85
-66
@@ -36,8 +36,11 @@
|
||||
|
||||
/* Moved here to define _CRT_SECURE_NO_WARNINGS before all the including takes place */
|
||||
#ifdef WIN32
|
||||
#include "win32/n2n_win32.h"
|
||||
#ifdef _MSC_VER
|
||||
#include "config.h" /* Visual C++ */
|
||||
#else
|
||||
#include "win32/winconfig.h"
|
||||
#endif
|
||||
#define N2N_CAN_NAME_IFACE 1
|
||||
#undef N2N_HAVE_DAEMON
|
||||
#undef N2N_HAVE_SETUID
|
||||
@@ -47,6 +50,8 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#define PACKAGE_BUILDDATE (__DATE__ " " __TIME__)
|
||||
|
||||
#include <time.h>
|
||||
@@ -165,12 +170,13 @@ typedef struct ether_hdr ether_hdr_t;
|
||||
|
||||
#ifndef WIN32
|
||||
typedef struct tuntap_dev {
|
||||
int fd;
|
||||
int if_idx;
|
||||
uint8_t mac_addr[6];
|
||||
uint32_t ip_addr, device_mask;
|
||||
uint16_t mtu;
|
||||
char dev_name[N2N_IFNAMSIZ];
|
||||
int fd;
|
||||
int if_idx;
|
||||
n2n_mac_t mac_addr;
|
||||
uint32_t ip_addr;
|
||||
uint32_t device_mask;
|
||||
uint16_t mtu;
|
||||
char dev_name[N2N_IFNAMSIZ];
|
||||
} tuntap_dev;
|
||||
|
||||
#define SOCKET int
|
||||
@@ -186,26 +192,31 @@ typedef char ipstr_t[32];
|
||||
/** Common type used to hold stringified MAC addresses. */
|
||||
#define N2N_MACSTR_SIZE 32
|
||||
typedef char macstr_t[N2N_MACSTR_SIZE];
|
||||
typedef char dec_ip_str_t[N2N_NETMASK_STR_SIZE];
|
||||
typedef char dec_ip_bit_str_t[N2N_NETMASK_STR_SIZE + 4];
|
||||
|
||||
|
||||
struct peer_info {
|
||||
n2n_mac_t mac_addr;
|
||||
n2n_sock_t sock;
|
||||
int timeout;
|
||||
time_t last_seen;
|
||||
time_t last_p2p;
|
||||
time_t last_sent_query;
|
||||
uint64_t last_valid_time_stamp;
|
||||
n2n_mac_t mac_addr;
|
||||
n2n_ip_subnet_t dev_addr;
|
||||
n2n_sock_t sock;
|
||||
int timeout;
|
||||
time_t last_seen;
|
||||
time_t last_p2p;
|
||||
time_t last_sent_query;
|
||||
uint64_t last_valid_time_stamp;
|
||||
|
||||
UT_hash_handle hh; /* makes this structure hashable */
|
||||
UT_hash_handle hh; /* makes this structure hashable */
|
||||
};
|
||||
|
||||
|
||||
typedef struct speck_context_t he_context_t;
|
||||
typedef char n2n_sn_name_t[N2N_EDGE_SN_HOST_SIZE];
|
||||
|
||||
typedef struct n2n_route {
|
||||
in_addr_t net_addr;
|
||||
int net_bitlen;
|
||||
in_addr_t gateway;
|
||||
in_addr_t net_addr;
|
||||
uint8_t net_bitlen;
|
||||
in_addr_t gateway;
|
||||
} n2n_route_t;
|
||||
|
||||
typedef struct n2n_edge n2n_edge_t;
|
||||
@@ -247,8 +258,8 @@ typedef struct n2n_edge_callbacks {
|
||||
typedef struct n2n_tuntap_priv_config {
|
||||
char tuntap_dev_name[N2N_IFNAMSIZ];
|
||||
char ip_mode[N2N_IF_MODE_SIZE];
|
||||
char ip_addr[N2N_NETMASK_STR_SIZE];
|
||||
char netmask[N2N_NETMASK_STR_SIZE];
|
||||
dec_ip_str_t ip_addr;
|
||||
dec_ip_str_t netmask;
|
||||
char device_mac[N2N_MACNAMSIZ];
|
||||
int mtu;
|
||||
uint8_t got_s;
|
||||
@@ -261,30 +272,32 @@ typedef struct n2n_tuntap_priv_config {
|
||||
|
||||
/* *************************************************** */
|
||||
|
||||
|
||||
typedef struct n2n_edge_conf {
|
||||
n2n_sn_name_t sn_ip_array[N2N_EDGE_NUM_SUPERNODES];
|
||||
n2n_route_t *routes; /**< Networks to route through n2n */
|
||||
n2n_community_t community_name; /**< The community. 16 full octets. */
|
||||
uint8_t header_encryption; /**< Header encryption indicator. */
|
||||
he_context_t *header_encryption_ctx; /**< Header encryption cipher context. */
|
||||
he_context_t *header_iv_ctx; /**< Header IV ecnryption cipher context, REMOVE as soon as seperte fileds for checksum and replay protection available */
|
||||
n2n_transform_t transop_id; /**< The transop to use. */
|
||||
uint16_t compression; /**< Compress outgoing data packets before encryption */
|
||||
uint16_t num_routes; /**< Number of routes in routes */
|
||||
uint8_t dyn_ip_mode; /**< Interface IP address is dynamically allocated, eg. DHCP. */
|
||||
uint8_t allow_routing; /**< Accept packet no to interface address. */
|
||||
uint8_t drop_multicast; /**< Multicast ethernet addresses. */
|
||||
uint8_t disable_pmtu_discovery; /**< Disable the Path MTU discovery. */
|
||||
uint8_t allow_p2p; /**< Allow P2P connection */
|
||||
uint8_t sn_num; /**< Number of supernode addresses defined. */
|
||||
uint8_t tos; /** TOS for sent packets */
|
||||
char *encrypt_key;
|
||||
int register_interval; /**< Interval for supernode registration, also used for UDP NAT hole punching. */
|
||||
int register_ttl; /**< TTL for registration packet when UDP NAT hole punching through supernode. */
|
||||
int local_port;
|
||||
int mgmt_port;
|
||||
n2n_sn_name_t sn_ip_array[N2N_EDGE_NUM_SUPERNODES];
|
||||
n2n_route_t *routes; /**< Networks to route through n2n */
|
||||
n2n_community_t community_name; /**< The community. 16 full octets. */
|
||||
uint8_t header_encryption; /**< Header encryption indicator. */
|
||||
he_context_t *header_encryption_ctx; /**< Header encryption cipher context. */
|
||||
he_context_t *header_iv_ctx; /**< Header IV ecnryption cipher context, REMOVE as soon as seperte fileds for checksum and replay protection available */
|
||||
n2n_transform_t transop_id; /**< The transop to use. */
|
||||
uint16_t compression; /**< Compress outgoing data packets before encryption */
|
||||
uint16_t num_routes; /**< Number of routes in routes */
|
||||
uint8_t tuntap_ip_mode; /**< Interface IP address allocated mode, eg. DHCP. */
|
||||
uint8_t allow_routing; /**< Accept packet no to interface address. */
|
||||
uint8_t drop_multicast; /**< Multicast ethernet addresses. */
|
||||
uint8_t disable_pmtu_discovery; /**< Disable the Path MTU discovery. */
|
||||
uint8_t allow_p2p; /**< Allow P2P connection */
|
||||
uint8_t sn_num; /**< Number of supernode addresses defined. */
|
||||
uint8_t tos; /** TOS for sent packets */
|
||||
char *encrypt_key;
|
||||
int register_interval; /**< Interval for supernode registration, also used for UDP NAT hole punching. */
|
||||
int register_ttl; /**< TTL for registration packet when UDP NAT hole punching through supernode. */
|
||||
int local_port;
|
||||
int mgmt_port;
|
||||
} n2n_edge_conf_t;
|
||||
|
||||
|
||||
struct n2n_edge_stats {
|
||||
uint32_t tx_p2p;
|
||||
uint32_t rx_p2p;
|
||||
@@ -298,44 +311,45 @@ struct n2n_edge {
|
||||
n2n_edge_conf_t conf;
|
||||
|
||||
/* Status */
|
||||
uint8_t sn_idx; /**< Currently active supernode. */
|
||||
uint8_t sn_wait; /**< Whether we are waiting for a supernode response. */
|
||||
size_t sup_attempts; /**< Number of remaining attempts to this supernode. */
|
||||
tuntap_dev device; /**< All about the TUNTAP device */
|
||||
n2n_trans_op_t transop; /**< The transop to use when encoding */
|
||||
n2n_cookie_t last_cookie; /**< Cookie sent in last REGISTER_SUPER. */
|
||||
n2n_route_t *sn_route_to_clean; /**< Supernode route to clean */
|
||||
n2n_edge_callbacks_t cb; /**< API callbacks */
|
||||
void *user_data; /**< Can hold user data */
|
||||
uint64_t sn_last_valid_time_stamp;/*< last valid time stamp from supernode */
|
||||
uint8_t sn_idx; /**< Currently active supernode. */
|
||||
uint8_t sn_wait; /**< Whether we are waiting for a supernode response. */
|
||||
size_t sup_attempts; /**< Number of remaining attempts to this supernode. */
|
||||
tuntap_dev device; /**< All about the TUNTAP device */
|
||||
n2n_trans_op_t transop; /**< The transop to use when encoding */
|
||||
n2n_cookie_t last_cookie; /**< Cookie sent in last REGISTER_SUPER. */
|
||||
n2n_route_t *sn_route_to_clean; /**< Supernode route to clean */
|
||||
n2n_edge_callbacks_t cb; /**< API callbacks */
|
||||
void *user_data; /**< Can hold user data */
|
||||
uint64_t sn_last_valid_time_stamp;/**< last valid time stamp from supernode */
|
||||
|
||||
/* Sockets */
|
||||
n2n_sock_t supernode;
|
||||
int udp_sock;
|
||||
int udp_mgmt_sock; /**< socket for status info. */
|
||||
int udp_mgmt_sock; /**< socket for status info. */
|
||||
|
||||
#ifndef SKIP_MULTICAST_PEERS_DISCOVERY
|
||||
n2n_sock_t multicast_peer; /**< Multicast peer group (for local edges) */
|
||||
int udp_multicast_sock; /**< socket for local multicast registrations. */
|
||||
int multicast_joined; /**< 1 if the group has been joined.*/
|
||||
n2n_sock_t multicast_peer; /**< Multicast peer group (for local edges) */
|
||||
int udp_multicast_sock; /**< socket for local multicast registrations. */
|
||||
int multicast_joined; /**< 1 if the group has been joined.*/
|
||||
#endif
|
||||
|
||||
/* Peers */
|
||||
struct peer_info * known_peers; /**< Edges we are connected to. */
|
||||
struct peer_info * pending_peers; /**< Edges we have tried to register with. */
|
||||
struct peer_info * known_peers; /**< Edges we are connected to. */
|
||||
struct peer_info * pending_peers; /**< Edges we have tried to register with. */
|
||||
|
||||
/* Timers */
|
||||
time_t last_register_req; /**< Check if time to re-register with super*/
|
||||
time_t last_p2p; /**< Last time p2p traffic was received. */
|
||||
time_t last_sup; /**< Last time a packet arrived from supernode. */
|
||||
time_t start_time; /**< For calculating uptime */
|
||||
time_t last_register_req; /**< Check if time to re-register with super*/
|
||||
time_t last_p2p; /**< Last time p2p traffic was received. */
|
||||
time_t last_sup; /**< Last time a packet arrived from supernode. */
|
||||
time_t start_time; /**< For calculating uptime */
|
||||
|
||||
/* Statistics */
|
||||
struct n2n_edge_stats stats;
|
||||
/* Tuntap config */
|
||||
n2n_tuntap_priv_config_t tuntap_priv_conf;
|
||||
|
||||
struct n2n_edge_stats stats; /**< Statistics */
|
||||
|
||||
n2n_tuntap_priv_config_t tuntap_priv_conf; /**< Tuntap config */
|
||||
};
|
||||
|
||||
|
||||
typedef struct sn_stats
|
||||
{
|
||||
size_t errors; /* Number of errors encountered. */
|
||||
@@ -429,6 +443,8 @@ void tuntap_get_address(struct tuntap_dev *tuntap);
|
||||
|
||||
/* Utils */
|
||||
char* intoa(uint32_t addr, char* buf, uint16_t buf_len);
|
||||
uint32_t bitlen2mask(uint8_t bitlen);
|
||||
uint8_t mask2bitlen(uint32_t mask);
|
||||
char* macaddr_str(macstr_t buf, const n2n_mac_t mac);
|
||||
int str2mac( uint8_t * outmac /* 6 bytes */, const char * s );
|
||||
uint8_t is_multi_broadcast(const uint8_t * dest_mac);
|
||||
@@ -441,6 +457,7 @@ void print_edge_stats(const n2n_edge_t *eee);
|
||||
/* Sockets */
|
||||
char* sock_to_cstr( n2n_sock_str_t out,
|
||||
const n2n_sock_t * sock );
|
||||
char * ip_subnet_to_str(dec_ip_bit_str_t buf, const n2n_ip_subnet_t *ipaddr);
|
||||
SOCKET open_socket(int local_port, int bind_any);
|
||||
int sock_equal( const n2n_sock_t * a,
|
||||
const n2n_sock_t * b );
|
||||
@@ -464,7 +481,9 @@ const n2n_edge_conf_t* edge_get_conf(const n2n_edge_t *eee);
|
||||
void edge_term_conf(n2n_edge_conf_t *conf);
|
||||
|
||||
/* Public functions */
|
||||
n2n_edge_t* edge_init(const tuntap_dev *dev, const n2n_edge_conf_t *conf, int *rv);
|
||||
n2n_edge_t* edge_init(const n2n_edge_conf_t *conf, int *rv);
|
||||
void update_supernode_reg(n2n_edge_t * eee, time_t nowTime);
|
||||
void readFromIPSocket(n2n_edge_t * eee, int in_sock);
|
||||
void edge_term(n2n_edge_t *eee);
|
||||
void edge_set_callbacks(n2n_edge_t *eee, const n2n_edge_callbacks_t *callbacks);
|
||||
void edge_set_userdata(n2n_edge_t *eee, void *user_data);
|
||||
|
||||
@@ -101,6 +101,15 @@
|
||||
#define N2N_SN_PKTBUF_SIZE 2048
|
||||
|
||||
|
||||
/* The way TUNTAP allocated IP. */
|
||||
#define TUNTAP_IP_MODE_SN_ASSIGN 0
|
||||
#define TUNTAP_IP_MODE_STATIC 1
|
||||
#define TUNTAP_IP_MODE_DHCP 2
|
||||
|
||||
/* Default network segment of the dhcp service provided by sn. */
|
||||
#define N2N_SN_DHCP_NET_ADDR_DEFAULT "172.17.12.0"
|
||||
#define N2N_SN_DHCP_NET_BIT_DEFAULT 24
|
||||
|
||||
/* ************************************** */
|
||||
|
||||
#define SUPERNODE_IP "127.0.0.1"
|
||||
|
||||
+49
-44
@@ -20,19 +20,10 @@
|
||||
#define N2N_WIRE_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined(WIN32)
|
||||
#include "win32/n2n_win32.h"
|
||||
|
||||
#if defined(__MINGW32__)
|
||||
#ifndef _MSC_VER
|
||||
/* Not included in Visual Studio 2008 */
|
||||
#include <stdint.h>
|
||||
#endif /* #ifdef __MINGW32__ */
|
||||
|
||||
#else /* #if defined(WIN32) */
|
||||
#include <stdint.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h> /* AF_INET and AF_INET6 */
|
||||
#endif /* #if defined(WIN32) */
|
||||
#endif
|
||||
|
||||
#define N2N_PKT_VERSION 2
|
||||
#define N2N_DEFAULT_TTL 2 /* can be forwarded twice at most */
|
||||
@@ -51,6 +42,13 @@ typedef uint8_t n2n_cookie_t[N2N_COOKIE_SIZE];
|
||||
|
||||
typedef char n2n_sock_str_t[N2N_SOCKBUF_SIZE]; /* tracing string buffer */
|
||||
|
||||
#if defined(WIN32)
|
||||
#include "win32/n2n_win32.h"
|
||||
#else /* #if defined(WIN32) */
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h> /* AF_INET and AF_INET6 */
|
||||
#endif /* #if defined(WIN32) */
|
||||
|
||||
typedef enum n2n_pc
|
||||
{
|
||||
n2n_ping=0, /* Not used */
|
||||
@@ -86,6 +84,12 @@ typedef enum n2n_pc
|
||||
#define N2N_EINVAL -3
|
||||
#define N2N_ENOSPACE -4
|
||||
|
||||
typedef struct n2n_ip_subnet {
|
||||
uint32_t net_addr; /* Host order IP address. */
|
||||
uint8_t net_bitlen; /* Subnet prefix. */
|
||||
} n2n_ip_subnet_t;
|
||||
|
||||
|
||||
typedef struct n2n_sock
|
||||
{
|
||||
uint8_t family; /* AF_INET or AF_INET6; or 0 if invalid */
|
||||
@@ -117,18 +121,18 @@ typedef struct n2n_common
|
||||
|
||||
typedef struct n2n_REGISTER
|
||||
{
|
||||
n2n_cookie_t cookie; /* Link REGISTER and REGISTER_ACK */
|
||||
n2n_mac_t srcMac; /* MAC of registering party */
|
||||
n2n_mac_t dstMac; /* MAC of target edge */
|
||||
n2n_sock_t sock; /* REVISIT: unused? */
|
||||
n2n_cookie_t cookie; /**< Link REGISTER and REGISTER_ACK */
|
||||
n2n_mac_t srcMac; /**< MAC of registering party */
|
||||
n2n_mac_t dstMac; /**< MAC of target edge */
|
||||
n2n_sock_t sock; /**< REVISIT: unused? */
|
||||
} n2n_REGISTER_t;
|
||||
|
||||
typedef struct n2n_REGISTER_ACK
|
||||
{
|
||||
n2n_cookie_t cookie; /* Return cookie from REGISTER */
|
||||
n2n_mac_t srcMac; /* MAC of acknowledging party (supernode or edge) */
|
||||
n2n_mac_t dstMac; /* Reflected MAC of registering edge from REGISTER */
|
||||
n2n_sock_t sock; /* Supernode's view of edge socket (IP Addr, port) */
|
||||
n2n_cookie_t cookie; /**< Return cookie from REGISTER */
|
||||
n2n_mac_t srcMac; /**< MAC of acknowledging party (supernode or edge) */
|
||||
n2n_mac_t dstMac; /**< Reflected MAC of registering edge from REGISTER */
|
||||
n2n_sock_t sock; /**< Supernode's view of edge socket (IP Addr, port) */
|
||||
} n2n_REGISTER_ACK_t;
|
||||
|
||||
typedef struct n2n_PACKET
|
||||
@@ -141,30 +145,30 @@ typedef struct n2n_PACKET
|
||||
} n2n_PACKET_t;
|
||||
|
||||
/* Linked with n2n_register_super in n2n_pc_t. Only from edge to supernode. */
|
||||
typedef struct n2n_REGISTER_SUPER
|
||||
{
|
||||
n2n_cookie_t cookie; /* Link REGISTER_SUPER and REGISTER_SUPER_ACK */
|
||||
n2n_mac_t edgeMac; /* MAC to register with edge sending socket */
|
||||
n2n_auth_t auth; /* Authentication scheme and tokens */
|
||||
typedef struct n2n_REGISTER_SUPER {
|
||||
n2n_cookie_t cookie; /**< Link REGISTER_SUPER and REGISTER_SUPER_ACK */
|
||||
n2n_mac_t edgeMac; /**< MAC to register with edge sending socket */
|
||||
n2n_ip_subnet_t dev_addr; /**< IP address of the tuntap adapter. */
|
||||
n2n_auth_t auth; /**< Authentication scheme and tokens */
|
||||
} n2n_REGISTER_SUPER_t;
|
||||
|
||||
/* Linked with n2n_register_super_ack in n2n_pc_t. Only from supernode to edge. */
|
||||
typedef struct n2n_REGISTER_SUPER_ACK
|
||||
{
|
||||
n2n_cookie_t cookie; /* Return cookie from REGISTER_SUPER */
|
||||
n2n_mac_t edgeMac; /* MAC registered to edge sending socket */
|
||||
uint16_t lifetime; /* How long the registration will live */
|
||||
n2n_sock_t sock; /* Sending sockets associated with edgeMac */
|
||||
|
||||
/* The packet format provides additional supernode definitions here.
|
||||
* uint8_t count, then for each count there is one
|
||||
* n2n_sock_t.
|
||||
*/
|
||||
uint8_t num_sn; /* Number of supernodes that were send
|
||||
/* Linked with n2n_register_super_ack in n2n_pc_t. Only from supernode to edge. */
|
||||
typedef struct n2n_REGISTER_SUPER_ACK {
|
||||
n2n_cookie_t cookie; /**< Return cookie from REGISTER_SUPER */
|
||||
n2n_mac_t edgeMac; /**< MAC registered to edge sending socket */
|
||||
n2n_ip_subnet_t dev_addr; /**< Assign an IP address to the tuntap adapter of edge. */
|
||||
uint16_t lifetime; /**< How long the registration will live */
|
||||
n2n_sock_t sock; /**< Sending sockets associated with edgeMac */
|
||||
|
||||
/** The packet format provides additional supernode definitions here.
|
||||
* uint8_t count, then for each count there is one
|
||||
* n2n_sock_t.
|
||||
*/
|
||||
uint8_t num_sn; /**< Number of supernodes that were send
|
||||
* even if we cannot store them all. If
|
||||
* non-zero then sn_bak is valid. */
|
||||
n2n_sock_t sn_bak; /* Socket of the first backup supernode */
|
||||
|
||||
n2n_sock_t sn_bak; /**< Socket of the first backup supernode */
|
||||
} n2n_REGISTER_SUPER_ACK_t;
|
||||
|
||||
|
||||
@@ -174,13 +178,14 @@ typedef struct n2n_REGISTER_SUPER_NAK
|
||||
n2n_cookie_t cookie; /* Return cookie from REGISTER_SUPER */
|
||||
} n2n_REGISTER_SUPER_NAK_t;
|
||||
|
||||
typedef struct n2n_PEER_INFO
|
||||
{
|
||||
uint16_t aflags;
|
||||
n2n_mac_t mac;
|
||||
n2n_sock_t sock;
|
||||
|
||||
typedef struct n2n_PEER_INFO {
|
||||
uint16_t aflags;
|
||||
n2n_mac_t mac;
|
||||
n2n_sock_t sock;
|
||||
} n2n_PEER_INFO_t;
|
||||
|
||||
|
||||
typedef struct n2n_QUERY_PEER
|
||||
{
|
||||
n2n_mac_t srcMac;
|
||||
|
||||
Reference in New Issue
Block a user