/*
* fn static void ftp_multi_up(LOAD_MULTI_DATA *pData)
* brief ftp upload
* details
*
* param[in]
* param[out]
*
*
* return
* retval T/F
*
* note
*/
static void *ftp_multi_up(LOAD_MULTI_DATA *pData)
{
int up_fd = -1;
int up_fdd = -1;
int len =0;
int index =0;
UINT32 test_byte_should_up = 0;
char filename[BUFLEN_512] = {0};
struct sockaddr_in addr;
#ifdef INCLUDE_DIAG_TR143_SPEEDTEST_IPV6
struct sockaddr_in6 addrV6;
#endif /* INCLUDE_DIAG_TR143_SPEEDTEST_IPV6 */
LOAD_CONN_PARAM load_conn;
LOAD_MULTI_CFG *pCfg = NULL;
LOAD_MULTI_RESULT *pRes = NULL;
if (NULL == pData)
{
TR143_ERROR("pData(%p)", pData);
return (void *)0;
}
pCfg = pData->pCfg;
pRes = pData->pRes;
if (NULL == pCfg || NULL == pRes)
{
TR143_ERROR("pCfg(%p) pRes(%p)", pCfg, pRes);
return (void *)0;
}
TR143_DEBUG("start ftp multi upload!");
memset(&load_conn, 0, sizeof(LOAD_CONN_PARAM));
TR143_SET_STATE(&load_conn, TR143_EREQUEST);
#ifdef INCLUDE_TR143_TX_ZERO_COPY
char buf[BUFLEN_256] = {0};
int sndfd = 0;
#else /* INCLUDE_TR143_TX_ZERO_COPY */
char *buf = NULL;
buf = malloc(TR143_TRANS_LEN);
if (NULL == buf)
{
TR143_ERROR("malloc buf fail\n");
TR143_SET_STATE(&load_conn, TR143_EINTERNAL);
goto SEND_MSG;
}
#endif /* INCLUDE_TR143_TX_ZERO_COPY */
cidLock();
if(0 == pRes->thread_num)
{
CUTIL_STR_STRNCPY(filename, pCfg->pFileName, sizeof(filename));
/* http://ispproject.rd.tp-link.net/redmine/issues/15110 */
if (pCfg->num_of_conn)
{
/* Fix Bug 679867 Supplement the remainder that cannot be divided completely */
test_byte_should_up = pCfg->testFileLength / pCfg->num_of_conn +
pCfg->testFileLength % pCfg->num_of_conn;
}
else
{
test_byte_should_up = pCfg->testFileLength;
}
}
else
{
snprintf(filename, sizeof(filename), "%s.%d", pCfg->pFileName, pRes->thread_num);
if (pCfg->num_of_conn)
{
test_byte_should_up = pCfg->testFileLength / pCfg->num_of_conn;
}
else
{
test_byte_should_up = pCfg->testFileLength;
}
}
pRes->thread_num++;
cidUnlock();
tr143_adjust_ethOffload_or_cpuAffinity(pCfg->ifName, DIR_UP, ENABLE);
/* 1. init control socket */
if (TRUE != tr143_loadSocketInit(&up_fd, pCfg, FALSE, TRUE))
{
TR143_ERROR("init control socket failed");
TR143_SET_STATE(&load_conn, TR143_ECONFAIL);
goto SEND_MSG;
}
/* 2. connect to load server */
#ifdef INCLUDE_DIAG_TR143_SPEEDTEST_IPV6
if (2 == pCfg->protoVerFlag)
{
/* 2. connect to load server */
if (TRUE != connect_with_check(up_fd, (struct sockaddr *)&(pCfg->dstIpv6Addr), sizeof(pCfg->dstIpv6Addr)))
{
TR143_ERROR("socket connect server failed.");
TR143_SET_STATE(&load_conn, TR143_ECONFAIL);
goto SEND_MSG;
}
/* 3. FTP get IP and Port */
if (TRUE != tr143_ftpGetIpAndPortV6(up_fd, pCfg, &addrV6, buf))
{
TR143_ERROR("FTP get IP and Port failed");
TR143_SET_STATE(&load_conn, TR143_ENOPASV);
goto SEND_MSG;
}
}
else if (1 == pCfg->protoVerFlag)
#endif /* INCLUDE_DIAG_TR143_SPEEDTEST_IPV6 */
{
if (TRUE != connect_with_check(up_fd, (struct sockaddr *)&(pCfg->dstAddr), sizeof(pCfg->dstAddr)))
{
TR143_ERROR("socket connect server failed.");
TR143_SET_STATE(&load_conn, TR143_ECONFAIL);
goto SEND_MSG;
}
/* 3. FTP get IP and Port */
if (TRUE != tr143_ftpGetIpAndPort(up_fd, pCfg, &addr, buf))
{
TR143_ERROR("FTP get IP and Port failed");
TR143_SET_STATE(&load_conn, TR143_ENOPASV);
goto SEND_MSG;
}
}
/* 4. init data socket */
if (TRUE != tr143_loadSocketInit(&up_fdd, pCfg, TRUE, TRUE))
{
TR143_ERROR("init data socket failed");
TR143_SET_STATE(&load_conn, TR143_ECONFAIL);
goto SEND_MSG;
}
getDateTime(load_conn.tcpOpenreqTime);
/* 5.data socket connect to load server */
#ifdef INCLUDE_DIAG_TR143_SPEEDTEST_IPV6
if (2 == pCfg->protoVerFlag)
{
if (TRUE != connect_with_check(up_fdd, (struct sockaddr *)&addrV6, sizeof(addrV6)))
{
TR143_ERROR("socket connect server failed.");
TR143_SET_STATE(&load_conn, TR143_ECONFAIL);
goto SEND_MSG;
}
}
else if (1 == pCfg->protoVerFlag)
#endif /* INCLUDE_DIAG_TR143_SPEEDTEST_IPV6 */
{
if(TRUE != connect_with_check(up_fdd, (struct sockaddr *)&addr, sizeof(addr)))
{
TR143_ERROR("data socket connect server failed.");
TR143_SET_STATE(&load_conn, TR143_ECONFAIL);
goto SEND_MSG;
}
}
getDateTime(load_conn.tcpOpenresTime);
/* 6. save load start time and TX/RX bytes */
for (index = 0; index < 2; index++)
{
#ifdef INCLUDE_TR143_TX_ZERO_COPY
len = snprintf(buf, BUFLEN_256, "%s %s\r\n", FSEQ_UL[index].pCmd, (index > 0) ? filename: pCfg->pPathName);
#else /* INCLUDE_TR143_TX_ZERO_COPY */
len = snprintf(buf, TR143_TRANS_LEN, "%s %s\r\n", FSEQ_UL[index].pCmd, (index > 0) ? filename: pCfg->pPathName);
#endif /* INCLUDE_TR143_TX_ZERO_COPY */
if (len == tr143_read_write_with_retry(up_fd, buf, len, TR143_WRITE_TYPE))
{
if (1 == index)
{
getDateTime(load_conn.ROMTIME);
}
#ifdef INCLUDE_TR143_TX_ZERO_COPY
if (6 < tr143_read_write_with_retry(up_fd, buf, BUFLEN_256, TR143_READ_TYPE))
#else /* INCLUDE_TR143_TX_ZERO_COPY */
if (6 < tr143_read_write_with_retry(up_fd, buf, TR143_TRANS_LEN, TR143_READ_TYPE))
#endif /* INCLUDE_TR143_TX_ZERO_COPY */
{
/* MAY reply "125 Data connection already open..." on Windows IIS. Just check 1yz. */
if (CUTIL_SAME_NSTR(buf, FSEQ_UL[index].pReplyCode, 1))
{
continue;
}
}
}
}
#ifdef INCLUDE_TR143_TX_ZERO_COPY
if (0 >= (sndfd = prepare_sendfile(filename)))
{
TR143_ERROR("Prepare for send file failed(%s)", strerror(errno));
goto SEND_MSG;
}
#endif /* INCLUDE_TR143_TX_ZERO_COPY */
tr143_saveStartTimeAndBytes(&load_conn, pCfg, pRes);
/* 7. upload test */
if(0 == pCfg->time_base_dura)
{
#ifdef INCLUDE_TR143_TX_ZERO_COPY
if (TRUE != tr143_uploadByBytes(&up_fdd, &load_conn, pCfg, pRes, test_byte_should_up, buf, sndfd))
#else /* INCLUDE_TR143_TX_ZERO_COPY */
if (TRUE != tr143_uploadByBytes(&up_fdd, &load_conn, pCfg, pRes, test_byte_should_up, buf))
#endif /* INCLUDE_TR143_TX_ZERO_COPY */
{
#ifdef INCLUDE_LOAD_DIAG_INTERRUPT
if (TRUE == g_interruptFlag)
{
g_interruptFlag = FALSE;
TR143_ERROR("tfp upload by bytes is interrupted");
TR143_SET_STATE(&load_conn, TR143_EOTHER);
goto SEND_MSG;
}
#endif /*INCLUDE_LOAD_DIAG_INTERRUPT*/
TR143_ERROR("ftp upload by bytes failed");
TR143_SET_STATE(&load_conn, TR143_ETRANSFAIL);
goto SEND_MSG;
}
}
else
{
#ifdef INCLUDE_TR143_TX_ZERO_COPY
if (TRUE != tr143_uploadByTime(&up_fdd, &load_conn, pCfg, pRes, buf, sndfd))
#else /* INCLUDE_TR143_TX_ZERO_COPY */
if (TRUE != tr143_uploadByTime(&up_fdd, &load_conn, pCfg, pRes, buf))
#endif /* INCLUDE_TR143_TX_ZERO_COPY */
{
#ifdef INCLUDE_LOAD_DIAG_INTERRUPT
if (TRUE == g_interruptFlag)
{
g_interruptFlag = FALSE;
TR143_ERROR("tfp upload by time is interrupted");
TR143_SET_STATE(&load_conn, TR143_EOTHER);
goto SEND_MSG;
}
#endif /*INCLUDE_LOAD_DIAG_INTERRUPT*/
TR143_ERROR("ftp upload by time failed");
TR143_SET_STATE(&load_conn, TR143_ETRANSFAIL);
goto SEND_MSG;
}
}
/* 8. save load end time and TX/RX bytes */
tr143_saveEndTimeAndBytes(&load_conn, pCfg, pRes);
/* 9. update upload result */
if(TRUE != tr143_set_upconn_result(load_conn, pCfg, pRes))
{
TR143_ERROR("set obj failed");
TR143_SET_STATE(&load_conn, TR143_EINTERNAL);
goto SEND_MSG;
}
TR143_SET_STATE(&load_conn, TR143_ECOMPELETED);
TR143_DEBUG("set obj finish");
SEND_MSG:
#ifdef INCLUDE_TR143_TX_ZERO_COPY
release_sendfile(sndfd, filename);
#else /* INCLUDE_TR143_TX_ZERO_COPY */
TR143_FREE(buf);
#endif /* INCLUDE_TR143_TX_ZERO_COPY */
TR143_CLOSESOCKET(up_fd);
TR143_CLOSESOCKET(up_fdd);
tr143_updateAndSendLoadStatus(pData, load_conn.diagnosticsState);
return (void *)0;
}
在这个过程中 这个宏起到了什么作用,这个宏是我在测速过程中的性能优化与加速,告诉我这个在上传过程中起到了什么作用然后我要做一页PPT简单展示这个宏的作用 给我构思一个展示优化思路的内容
最新发布