Merge pull request #4065 from longtengmcu/master

fix at socket and sal_socket bug
This commit is contained in:
Bernard Xiong
2020-12-09 17:26:47 +08:00
committed by GitHub
3 changed files with 78 additions and 35 deletions
+59 -15
View File
@@ -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);
@@ -1087,10 +1103,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
{
@@ -1098,30 +1116,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))
/*when use the multi netdev, it must free the ai use the getaddrinfo netdev */
for(i = 0; i < SAL_SOCKETS_NUM; i++)
{
if(sal_dev_res_tbl[i].res == 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);
}
else
{
/* 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))
{
pf->netdb_ops->freeaddrinfo(ai);
}
}
}