[Verse-cvs] [verse] SVN commit:[4526] Removed ip and port from VNetworkAddress ( too much dependent on IPv4).

Jiri Hnidek jiri.hnidek at tul.cz
Tue Jul 15 10:55:49 CEST 2008


Revision: 4526
          https://svn.blender.org//revision/?rev=4526&view=rev
Author:   jiri
Date:     2008-07-15 10:55:40 +0200 (Tue, 15 Jul 2008)

Log Message:
-----------
Removed ip and port from VNetworkAddress (too much dependent on IPv4). I added sockaddr_in and sockaddr_in6 to this structure. Verse still works only with IPv4. Changes tested only on Linux.

Modified Paths:
--------------
    branches/verse-pam-branch/SConstruct
    branches/verse-pam-branch/v_connect.c
    branches/verse-pam-branch/v_connection.c
    branches/verse-pam-branch/v_connection.h
    branches/verse-pam-branch/v_network.c
    branches/verse-pam-branch/v_network.h

Modified: branches/verse-pam-branch/SConstruct
===================================================================
--- branches/verse-pam-branch/SConstruct	2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/SConstruct	2008-07-15 08:55:40 UTC (rev 4526)
@@ -40,6 +40,7 @@
     platform_libs = ['ws2_32']
 elif sys.platform == 'linux2':
     print "Building on linux2"
+    debug_flags = ['-ggdb']
     platform_libs = ['pam']
 elif sys.platform == 'openbsd3':
     print "Building on openbsd3"

Modified: branches/verse-pam-branch/v_connect.c
===================================================================
--- branches/verse-pam-branch/v_connect.c	2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_connect.c	2008-07-15 08:55:40 UTC (rev 4526)
@@ -121,7 +121,7 @@
 #if defined(V_PRINT_SEND_COMMANDS)
 		char ip_string[32];
 #endif
-		session = v_con_connect(a.ip, a.port, V_CS_CONTACT);
+		session = v_con_connect(&a, V_CS_CONTACT);
 #if defined(V_PRINT_SEND_COMMANDS)
 		v_n_get_address_string(&a, ip_string);
 		printf("send: %p = verse_send_connect(name = %s, pass = %s, address = %s (%s), expected_key = %p)\n", session, name, pass, address, ip_string, expected_key);
@@ -340,7 +340,7 @@
 
 	if(!v_n_set_network_address(&a, address))
 		return NULL;
-	if(v_co_switch_connection(a.ip, a.port))
+	if(v_co_switch_connection(&a))
 	{
 		if(v_con_get_connect_stage() != V_CS_PENDING_DECISION)
 			return NULL;
@@ -378,13 +378,15 @@
 		v_send_hidden_connect_terminate(v_con_get_network_address(), v_noq_get_next_out_packet_id(v_con_get_network_queue()), bye);
 	else if(!v_n_set_network_address(&a, address))
 		return;
-	else if(v_co_switch_connection(a.ip, a.port))
+	else if(v_co_switch_connection(&a))
 		v_send_hidden_connect_terminate(v_con_get_network_address(), v_noq_get_next_out_packet_id(v_con_get_network_queue()), bye);
 
 	if(v_con_get_connect_stage() != V_CS_PENDING_DECISION)
 		verse_session_destroy(v_con_get_network_queue());
 }
 
+/* Evil PING stuff */
+
 void verse_send_ping(const char *address, const char *message)
 {
 	VNetworkAddress a;
@@ -425,15 +427,14 @@
 }
 
 typedef struct {
-	uint32	ip;
-	uint16	port;
 	char	message[1400];
 	void	*next;
+	VNetworkAddress address;
 } VPingCommand;
 
 static VPingCommand *v_ping_commands = NULL;
 
