diff options
| author | Bernard Xiong <[email protected]> | 2020-12-09 17:26:47 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-12-09 17:26:47 +0800 |
| commit | 86756c0d4cc73f2ec863c0db16c3b4265fcc3ad6 (patch) | |
| tree | b6e6e47ee307cb0a4206852eac58fd8dc2984ddf /components/net/sal_socket | |
| parent | 3123e626d555f46af51c6830c1e03c33568e2bd7 (diff) | |
| parent | 962acc3313d611a886b764135db01572e0206c4d (diff) | |
Merge pull request #4065 from longtengmcu/master
fix at socket and sal_socket bug
Diffstat (limited to 'components/net/sal_socket')
| -rw-r--r-- | components/net/sal_socket/src/sal_socket.c | 72 |
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 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); + } } |
