Add collision test

This commit is contained in:
Mészáros Mihály 2017-09-22 14:56:56 +02:00
parent 6aa8b7685b
commit 43cfc4fe70

View File

@ -46,24 +46,23 @@
////////////////////////////////////////////////////
static int udp_fd = -1;
static ioa_addr real_local_addr;
static int counter = 0;
#ifdef __cplusplus
static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_addr *other_addr, int *port, int *rfc5780, int response_port, int change_ip, int change_port, int padding)
static int run_stunclient(ioa_addr *local_addr, ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_addr *other_addr, int *port, int *rfc5780, int response_port, int change_ip, int change_port, int padding)
{
int ret=0;
if (response_port >= 0) {
addr_set_port(&real_local_addr, response_port);
addr_set_port(local_addr, response_port);
}
udp_fd = socket(remote_addr->ss.sa_family, SOCK_DGRAM, 0);
if (udp_fd < 0)
err(-1, NULL);
if (!addr_any(&real_local_addr)) {
if (addr_bind(udp_fd, &real_local_addr,0,1,UDP_SOCKET) < 0)
if (!addr_any(local_addr)) {
if (addr_bind(udp_fd, local_addr,0,1,UDP_SOCKET) < 0)
err(-1, NULL);
}
@ -137,10 +136,10 @@ static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_a
}
if (addr_get_from_sock(udp_fd, &real_local_addr) < 0) {
if (addr_get_from_sock(udp_fd, local_addr) < 0) {
printf("%s: Cannot get address from local socket\n", __FUNCTION__);
} else {
*port = addr_get_port(&real_local_addr);
*port = addr_get_port(local_addr);
}
{
@ -201,7 +200,7 @@ static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_a
addr_debug_print(1, other_addr, "Other addr: ");
}
addr_debug_print(1, reflexive_addr, "UDP reflexive addr");
addr_debug_print(1, local_addr, "Local addr: ");
} else {
printf("Cannot read the response\n");
}
@ -233,7 +232,7 @@ static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_a
#else
static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_addr *other_addr, int *port, int *rfc5780, int response_port, int change_ip, int change_port, int padding)
static int run_stunclient(ioa_addr *local_addr, ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_addr *other_addr, int *port, int *rfc5780, int response_port, int change_ip, int change_port, int padding)
{
int ret=0;
stun_buffer buf;
@ -242,11 +241,11 @@ static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_a
if (udp_fd < 0)
err(-1, NULL);
if (!addr_any(&real_local_addr)) {
if (!addr_any(local_addr)) {
if (response_port >= 0) {
addr_set_port(&real_local_addr, response_port);
addr_set_port(local_addr, response_port);
}
if (addr_bind(udp_fd, &real_local_addr,0,1,UDP_SOCKET) < 0) {
if (addr_bind(udp_fd, local_addr,0,1,UDP_SOCKET) < 0) {
err(-1, NULL);
}
}
@ -279,10 +278,10 @@ static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_a
}
if (addr_get_from_sock(udp_fd, &real_local_addr) < 0) {
if (addr_get_from_sock(udp_fd, local_addr) < 0) {
printf("%s: Cannot get address from local socket\n", __FUNCTION__);
} else {
*port = addr_get_port(&real_local_addr);
*port = addr_get_port(local_addr);
}
@ -337,7 +336,7 @@ static int run_stunclient(ioa_addr *remote_addr, ioa_addr *reflexive_addr, ioa_a
addr_debug_print(1, other_addr, "Other addr: ");
}
addr_debug_print(1, reflexive_addr, "UDP reflexive addr");
addr_debug_print(1, local_addr, "Local addr: ");
} else {
printf("Cannot read the response\n");
}
@ -380,17 +379,21 @@ static char Usage[] =
"Options:\n"
" -m NAT mapping behavior discovery\n"
" -f NAT filtering behavior discovery\n"
" -c NAT collision behavior discovery\n"
" Requires an alternative IP address (-A)\n"
" -p STUN server port (Default: 3478)\n"
" -L Local address to use (optional)\n";
" -L Local address to use (optional)\n"
" -A Local alrernative address to use\n"
" Used by collision behavior Discovery\n";
//////////////////////////////////////////////////
static void init(ioa_addr *real_local_addr,ioa_addr *remote_addr,int *local_port,int port, int *rfc5780, char* local_addr, char* remote_param)
static void init(ioa_addr *local_addr,ioa_addr *remote_addr,int *local_port,int port, int *rfc5780, char* local_addr_string, char* remote_param)
{
addr_set_any(real_local_addr);
addr_set_any(local_addr);
if(local_addr[0]) {
if(make_ioa_addr((const u08bits*)local_addr, 0, real_local_addr)<0) {
if(local_addr_string[0]) {
if(make_ioa_addr((const u08bits*)local_addr_string, 0, local_addr)<0) {
err(-1,NULL);
}
}
@ -411,24 +414,27 @@ static void discoveryresult(const char *decision){
int main(int argc, char **argv)
{
int port = DEFAULT_STUN_PORT;
char local_addr[256]="\0";
char local_addr_string[256]="\0";
char local2_addr_string[256]="\0";
int c=0;
int mapping = 0;
int filtering = 0;
int collision = 0;
int local_port, rfc5780;
ioa_addr other_addr, reflexive_addr, tmp_addr, remote_addr;
ioa_addr other_addr, reflexive_addr, tmp_addr, remote_addr, local_addr, local2_addr;
set_logfile("stdout");
set_system_parameters(0);
ns_bzero(local_addr, sizeof(local_addr));
ns_bzero(local_addr_string, sizeof(local_addr_string));
ns_bzero(local2_addr_string, sizeof(local2_addr_string));
addr_set_any(&remote_addr);
addr_set_any(&other_addr);
addr_set_any(&reflexive_addr);
addr_set_any(&tmp_addr);
while ((c = getopt(argc, argv, "mfp:L:")) != -1) {
while ((c = getopt(argc, argv, "mfcp:L:A:")) != -1) {
switch(c) {
case 'm':
mapping=1;
@ -436,11 +442,17 @@ int main(int argc, char **argv)
case 'f':
filtering=1;
break;
case 'c':
collision=1;
break;
case 'p':
port = atoi(optarg);
break;
case 'L':
STRCPY(local_addr, optarg);
STRCPY(local_addr_string, optarg);
break;
case 'A':
STRCPY(local2_addr_string, optarg);
break;
default:
fprintf(stderr,"%s\n", Usage);
@ -452,12 +464,18 @@ int main(int argc, char **argv)
fprintf(stderr, "%s\n", Usage);
exit(-1);
}
if(collision && local2_addr_string == '\0'){
fprintf(stderr, "Use \"-A\" to add an Alternative local IP address.\n");
fprintf(stderr, "It is mandatory with \"-c\" collision behavior detection..\n");
exit(-1);
}
init(&real_local_addr, &remote_addr, &local_port, port, &rfc5780, local_addr, argv[optind]);
init(&local_addr, &remote_addr, &local_port, port, &rfc5780, local_addr_string, argv[optind]);
if (mapping) {
run_stunclient(&remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
if (addr_eq(&real_local_addr,&reflexive_addr)){
if(mapping) {
run_stunclient(&local_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
if (addr_eq(&local_addr,&reflexive_addr)){
discoveryresult("No NAT! (Endpoint Independent Mapping)");
}
if(rfc5780) {
@ -467,14 +485,14 @@ int main(int argc, char **argv)
addr_cpy(&remote_addr, &other_addr);
addr_set_port(&remote_addr, port);
run_stunclient(&remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
run_stunclient(&local_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
if(addr_eq(&tmp_addr,&reflexive_addr)){
discoveryresult("NAT with Enpoint Independent Mapping!");
} else {
addr_cpy(&tmp_addr, &reflexive_addr);
addr_cpy(&remote_addr, &other_addr);
run_stunclient(&remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
run_stunclient(&local_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
if(addr_eq(&tmp_addr,&reflexive_addr)){
discoveryresult("NAT with Address Dependent Mapping!");
} else {
@ -486,22 +504,22 @@ int main(int argc, char **argv)
}
}
init(&real_local_addr, &remote_addr, &local_port, port, &rfc5780, local_addr, argv[optind]);
init(&local_addr, &remote_addr, &local_port, port, &rfc5780, local_addr_string, argv[optind]);
if (filtering) {
run_stunclient(&remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
if (addr_eq(&real_local_addr,&reflexive_addr)){
if(filtering) {
run_stunclient(&local_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
if(addr_eq(&local_addr, &reflexive_addr)){
discoveryresult("No NAT! (Endpoint Independent Mapping)");
}
if(rfc5780) {
if(!addr_any(&other_addr)){
int res=0;
res=run_stunclient(&remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,1,1,0);
res=run_stunclient(&local_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,1,1,0);
if (!res) {
discoveryresult("NAT with Enpoint Independent Filtering!");
} else {
res=0;
res=run_stunclient(&remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,1,0);
res=run_stunclient(&local_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,1,0);
if(!res){
discoveryresult("NAT with Address Dependent Filtering!");
} else {
@ -512,8 +530,26 @@ int main(int argc, char **argv)
}
}
}
if (!filtering && !mapping) {
printf("Please use either -f or -m parameter for Filtering or Mapping behavior discovery.\n");
init(&local_addr, &remote_addr, &local_port, port, &rfc5780, local_addr_string, argv[optind]);
if(collision) {
addr_set_any(&local2_addr);
if(local2_addr_string[0]) {
if(make_ioa_addr((const u08bits*)local2_addr_string, 0, &local2_addr)<0) {
err(-1,NULL);
}
}
run_stunclient(&local_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
addr_set_port(&local2_addr,addr_get_port(&local_addr));
run_stunclient(&local2_addr, &remote_addr, &reflexive_addr, &other_addr, &local_port, &rfc5780,-1,0,0,0);
}
if (!filtering && !mapping && !collision) {
printf("Please use either -f or -c or -m parameter for Filtering or Mapping behavior discovery.\n");
}
socket_closesocket(udp_fd);