Skip to content

Commit 86756c0

Browse files
authored
Merge pull request #4065 from longtengmcu/master
fix at socket and sal_socket bug
2 parents 3123e62 + 962acc3 commit 86756c0

File tree

3 files changed

+77
-34
lines changed

3 files changed

+77
-34
lines changed

components/net/at/at_socket/at_socket.c

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -821,24 +821,17 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f
821821
goto __exit;
822822
}
823823
else
824-
{
825-
if (sock->state == AT_SOCKET_CONNECT)
826-
{
827-
/* get receive buffer to receiver ring buffer */
828-
rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER);
829-
recv_len = at_recvpkt_get(&(sock->recvpkt_list), (char *) mem, len);
830-
rt_mutex_release(sock->recv_lock);
831-
if (recv_len > 0)
832-
{
833-
break;
834-
}
835-
}
836-
else
824+
{
825+
826+
/* get receive buffer to receiver ring buffer */
827+
rt_mutex_take(sock->recv_lock, RT_WAITING_FOREVER);
828+
recv_len = at_recvpkt_get(&(sock->recvpkt_list), (char *) mem, len);
829+
rt_mutex_release(sock->recv_lock);
830+
if (recv_len > 0)
837831
{
838-
LOG_D("received data exit, current socket (%d) is closed by remote.", socket);
839-
result = 0;
840-
goto __exit;
832+
break;
841833
}
834+
842835
}
843836
}
844837

components/net/netdev/src/netdev.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ void netdev_low_level_set_dhcp_status(struct netdev *netdev, rt_bool_t is_enable
856856
static void netdev_list_if(void)
857857
{
858858
#define NETDEV_IFCONFIG_MAC_MAX_LEN 6
859-
#define NETDEV_IFCONFIG_IEMI_MAX_LEN 8
859+
#define NETDEV_IFCONFIG_IMEI_MAX_LEN 8
860860

861861
rt_ubase_t index;
862862
rt_slist_t *node = RT_NULL;
@@ -894,9 +894,15 @@ static void netdev_list_if(void)
894894
{
895895
/* two numbers are displayed at one time*/
896896
if (netdev->hwaddr[index] < 10 && index != netdev->hwaddr_len - 1)
897-
rt_kprintf("0");
898-
899-
rt_kprintf("%d", netdev->hwaddr[index]);
897+
{
898+
rt_kprintf("%02d", netdev->hwaddr[index]);
899+
}
900+
else
901+
{
902+
rt_kprintf("%d", netdev->hwaddr[index]);
903+
}
904+
905+
900906
}
901907
}
902908

components/net/sal_socket/src/sal_socket.c

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ struct sal_socket_table
4141
struct sal_socket **sockets;
4242
};
4343

44+
/* record the netdev and res table*/
45+
struct sal_netdev_res_table
46+
{
47+
struct addrinfo *res;
48+
struct netdev *netdev;
49+
};
50+
4451
#ifdef SAL_USING_TLS
4552
/* The global TLS protocol options */
4653
static struct sal_proto_tls *proto_tls;
@@ -50,6 +57,7 @@ static struct sal_proto_tls *proto_tls;
5057
static struct sal_socket_table socket_table;
5158
static struct rt_mutex sal_core_lock;
5259
static rt_bool_t init_ok = RT_FALSE;
60+
static struct sal_netdev_res_table sal_dev_res_tbl[SAL_SOCKETS_NUM];
5361

5462
#define IS_SOCKET_PROTO_TLS(sock) (((sock)->protocol == PROTOCOL_TLS) || \
5563
((sock)->protocol == PROTOCOL_DTLS))
@@ -90,6 +98,11 @@ do {
9098
((pf) = (struct sal_proto_family *) (netdev)->sal_user_data) != RT_NULL && \
9199
(pf)->netdb_ops->ops) \
92100

101+
#define SAL_NETDBOPS_VALID(netdev, pf, ops) \
102+
((netdev) && \
103+
((pf) = (struct sal_proto_family *) (netdev)->sal_user_data) != RT_NULL && \
104+
(pf)->netdb_ops->ops) \
105+
93106
/**
94107
* SAL (Socket Abstraction Layer) initialize.
95108
*
@@ -116,6 +129,9 @@ int sal_init(void)
116129
return -1;
117130
}
118131

132+
/*init the dev_res table */
133+
rt_memset(sal_dev_res_tbl, 0, sizeof(sal_dev_res_tbl));
134+
119135
/* create sal socket lock */
120136
rt_mutex_init(&sal_core_lock, "sal_lock", RT_IPC_FLAG_FIFO);
121137

@@ -1087,41 +1103,69 @@ int sal_getaddrinfo(const char *nodename,
10871103
{
10881104
struct netdev *netdev = netdev_default;
10891105
struct sal_proto_family *pf;
1106+
int ret = 0;
1107+
rt_uint32_t i = 0;
10901108

10911109
if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, getaddrinfo))
10921110
{
1093-
return pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
1111+
ret = pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
10941112
}
10951113
else
10961114
{
10971115
/* get the first network interface device with up status */
10981116
netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP);
10991117
if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, getaddrinfo))
11001118
{
1101-
return pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
1119+
ret = pf->netdb_ops->getaddrinfo(nodename, servname, hints, res);
1120+
}
1121+
else
1122+
{
1123+
ret = -1;
11021124
}
11031125
}
11041126

1105-
return -1;
1127+
if(ret == RT_EOK)
1128+
{
1129+
/*record the netdev and res*/
1130+
for(i = 0; i < SAL_SOCKETS_NUM; i++)
1131+
{
1132+
if(sal_dev_res_tbl[i].res == RT_NULL)
1133+
{
1134+
sal_dev_res_tbl[i].res = *res;
1135+
sal_dev_res_tbl[i].netdev = netdev;
1136+
break;
1137+
}
1138+
}
1139+
1140+
RT_ASSERT((i < SAL_SOCKETS_NUM));
1141+
1142+
}
1143+
1144+
return ret;
11061145
}
11071146

11081147
void sal_freeaddrinfo(struct addrinfo *ai)
11091148
{
1110-
struct netdev *netdev = netdev_default;
1111-
struct sal_proto_family *pf;
1149+
struct netdev *netdev = RT_NULL;
1150+
struct sal_proto_family *pf = RT_NULL;
1151+
rt_uint32_t i = 0;
11121152

1113-
if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, freeaddrinfo))
1114-
{
1115-
pf->netdb_ops->freeaddrinfo(ai);
1116-
}
1117-
else
1153+
/*when use the multi netdev, it must free the ai use the getaddrinfo netdev */
1154+
for(i = 0; i < SAL_SOCKETS_NUM; i++)
11181155
{
1119-
/* get the first network interface device with up status */
1120-
netdev = netdev_get_first_by_flags(NETDEV_FLAG_UP);
1121-
if (SAL_NETDEV_NETDBOPS_VALID(netdev, pf, freeaddrinfo))
1156+
if(sal_dev_res_tbl[i].res == ai)
11221157
{
1123-
pf->netdb_ops->freeaddrinfo(ai);
1158+
netdev = sal_dev_res_tbl[i].netdev;
1159+
sal_dev_res_tbl[i].res = RT_NULL;
1160+
sal_dev_res_tbl[i].netdev = RT_NULL;
1161+
break;
11241162
}
11251163
}
1164+
RT_ASSERT((i < SAL_SOCKETS_NUM));
1165+
1166+
if (SAL_NETDBOPS_VALID(netdev, pf, freeaddrinfo))
1167+
{
1168+
pf->netdb_ops->freeaddrinfo(ai);
1169+
}
11261170
}
11271171

0 commit comments

Comments
 (0)