瀏覽代碼

Add collision test

Mészáros Mihály 8 年之前
父節點
當前提交
43cfc4fe70
共有 1 個文件被更改,包括 75 次插入39 次删除
  1. 75 39
      src/apps/natdiscovery/natdiscovery.c

+ 75 - 39
src/apps/natdiscovery/natdiscovery.c

@@ -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);