-boolean v_connect_unpack_ping(const char *buf, size_t buffer_length, uint32 ip, uint16 port)
+boolean v_connect_unpack_ping(const char *buf, size_t buffer_length, VNetworkAddress *address)
 {
 	if(buffer_length > 5)
 	{
@@ -450,8 +451,7 @@
 				VPingCommand *pc;
 
 				pc = malloc(sizeof *pc);
-				pc->ip = ip;
-				pc->port = port;
+				memcpy(&pc->address, address, sizeof(VNetworkAddress));
 				vnp_raw_unpack_string(&buf[buffer_pos], pc->message,
 						      sizeof pc->message, buffer_length - buffer_pos);
 				pc->next = v_ping_commands;
@@ -467,16 +467,13 @@
 {
 	VPingCommand *cp;
 	void (* func_ping)(void *user_data, const char *address, const char *text);
-	VNetworkAddress a;
 	char address[64];
 	func_ping = v_fs_get_user_func(5);
 
 	while(v_ping_commands != NULL)
 	{
 		cp = v_ping_commands->next;
-		a.ip = v_ping_commands->ip;
-		a.port = v_ping_commands->port;
-		v_n_get_address_string(&a, address);	
+		v_n_get_address_string(&v_ping_commands->address, address);
 #if defined V_PRINT_RECEIVE_COMMANDS
 		printf("receive: verse_send_ping(address = %s message = %s ); callback = %p\n", address, v_ping_commands->message, v_fs_get_user_func(5));
 #endif

Modified: branches/verse-pam-branch/v_connection.c
===================================================================
--- branches/verse-pam-branch/v_connection.c	2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_connection.c	2008-07-15 08:55:40 UTC (rev 4526)
@@ -94,7 +94,7 @@
 extern void *v_create_ordered_storage(void);
 extern void v_destroy_ordered_storage(void *data);
 
-void *v_con_connect(uint32 ip, uint16 port, VConnectStage stage) /* creates a new connection slot */
+void *v_con_connect(VNetworkAddress *address, VConnectStage stage) /* creates a new connection slot */
 {
 	v_con_init(); /* init connections, if not done yet */
 	if((VConData.con_count - 1) % CONNECTION_CHUNK_SIZE == 0) /* do we need more slots for connections, then reallocate more space */
@@ -102,8 +102,7 @@
 	VConData.con[VConData.con_count].out_queue = v_noq_create_network_queue(); /* create a out queue fo all out going commands */
 	v_niq_clear(&VConData.con[VConData.con_count].in_queue); /* clear and init the que of incomming packets.*/
 	VConData.con[VConData.con_count].connected = FALSE; /* not yet propperly connected and should not accept commands yet */
-	VConData.con[VConData.con_count].network_address.ip = ip; /* ip address of other side */
-	VConData.con[VConData.con_count].network_address.port = port; /* port used by other side */
+	memcpy((char*)&VConData.con[VConData.con_count].network_address, (char*)address, sizeof(*address)); /* address and port of other side*/
 	VConData.con[VConData.con_count].avatar = 0; /* no avatar set yet*/
 /*	VConData.con[VConData.con_count].packet_id = 2;*/
 	VConData.con[VConData.con_count].destroy_flag = FALSE; /* this is a flag that is set once the connection is about to be destroyed.*/
@@ -145,15 +144,15 @@
 	return NULL;
 }
 
-uint32 v_co_find_connection(uint32 ip, uint16 port) /* if a packet comes form a ip address what connection does it belong to? */
+uint32 v_co_find_connection(VNetworkAddress *address) /* if a packet comes from a ip address what connection does it belong to? */
 {
 	unsigned int i;
 
 	for(i = 0; i < VConData.con_count; i++)
 	{
-		if(ip == VConData.con[i].network_address.ip &&
-		   port == VConData.con[i].network_address.port &&
-		   VConData.con[i].destroy_flag == 0)
+		if(address->addr4.sin_addr.s_addr == VConData.con[i].network_address.addr4.sin_addr.s_addr &&
+						address->addr4.sin_port == VConData.con[i].network_address.addr4.sin_port &&
+						VConData.con[i].destroy_flag == 0)
 		{
 			return i;
 		}
@@ -161,12 +160,13 @@
 	return -1;
 }
 
-boolean v_co_switch_connection(uint32 ip, uint16 port) /* switches to the current connection to one ip address if it exists */
+boolean v_co_switch_connection(VNetworkAddress *address) /* switches to the current connection to one ip address if it exists */
 {
 	unsigned int i;
 	for(i = 0; i < VConData.con_count; i++)
 	{
-		if(ip == VConData.con[i].network_address.ip && port == VConData.con[i].network_address.port)
+		if(address->addr4.sin_addr.s_addr == VConData.con[i].network_address.addr4.sin_addr.s_addr &&
+						address->addr4.sin_port == VConData.con[i].network_address.addr4.sin_port)
 		{
 			VConData.current_connection = i;
 			return TRUE;
@@ -192,7 +192,7 @@
 
 extern void	verse_send_packet_nak(uint32 packet_id);
 extern void	v_callback_connect_terminate(const char *bye);
-extern boolean	v_connect_unpack_ping(const char *buf, size_t buffer_length, uint32 ip, uint16 port);
+extern boolean	v_connect_unpack_ping(const char *buf, size_t buffer_length, VNetworkAddress *address);
 extern void	v_ping_update(void);
 void v_fs_unpack_beginning(uint8 *data, unsigned int length);
 
@@ -211,7 +211,7 @@
 	size = v_n_receive_data(&address, buf, sizeof buf); /* Ask for incoming data from the network. */
 	while(size != -1 && size != 0) /* Did we get any data? */
 	{
-		VConData.current_connection = v_co_find_connection(address.ip, address.port); /* Is there a connection matching the IP and port? */
+		VConData.current_connection = v_co_find_connection(&address); /* Is there a connection matching the IP and port? */
 		vnp_raw_unpack_uint32(buf, &packet_id); /* Unpack the ID of the packet. */
 /*		printf("got packet ID %u, %d bytes, connection %u\n", packet_id, size, VConData.current_connection);*/
 		if(VConData.current_connection < VConData.con_count &&
@@ -233,7 +233,7 @@
 				v_niq_timer_update(&VConData.con[VConData.current_connection].in_queue);
 			}
 		}
-		else if(v_connect_unpack_ping(buf, size, address.ip, address.port))	/* Ping handled. */
+		else if(v_connect_unpack_ping(buf, size, &address))	/* Ping handled. */
 			;
 		else if(v_fs_func_accept_connections()) /* Do we accept connection-attempts? */
 		{
@@ -242,10 +242,10 @@
 			{
 				if(VConData.current_connection < VConData.con_count)
 				{
-					VConData.con[VConData.current_connection].network_address.ip = 0;
+					VConData.con[VConData.current_connection].network_address.addr4.sin_addr.s_addr = 0;
 					VConData.con[VConData.current_connection].destroy_flag = TRUE; /* Destroy old connection if there is one. */
 				}
-				v_con_connect(address.ip, address.port, V_CS_IDLE); /* Create a new connection. */
+				v_con_connect(&address, V_CS_IDLE); /* Create a new connection. */
 				v_unpack_connection(buf, size); /* Unpack the connection-attempt. */
 			}
 		}

Modified: branches/verse-pam-branch/v_connection.h
===================================================================
--- branches/verse-pam-branch/v_connection.h	2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_connection.h	2008-07-15 08:55:40 UTC (rev 4526)
@@ -53,10 +53,10 @@
 extern unsigned int *	v_con_get_network_expected_packet(void);
 extern void *			v_con_get_ordered_storage(void);
 extern void *			v_con_get_func_storage(void);
-extern void *			v_con_connect(uint32 ip, uint16 port, VConnectStage stage);
+extern void *			v_con_connect(VNetworkAddress *address, VConnectStage stage);
 extern unsigned int		v_con_get_network_address_count(void);
 
-extern boolean			v_co_switch_connection(uint32 ip, uint16 port);
+extern boolean			v_co_switch_connection(VNetworkAddress *address);
 
 extern void			v_con_inqueue_timer_update(void);
 

Modified: branches/verse-pam-branch/v_network.c
===================================================================
--- branches/verse-pam-branch/v_network.c	2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_network.c	2008-07-15 08:55:40 UTC (rev 4526)
@@ -122,9 +122,10 @@
 	struct hostent	*he;
 	char		*colon = NULL, *buf = NULL;
 	boolean		ok = FALSE;
+	unsigned short port;
 
 	v_n_socket_create();
-	address->port = VERSE_STD_CONNECT_TO_PORT;
+	port = VERSE_STD_CONNECT_TO_PORT;
 	/* If a port number is included, as indicated by a colon, we need to work a bit more. */
 	if((colon = strchr(host_name, ':')) != NULL)
 	{
@@ -140,8 +141,8 @@
 			host_name = buf;
 			if(sscanf(colon + 1, "%u", &tp) == 1)
 			{
-				address->port = (unsigned short) tp;
-				if(address->port != tp)	/* Protect against overflow. */
+				port = (unsigned short) tp;
+				if(port != tp)	/* Protect against overflow. */
 					host_name = NULL;
 			}
 			else
@@ -150,11 +151,19 @@
 		else
 			return FALSE;
 	}
-	if(host_name != NULL && (he = gethostbyname(host_name)) != NULL)
+	if(host_name != NULL)
 	{
-		memcpy(&address->ip, he->h_addr_list[0], he->h_length);
-		address->ip = ntohl(address->ip);
-		ok = TRUE;
+		if((he = gethostbyname2(host_name, AF_INET)) != NULL) {
+			printf("ipv4\n");
+			memset((char*)&address->addr4, 0, sizeof(struct sockaddr_in));
+			memcpy((char*)&address->addr4.sin_addr, he->h_addr_list[0], he->h_length);
+			address->addrtype = address->addr4.sin_family = he->h_addrtype;
+			address->addr4.sin_port = htons(port);
+			ok = TRUE;
+		}
+		else {
+			perror("gethostbyname2()");
+		}
 	}
 	if(buf != NULL)
 		free(buf);
@@ -170,11 +179,9 @@
 
 	if((sock = v_n_socket_create()) == -1 || length == 0)
 		return 0;
-	address_in.sin_family = AF_INET;     /* host byte order */
-	address_in.sin_port = htons(address->port); /* short, network byte order */
-	address_in.sin_addr.s_addr = htonl(address->ip);
-	memset(&address_in.sin_zero, 0, sizeof address_in.sin_zero);
-	ret = sendto(sock, data, length, 0, (struct sockaddr *) &address_in, sizeof(struct sockaddr_in));
+
+	ret = sendto(sock, data, length, 0, (struct sockaddr *) &address->addr4, sizeof(struct sockaddr_in));
+
 	if(ret < 0)
 		fprintf(stderr, "Socket sendto() of %u bytes failed, code %d (%s)\n", (unsigned int) length, errno, strerror(errno));
 	return ret;
@@ -218,10 +225,9 @@
 	address_in.sin_port = htons(my_port); 
 	address_in.sin_addr.s_addr = INADDR_ANY;
 	len = recvfrom(v_n_socket_create(), data, length, 0, (struct sockaddr *) &address_in, &from_length);
-	if(len > 0)
+	if(len > 0 && len!=-1)
 	{
-		address->ip   = ntohl(address_in.sin_addr.s_addr);
-		address->port = ntohs(address_in.sin_port);
+		memcpy((char*)&address->addr4, (char*)&address_in, sizeof(struct sockaddr_in));
 	}
 	return len;
 }
@@ -264,6 +270,8 @@
 
 void v_n_get_address_string(const VNetworkAddress *address, char *string)
 {
-	sprintf(string, "%u.%u.%u.%u:%u", address->ip >> 24, (address->ip >> 16) & 0xff,
-		(address->ip >> 8) & 0xff, address->ip & 0xff, address->port);
+	char str[32];
+	inet_ntop(AF_INET, &address->addr4.sin_addr, str, 32);
+	sprintf(string, "%s:%u", str, htons(address->addr4.sin_port));
 }
+

Modified: branches/verse-pam-branch/v_network.h
===================================================================
--- branches/verse-pam-branch/v_network.h	2008-07-08 11:41:15 UTC (rev 4525)
+++ branches/verse-pam-branch/v_network.h	2008-07-15 08:55:40 UTC (rev 4526)
@@ -5,11 +5,15 @@
 #if !defined V_NETWORK_H
 #define	V_NETWORK_H
 
+#include <netinet/in.h>
+
 #define VERSE_STD_CONNECT_PORT 4950
 
 typedef struct{
-	unsigned int ip;
-	unsigned short port;
+	/* IPv4 & IPv6 */
+	unsigned int addrtype;
+	struct sockaddr_in addr4;
+	struct sockaddr_in6 addr6;
 }VNetworkAddress;
 
 extern void		v_n_set_port(unsigned short port);





More information about the Verse-cvs mailing list