1 #include <VP_Os/vp_os_malloc.h>
4 #include <ardrone_tool/Com/config_com.h>
6 #include <VP_Com/vp_com_socket.h>
7 #include <VP_Com/vp_com.h>
10 #include <sys/types.h>
15 #define BUFFER_SIZE 1024
16 #define AUTH_MAX_NUMRETRIES 3
17 #define AUTH_MSG "PARROT AUTH"
18 #define AUTH_MSG_OK "PARROT AUTH OK"
20 vp_com_t* wifi_com(void)
22 static vp_com_t com = {
28 #else // ! USE_MINGW32
29 PTHREAD_MUTEX_INITIALIZER,
30 #endif // ! USE_MINGW32
50 C_RESULT wifi_server_auth(struct in_addr *addr)
54 C_RESULT result = C_FAIL;
56 int8_t recvString[BUFFER_SIZE]; /* Buffer for received string */
57 int recvStringLen; /* Length of received string */
58 struct timeval tv = {0, 500000};
60 const int8_t msg[] = AUTH_MSG;
64 vp_com_socket_t socket;
66 // Initialize sending socket
67 to.s_addr = htonl(WIFI_BROADCAST_ADDR);
68 COM_CONFIG_SOCKET_AUTH(&socket, VP_COM_CLIENT, AUTH_PORT, inet_ntoa(to));
69 socket.protocol = VP_COM_UDP;
71 if(VP_FAILED(vp_com_init(COM_AUTH())))
73 printf("Failed to init Authentification\n");
74 vp_com_shutdown( COM_AUTH() );
78 if(VP_FAILED(vp_com_open(COM_AUTH(), &socket, &read, &write)))
80 printf("Failed to open Authentification\n");
81 vp_com_shutdown( COM_AUTH() );
85 if (setsockopt((int)socket.priv, SOL_SOCKET, SO_BROADCAST,(char *)&on,sizeof(on)) < 0)
87 printf("Failed to set socket option Authentification\n");
88 vp_com_close(COM_AUTH(), &socket);
89 vp_com_shutdown( COM_AUTH() );
93 if (setsockopt((int)socket.priv, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
95 printf("Failed to set socket option Authentification\n");
96 vp_com_close(COM_AUTH(), &socket);
97 vp_com_shutdown( COM_AUTH() );
103 int len = strlen((char*)msg);
106 if (VP_FAILED(write(&socket, msg, &len)))
108 vp_com_close(COM_AUTH(), &socket);
109 vp_com_shutdown( COM_AUTH() );
114 printf("Wait authentification\n");
119 recvStringLen = BUFFER_SIZE;
120 if(VP_FAILED(read(&socket, recvString, &recvStringLen)))
122 vp_com_close(COM_AUTH(), &socket);
123 vp_com_shutdown( COM_AUTH());
128 recvString[recvStringLen] = '\0';
130 while((recvStringLen != 0) && (strcmp((char *)recvString, AUTH_MSG) == 0));
132 while((strcmp((char *)recvString, AUTH_MSG_OK) != 0) && (numretries++ < AUTH_MAX_NUMRETRIES));
134 if(strcmp((char*)recvString, AUTH_MSG_OK) == 0)
136 from.s_addr = socket.scn;
137 printf("Authentification ok from %s:%d\n", inet_ntoa(from), socket.port);
138 memcpy(addr, &from, sizeof(struct in_addr));
142 vp_com_close(COM_AUTH(), &socket);
143 vp_com_shutdown( COM_AUTH() );
148 vp_com_config_t* wifi_config(void)
150 static vp_com_wifi_config_t config =
164 struct ifaddrs * ifAddrStructHead = NULL;
165 struct ifaddrs * ifAddrStruct = NULL;
166 struct in_addr tmpAddr;
167 bool_t found = FALSE;
169 if(strlen(config.itfName) == 0)
171 getifaddrs(&ifAddrStruct);
172 ifAddrStructHead = ifAddrStruct;
174 while (!found && (ifAddrStruct != NULL))
176 // Looking for WIFI interface's IP address corresponding to WIFI_BASE_ADDR
177 if (ifAddrStruct->ifa_addr->sa_family == AF_INET)
179 tmpAddr = ((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
180 if ( (ntohl(tmpAddr.s_addr) & 0xFFFFFF00) == WIFI_BASE_ADDR )
182 inet_ntop(AF_INET, &tmpAddr, config.localHost, VP_COM_NAME_MAXSIZE);
183 memcpy(config.itfName, ifAddrStruct->ifa_name, strlen(ifAddrStruct->ifa_name));
184 if(VP_FAILED(wifi_server_auth(&tmpAddr)))
185 tmpAddr.s_addr = htonl ( ntohl(tmpAddr.s_addr) - ( ( ( ntohl(tmpAddr.s_addr) & 0xFF ) - 1 ) % 5 ) );
186 memcpy(config.server, inet_ntoa(tmpAddr), strlen(inet_ntoa(tmpAddr)));
187 tmpAddr = ((struct sockaddr_in *)ifAddrStruct->ifa_netmask)->sin_addr;
188 inet_ntop(AF_INET, &tmpAddr, config.netmask, VP_COM_NAME_MAXSIZE);
189 tmpAddr = ((struct sockaddr_in *)ifAddrStruct->ifa_broadaddr)->sin_addr;
190 inet_ntop(AF_INET, &tmpAddr, config.broadcast, VP_COM_NAME_MAXSIZE);
194 ifAddrStruct = ifAddrStruct->ifa_next;
197 if (ifAddrStructHead != NULL)
199 freeifaddrs(ifAddrStructHead);
203 return (vp_com_config_t*)&config;
206 vp_com_connection_t* wifi_connection(void)
208 static vp_com_wifi_connection_t connection = {
213 return (vp_com_connection_t*) &connection;
216 void wifi_config_socket(vp_com_socket_t* socket, VP_COM_SOCKET_TYPE type, int32_t port, const char* serverhost)
218 vp_os_memset(socket, 0, sizeof(vp_com_socket_t));
221 socket->protocol = VP_COM_TCP;
224 if(serverhost && socket->type == VP_COM_CLIENT)
225 strcpy(socket->serverHost, serverhost);