Skip to content

Commit

Permalink
prepare for ipv6
Browse files Browse the repository at this point in the history
  • Loading branch information
wangyu- committed Jul 25, 2018
1 parent 649a55e commit 9c1a8c8
Show file tree
Hide file tree
Showing 9 changed files with 609 additions and 220 deletions.
492 changes: 365 additions & 127 deletions common.cpp

Large diffs are not rendered by default.

189 changes: 175 additions & 14 deletions common.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,10 @@ typedef int i32_t;
typedef unsigned short u16_t;
typedef short i16_t;


#if defined(__MINGW32__)
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
#define setsockopt(a,b,c,d,e) setsockopt(a,b,c,(const char *)(d),e)
#endif

Expand Down Expand Up @@ -96,7 +99,7 @@ struct my_itimerspec {

typedef u64_t my_time_t;


const int max_addr_len=100;
const int max_data_len=3600;
const int buf_len=max_data_len+200;

Expand Down Expand Up @@ -169,8 +172,9 @@ typedef u64_t anti_replay_seq_t;
typedef u64_t fd64_t;

//enum dest_type{none=0,type_fd64_ip_port,type_fd64,type_fd64_ip_port_conv,type_fd64_conv/*,type_fd*/};
enum dest_type{none=0,type_fd64_ip_port,type_fd64,type_fd,type_write_fd,type_fd_ip_port/*,type_fd*/};
enum dest_type{none=0,type_fd64_addr,type_fd64,type_fd,type_write_fd,type_fd_addr/*,type_fd*/};

/*
struct ip_port_t
{
u32_t ip;
Expand All @@ -189,13 +193,175 @@ struct fd_ip_port_t
{
int fd;
ip_port_t ip_port;
};*/


struct pseudo_header {
u32_t source_address;
u32_t dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
};

u32_t djb2(unsigned char *str,int len);
u32_t sdbm(unsigned char *str,int len);

struct address_t //TODO scope id
{
struct hash_function
{
u32_t operator()(const address_t &key) const
{
return sdbm((unsigned char*)&key.inner,sizeof(key.inner));
}
};

union storage_t //sockaddr_storage is too huge, we dont use it.
{
sockaddr_in ipv4;
sockaddr_in6 ipv6;
};
storage_t inner;

address_t()
{
clear();
}
void clear()
{
memset(&inner,0,sizeof(inner));
}
int from_ip_port(u32_t ip, int port)
{
clear();
inner.ipv4.sin_family=AF_INET;
inner.ipv4.sin_port=htons(port);
inner.ipv4.sin_addr.s_addr=ip;
return 0;
}

int from_ip_port_new(int type, void * ip, int port)
{
clear();
if(type==AF_INET)
{
inner.ipv4.sin_family=AF_INET;
inner.ipv4.sin_port=htons(port);
inner.ipv4.sin_addr.s_addr=*((u32_t *)ip);
}
else if(type==AF_INET6)
{
inner.ipv6.sin6_family=AF_INET;
inner.ipv6.sin6_port=htons(port);
inner.ipv6.sin6_addr=*((in6_addr*)ip);
}
return 0;
}

int from_str(char * str);

int from_str_ip_only(char * str);

int from_sockaddr(sockaddr *,socklen_t);

char* get_str();
void to_str(char *);

inline u32_t get_type()
{
u32_t ret=((sockaddr*)&inner)->sa_family;
assert(ret==AF_INET||ret==AF_INET6);
return ret;
}

inline u32_t get_len()
{
u32_t type=get_type();
switch(type)
{
case AF_INET:
return sizeof(sockaddr_in);
case AF_INET6:
return sizeof(sockaddr_in6);
default:
assert(0==1);
}
return -1;
}

inline u32_t get_port()
{
u32_t type=get_type();
switch(type)
{
case AF_INET:
return ntohs(inner.ipv4.sin_port);
case AF_INET6:
return ntohs(inner.ipv6.sin6_port);
default:
assert(0==1);
}
return -1;
}

inline void set_port(int port)
{
u32_t type=get_type();
switch(type)
{
case AF_INET:
inner.ipv4.sin_port=htons(port);
break;
case AF_INET6:
inner.ipv6.sin6_port=htons(port);
break;
default:
assert(0==1);
}
return ;
}

bool operator == (const address_t &b) const
{
//return this->data==b.data;
return memcmp(&this->inner,&b.inner,sizeof(this->inner))==0;
}

int new_connected_udp_fd();

char* get_ip();
};

namespace std {
template <>
struct hash<address_t>
{
std::size_t operator()(const address_t& key) const
{

//return address_t::hash_function(k);
return sdbm((unsigned char*)&key.inner,sizeof(key.inner));
}
};
}

struct fd64_addr_t
{
fd64_t fd64;
address_t addr;
};
struct fd_addr_t
{
int fd;
address_t addr;
};
union inner_t
{
fd64_t fd64;
int fd;
fd64_ip_port_t fd64_ip_port;
fd_ip_port_t fd_ip_port;
fd64_addr_t fd64_addr;
fd_addr_t fd_addr;
};
struct dest_t
{
Expand All @@ -207,18 +373,10 @@ struct dest_t

struct fd_info_t
{
ip_port_t ip_port;
address_t addr;
ev_io io_watcher;
};

struct pseudo_header {
u32_t source_address;
u32_t dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
};

u64_t get_current_time();
u64_t get_current_time_rough();
u64_t get_current_time_us();
Expand Down Expand Up @@ -249,7 +407,7 @@ u64_t hton64(u64_t a);
bool larger_than_u16(uint16_t a,uint16_t b);
bool larger_than_u32(u32_t a,u32_t b);
void setnonblocking(int sock);
int set_buf_size(int fd,int socket_buf_size,int force_socket_buf=0);
int set_buf_size(int fd,int socket_buf_size);

unsigned short csum(const unsigned short *ptr,int nbytes);
unsigned short tcp_csum(const pseudo_header & ph,const unsigned short *ptr,int nbytes);
Expand Down Expand Up @@ -279,4 +437,7 @@ int new_listen_socket(int &fd,u32_t ip,int port);

int new_connected_socket(int &fd,u32_t ip,int port);

int new_listen_socket2(int &fd,address_t &addr);
int new_connected_socket2(int &fd,address_t &addr);

#endif /* COMMON_H_ */
3 changes: 2 additions & 1 deletion connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ struct conn_info_t //stores info for a raw connection.for client ,there is o
int remote_fd; //only used for client
fd64_t remote_fd64;//only used for client

ip_port_t ip_port;//only used for server
//ip_port_t ip_port;
address_t addr;//only used for server

conn_info_t()
{
Expand Down
6 changes: 3 additions & 3 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,9 @@ int main(int argc, char *argv[])
process_arg(argc,argv);

delay_manager.set_capacity(delay_capacity);
local_ip_uint32=inet_addr(local_ip);
remote_ip_uint32=inet_addr(remote_ip);
sub_net_uint32=inet_addr(sub_net);
//local_ip_uint32=inet_addr(local_ip);
//remote_ip_uint32=inet_addr(remote_ip);
sub_net_uint32=inet_addr(sub_net);// used only in tinyfecVPN

if(strlen(tun_dev)==0)
{
Expand Down
34 changes: 6 additions & 28 deletions misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ int output_interval_max=0*1000;

int fix_latency=0;

u32_t local_ip_uint32,remote_ip_uint32=0;
char local_ip[100], remote_ip[100];
int local_port = -1, remote_port = -1;
address_t local_addr,remote_addr;
//u32_t local_ip_uint32,remote_ip_uint32=0;
//char local_ip[100], remote_ip[100];
//int local_port = -1, remote_port = -1;

conn_manager_t conn_manager;
delay_manager_t delay_manager;
Expand Down Expand Up @@ -773,34 +774,11 @@ void process_arg(int argc, char *argv[])
break;
case 'l':
no_l = 0;
if (strchr(optarg, ':') != 0)
{
sscanf(optarg, "%[^:]:%d", local_ip, &local_port);
}
else
{
mylog(log_fatal,"-l ip:port\n");
myexit(1);
strcpy(local_ip, "127.0.0.1");
sscanf(optarg, "%d", &local_port);
}
local_addr.from_str(optarg);
break;
case 'r':
no_r = 0;
if (strchr(optarg, ':') != 0)
{
//printf("in :\n");
//printf("%s\n",optarg);
sscanf(optarg, "%[^:]:%d", remote_ip, &remote_port);
//printf("%d\n",remote_port);
}
else
{
mylog(log_fatal," -r ip:port\n");
myexit(1);
strcpy(remote_ip, "127.0.0.1");
sscanf(optarg, "%d", &remote_port);
}
remote_addr.from_str(optarg);
break;
case 'h':
break;
Expand Down
8 changes: 5 additions & 3 deletions misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,11 @@ extern int output_interval_max;

extern int fix_latency;

extern u32_t local_ip_uint32,remote_ip_uint32;
extern char local_ip[100], remote_ip[100];
extern int local_port, remote_port;
//extern u32_t local_ip_uint32,remote_ip_uint32;
//extern char local_ip[100], remote_ip[100];
//extern int local_port, remote_port;

extern address_t local_addr,remote_addr;

extern conn_manager_t conn_manager;
extern delay_manager_t delay_manager;
Expand Down
19 changes: 14 additions & 5 deletions packet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ int de_obscure_old(const char * input, int in_len,char *output,int &out_len)
return 0;
}


/*
int sendto_fd_ip_port (int fd,u32_t ip,int port,char * buf, int len,int flags)
{
Expand All @@ -161,6 +161,15 @@ int sendto_fd_ip_port (int fd,u32_t ip,int port,char * buf, int len,int flags)
len , 0,
(struct sockaddr *) &tmp_sockaddr,
sizeof(tmp_sockaddr));
}*/

int sendto_fd_addr (int fd,address_t addr,char * buf, int len,int flags)
{

return sendto(fd, buf,
len , 0,
(struct sockaddr *) &addr.inner,
addr.get_len());
}
/*
int sendto_ip_port (u32_t ip,int port,char * buf, int len,int flags)
Expand All @@ -181,17 +190,17 @@ int my_send(const dest_t &dest,char *data,int len)
}
switch(dest.type)
{
case type_fd_ip_port:
case type_fd_addr:
{
return sendto_fd_ip_port(dest.inner.fd,dest.inner.fd_ip_port.ip_port.ip,dest.inner.fd_ip_port.ip_port.port,data,len,0);
return sendto_fd_addr(dest.inner.fd,dest.inner.fd_addr.addr,data,len,0);
break;
}
case type_fd64_ip_port:
case type_fd64_addr:
{
if(!fd_manager.exist(dest.inner.fd64)) return -1;
int fd=fd_manager.to_fd(dest.inner.fd64);

return sendto_fd_ip_port(fd,dest.inner.fd64_ip_port.ip_port.ip,dest.inner.fd64_ip_port.ip_port.port,data,len,0);
return sendto_fd_addr(fd,dest.inner.fd64_addr.addr,data,len,0);
break;
}
case type_fd:
Expand Down
Loading

0 comments on commit 9c1a8c8

Please sign in to comment.