summaryrefslogtreecommitdiff
path: root/components/net
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2020-12-09 17:26:47 +0800
committerGitHub <[email protected]>2020-12-09 17:26:47 +0800
commit86756c0d4cc73f2ec863c0db16c3b4265fcc3ad6 (patch)
treeb6e6e47ee307cb0a4206852eac58fd8dc2984ddf /components/net
parent3123e626d555f46af51c6830c1e03c33568e2bd7 (diff)
parent962acc3313d611a886b764135db01572e0206c4d (diff)
Merge pull request #4065 from longtengmcu/master
fix at socket and sal_socket bug
Diffstat (limited to 'components/net')
-rw-r--r--components/net/at/at_socket/at_socket.c25
-rw-r--r--components/net/netdev/src/netdev.c14
-rw-r--r--components/net/sal_socket/src/sal_socket.c72
3 files changed, 77 insertions, 34 deletions
diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c
index 666b0f509e..ce8559f129 100644
--- a/components/net/at/at_socket/at_socket.c
+++ b/components/net/at/at_socket/at_socket.c
@@ -821,24 +821,17 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f
goto __exit;
}
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);
- rt_mutex_release(sock->recv_lock);
- if (recv_len > 0)
- {
- break;
- }
- }
- else
+ {
+
+ /* 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);
+ rt_mutex_release(sock->recv_lock);
+ if (recv_len > 0)
{
- LOG_D("received data exit, current socket (%d) is closed by remote.", socket);
- result = 0;
- goto __exit;
+ break;
}
+
}
}
diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c
index aa43d8d3db..646d2dfdd1 100644
--- a/components/net/netdev/src/netdev.c
+++ b/components/net/netdev/src/netdev.c
@@ -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,9 +894,15 @@ 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("%d", netdev->hwaddr[index]);
+ {
+ rt_kprintf("%02d", netdev->hwaddr[index]);
+ }
+ else
+ {
+ rt_kprintf("%d", netdev->hwaddr[index]);
+ }
+
+
}
}
diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c
index 1e05aded59..c3e1c15749 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);
@@ -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))
- {
- 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);
+ }
}