summaryrefslogtreecommitdiff
path: root/components/net/sal_socket
diff options
context:
space:
mode:
authorlongtengmcu <[email protected]>2020-11-22 12:36:07 +0800
committerlongtengmcu <[email protected]>2020-11-22 12:36:07 +0800
commitaac5e9da4cc14f88771b3cf34d24e44d7e545ea5 (patch)
tree19ee4946ed39041f73b99d5a8d616b124a57647c /components/net/sal_socket
parent9dc0bbb814dff797eabb1cbcc133410c75471cd0 (diff)
1、web socket请求数据从服务器回来时,服务器会关闭连接,此时AT socket在读取返回的数据时不应该判断socket为连接的状态
2、sal socket在支持多网卡时,sal_getaddrinfo从A网卡获取的地址信息,在sal_freeaddrinfo释放时必须由A网卡进行释放
Diffstat (limited to 'components/net/sal_socket')
-rw-r--r--components/net/sal_socket/src/sal_socket.c72
1 files changed, 58 insertions, 14 deletions
diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c
index ec0519df02..bf88cfa751 100644
--- a/components/net/sal_socket/src/sal_socket.c
+++ b/components/net/sal_socket/src/sal_socket.c
@@ -41,6 +41,13 @@ struct sal_socket_table
struct sal_socket **sockets;
};
+/* record the netdev and res table*/
+struct sal_netdev_res_table
+{
+ struct addrinfo *res;
+ struct netdev *netdev;
+};
+
#ifdef SAL_USING_TLS
/* The global TLS protocol options */
static struct sal_proto_tls *proto_tls;
@@ -50,6 +57,7 @@ static struct sal_proto_tls *proto_tls;
static struct sal_socket_table socket_table;
static struct rt_mutex sal_core_lock;
static rt_bool_t init_ok = RT_FALSE;
+static struct sal_netdev_res_table sal_dev_res_tbl[SAL_SOCKETS_NUM];
#define IS_SOCKET_PROTO_TLS(sock) (((sock)->protocol == PROTOCOL_TLS) || \
((sock)->protocol == PROTOCOL_DTLS))
@@ -90,6 +98,11 @@ do {
((pf) = (struct sal_proto_family *) (netdev)->sal_user_data) != RT_NULL && \
(pf)->netdb_ops->ops) \
+#define SAL_NETDBOPS_VALID(netdev, pf, ops) \
+ ((netdev) && \
+ ((pf) = (struct sal_proto_family *) (netdev)->sal_user_data) != RT_NULL && \
+ (pf)->netdb_ops->ops) \
+
/**
* SAL (Socket Abstraction Layer) initialize.
*
@@ -116,6 +129,9 @@ int sal_init(void)
return -1;
}
+ /*init the dev_res table */
+ rt_memset(sal_dev_res_tbl, 0, sizeof(sal_dev_res_tbl));
+
/* create sal socket lock */
rt_mutex_init(&sal_core_lock, "sal_lock", RT_IPC_FLAG_FIFO);
@@ -1086,10 +1102,12 @@ int sal_getaddrinfo(const char *nodename,
{
struct netdev *netdev = netdev_default;
struct sal_proto_family *pf;
+ int ret = 0;
+ rt_uint32_t i = 0;
if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, getaddrinfo))
{
- return pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
+ ret = pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
}
else
{
@@ -1097,30 +1115,56 @@ int sal_getaddrinfo(const char *nodename,
netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP);
if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, getaddrinfo))
{
- return pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
+ ret = pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
+ }
+ else
+ {
+ ret = -1;
}
}
- return -1;
+ if(ret == RT_EOK)
+ {
+ /*record the netdev and res*/
+ for(i = 0; i < SAL_SOCKETS_NUM; i++)
+ {
+ if(sal_dev_res_tbl[i].res == RT_NULL)
+ {
+ sal_dev_res_tbl[i].res = *res;
+ sal_dev_res_tbl[i].netdev = netdev;
+ break;
+ }
+ }
+
+ RT_ASSERT((i < SAL_SOCKETS_NUM));
+
+ }
+
+ return ret;
}
void sal_freeaddrinfo(struct addrinfo *ai)
{
- struct netdev *netdev = netdev_default;
- struct sal_proto_family *pf;
+ struct netdev *netdev = RT_NULL;
+ struct sal_proto_family *pf = RT_NULL;
+ rt_uint32_t i = 0;
- if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, freeaddrinfo))
- {
- pf->netdb_ops->freeaddrinfo(ai);
- }
- else
+ /*when use the multi netdev, it must free the ai use the getaddrinfo netdev */
+ for(i = 0; i < SAL_SOCKETS_NUM; i++)
{
- /* get the first network interface device with up status */
- netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP);
- if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, freeaddrinfo))
+ if(sal_dev_res_tbl[i].res == ai)
{
- pf->netdb_ops->freeaddrinfo(ai);
+ netdev = sal_dev_res_tbl[i].netdev;
+ sal_dev_res_tbl[i].res = RT_NULL;
+ sal_dev_res_tbl[i].netdev = RT_NULL;
+ break;
}
}
+ RT_ASSERT((i < SAL_SOCKETS_NUM));
+
+ if (SAL_NETDBOPS_VALID(netdev, pf, freeaddrinfo))
+ {
+ pf->netdb_ops->freeaddrinfo(ai);
+ }
}