1 #include "multirat_conf.h"
2 #include "multirat_process.h"
3 #include "multirat_connection.h"
4 #include "multirat_libapi.h"
6 #include <vconf-keys.h>
8 int32 connection_interface_status(struct ifreq *ifr, char *name)
12 uint32 interfaces = 0;
14 struct ifreq ifreq[10];
16 sock = socket(AF_INET, SOCK_STREAM, 0);
19 TIZEN_LOGD("Error !!! while creating socket [%d] [%s]", errno, strerror(errno));
23 ifconf.ifc_buf = (char *) ifreq;
24 ifconf.ifc_len = sizeof ifreq;
26 if (ioctl(sock, SIOCGIFCONF, &ifconf) == -1)
28 TIZEN_LOGD("Error !!! while executing ioctl [%d] [%s]", errno, strerror(errno));
33 interfaces = ifconf.ifc_len / sizeof(ifreq[0]);
34 TIZEN_LOGD("Number of interfaces [%d]",interfaces);
36 for (i = 0; i < interfaces; i++)
38 TIZEN_D_LOGD("Name of Interface [%s]", ifreq[i].ifr_name);
39 if(!strncmp(ifreq[i].ifr_name, name, strlen(name)))
41 ioctl(sock, SIOCGIFFLAGS, &ifreq[i]);
42 if((ifreq[i].ifr_flags & IFF_UP) && (ifreq[i].ifr_flags & IFF_RUNNING))
44 memcpy(ifr,&(ifreq[i]),sizeof(struct ifreq));
54 int32 connection_is_ifaceup(uint32 ifaceidx, interfaceInfo *ifaceInfo,int iptype)
57 int8 *default_iname = DEFAULT_INTERFACE;
58 int8 *ifacename = NULL;
59 int8 ip[INET_ADDRSTRLEN] = {0};
60 struct sockaddr_in *address = NULL;
61 struct sockaddr_in6 *address_ip6 = NULL;
64 if (0 == strncasecmp(default_iname, LTE, strlen(LTE)))
67 * thread 0 should get interface LTE (1)
68 * and thread 1 should get interface WIFI(0)
70 ifaceidx = (ifaceidx + 1) % 2;
75 ifacename = LTE_IFACE_NAME;
79 ifacename = WIFI_IFACE_NAME;
82 memset(&ifreq,0,sizeof(struct ifreq));
83 status = connection_interface_status(&ifreq,ifacename);
92 address_ip6= (struct sockaddr_in6 *) &ifreq.ifr_addr;
93 if (!inet_ntop(AF_INET6, &address_ip6->sin6_addr, ip, sizeof(ip)))
95 TIZEN_LOGD("Error !!! while executing inet_ntop [%d] [%s]", errno, strerror(errno));
101 address = (struct sockaddr_in *) &ifreq.ifr_addr;
102 if (!inet_ntop(AF_INET, &address->sin_addr, ip, sizeof(ip)))
104 TIZEN_LOGD("Error !!! while executing inet_ntop [%d] [%s]", errno, strerror(errno));
109 memset(ifaceInfo[ifaceidx].ip, 0, INET_ADDRSTRLEN);
110 strcpy(ifaceInfo[ifaceidx].ip,ip);
115 int32 file_thread_connServer (int32 sockFd, struct sockaddr_in *remote_addr,struct sockaddr_in6 *remote_addr_ip6, uint32 timeout,
116 SmartBondingData *SBData)
120 int32 select_ret = 0;
121 uint32 connTimeOut = 0;
122 uint64 connect_start = 0;
123 int8 tmp_ip_addr[INET6_ADDRSTRLEN];
124 int32 connect_status = -1;
128 connTimeOut = MIN(timeout, 60);
135 //flags = fcntl(sockFd, F_GETFL, 0);
137 if(SBData->conn.ip_family)
139 SECURE_DB_INFO("destIPv6 address [%s]", inet_ntop(AF_INET6,&(remote_addr_ip6->sin6_addr),tmp_ip_addr,INET6_ADDRSTRLEN));
143 SECURE_DB_INFO("destIPv4 address [%s]", inet_ntoa(remote_addr->sin_addr));
146 if(-1 == fcntl(sockFd, F_SETFL, O_NONBLOCK))
148 TIZEN_LOGD("Error !!! connection FCNTL failed [%d] [%s]", errno, strerror(errno));
152 if(SBData->conn.ip_family)
154 connect_status = connect(sockFd, (struct sockaddr *)remote_addr_ip6, sizeof(struct sockaddr_in6));
158 connect_status = connect(sockFd, (struct sockaddr *)remote_addr, sizeof(struct sockaddr_in6));
160 if(connect_status == -1)
162 if(errno != EINPROGRESS)
164 TIZEN_LOGD("Error !!! connection failure [%d] [%d] [%s]", sockFd, errno, strerror(errno));
172 connect_start = get_time_in_sec();
173 while(((get_time_in_sec() - connect_start) < connTimeOut) && ((SBData->fStream->compRspRcvdFlag)) && ((SBData->status == MAIN_START) || (SBData->file_status == NO_REDIVISION)))
178 FD_SET(sockFd, &write_fds);
179 select_ret = select(sockFd + 1, NULL, &write_fds, NULL, &tv);
182 TIZEN_LOGD("Time out on select with socket [%d]",sockFd);
185 else if(select_ret == -1)
187 TIZEN_LOGD("Error !!! select failed [%d] [%s]", errno, strerror(errno));
190 else if(select_ret == 1)
193 socklen_t slen = sizeof (so_error);
194 if(getsockopt(sockFd, SOL_SOCKET, SO_ERROR, &so_error, &slen) == 0)
198 TIZEN_LOGD("Error !!! getsockopt failed, so_error is true [%d] [%s]", errno, strerror(errno));
207 TIZEN_LOGD("Error !!! getsockopt failed [%d] [%s]", errno, strerror(errno));
216 int32 get_connection_status(SmartBondingData *SBData)
221 int32 sockFd = SBData->socket_fd;
224 int32 select_ret = 0;
230 FD_SET(sockFd, &write_fds);
232 TIZEN_LOGD("SBData[%p] Check Connection Status ", SBData);
234 select_ret = select(sockFd + 1, NULL, &write_fds, NULL, &tv);
237 SBData->con_status = CONNECTION_WAIT;
238 TIZEN_LOGD("Time out on select with socket [%d] SBData[%p]",sockFd, SBData);
240 else if(select_ret == -1)
242 SBData->con_status = CONNECTION_FAIL;
243 TIZEN_LOGD("Error !!! select failed [%d] [%s] SBData[%p]", errno, strerror(errno), SBData);
245 else if(select_ret == 1)
248 socklen_t slen = sizeof (so_error);
249 if(getsockopt(sockFd, SOL_SOCKET, SO_ERROR, &so_error, &slen) == 0)
253 SBData->con_status = CONNECTION_FAIL;
254 TIZEN_LOGD("Error !!! getsockopt failed, so_error is true [%d] [%s] SBData[%p]", errno, strerror(errno), SBData);
258 SBData->con_status = CONNECTION_SUCCESS;
259 TIZEN_LOGD("Connection Success");
265 SBData->con_status = CONNECTION_FAIL;
266 TIZEN_LOGD("Error !!! getsockopt failed [%d] [%s] SBData[%p]", errno, strerror(errno), SBData);
272 int32 connServer (int32 sockFd, struct sockaddr_in *remote_addr,struct sockaddr_in6 *remote_addr_ip6, uint32 timeout,
273 SmartBondingData *SBData)
276 int32 select_ret = 0;
277 uint32 connTimeOut = 0;
278 uint64 connect_start = 0;
279 int8 tmp_ip_addr[INET_ADDRSTRLENG];
280 int32 connect_status = -1;
284 connTimeOut = MIN(timeout, 60);
291 if(SBData->conn.ip_family)
293 SECURE_DB_INFO("SBData[%p] destIPv6 address [%s] timeout [%d]", SBData, inet_ntop(AF_INET6,&(remote_addr_ip6->sin6_addr),tmp_ip_addr,INET6_ADDRSTRLEN), connTimeOut);
297 SECURE_DB_INFO("SBData[%p] destIPv4 address [%s] timeout [%d]", SBData, inet_ntoa(remote_addr->sin_addr), connTimeOut);
300 if(-1 == fcntl(sockFd, F_SETFL, O_NONBLOCK))
302 TIZEN_LOGD("SBData[%p] Error !!! connection FCNTL failed [%d] [%s]", SBData, errno, strerror(errno));
305 if(SBData->conn.ip_family)
307 connect_status = connect(sockFd, (struct sockaddr *)remote_addr_ip6, sizeof(struct sockaddr_in6));
311 connect_status = connect(sockFd, (struct sockaddr *)remote_addr, sizeof(struct sockaddr_in6));
313 if(connect_status == -1)
315 if(errno != EINPROGRESS)
317 SBData->con_status = CONNECTION_FAIL;
318 TIZEN_LOGD("SBData[%p] Error !!! connection failure [%d] [%d] [%s]", SBData, sockFd, errno, strerror(errno));
322 SBData->con_status = CONNECTION_FAIL;
326 connect_start = get_time_in_sec();
327 while(((get_time_in_sec() - connect_start) < connTimeOut) && (SBData->cancel != 1))
330 tv.tv_usec = 500000; /* half sec */
332 FD_SET(sockFd, &write_fds);
333 select_ret = select(sockFd + 1, NULL, &write_fds, NULL, &tv);
336 SBData->con_status = CONNECTION_WAIT;
337 TIZEN_LOGD("SBData[%p] Time out on select with socket [%d]",SBData, sockFd);
340 else if(select_ret == -1)
342 SBData->con_status = CONNECTION_FAIL;
343 TIZEN_LOGD("SBData[%p] Error !!! select failed [%d] [%s]", SBData, errno, strerror(errno));
346 else if(select_ret == 1)
349 socklen_t slen = sizeof (so_error);
350 if(getsockopt(sockFd, SOL_SOCKET, SO_ERROR, &so_error, &slen) == 0)
354 SBData->con_status = CONNECTION_FAIL;
355 TIZEN_LOGD("SBData[%p] Error !!! getsockopt failed, so_error is true [%d] [%s]",SBData, errno, strerror(errno));
359 struct sockaddr sockname;
360 unsigned int len = sizeof(sockname);
361 unsigned short port = 0;
362 memset(&sockname, 0, len);
363 if(getsockname(sockFd, &sockname, &len) != -1)
365 port = ntohs(((struct sockaddr_in*)(&sockname))->sin_port);
369 TIZEN_LOGD("SBData[%p] Error !!! getsockname failed [%d] [%s]",SBData, errno, strerror(errno));
371 SBData->con_status = CONNECTION_SUCCESS;
373 SECURE_DB_INFO("SBData[%p] Conection Success source_port=%hu",SBData, port);
379 SBData->con_status = CONNECTION_FAIL;
380 TIZEN_LOGD("SBData[%p] Error !!! getsockopt failed [%d] [%s]",SBData, errno, strerror(errno));
387 SBData->con_status = CONNECTION_SUCCESS;
391 void file_thread_connect_server(fileThread *fThread)
395 uint32 bindCount = 0;
397 struct sockaddr_in remote_addr;
398 struct sockaddr_in6 remote_addr_ip6;
400 connection *conn = fThread->conn ;
402 index = fThread->interface_index;
404 TIZEN_LOGD("Connect Server");
406 h = gethostbyname(conn->ifaceInfo[index].server_ip);
408 SECURE_DB_INFO("Server IP %s For %d interface", conn->ifaceInfo[index].server_ip, index);
410 // memset(&remote_addr, 0, sizeof(struct sockaddr_in));
414 memset(&remote_addr_ip6, 0, sizeof(struct sockaddr_in6));
415 remote_addr_ip6.sin6_family = h->h_addrtype;
416 memcpy((char *) &remote_addr_ip6.sin6_addr.s6_addr, h->h_addr_list[0], h->h_length);
417 remote_addr_ip6.sin6_port = htons(conn->ifaceInfo[index].server_port);
421 memset(&remote_addr, 0, sizeof(struct sockaddr_in));
422 remote_addr.sin_family = h->h_addrtype;
423 memcpy((char *) &remote_addr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
424 remote_addr.sin_port = htons(conn->ifaceInfo[index].server_port);
427 while (*fThread->compRspRcvdFlag)
431 TIZEN_LOGD("thread ID Tried Connect More Times File Thread");
436 socketId = conn_get_socket_bind(conn->ifaceInfo[index].ip,index,conn->ip_family);
445 TIZEN_LOGD("Socket ID [%d]",socketId);
447 if(-1 == file_thread_connServer(socketId, &remote_addr,&remote_addr_ip6, fThread->SBData->timeout, fThread->SBData))
449 CLOSE_SOCKET(socketId);
454 if (((*fThread->compRspRcvdFlag)== 0) && (socketId >= 0))
456 TIZEN_LOGD("socket compRspRcvdFlag 0 and socket thread id [%d]", socketId);
457 CLOSE_SOCKET(socketId);
460 fThread->socketId = socketId;
464 void connect_server(RangeRequestThread *rrthread)
468 uint32 bindCount = 0;
469 int8 *default_iname = DEFAULT_INTERFACE;
471 struct sockaddr_in remote_addr;
472 struct sockaddr_in6 remote_addr_ip6;
473 connection *conn = rrthread->conn ;
475 index = rrthread->threadId;
477 if (0 == strncasecmp(default_iname, LTE, strlen(LTE)))
479 index = (index +1) % 2;
482 h = gethostbyname(conn->ifaceInfo[index].server_ip);
484 SECURE_DB_INFO("Server IP [%s] For [%d] interface", conn->ifaceInfo[index].server_ip, index);
486 // memset(&remote_addr, 0, sizeof(struct sockaddr_in));
490 memset(&remote_addr_ip6, 0, sizeof(struct sockaddr_in6));
491 remote_addr_ip6.sin6_family = h->h_addrtype;
492 memcpy((char *) &remote_addr_ip6.sin6_addr.s6_addr, h->h_addr_list[0], h->h_length);
493 remote_addr_ip6.sin6_port = htons(conn->ifaceInfo[index].server_port);
497 memset(&remote_addr, 0, sizeof(struct sockaddr_in));
498 remote_addr.sin_family = h->h_addrtype;
499 memcpy((char *) &remote_addr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
500 remote_addr.sin_port = htons(conn->ifaceInfo[index].server_port);
503 while (*rrthread->compRspRcvdFlag)
507 TIZEN_LOGD("thread ID [%d] Tried Connect More Times",rrthread->threadId);
512 socketId = conn_get_socket_bind(conn->ifaceInfo[index].ip,index,conn->ip_family);
521 TIZEN_LOGD("Socket ID [%d]",socketId);
523 if(-1 == connServer(socketId, &remote_addr,&remote_addr_ip6,rrthread->SBData->timeout, rrthread->SBData))
525 CLOSE_SOCKET(socketId);
530 if (((*rrthread->compRspRcvdFlag)== 0) && (socketId >= 0))
532 TIZEN_LOGD("socket compRspRcvdFlag 0 and socket thread id [%d]", socketId);
533 CLOSE_SOCKET(socketId);
536 conn->sockId[rrthread->threadId] = socketId;
537 rrthread->socketId = socketId;
541 uint32 is_interface_up(int8* ifacename, interfaceInfo *ifaceinfo,int iptype)
544 int8 ip[INET_ADDRSTRLEN] = {0};
547 memset(&ifreq,0,sizeof(struct ifreq));
548 status = connection_interface_status(&ifreq, ifacename);
553 struct sockaddr_in6 *address_ip6 = (struct sockaddr_in6 *) &ifreq.ifr_addr;
554 if (!inet_ntop(AF_INET6, &address_ip6->sin6_addr, ip, sizeof(ip)))
556 TIZEN_LOGD("socket error");
562 struct sockaddr_in *address = (struct sockaddr_in *) &ifreq.ifr_addr;
563 if (!inet_ntop(AF_INET, &address->sin_addr, ip, sizeof(ip)))
565 TIZEN_LOGD("socket error");
571 if (!strncmp(ifacename, LTE_IFACE_NAME , strlen(ifacename)))
573 memset(ifaceinfo[LTE_INTERFACE].ip , 0 , INET_ADDRSTRLENG);
574 strcpy(ifaceinfo[LTE_INTERFACE].interface_name, ifreq.ifr_name);
575 strcpy(ifaceinfo[LTE_INTERFACE].ip,ip);
576 SECURE_DB_INFO("IP address of LTE [%s]",ip);
579 else if (!strncmp(ifacename, WIFI_IFACE_NAME , strlen(ifacename)))
581 int32 is_on = VCONFKEY_MOBILE_HOTSPOT_MODE_NONE;
582 memset(ifaceinfo[WIFI_INTERFACE].ip , 0 , INET_ADDRSTRLENG);
583 strcpy(ifaceinfo[WIFI_INTERFACE].interface_name, ifreq.ifr_name);
584 strcpy(ifaceinfo[WIFI_INTERFACE].ip,ip);
585 SECURE_DB_INFO("IP address of WiFi [%s]", ip);
587 vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &is_on);
588 if(is_on != VCONFKEY_MOBILE_HOTSPOT_MODE_NONE)
590 TIZEN_LOGD("Wi-Fi is Not in Normal Wi-Fi Mode");
596 TIZEN_LOGD ("Interface name [%s] is not found", ifacename);
600 uint32 is_both_interface_avail(interfaceInfo *ifaceInfo,int iptype)
605 lteFlag = is_interface_up(LTE_IFACE_NAME, ifaceInfo,iptype);
606 TIZEN_LOGD ("MultiRat Main Thread lte [%u]", lteFlag);
608 wifiFlag = is_interface_up(WIFI_IFACE_NAME, ifaceInfo,iptype);
609 TIZEN_LOGD ("MultiRat Main Thread wifi [%u]", wifiFlag);
611 return (lteFlag && wifiFlag);
614 int32 conn_get_socket_bind(int8 *ip, int ifaceidx, int iptype)
616 int32 socket_fd = -1;
618 struct sockaddr_in sa_loc;
619 struct sockaddr_in6 sa_loc6;
621 memset(&sa_loc6, 0, sizeof(struct sockaddr_in6));
622 memset(&sa_loc, 0, sizeof(struct sockaddr_in));
626 socket_fd = socket(AF_INET6, SOCK_STREAM, 0);
629 TIZEN_LOGD("Error !!! socket creation failed [%d] [%s]", errno, strerror(errno));
632 sa_loc6.sin6_family = AF_INET6;
633 sa_loc6.sin6_port = htons(0);
634 inet_pton(AF_INET6,ip,&(sa_loc6.sin6_addr));
638 socket_fd = socket(AF_INET, SOCK_STREAM, 0);
641 TIZEN_LOGD("Error !!! socket creation failed [%d] [%s]", errno, strerror(errno));
644 sa_loc.sin_family = AF_INET;
645 sa_loc.sin_port = htons(0);
646 sa_loc.sin_addr.s_addr = inet_addr(ip);
651 bind_ret = bind(socket_fd,(struct sockaddr *)&sa_loc, sizeof(struct sockaddr));
655 bind_ret = bind(socket_fd,(struct sockaddr *)&sa_loc6, sizeof(struct sockaddr_in6));
658 SECURE_DB_INFO("Binding [%d] on IP Address [%s]",socket_fd,ip);
661 TIZEN_LOGD("Error !!! bind failed [%d] [%s]", errno, strerror(errno));
662 CLOSE_SOCKET(socket_fd);
665 SECURE_DB_INFO("Binding to the IP address[%s] Successful",ip);
669 int32 conn_poll(int32 socketId, uint32 timeout)
672 memset(&rcvfd, 0, sizeof(struct pollfd));
674 rcvfd.events = POLLIN;
676 return poll(&rcvfd, 1, timeout);
679 int32 file_thread_conn_poll(int32 socket, SmartBondingData *SBData)
682 uint32 pollStartTime = get_time_in_sec();
683 while((SBData->fStream->compRspRcvdFlag) && (((SBData->status == MAIN_START) || (SBData->file_status == NO_REDIVISION)) && ((get_time_in_sec() - pollStartTime) < 30)))
686 pollret = conn_poll(socket, 200);
689 TIZEN_LOGD("Error !!! watchdog thread pollfd failed");
692 else if(pollret == 0)
694 TIZEN_D_LOGD("Timeout on File Thread Poll");
699 TIZEN_D_LOGD("File Thread Response");
707 int32 watchdog_conn_poll(int32 socket, SmartBondingData *SBData)
710 uint32 pollStartTime = get_time_in_sec();
711 while((SBData->cthread->threadStatus != THREAD_FINISH) && ((get_time_in_sec() - pollStartTime) < 30))
714 pollret = conn_poll(socket, 2000);
717 TIZEN_LOGD("Error !!! watchdog thread pollfd failed");
720 else if(pollret == 0)
722 TIZEN_D_LOGD("Timeout on Watch Dog Poll");
727 TIZEN_D_LOGD("WatchDog Received Response");
734 void PollThread_poll(int32 socket, SmartBondingData *SBData, uint32 timeout_check)
737 uint32 pollStartTime = get_time_in_sec();
738 while((SBData->PollThrd->threadStatus != THREAD_FINISH) && ((get_time_in_sec() - pollStartTime) < 30))
741 pollret = conn_poll(socket, timeout_check);
744 TIZEN_LOGD("Error !!! Poll Thread pollfd failed");
747 else if(pollret == 0)
749 TIZEN_D_LOGD("Timeout on Pollthread Poll");
754 TIZEN_D_LOGD("Poll Thread Received Data");
761 void lib_conn_poll(int32 socket, SmartBondingData *SBData)
764 while((SBData->cancel != 1))
767 pollret = conn_poll(socket, 1000);
770 TIZEN_LOGD("Error !!! Libapi pollfd failed");
773 else if(pollret == 0)
775 TIZEN_D_LOGD("Timeout on Libapi Poll");
780 TIZEN_D_LOGD("App Read Received Data to Read");
787 int32 read_conn_poll(int32 socket, SmartBondingData *SBData)
790 uint32 pollStartTime = get_time_in_sec();
791 while((SBData->cancel != 1) && ((get_time_in_sec() - pollStartTime) < SBData->timeout))
794 pollret = conn_poll(socket, 200);
797 TIZEN_LOGD("Error !!! Read pollfd failed");
800 else if(pollret == 0)
802 TIZEN_D_LOGD("Timeout on Read Poll");
807 TIZEN_D_LOGD("Received Data to Read");