Merge pull request #4065 from longtengmcu/master
fix at socket and sal_socket bug
This commit is contained in:
commit
86756c0d4c
|
@ -822,8 +822,7 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f
|
|||
}
|
||||
else
|
||||
{
|
||||
if (sock->state == AT_SOCKET_CONNECT)
|
||||
{
|
||||
|
||||
/* get receive buffer to receiver ring buffer */
|
||||
rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER);
|
||||
recv_len = at_recvpkt_get(&(sock->recvpkt_list), (char *) mem, len);
|
||||
|
@ -832,13 +831,7 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f
|
|||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_D("received data exit, current socket (%d) is closed by remote.", socket);
|
||||
result = 0;
|
||||
goto __exit;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -856,7 +856,7 @@ void netdev_low_level_set_dhcp_status(struct netdev *netdev, rt_bool_t is_enable
|
|||
static void netdev_list_if(void)
|
||||
{
|
||||
#define NETDEV_IFCONFIG_MAC_MAX_LEN 6
|
||||
#define NETDEV_IFCONFIG_IEMI_MAX_LEN 8
|
||||
#define NETDEV_IFCONFIG_IMEI_MAX_LEN 8
|
||||
|
||||
rt_ubase_t index;
|
||||
rt_slist_t *node = RT_NULL;
|
||||
|
@ -894,10 +894,16 @@ static void netdev_list_if(void)
|
|||
{
|
||||
/* two numbers are displayed at one time*/
|
||||
if (netdev->hwaddr[index] < 10 && index != netdev->hwaddr_len - 1)
|
||||
rt_kprintf("0");
|
||||
|
||||
{
|
||||
rt_kprintf("%02d", netdev->hwaddr[index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("%d", netdev->hwaddr[index]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
rt_kprintf("\nFLAGS:");
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
pf->netdb_ops->freeaddrinfo(ai);
|
||||
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;
|
||||
}
|
||||
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))
|
||||
}
|
||||
RT_ASSERT((i < SAL_SOCKETS_NUM));
|
||||
|
||||
if (SAL_NETDBOPS_VALID(netdev, pf, freeaddrinfo))
|
||||
{
|
||||
pf->netdb_ops->freeaddrinfo(ai);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue