1 #include "multirat_conf.h"
2 #include "multirat_process.h"
3 #include "multirat_libapi.h"
4 #include "multirat_watch_dog_thread.h"
5 #include "multirat_multisocket.h"
6 #include "multirat_decode_http.h"
7 #include "multirat_range_request_thread.h"
9 #include <vconf-keys.h>
10 #include "multirat_file_stream.h"
11 #include "multirat_file_manager.h"
12 #include "multirat_file_buffer.h"
13 #include "multirat_watchthread.h"
15 #ifdef TIZEN_UX_SUPPORT
16 #include "smartbonding-client.h"
19 void get_proxy_info(SmartBondingData *SBData, int interface_index)
21 connection *conn = &(SBData->conn);
22 get_proxy_ip_port(conn->ifaceInfo[interface_index].proxy_addr, &(conn->ifaceInfo[interface_index].proxy_port));
23 if(strlen(conn->ifaceInfo[interface_index].proxy_addr) != 0)
25 memset(SBData->conn.ifaceInfo[interface_index].server_ip,0,INET_ADDRSTRLEN);
26 memcpy(conn->ifaceInfo[interface_index].server_ip, conn->ifaceInfo[interface_index].proxy_addr, strlen(conn->ifaceInfo[interface_index].proxy_addr));
27 conn->ifaceInfo[interface_index].server_port = conn->ifaceInfo[interface_index].proxy_port;
28 conn->ifaceInfo[interface_index].proxyEnable = B_TRUE;
32 conn->ifaceInfo[interface_index].server_port = 80;
34 get_dns_ip(conn->ifaceInfo[interface_index].dns_1, conn->ifaceInfo[interface_index].dns_2);
36 SECURE_DB_INFO("Server/Proxy IP Address [%s]", conn->ifaceInfo[interface_index].server_ip);
37 SECURE_DB_INFO("Server/Proxy Port [%d]", conn->ifaceInfo[interface_index].server_port);
38 SECURE_DB_INFO("DNS 1 [%s]", conn->ifaceInfo[interface_index].dns_1);
39 SECURE_DB_INFO("DNS 2 [%s]", conn->ifaceInfo[interface_index].dns_2);
42 int32 file_thread_FirstConnection(SmartBondingData *SBData, fileThread *fThread, int64 *chunkInfo, int8 *recv_buf, int32 *lengthRcvd)
48 uint32 retval_watch_dog = 1;
50 uint32 interface_index = 0;
52 httpReq *req = &(SBData->req);
53 struct hostent *h = NULL;
54 struct sockaddr_in remote_addr;
55 struct sockaddr_in6 remote_addr_ip6;
57 connection *conn = &(SBData->conn);
58 memset(&httprsp, 0, sizeof(httpResp));
59 interface_index = (fThread->interface_index);
61 SECURE_DB_INFO("Server IP Address [%s]", conn->ifaceInfo[SBData->interface_index].server_ip);
62 get_proxy_info(SBData, interface_index);
63 if(req->Rangeheader != NULL)
65 newReq = get_new_req(req->req_buff_wo_range, 0, chunkInfo[0], chunkInfo[1], &length, req->req_wo_len, conn->ifaceInfo[interface_index].proxyEnable);
69 newReq = get_new_req(req->req_buff, 0, chunkInfo[0], chunkInfo[1], &length, req->reqLen, conn->ifaceInfo[interface_index].proxyEnable);
72 SECURE_DB_INFO("HTTP New Req [%s]",newReq);
74 if(!SBData->conn.ifaceInfo[interface_index].proxyEnable)
76 getHost(&host, newReq);
79 SECURE_DB_INFO("DNS Resolution for Proxy Case Host [%s]", host);
80 if(!getDNSInfo(host, interface_index, SBData))
82 TIZEN_LOGD("DNS Resolution Failed for Interface [%d]", interface_index);
97 while(*fThread->compRspRcvdFlag)
100 memset(recv_buf, 0, MAX_HEADERS_SIZE + 1);
102 socket = conn_get_socket_bind(conn->ifaceInfo[interface_index].ip,interface_index,conn->ip_family);
113 TIZEN_LOGD("File Thread Socket [%d]",socket);
119 TIZEN_LOGD("No Of Redirections Exceeded");
120 CLOSE_SOCKET(socket);
128 h = gethostbyname(conn->ifaceInfo[interface_index].server_ip);
130 if(SBData->conn.ip_family)
132 memset(&remote_addr_ip6, 0, sizeof(struct sockaddr_in6));
133 remote_addr_ip6.sin6_family = h->h_addrtype;
134 memcpy((char *) &remote_addr_ip6.sin6_addr.s6_addr, h->h_addr_list[0], h->h_length);
135 remote_addr_ip6.sin6_port = htons(conn->port);
139 memset(&remote_addr, 0, sizeof(struct sockaddr_in));
140 remote_addr.sin_family = h->h_addrtype;
141 memcpy((char *) &remote_addr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
142 remote_addr.sin_port = htons(conn->port);
145 if(-1 == file_thread_connServer(socket, &remote_addr, &remote_addr_ip6, SBData->timeout, SBData))
147 CLOSE_SOCKET(socket);
155 TIZEN_LOGD("Connect Success in File Thread");
157 if (-1 == send(socket, newReq, length, 0))
159 TIZEN_LOGD("File Thread got Exception during send [%s]", strerror (errno));
163 TIZEN_LOGD("Send HTTP Request Success in File Thread");
164 memset(recv_buf, 0, MAX_HEADERS_SIZE + 1);
165 while (*fThread->compRspRcvdFlag)
172 if(file_thread_conn_poll(socket, SBData) <= 0)
174 TIZEN_LOGD("Error !!! File Thread pollfd failed Timeout or Fail or Exit");
178 rcvdLen = recv(socket, recv_buf + offset, MAX_HEADERS_SIZE - offset, 0);
179 TIZEN_LOGD("Recvd length [%d]",rcvdLen);
183 len = decode_http_find_str(recv_buf, END_OF_HEADERS);
187 TIZEN_LOGD("Header length [%d]", headerLen);
188 memset(&httprsp, 0, sizeof(httpResp));
189 decode_http_rsp_init(recv_buf, headerLen, &httprsp);
190 SECURE_DB_INFO("File Thread Response [%s]", httprsp.resp_buff);
192 retval = process_http_rsp(&httprsp);
193 if ((HTTP_RSP_REDIRECT == retval) && (httprsp.location != NULL))
195 TIZEN_LOGD("Redirection Happening and New Location [%s]", httprsp.location);
197 if(handleRedirection(httprsp.location, interface_index, &newReq, &length, SBData) == HTTP_RSP_DECODING_SUCCESS)
199 retval_watch_dog = 0;
200 CLOSE_SOCKET(socket);
211 else if(HTTP_RSP_DECODING_SUCCESS != retval)
213 TIZEN_LOGD("HTTP Decoding Error");
218 TIZEN_LOGD("HTTP Response in File Trhead is SUCCESS");
219 *lengthRcvd = rcvdLen;
222 offset = offset + rcvdLen;
223 if(offset >= MAX_HEADERS_SIZE)
235 delete_http_rsp(&httprsp);
236 if(retval_watch_dog == 1)
241 TIZEN_LOGD("RETURN VALUE [%d]",retval);
247 CLOSE_SOCKET(socket);
256 if((store_interface_ip_request(newReq, SBData, interface_index) == 0))
258 SBData->watch_dog_complete = 1;
267 int32 watchdog_test_connection_type(SmartBondingData *SBData)
275 uint32 retval_dns = 0;
276 uint32 retval_watch_dog = 1;
279 uint32 resp_offset = 0;
280 uint32 interface_index = 0;
282 uint64 startTime = 0;
283 uint64 contLength = 0;
284 int8 recv_buf[MAX_HEADERS_SIZE + 1] = {0};
286 httpReq *req = &(SBData->req);
287 struct hostent *h = NULL;
288 struct sockaddr_in remote_addr;
289 struct sockaddr_in6 remote_addr_ip6;
291 connection *conn = &SBData->conn;
292 startTime = get_time_in_microsec();
293 memset(&httprsp, 0, sizeof(httpResp));
294 TIZEN_LOGD("WatchDog test");
295 interface_index = (SBData->interface_index + 1) % 2;
296 if(req->Rangeheader != NULL)
298 newReq = get_new_req(req->req_buff_wo_range, 0, 0, 1, &length, req->req_wo_len, conn->ifaceInfo[interface_index].proxyEnable);
302 newReq = get_new_req(req->req_buff, 0, 0, 1, &length, req->reqLen, conn->ifaceInfo[interface_index].proxyEnable);
304 TIZEN_LOGD("UID [%d]", getuid());
305 memcpy(conn->ifaceInfo[SBData->interface_index].server_ip, conn->ip_addr, strlen(conn->ip_addr));
306 memcpy(conn->ifaceInfo[interface_index].server_ip, conn->ip_addr, strlen(conn->ip_addr));
308 SECURE_DB_INFO("Server IP Address [%s]", conn->ifaceInfo[SBData->interface_index].server_ip);
310 SECURE_DB_INFO("HTTP New Req [%s]",newReq);
311 getHost(&host, newReq);
314 SECURE_DB_INFO("DNS Resolution for Proxy Case Host [%s]", host);
315 retval_dns = getDNSInfo(host, interface_index, SBData);
320 TIZEN_LOGD("DNS Resolution Failed for Interface [%d]", interface_index);
324 while(SBData->cthread->threadStatus != THREAD_FINISH)
326 retval_watch_dog = 1;
328 socket = conn_get_socket_bind(conn->ifaceInfo[interface_index].ip,interface_index,conn->ip_family);
336 TIZEN_LOGD("WatchDog Socket [%d]",socket);
341 TIZEN_LOGD("No Of Redirections Exceeded");
342 CLOSE_SOCKET(socket);
346 h = gethostbyname(conn->ifaceInfo[interface_index].server_ip);
348 if(SBData->conn.ip_family)
351 memset(&remote_addr_ip6, 0, sizeof(struct sockaddr_in6));
352 remote_addr_ip6.sin6_family = h->h_addrtype;
353 memcpy((char *) &remote_addr_ip6.sin6_addr.s6_addr, h->h_addr_list[0], h->h_length);
354 remote_addr_ip6.sin6_port = htons(conn->port);
358 memset(&remote_addr, 0, sizeof(struct sockaddr_in));
359 remote_addr.sin_family = h->h_addrtype;
360 memcpy((char *) &remote_addr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
361 remote_addr.sin_port = htons(conn->port);
364 if(-1 == connServer(socket, &remote_addr,&remote_addr_ip6,SBData->timeout, SBData))
367 CLOSE_SOCKET(socket);
371 TIZEN_LOGD("Connect Success in Watchdog");
373 if (-1 == send(socket, newReq, length, 0))
375 TIZEN_LOGD("Watch Dog Thread got Exception during send [%s]", strerror (errno));
379 TIZEN_LOGD("Send HTTP Request Success in Watchdog");
380 memset(recv_buf, 0, MAX_HEADERS_SIZE + 1);
381 while (SBData->cthread->threadStatus != THREAD_FINISH)
390 if(watchdog_conn_poll(socket, SBData) <= 0)
392 TIZEN_LOGD("Error !!! watchdog thread pollfd failed Timeout or Fail or Exit");
396 rcvdLen = recv(socket, recv_buf + offset, MAX_HEADERS_SIZE - offset, 0);
397 TIZEN_LOGD("Recvd lenght [%d]",rcvdLen);
401 TIZEN_D_LOGD("Watch1 Dog Thread Response [%s]",recv_buf);
402 len = decode_http_find_str(recv_buf, END_OF_HEADERS);
407 TIZEN_LOGD("Watch Dog Thread Response [%s]",recv_buf);
409 memset(&httprsp, 0, sizeof(httpResp));
411 decode_http_rsp_init(recv_buf, headerLen, &httprsp);
412 retval = process_http_rsp(&httprsp);
414 if ((HTTP_RSP_REDIRECT == retval) && (httprsp.location != NULL))
416 TIZEN_LOGD("Redirection Happening and New Location [%s]", httprsp.location);
418 if(handleRedirection(httprsp.location, interface_index, &newReq, &length, SBData) == HTTP_RSP_DECODING_SUCCESS)
420 retval_watch_dog = 0;
421 CLOSE_SOCKET(socket);
430 else if(HTTP_RSP_DECODING_SUCCESS != retval)
432 TIZEN_LOGD("HTTP Decoding Error");
436 TIZEN_LOGD("HTTP Response in Watch Dog is SUCCESS");
437 contLength = atol(httprsp.contLen);
439 if(httprsp.connection != NULL)
440 connType = strncmp(httprsp.connection, "close", strlen("close"));
444 TIZEN_LOGD("Connection Type is Not CLOSE");
447 endTime = get_time_in_microsec();
448 timeT2 = (endTime-startTime)/1000;
450 resp_offset = offset + rcvdLen;
452 TIZEN_LOGD("Response Lenght in Watch dog [%d] and Data Read till Now [%d]",resp_len, resp_offset);
455 offset = offset + rcvdLen;
456 if(offset >= MAX_HEADERS_SIZE)
465 delete_http_rsp(&httprsp);
466 if(retval_watch_dog == 1)
472 TIZEN_LOGD("End Time is Zero");
473 /* Error condtion abort multisocket(This interface is not stable) */
478 /* Compair the time between two interfaces */
479 retval = check_speed(SBData, timeT2, resp_offset, resp_len, recv_buf, socket, contLength);
487 CLOSE_SOCKET(socket);
489 if((store_interface_ip_request(newReq, SBData, interface_index) == 0))
491 SBData->watch_dog_complete = 1;
496 TIZEN_LOGD("RETURN VALUE [%d]",retval);
500 int32 check_speed(SmartBondingData *SBData, uint32 timeT2, uint32 resp_offset,
501 uint32 resp_len, int8 *recv_buf, int32 socket, uint64 contLength)
504 StatDetails *stat = &(SBData->stat);
506 if(stat->timeT1 > (5 * timeT2))
508 /* Watch Dog Socket Becomes Main Socket */
509 TIZEN_LOGD("Interface 2 Much Faster Than Interaface 1");
510 //CLOSE_SOCKET(SBData->socket_fd);
511 //SBData->socket_fd = 0;
514 else if(timeT2 > (5 * stat->timeT1))
516 TIZEN_LOGD("IF 1 much faster than 2 abort \n");
517 /* Abort multi socket */
523 int32 get_bytesof_range_request(uint64 *start, int8 *rangeHeader)
530 int8 temp1[100] = {0};
532 len = decode_http_find_str(rangeHeader, "bytes");
535 i1 = strchr(rangeHeader, '=');
536 i2 = strchr(rangeHeader, '-');
537 i3 = strrchr(rangeHeader, '-');
538 i4 = strchr(rangeHeader, ',');
540 if ((i1 == 0) || (i2 == 0) || ((i1+1) >= i2) || (i2 != i3) || (i4!=0))
546 strncpy(temp1, rangeHeader + 6, ((i2 -i1)-1));
547 *start = atol(temp1);
557 int32 is_connection_header_keepalive(SmartBondingData *SBData)
559 if (SBData->resp.connection != NULL)
561 if (strcmp(SBData->resp.connection, "Keep-Alive") == 0)
567 CThread * cthread_init()
569 CThread *cthread = malloc(sizeof(CThread));
572 TIZEN_LOGD("Error !!! cthread allocation failed [%d] [%s]", errno, strerror(errno));
575 memset(cthread,0,sizeof(CThread));
576 cthread->threadId = 0;
580 void cthread_start_thread(SmartBondingData *SBData)
583 pthread_t thread = 0;
584 CThread *cthread = SBData->cthread;
585 TIZEN_D_LOGD("Starting Thread");
586 if ((ECode = pthread_create(&thread, NULL, cthread_entry_function, (void *)SBData)) != 0)
588 TIZEN_LOGD("Error !!! creating pthread [%d] [%s]", errno, strerror(errno));
589 cthread_exit(cthread);
593 TIZEN_D_LOGD("Init Watch Dog Thread ");
594 cthread->threadStatus = THREAD_INIT;
595 cthread->threadId = thread;
600 void * cthread_entry_function (void *pArg)
604 SmartBondingData *SBData = (SmartBondingData *)pArg;
605 if(SBData->twoChunk == 1)
606 file_cthread_run_thread(SBData);
608 cthread_run_thread(SBData);
612 cthread_exit((CThread *)pArg);
617 int32 cthread_get_thread_status(CThread *cthread)
619 return cthread->threadStatus;
622 void cthread_exit(CThread *cthread)
624 TIZEN_LOGD("Cthread Exit\n");
627 if(cthread->threadStatus == THREAD_INIT)
629 cthread->threadStatus = THREAD_FINISH;
630 if(0 != cthread->threadId)
631 pthread_join(cthread->threadId,NULL);
632 cthread->threadId = 0;
638 int32 get_req_without_range(int8 *oldReq, int8 *newReq, int8 *rangeHeader, uint64 *rangeStart)
644 if (get_bytesof_range_request(rangeStart, rangeHeader))
646 len = decode_http_find_str(oldReq, RANGELEN_REQ_HEADER_CMP1);
648 len = decode_http_find_str(oldReq, RANGELEN_REQ_HEADER_CMP2);
650 memcpy(newReq, oldReq, len);
651 TIZEN_LOGD ("Before Range [%s] Range Header [%s]", newReq, rangeHeader);
653 if(!(decode_http_find_str(temp, END_OF_LINE) == decode_http_find_str(temp, END_OF_HEADERS)))
655 /*this will bring to point after Rnage header*/
656 len = decode_http_find_str(temp, END_OF_LINE);
657 temp = temp + len + 2;
661 len = decode_http_find_str(temp, END_OF_HEADERS);
662 temp = temp + len + 2;
664 memcpy(newReq + tempLen, temp, strlen(temp));
665 TIZEN_LOGD ("Successfully removed range header [%s]", newReq);
666 return strlen(newReq);
677 #ifdef TIZEN_UX_SUPPORT
678 static void _smart_bonding_start_cb(smbd_event_info_t event, void *user_data)
680 TIZEN_LOGD("start bonding cb \n");
681 SmartBondingData *SBData = (SmartBondingData *)user_data;
682 switch (event.Event) {
683 case SMBD_EVENT_USER_OPTION_OK:
685 SBData->user_option = USER_OK;
687 case SMBD_EVENT_USER_OPTION_CANCEL:
689 SBData->user_option = USER_CANCEL;
696 int32 user_selection(SmartBondingData *SBData)
698 int32 retval = B_FALSE;
699 int status = VCONFKEY_NETWORK_CELLULAR_NO_SERVICE;
700 CThread *cthread = SBData->cthread;
701 TIZEN_LOGD("Test For Tizen Ux Support");
702 if(!(smartbonding_client_init()))
705 TIZEN_LOGD("INIT UX Library User Option");
707 while(SBData->response_check == 0 && cthread->threadStatus != THREAD_FINISH)
709 if(cthread->threadStatus != THREAD_FINISH)
715 vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status);
717 TIZEN_LOGD("current LTE status [%d] and Expected LTE Status [%d]", status, VCONFKEY_NETWORK_CELLULAR_ON);
719 while(((status) != VCONFKEY_NETWORK_CELLULAR_ON) && (cthread->threadStatus != THREAD_FINISH))
721 TIZEN_D_LOGD("LTE Data pack Off");
723 status = VCONFKEY_NETWORK_CELLULAR_NO_SERVICE;
724 vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status);
727 TIZEN_LOGD("Data Pack On status [%d]", status);
729 if (smart_bonding_start(SBData->req.url, SBData->resp.cLen, _smart_bonding_start_cb, (void *)SBData) != SMBD_ERR_NONE)
731 TIZEN_LOGD("Start Bonding API failed");
735 TIZEN_LOGD("Start Bonding API success");
736 SBData->user_option = USER_POP_UP;
738 while(SBData->user_option == USER_POP_UP && cthread->threadStatus != THREAD_FINISH)
740 if(cthread->threadStatus != THREAD_FINISH)
746 if(SBData->user_option != USER_OK)
748 TIZEN_LOGD("User selected cancel");
753 TIZEN_LOGD("User selected OK");
758 void file_cthread_run_thread(SmartBondingData *SBData)
761 uint32 bFileStreamStarted = 0;
762 uint64 speed_time = get_time_in_sec();
763 connection *conn = &(SBData->conn);
764 CThread *cthread = SBData->cthread;
765 cthread->threadStatus = THREAD_RUNNING;
766 float ratio = 0; /* Ratio of Wifi/LTE speed */
767 uint32 wifiSpeed = 0;
769 uint64 expected_bytes = 0;
772 if(SBData->interface_index == 1)
774 TIZEN_LOGD("Main Interface is LTE");
778 #ifdef TIZEN_UX_SUPPORT
779 if(!user_selection(SBData))
783 fp= fopen("/opt/usr/media/Ratiostat", "r");
788 nitems = fscanf (fp, "%u %u",<eSpeed,&wifiSpeed);
790 TIZEN_LOGD("LTE SPEEED IS [%u] and WIFI SPEED IS [%u]",lteSpeed,wifiSpeed);
791 if( (lteSpeed != 0) && ( wifiSpeed != 0))
793 ratio = (double)lteSpeed/(double)wifiSpeed;
795 TIZEN_LOGD("Ratio of Previous Download From History %f", ratio);
799 TIZEN_LOGD("Failed to Open History previous Download");
802 while ((cthread->threadStatus != THREAD_FINISH) && ((SBData->resp.cLen - SBData->response_body_read) > (MULTIRAT_LOWER_LIMIT_TWO_CHUNK * 2)))
806 ratio = MAX(0.1, MIN(10,ratio));
807 expected_bytes = ((SBData->resp.cLen - SBData->response_body_read)/(ratio + 1));
810 expected_bytes = (SBData->resp.cLen - SBData->response_body_read)/2;
812 expected_bytes += SBData->response_body_read;
814 bIsUp = is_both_interface_avail(conn->ifaceInfo,conn->ip_family);
817 SBData->expectedbytes = expected_bytes;
818 TIZEN_LOGD("Expected Bytes [%llu]", SBData->expectedbytes);
820 file_stream_init(SBData);
822 if((bFileStreamStarted = file_stream_start(SBData)))
824 SBData->fileThreadStarted = bFileStreamStarted;
825 TIZEN_LOGD("File Stream Started [%d]",bFileStreamStarted);
832 if(!(SBData->fileThreadStarted))
835 while (cthread->threadStatus != THREAD_FINISH)
839 status = speed_calc_check_compare(&speed_time, SBData);
847 cthread->threadStatus = THREAD_FINISH;
851 void cthread_run_thread(SmartBondingData *SBData)
854 uint32 chunk_div = 0;
855 uint32 min_chunk = 0;
856 uint32 max_chunk = 0;
857 uint32 bMultiSocketStarted = 0;
858 uint64 bytesForMultiSocket = 0;
860 connection *conn = &(SBData->conn);
861 MultiSockInput mSockInput;
862 CThread *cthread = SBData->cthread;
863 cthread->threadStatus = THREAD_RUNNING;
864 /* NOT USED FOR 2 chunk approach */
866 if(SBData->interface_index == 1)
868 TIZEN_LOGD("Main Interface is LTE");
872 #ifdef TIZEN_UX_SUPPORT
873 if(!user_selection(SBData))
877 bytesForMultiSocket = SBData->resp.cLen - SBData->response_body_read;
879 while ((cthread->threadStatus != THREAD_FINISH) && (bytesForMultiSocket > MULTIRAT_LOWER_LIMIT))
881 bIsUp = is_both_interface_avail(conn->ifaceInfo,conn->ip_family);
884 memset(&mSockInput, 0, sizeof(mSockInput));
886 conn_type = watchdog_test_connection_type(SBData);
889 chunk_div = MULTIRAT_BLOCK_DIV;
890 max_chunk = MAX_MULTIRAT_BLOCK_SIZE;
892 else if(conn_type == 0)
895 max_chunk = MULTIRAT_CHUNK_SIZE;
899 TIZEN_LOGD("Aborting watch dog");
903 while(SBData->response_check == 0)
905 if(cthread->threadStatus != THREAD_FINISH)
911 min_chunk = MIN_MULTIRAT_BLOCK_SIZE;
913 mSockInput.rspOffset = SBData->response_body_read + EXPECTED_BYTE;
914 bytesForMultiSocket = SBData->resp.cLen - mSockInput.rspOffset;
915 mSockInput.chunkSize = bytesForMultiSocket/chunk_div;
916 mSockInput.conn = conn;
918 if (mSockInput.chunkSize > max_chunk)
919 mSockInput.chunkSize = max_chunk;
920 else if (mSockInput.chunkSize < min_chunk)
921 mSockInput.chunkSize = min_chunk;
924 if(bytesForMultiSocket > (mSockInput.chunkSize))
926 multirat_watchdogthread_calnochunks(mSockInput.chunkSize,
927 &mSockInput.noOfChunks, &mSockInput.lastChunk, bytesForMultiSocket);
931 TIZEN_LOGD("Size too small ignoring this content");
935 TIZEN_LOGD("No of Chunks = [%d],Chunk Size = [%d] bytesForMultiSocket = [%llu]",
936 mSockInput.noOfChunks, mSockInput.chunkSize, bytesForMultiSocket);
938 multisocket_init(&mSockInput, SBData);
939 if ((bMultiSocketStarted = multisocket_start(SBData)))
941 TIZEN_LOGD ("MultiSocket started [%d]", bMultiSocketStarted);
942 SBData->totalExpectedBytes = SBData->msocket->rspOffset;
943 SBData->multiSocketThreadStarted = bMultiSocketStarted;
948 TIZEN_LOGD ("MultiSocket failed");
949 multisocket_exit(SBData->msocket);
950 SBData->msocket = NULL;
955 if(SBData->response_check !=0)
956 bytesForMultiSocket = SBData->resp.cLen - SBData->response_body_read;
958 cthread->threadStatus = THREAD_FINISH;
962 void multirat_watchdogthread_calnochunks(uint32 chunkSize, uint32 *noOfChunks, uint32 *lastChunk, uint64 totalSize)
965 uint32 tempChunk = 0;
966 uint32 tempTotalChunks = 0;
968 TIZEN_LOGD("Multirat Watchdog Thread CalNoChunks");
970 tempChunk = (totalSize % chunkSize);
971 min = MIN((chunkSize/3), MIN_LAST_CHUNK);
972 if((0 != tempChunk) && (tempChunk < min))
974 tempTotalChunks = (totalSize/chunkSize);
975 tempChunk = chunkSize + tempChunk;
976 TIZEN_LOGD("Last Chunk Size Changed");
980 TIZEN_LOGD("Last Chunk Size not Chnaged");
983 tempTotalChunks = (totalSize/chunkSize);
987 tempTotalChunks = (totalSize/chunkSize) + 1;
991 *lastChunk = tempChunk;
992 *noOfChunks = tempTotalChunks;