904 lines
32 KiB
C
904 lines
32 KiB
C
/*
|
|
*********************************************************************************************************
|
|
* uC/HTTP
|
|
* Hypertext Transfer Protocol
|
|
*
|
|
* Copyright 2004-2020 Silicon Laboratories Inc. www.silabs.com
|
|
*
|
|
* SPDX-License-Identifier: APACHE-2.0
|
|
*
|
|
* This software is subject to an open source license and is distributed by
|
|
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
|
|
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*
|
|
* HTTP CLIENT SOCKET MODULE
|
|
*
|
|
* Filename : http-c_sock.c
|
|
* Version : V3.01.00
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* INCLUDE FILES
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
#define MICRIUM_SOURCE
|
|
#define HTTPc_SOCK_MODULE
|
|
|
|
#include <net_ascii.h>
|
|
#include <net_util.h>
|
|
|
|
#include <net.h>
|
|
#include <net_cfg_net.h>
|
|
#include <net_app.h>
|
|
#include <net_sock.h>
|
|
#include <net_tcp.h>
|
|
|
|
|
|
#include "http-c_sock.h"
|
|
#include "http-c_conn.h"
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
#include "http-c_websock.h"
|
|
#endif
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* LOCAL DEFINES
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
|
|
#define HTTPc_SOCK_TIMEOUT_CONNECT_MS_DFLT 2000u
|
|
#define HTTPc_SOCK_TIMEOUT_CONNECT_MS_MAX 10000u
|
|
#define HTTPc_SOCK_TIMEOUT_CONNECT_MS_MIN 1000u
|
|
|
|
#define HTTPc_SOCK_TIMEOUT_INACTIVITY_S_DFLT 60u
|
|
#define HTTPc_SOCK_TIMEOUT_INACTIVITY_S_MAX 255u
|
|
#define HTTPc_SOCK_TIMEOUT_INACTIVITY_S_MIN 1u
|
|
|
|
#define HTTPc_SOCK_SEL_TIMEOUT_MS 1u
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcSock_Connect()
|
|
*
|
|
* Description : (1) Open Socket.
|
|
* (2) Connect to Server.
|
|
* (3) Set Inactivity Connection Timeout.
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Connection with HTTP server successfully.
|
|
* HTTPc_ERR_CONN_SOCK_OPEN Opening socket error.
|
|
* HTTPc_ERR_CONN_SOCK_CONN Connect with server error.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcTask_Handler(),
|
|
* HTTPc_ConnGet().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcSock_Connect(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
NET_APP_SOCK_SECURE_CFG *p_secure_cfg;
|
|
NET_CONN_ID conn_id_tcp;
|
|
NET_ERR err_net;
|
|
CPU_BOOLEAN no_delay;
|
|
CPU_BOOLEAN keep_alive;
|
|
|
|
|
|
#ifdef NET_SECURE_MODULE_EN
|
|
p_secure_cfg = &p_conn->SockSecureCfg;
|
|
if (p_secure_cfg->TrustCallback == DEF_NULL) {
|
|
/* p_secure_cfg = DEF_NULL; */
|
|
} else {
|
|
if (p_secure_cfg->CommonName == DEF_NULL) {
|
|
p_secure_cfg->CommonName = p_conn->HostNamePtr;
|
|
}
|
|
if (p_conn->ServerPort == HTTP_DFLT_PORT_NBR) {
|
|
p_conn->ServerPort = HTTP_DFLT_PORT_NBR_SECURE;
|
|
}
|
|
}
|
|
p_secure_cfg->UserDataPtr = p_conn->UserData; //增加
|
|
#else
|
|
p_secure_cfg = DEF_NULL;
|
|
#endif
|
|
|
|
|
|
|
|
if (p_conn->ConnectTimeout_ms <= 0) {
|
|
*p_err = HTTPc_ERR_CONN_PARAM_CONNECT_TIMEOUT_INVALID;
|
|
goto exit;
|
|
}
|
|
|
|
if (p_conn->InactivityTimeout_s <= 0) {
|
|
*p_err = HTTPc_ERR_CONN_PARAM_INACTIVITY_TIMEOUT_INVALID;
|
|
goto exit;
|
|
}
|
|
|
|
/* ---------------- RESOLVE HOST NAME ----------------- */
|
|
NetApp_ClientStreamOpenByHostname(&p_conn->SockID,
|
|
p_conn->HostNamePtr,
|
|
p_conn->ServerPort,
|
|
&p_conn->ServerSockAddr,
|
|
p_secure_cfg,
|
|
p_conn->ConnectTimeout_ms,
|
|
&err_net);
|
|
switch (err_net) {
|
|
case NET_APP_ERR_NONE:
|
|
case NET_APP_ERR_CONN_IN_PROGRESS:
|
|
break;
|
|
|
|
default:
|
|
p_conn->SockID = NET_SOCK_ID_NONE;
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CONNECT;
|
|
goto exit;
|
|
}
|
|
/* ---------------- CFG SOCK BLOCK OPT ---------------- */
|
|
(void)NetSock_CfgBlock(p_conn->SockID, NET_SOCK_BLOCK_SEL_NO_BLOCK, &err_net);
|
|
if (err_net != NET_SOCK_ERR_NONE) {
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CONNECT;
|
|
goto exit_close;
|
|
}
|
|
|
|
/* ----- SET SOCKET CONNECTION INACTIVITY TIMEOUT ----- */
|
|
(void)NetSock_OptSet(p_conn->SockID,
|
|
NET_SOCK_PROTOCOL_TCP,
|
|
NET_SOCK_OPT_TCP_KEEP_IDLE,
|
|
(void *)&p_conn->InactivityTimeout_s,
|
|
sizeof(p_conn->InactivityTimeout_s),
|
|
&err_net);
|
|
if (err_net != NET_SOCK_ERR_NONE) {
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CONNECT;
|
|
goto exit_close;
|
|
}
|
|
|
|
/* ---------- SET SOCKET KEEP-ALIVE TIMEOUT ----------- */
|
|
keep_alive = p_conn->IsKeepAlive;
|
|
(void)NetSock_OptSet(p_conn->SockID,
|
|
NET_SOCK_PROTOCOL_SOCK,
|
|
NET_SOCK_OPT_SOCK_KEEP_ALIVE,
|
|
&keep_alive,
|
|
sizeof(keep_alive),
|
|
&err_net);
|
|
if (err_net != NET_SOCK_ERR_NONE) {
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CONNECT;
|
|
goto exit_close;
|
|
}
|
|
|
|
/* --------------- SET NO DELAY FEATURE --------------- */
|
|
no_delay = DEF_FALSE; /* Set to false to disable the naggle algorithm. */
|
|
(void)NetSock_OptSet(p_conn->SockID,
|
|
NET_SOCK_PROTOCOL_TCP,
|
|
NET_SOCK_OPT_TCP_NO_DELAY,
|
|
(void *)&no_delay,
|
|
sizeof(no_delay),
|
|
&err_net);
|
|
if (err_net != NET_SOCK_ERR_NONE) {
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CONNECT;
|
|
goto exit_close;
|
|
}
|
|
/* -------------- SET TCP CONNECTION MSL -------------- */
|
|
conn_id_tcp = NetSock_GetConnTransportID(p_conn->SockID, &err_net);
|
|
if (err_net != NET_SOCK_ERR_NONE) {
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CONNECT;
|
|
goto exit_close;
|
|
}
|
|
|
|
(void)NetTCP_ConnCfgMSL_Timeout(conn_id_tcp, 0u, &err_net);
|
|
if (err_net != NET_TCP_ERR_NONE) {
|
|
printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__);
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CONNECT;
|
|
goto exit_close;
|
|
}
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
goto exit;
|
|
|
|
|
|
exit_close:
|
|
printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__);
|
|
NetSock_Close(p_conn->SockID, &err_net);
|
|
p_conn->SockID = NET_SOCK_ID_NONE;
|
|
|
|
exit:
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcSock_ConnDataRx()
|
|
*
|
|
* Description : Receive data from the network and update connection.
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* max_len Specify the maximum length to get from the socket.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Data successfully received.
|
|
* HTTPc_ERR_CONN_SOCK_RX Transitory error.
|
|
* HTTPc_ERR_CONN_SOCK_CONN_CLOSED Connection is fully or half closed.
|
|
* HTTPc_ERR_CONN_SOCK_RX_FATAL Fatal error occurred.
|
|
*
|
|
* Return(s) : DEF_OK, if data received successfully.
|
|
* DEF_FAIL, otherwise.
|
|
*
|
|
* Caller(s) : HTTPcResp().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
CPU_BOOLEAN HTTPcSock_ConnDataRx(HTTPc_CONN *p_conn,
|
|
CPU_INT32U max_len,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
CPU_CHAR *p_buf;
|
|
NET_SOCK_ADDR_LEN addr_len_server;
|
|
CPU_INT16S rx_len;
|
|
CPU_INT32U buf_len;
|
|
CPU_BOOLEAN rtn_val;
|
|
NET_ERR err_net;
|
|
|
|
|
|
if (p_conn->RxDataLenRem > 0) { /* If data is still present in the rx buf. */
|
|
/* Move rem data to the beginning of the rx buf. */
|
|
Mem_Copy(p_conn->BufPtr, p_conn->RxBufPtr, p_conn->RxDataLenRem);
|
|
}
|
|
p_conn->RxBufPtr = p_conn->BufPtr;
|
|
|
|
p_buf = p_conn->BufPtr + p_conn->RxDataLenRem;
|
|
buf_len = p_conn->BufLen - (p_conn->RxDataLenRem + p_conn->TxDataLen);
|
|
|
|
if (buf_len == 0) {
|
|
rtn_val = DEF_OK; /* HTTP buffer already full of data rx. */
|
|
*p_err = HTTPc_ERR_NONE;
|
|
goto exit;
|
|
}
|
|
if (max_len != 0) {
|
|
buf_len = DEF_MIN(buf_len, max_len);
|
|
}
|
|
addr_len_server = sizeof(p_conn->ServerSockAddr);
|
|
|
|
/* ------------------ RECEIVED DATA ------------------- */
|
|
rx_len = NetSock_RxDataFrom(p_conn->SockID,
|
|
(void *)p_buf,
|
|
buf_len,
|
|
NET_SOCK_FLAG_NO_BLOCK,
|
|
&p_conn->ServerSockAddr,
|
|
&addr_len_server,
|
|
DEF_NULL,
|
|
DEF_NULL,
|
|
DEF_NULL,
|
|
&err_net);
|
|
switch (err_net) {
|
|
case NET_SOCK_ERR_NONE: /* Data received. */
|
|
case NET_SOCK_ERR_INVALID_DATA_SIZE:
|
|
p_conn->RxDataLenRem += rx_len;
|
|
break;
|
|
|
|
|
|
case NET_ERR_RX: /* Transitory rx err(s). */
|
|
case NET_INIT_ERR_NOT_COMPLETED:
|
|
case NET_SOCK_ERR_RX_Q_EMPTY:
|
|
case NET_ERR_FAULT_LOCK_ACQUIRE:
|
|
rtn_val = DEF_FAIL;
|
|
*p_err = HTTPc_ERR_CONN_SOCK_RX;
|
|
goto exit;
|
|
|
|
|
|
case NET_SOCK_ERR_CLOSED: /* Conn closed by peer. */
|
|
case NET_SOCK_ERR_RX_Q_CLOSED:
|
|
rtn_val = DEF_FAIL;
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CLOSED;
|
|
goto exit;
|
|
|
|
|
|
default: /* Fatal err. */
|
|
rtn_val = DEF_FAIL;
|
|
*p_err = HTTPc_ERR_CONN_SOCK_RX_FATAL;
|
|
goto exit;
|
|
|
|
}
|
|
|
|
|
|
rtn_val = DEF_OK;
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
|
|
exit:
|
|
return (rtn_val);
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcSock_ConnDataTx()
|
|
*
|
|
* Description : Transmit data on the network and update HTTPc connection parameters.
|
|
*
|
|
* Argument(s) : p_conn Pointer to the current HTTPc Connection.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Data transmit to TCPIP stack successfully.
|
|
* HTTPc_ERR_CONN_SOCK_TX Transitory error.
|
|
* HTTPc_ERR_CONN_SOCK_CLOSED Connection is fully or half closed.
|
|
* HTTPc_ERR_CONN_SOCK_TX_FATAL Fatal error occurred.
|
|
*
|
|
* Return(s) : DEF_OK, if entire data transmitted successfully.
|
|
*
|
|
* DEF_FAIL, otherwise.
|
|
*
|
|
* Caller(s) : HTTPc_Req().
|
|
*
|
|
* Note(s) : none.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
CPU_BOOLEAN HTTPcSock_ConnDataTx(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
NET_SOCK_ADDR_LEN addr_len_server;
|
|
CPU_INT16U tx_len;
|
|
CPU_BOOLEAN rtn_val;
|
|
NET_ERR err_net;
|
|
|
|
|
|
addr_len_server = sizeof(p_conn->ServerSockAddr);
|
|
|
|
/*调用底层socket*/
|
|
tx_len = NetSock_TxDataTo(p_conn->SockID,
|
|
p_conn->TxDataPtr,
|
|
p_conn->TxDataLen,
|
|
NET_SOCK_FLAG_NO_BLOCK,
|
|
&p_conn->ServerSockAddr,
|
|
addr_len_server,
|
|
&err_net);
|
|
switch (err_net) {
|
|
case NET_SOCK_ERR_NONE: /* Data transmitted. */
|
|
case NET_INIT_ERR_NOT_COMPLETED:
|
|
case NET_SOCK_ERR_PORT_NBR_NONE_AVAIL:
|
|
case NET_CONN_ERR_NONE_AVAIL:
|
|
case NET_ERR_FAULT_LOCK_ACQUIRE:
|
|
p_conn->TxDataLen -= tx_len;
|
|
if (p_conn->TxDataLen > 0u) { /* If data is not entirely transmitted. */
|
|
p_conn->TxDataPtr = (CPU_CHAR *)p_conn->TxDataPtr + tx_len;
|
|
rtn_val = DEF_FAIL;
|
|
*p_err = HTTPc_ERR_CONN_SOCK_TX;
|
|
goto exit;
|
|
}
|
|
break;
|
|
|
|
case NET_ERR_TX:
|
|
rtn_val = DEF_FAIL;
|
|
*p_err = HTTPc_ERR_CONN_SOCK_TX;
|
|
goto exit;
|
|
|
|
case NET_SOCK_ERR_CLOSED: /* Conn closed by peer. */
|
|
case NET_SOCK_ERR_TX_Q_CLOSED:
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CLOSED;
|
|
rtn_val = DEF_FAIL;
|
|
goto exit;
|
|
|
|
|
|
default: /* Fatal err. */
|
|
rtn_val = DEF_FAIL;
|
|
*p_err = HTTPc_ERR_CONN_SOCK_TX_FATAL;
|
|
goto exit;
|
|
}
|
|
|
|
rtn_val = DEF_OK;
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
|
|
exit:
|
|
return (rtn_val);
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcSock_Close()
|
|
*
|
|
* Description : Close Socket Connection with Server.
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Socket successfully closed.
|
|
* HTTPc_ERR_CONN_SOCK_CLOSE_FATAL Fatal error occurred.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcConn_Close().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcSock_Close(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
CPU_BOOLEAN done;
|
|
NET_ERR err_net;
|
|
|
|
|
|
done = DEF_NO;
|
|
while (done != DEF_YES) {
|
|
NetSock_Close(p_conn->SockID, &err_net);
|
|
switch (err_net) {
|
|
case NET_SOCK_ERR_NONE: /* Socket successfully closed. */
|
|
case NET_SOCK_ERR_CLOSED:
|
|
case NET_SOCK_ERR_CONN_CLOSE_IN_PROGRESS:
|
|
case NET_SOCK_ERR_INVALID_FAMILY:
|
|
case NET_SOCK_ERR_INVALID_TYPE:
|
|
case NET_SOCK_ERR_INVALID_STATE:
|
|
case NET_SOCK_ERR_CONN_SIGNAL_TIMEOUT:
|
|
case NET_SOCK_ERR_CONN_FAIL:
|
|
case NET_SOCK_ERR_FAULT:
|
|
case NET_CONN_ERR_INVALID_CONN:
|
|
case NET_CONN_ERR_NOT_USED:
|
|
done = DEF_YES;
|
|
p_conn->SockID = NET_SOCK_ID_NONE;
|
|
break;
|
|
|
|
|
|
case NET_INIT_ERR_NOT_COMPLETED: /* Transitory fault(s); close aborted but MIGHT ... */
|
|
case NET_ERR_FAULT_LOCK_ACQUIRE: /* ... close in a subsequent attempt. */
|
|
break;
|
|
|
|
|
|
default: /* Fatal err. */
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CLOSE_FATAL;
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
|
|
exit:
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcSock_Sel()
|
|
*
|
|
* Description : (1) Check all HTTPc Connection sockets for available resources &/or operations.
|
|
* (2) Set each HTTPc Connection descriptors.
|
|
*
|
|
*
|
|
* Argument(s) : p_conn Pointer to fist item in Connection list or Single Connection pointer.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Select Operation successful.
|
|
* HTTPc_ERR_CONN_INVALID_STATE HTTPc Connection invalid state.
|
|
* HTTPc_ERR_CONN_SOCK_SEL Socket Select operation faulted.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcTask(),
|
|
* HTTPc_ReqSend().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
//接口修改
|
|
/* printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__); */
|
|
void HTTPcSock_Sel(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
HTTPc_CONN *p_conn_tmp;
|
|
NET_SOCK_TIMEOUT sock_timeout;
|
|
NET_SOCK_TIMEOUT *p_sock_timeout;
|
|
NET_SOCK_DESC sock_desc_rd;
|
|
NET_SOCK_DESC sock_desc_wr;
|
|
NET_SOCK_DESC sock_desc_err;
|
|
NET_SOCK_QTY sock_nbr_max;
|
|
NET_SOCK_QTY sock_nbr_rdy;
|
|
CPU_INT08U state_family;
|
|
NET_ERR err_net;
|
|
CPU_BOOLEAN rx_data;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
HTTPc_WEBSOCK *p_ws;
|
|
#endif
|
|
|
|
/* ---------------- PREPARE SOCK DESC ----------------- */
|
|
NET_SOCK_DESC_INIT(&sock_desc_rd);
|
|
NET_SOCK_DESC_INIT(&sock_desc_wr);
|
|
NET_SOCK_DESC_INIT(&sock_desc_err);
|
|
|
|
sock_nbr_max = 0;
|
|
p_conn_tmp = p_conn;
|
|
p_sock_timeout = DEF_NULL;
|
|
sock_timeout.timeout_sec = 0;
|
|
sock_timeout.timeout_us = HTTPc_SOCK_SEL_TIMEOUT_MS * DEF_TIME_NBR_uS_PER_SEC / DEF_TIME_NBR_mS_PER_SEC;
|
|
|
|
while (p_conn_tmp != DEF_NULL) {
|
|
|
|
if (p_conn_tmp->SockID != NET_SOCK_ID_NONE) {
|
|
printf("p_conn_tmp->SockID,%d", p_conn_tmp->SockID);
|
|
state_family = HTTPc_CONN_STATE_FAMILY_MASK & p_conn_tmp->State;
|
|
switch (state_family) {
|
|
case HTTPc_CONN_STATE_FLOW_FAMILY:
|
|
p_sock_timeout = &sock_timeout;
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_REQ_FAMILY:
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_wr);
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_RESP_FAMILY:
|
|
rx_data = DEF_BIT_IS_SET(p_conn->RespFlags, HTTPc_FLAG_RESP_RX_MORE_DATA);
|
|
if (rx_data == DEF_NO) {
|
|
p_sock_timeout = &sock_timeout;
|
|
}
|
|
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_rd);
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
case HTTPc_CONN_STATE_WEBSOCK_FAMILY:
|
|
p_ws = p_conn_tmp->WebSockPtr;
|
|
if (p_ws->TxMsgListHeadPtr != DEF_NULL) {
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_wr);
|
|
}
|
|
|
|
rx_data = DEF_BIT_IS_SET(p_conn->RespFlags, HTTPc_FLAG_RESP_RX_MORE_DATA);
|
|
if (rx_data == DEF_NO) {
|
|
p_sock_timeout = &sock_timeout;
|
|
}
|
|
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_rd);
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
#endif
|
|
default:
|
|
*p_err = HTTPc_ERR_CONN_INVALID_STATE;
|
|
goto exit;
|
|
}
|
|
p_conn_tmp->SockFlags = HTTPc_FLAG_NONE;
|
|
if (sock_nbr_max <= p_conn_tmp->SockID) { /* Update highest sock nbr. */
|
|
sock_nbr_max = p_conn_tmp->SockID + 1;
|
|
}
|
|
}
|
|
p_conn_tmp = p_conn_tmp->NextPtr;
|
|
}
|
|
|
|
if (sock_nbr_max == 0u) {
|
|
p_sock_timeout = &sock_timeout;
|
|
}
|
|
/* -------------------- SOCK SEL ---------------------- */
|
|
|
|
|
|
/*********************************调用底层的tcp/ip********************************************/
|
|
sock_nbr_rdy = NetSock_Sel(sock_nbr_max,
|
|
&sock_desc_rd,
|
|
&sock_desc_wr,
|
|
&sock_desc_err,
|
|
p_sock_timeout,
|
|
&err_net);
|
|
switch (err_net) {
|
|
case NET_SOCK_ERR_NONE:
|
|
case NET_SOCK_ERR_TIMEOUT:
|
|
break;
|
|
|
|
|
|
default:
|
|
*p_err = HTTPc_ERR_CONN_SOCK_SEL;
|
|
goto exit;
|
|
}
|
|
|
|
if (sock_nbr_rdy > 0) {
|
|
p_conn_tmp = p_conn;
|
|
while (p_conn_tmp != DEF_NULL) {
|
|
if (p_conn_tmp->SockID != NET_SOCK_ID_NONE) {
|
|
|
|
state_family = HTTPc_CONN_STATE_FAMILY_MASK & p_conn_tmp->State;
|
|
switch (state_family) {
|
|
case HTTPc_CONN_STATE_FLOW_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_REQ_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_wr)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_WR);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_RESP_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_rd)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_RD);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
case HTTPc_CONN_STATE_WEBSOCK_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_wr)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_WR);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_rd)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_RD);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
*p_err = HTTPc_ERR_CONN_INVALID_STATE;
|
|
goto exit;
|
|
}
|
|
}
|
|
p_conn_tmp = p_conn_tmp->NextPtr;
|
|
}
|
|
}
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
exit:
|
|
return;
|
|
}
|
|
|
|
|
|
//原来的接口
|
|
void HTTPcSock_Sel_old(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__);
|
|
HTTPc_CONN *p_conn_tmp;
|
|
NET_SOCK_TIMEOUT sock_timeout;
|
|
NET_SOCK_TIMEOUT *p_sock_timeout;
|
|
NET_SOCK_DESC sock_desc_rd;
|
|
NET_SOCK_DESC sock_desc_wr;
|
|
NET_SOCK_DESC sock_desc_err;
|
|
NET_SOCK_QTY sock_nbr_max;
|
|
NET_SOCK_QTY sock_nbr_rdy;
|
|
CPU_INT08U state_family;
|
|
NET_ERR err_net;
|
|
CPU_BOOLEAN rx_data;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
HTTPc_WEBSOCK *p_ws;
|
|
#endif
|
|
|
|
/* ---------------- PREPARE SOCK DESC ----------------- */
|
|
NET_SOCK_DESC_INIT(&sock_desc_rd);
|
|
NET_SOCK_DESC_INIT(&sock_desc_wr);
|
|
NET_SOCK_DESC_INIT(&sock_desc_err);
|
|
|
|
sock_nbr_max = 0;
|
|
p_conn_tmp = p_conn;
|
|
p_sock_timeout = DEF_NULL;
|
|
sock_timeout.timeout_sec = 0;
|
|
sock_timeout.timeout_us = HTTPc_SOCK_SEL_TIMEOUT_MS * DEF_TIME_NBR_uS_PER_SEC / DEF_TIME_NBR_mS_PER_SEC;
|
|
|
|
while (p_conn_tmp != DEF_NULL) {
|
|
|
|
if (p_conn_tmp->SockID != NET_SOCK_ID_NONE) {
|
|
printf("p_conn_tmp->SockID,%d", p_conn_tmp->SockID);
|
|
state_family = HTTPc_CONN_STATE_FAMILY_MASK & p_conn_tmp->State;
|
|
switch (state_family) {
|
|
case HTTPc_CONN_STATE_FLOW_FAMILY:
|
|
p_sock_timeout = &sock_timeout;
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_REQ_FAMILY:
|
|
printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__);
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_wr);
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_RESP_FAMILY:
|
|
printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__);
|
|
rx_data = DEF_BIT_IS_SET(p_conn->RespFlags, HTTPc_FLAG_RESP_RX_MORE_DATA);
|
|
if (rx_data == DEF_NO) {
|
|
p_sock_timeout = &sock_timeout;
|
|
}
|
|
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_rd);
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
case HTTPc_CONN_STATE_WEBSOCK_FAMILY:
|
|
printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__);
|
|
p_ws = p_conn_tmp->WebSockPtr;
|
|
if (p_ws->TxMsgListHeadPtr != DEF_NULL) {
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_wr);
|
|
}
|
|
|
|
rx_data = DEF_BIT_IS_SET(p_conn->RespFlags, HTTPc_FLAG_RESP_RX_MORE_DATA);
|
|
if (rx_data == DEF_NO) {
|
|
p_sock_timeout = &sock_timeout;
|
|
}
|
|
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_rd);
|
|
NET_SOCK_DESC_SET(p_conn_tmp->SockID, &sock_desc_err);
|
|
break;
|
|
#endif
|
|
default:
|
|
printf(">>>>>>>>>>>>----------------------->>>>>>>>>>>>>%s, %d", __FUNCTION__, __LINE__);
|
|
*p_err = HTTPc_ERR_CONN_INVALID_STATE;
|
|
goto exit;
|
|
}
|
|
p_conn_tmp->SockFlags = HTTPc_FLAG_NONE;
|
|
if (sock_nbr_max <= p_conn_tmp->SockID) { /* Update highest sock nbr. */
|
|
sock_nbr_max = p_conn_tmp->SockID + 1;
|
|
}
|
|
}
|
|
p_conn_tmp = p_conn_tmp->NextPtr;
|
|
}
|
|
|
|
if (sock_nbr_max == 0u) {
|
|
p_sock_timeout = &sock_timeout;
|
|
}
|
|
/* -------------------- SOCK SEL ---------------------- */
|
|
sock_nbr_rdy = NetSock_Sel(sock_nbr_max,
|
|
&sock_desc_rd,
|
|
&sock_desc_wr,
|
|
&sock_desc_err,
|
|
p_sock_timeout,
|
|
&err_net);
|
|
switch (err_net) {
|
|
case NET_SOCK_ERR_NONE:
|
|
case NET_SOCK_ERR_TIMEOUT:
|
|
break;
|
|
|
|
|
|
default:
|
|
*p_err = HTTPc_ERR_CONN_SOCK_SEL;
|
|
goto exit;
|
|
}
|
|
|
|
if (sock_nbr_rdy > 0) {
|
|
p_conn_tmp = p_conn;
|
|
while (p_conn_tmp != DEF_NULL) {
|
|
if (p_conn_tmp->SockID != NET_SOCK_ID_NONE) {
|
|
|
|
state_family = HTTPc_CONN_STATE_FAMILY_MASK & p_conn_tmp->State;
|
|
switch (state_family) {
|
|
case HTTPc_CONN_STATE_FLOW_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_REQ_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_wr)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_WR);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_RESP_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_rd)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_RD);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
case HTTPc_CONN_STATE_WEBSOCK_FAMILY:
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_wr)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_WR);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_rd)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_RD);
|
|
}
|
|
if (NET_SOCK_DESC_IS_SET(p_conn_tmp->SockID, &sock_desc_err)) {
|
|
DEF_BIT_SET(p_conn_tmp->SockFlags, HTTPc_FLAG_SOCK_RDY_ERR);
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
*p_err = HTTPc_ERR_CONN_INVALID_STATE;
|
|
goto exit;
|
|
}
|
|
}
|
|
p_conn_tmp = p_conn_tmp->NextPtr;
|
|
}
|
|
}
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
exit:
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcSock_IsRxClosed()
|
|
*
|
|
* Description : Check if the TCP Connection is half closed (FIN flag was received from Server).
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Close status of socket successfully checked.
|
|
*
|
|
* ------------ RETURNED BY NetSock_GetConnTransportID() ------------
|
|
* See NetSock_GetConnTransportID() for additional return error codes.
|
|
*
|
|
* Return(s) : DEF_YES, if TCP connection is half-closed.
|
|
* DEF_NO, otherwise.
|
|
*
|
|
* Caller(s) : HTTPcTask_Handler().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
CPU_BOOLEAN HTTPcSock_IsRxClosed(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
NET_TCP_CONN_ID conn_id_tcp;
|
|
NET_TCP_CONN_STATE state;
|
|
CPU_BOOLEAN result;
|
|
NET_ERR err_net;
|
|
|
|
|
|
result = DEF_NO;
|
|
|
|
conn_id_tcp = NetSock_GetConnTransportID(p_conn->SockID, &err_net);
|
|
if (err_net != NET_SOCK_ERR_NONE) {
|
|
result = DEF_YES;
|
|
goto exit;
|
|
}
|
|
|
|
state = NetTCP_ConnStateGet(conn_id_tcp);
|
|
|
|
if (state == NET_TCP_CONN_STATE_CLOSE_WAIT) {
|
|
result = DEF_YES;
|
|
}
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
|
|
exit:
|
|
return (result);
|
|
}
|
|
|
|
|