未验证 提交 9fdd46fa 编写于 作者: B Bernard Xiong 提交者: GitHub

Merge pull request #1737 from chenyong111/master

Add query and unregistered protocol family functions,format code
...@@ -36,10 +36,9 @@ ...@@ -36,10 +36,9 @@
#ifdef DBG_SECTION_NAME #ifdef DBG_SECTION_NAME
#undef DBG_SECTION_NAME #undef DBG_SECTION_NAME
#define DBG_SECTION_NAME "[AT_SOC] " #define DBG_SECTION_NAME "AT_SOC"
#endif #endif
#define HTONS_PORT(x) ((((x) & 0x00ffUL) << 8) | (((x) & 0xff00UL) >> 8)) #define HTONS_PORT(x) ((((x) & 0x00ffUL) << 8) | (((x) & 0xff00UL) >> 8))
#define NIPQUAD(addr) \ #define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \ ((unsigned char *)&addr)[0], \
...@@ -89,7 +88,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length) ...@@ -89,7 +88,7 @@ static size_t at_recvpkt_put(rt_slist_t *rlist, const char *ptr, size_t length)
at_recv_pkt_t pkt; at_recv_pkt_t pkt;
pkt = (at_recv_pkt_t) rt_calloc(1, sizeof(struct at_recv_pkt)); pkt = (at_recv_pkt_t) rt_calloc(1, sizeof(struct at_recv_pkt));
if (!pkt) if (pkt == RT_NULL)
{ {
LOG_E("No memory for receive packet table!"); LOG_E("No memory for receive packet table!");
return 0; return 0;
...@@ -340,7 +339,7 @@ int at_socket(int domain, int type, int protocol) ...@@ -340,7 +339,7 @@ int at_socket(int domain, int type, int protocol)
/* allocate and initialize a new AT socket */ /* allocate and initialize a new AT socket */
sock = alloc_socket(); sock = alloc_socket();
if(!sock) if(sock == RT_NULL)
{ {
LOG_E("Allocate a new AT socket failed!"); LOG_E("Allocate a new AT socket failed!");
return RT_NULL; return RT_NULL;
...@@ -381,14 +380,16 @@ int at_closesocket(int socket) ...@@ -381,14 +380,16 @@ int at_closesocket(int socket)
struct at_socket *sock; struct at_socket *sock;
enum at_socket_state last_state; enum at_socket_state last_state;
if (!at_dev_ops) if (at_dev_ops == RT_NULL)
{ {
LOG_E("Please register AT device socket options first!");
return -1; return -1;
} }
if ((sock = at_get_socket(socket)) == RT_NULL) sock = at_get_socket(socket);
if (sock == RT_NULL)
{
return -1; return -1;
}
last_state = sock->state; last_state = sock->state;
...@@ -410,14 +411,16 @@ int at_shutdown(int socket, int how) ...@@ -410,14 +411,16 @@ int at_shutdown(int socket, int how)
{ {
struct at_socket *sock; struct at_socket *sock;
if (!at_dev_ops) if (at_dev_ops == RT_NULL)
{ {
LOG_E("Please register AT device socket options first!");
return -1; return -1;
} }
if ((sock = at_get_socket(socket)) == RT_NULL) sock = at_get_socket(socket);
if (sock == RT_NULL)
{
return -1; return -1;
}
if (sock->state == AT_SOCKET_CONNECT) if (sock->state == AT_SOCKET_CONNECT)
{ {
...@@ -434,7 +437,9 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen) ...@@ -434,7 +437,9 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen)
{ {
if (at_get_socket(socket) == RT_NULL) if (at_get_socket(socket) == RT_NULL)
{
return -1; return -1;
}
return 0; return 0;
} }
...@@ -470,7 +475,8 @@ static void at_recv_notice_cb(int socket, at_socket_evt_t event, const char *buf ...@@ -470,7 +475,8 @@ static void at_recv_notice_cb(int socket, at_socket_evt_t event, const char *buf
RT_ASSERT(bfsz); RT_ASSERT(bfsz);
RT_ASSERT(event == AT_SOCKET_EVT_RECV); RT_ASSERT(event == AT_SOCKET_EVT_RECV);
if ((sock = at_get_socket(socket)) == RT_NULL) sock = at_get_socket(socket);
if (sock == RT_NULL)
return ; return ;
/* put receive buffer to receiver packet list */ /* put receive buffer to receiver packet list */
...@@ -506,14 +512,13 @@ int at_connect(int socket, const struct sockaddr *name, socklen_t namelen) ...@@ -506,14 +512,13 @@ int at_connect(int socket, const struct sockaddr *name, socklen_t namelen)
char ipstr[16] = { 0 }; char ipstr[16] = { 0 };
int result = 0; int result = 0;
if (!at_dev_ops) if (at_dev_ops == RT_NULL)
{ {
LOG_E("Please register AT device socket options first!");
return -1; return -1;
} }
sock = at_get_socket(socket); sock = at_get_socket(socket);
if (!sock) if (sock == RT_NULL)
{ {
result = -1; result = -1;
goto __exit; goto __exit;
...@@ -560,21 +565,19 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f ...@@ -560,21 +565,19 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f
int result = 0; int result = 0;
size_t recv_len = 0; size_t recv_len = 0;
if (!mem || len == 0) if (mem == RT_NULL || len == 0)
{ {
LOG_E("AT recvfrom input data or length error!"); LOG_E("AT recvfrom input data or length error!");
result = -1; return -1;
goto __exit;
} }
if (!at_dev_ops) if (at_dev_ops == RT_NULL)
{ {
LOG_E("Please register AT device socket options first!");
return -1; return -1;
} }
sock = at_get_socket(socket); sock = at_get_socket(socket);
if (!sock) if (sock == RT_NULL)
{ {
result = -1; result = -1;
goto __exit; goto __exit;
...@@ -686,14 +689,13 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct ...@@ -686,14 +689,13 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct
struct at_socket *sock; struct at_socket *sock;
int len, result = 0; int len, result = 0;
if (!at_dev_ops) if (at_dev_ops == RT_NULL)
{ {
LOG_E("Please register AT device socket options first!");
result = -1; result = -1;
goto __exit; goto __exit;
} }
if (!data || size == 0) if (data == RT_NULL || size == 0)
{ {
LOG_E("AT sendto input data or size error!"); LOG_E("AT sendto input data or size error!");
result = -1; result = -1;
...@@ -701,7 +703,7 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct ...@@ -701,7 +703,7 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct
} }
sock = at_get_socket(socket); sock = at_get_socket(socket);
if (!sock) if (sock == RT_NULL)
{ {
result = -1; result = -1;
goto __exit; goto __exit;
...@@ -780,14 +782,14 @@ int at_getsockopt(int socket, int level, int optname, void *optval, socklen_t *o ...@@ -780,14 +782,14 @@ int at_getsockopt(int socket, int level, int optname, void *optval, socklen_t *o
struct at_socket *sock; struct at_socket *sock;
int32_t timeout; int32_t timeout;
if (!optval || !optlen) if (optval == RT_NULL || optlen == RT_NULL)
{ {
LOG_E("AT getsocketopt input option value or option length error!"); LOG_E("AT getsocketopt input option value or option length error!");
return -1; return -1;
} }
sock = at_get_socket(socket); sock = at_get_socket(socket);
if (!sock) if (sock == RT_NULL)
{ {
return -1; return -1;
} }
...@@ -827,14 +829,14 @@ int at_setsockopt(int socket, int level, int optname, const void *optval, sockle ...@@ -827,14 +829,14 @@ int at_setsockopt(int socket, int level, int optname, const void *optval, sockle
{ {
struct at_socket *sock; struct at_socket *sock;
if (!optval) if (optval == RT_NULL)
{ {
LOG_E("AT setsockopt input option value error!"); LOG_E("AT setsockopt input option value error!");
return -1; return -1;
} }
sock = at_get_socket(socket); sock = at_get_socket(socket);
if (!sock) if (sock == RT_NULL)
{ {
return -1; return -1;
} }
...@@ -923,15 +925,14 @@ struct hostent *at_gethostbyname(const char *name) ...@@ -923,15 +925,14 @@ struct hostent *at_gethostbyname(const char *name)
static char s_hostname[DNS_MAX_NAME_LENGTH + 1]; static char s_hostname[DNS_MAX_NAME_LENGTH + 1];
size_t idx = 0; size_t idx = 0;
if (!name) if (name == RT_NULL)
{ {
LOG_E("AT gethostbyname input name error!"); LOG_E("AT gethostbyname input name error!");
return RT_NULL; return RT_NULL;
} }
if (!at_dev_ops) if (at_dev_ops == RT_NULL)
{ {
LOG_E("Please register AT device socket options first!");
return RT_NULL; return RT_NULL;
} }
...@@ -983,12 +984,13 @@ int at_getaddrinfo(const char *nodename, const char *servname, ...@@ -983,12 +984,13 @@ int at_getaddrinfo(const char *nodename, const char *servname,
{ {
return EAI_FAIL; return EAI_FAIL;
} }
if (!at_dev_ops) *res = RT_NULL;
if (at_dev_ops == RT_NULL)
{ {
LOG_E("Please register AT device socket options first!");
return EAI_FAIL; return EAI_FAIL;
} }
*res = RT_NULL;
if ((nodename == RT_NULL) && (servname == RT_NULL)) if ((nodename == RT_NULL) && (servname == RT_NULL))
{ {
return EAI_NONAME; return EAI_NONAME;
...@@ -1085,10 +1087,10 @@ int at_getaddrinfo(const char *nodename, const char *servname, ...@@ -1085,10 +1087,10 @@ int at_getaddrinfo(const char *nodename, const char *servname,
struct sockaddr_in *sa4 = (struct sockaddr_in *) sa; struct sockaddr_in *sa4 = (struct sockaddr_in *) sa;
/* set up sockaddr */ /* set up sockaddr */
sa4->sin_addr.s_addr = addr.u_addr.ip4.addr; sa4->sin_addr.s_addr = addr.u_addr.ip4.addr;
sa4->sin_family = AF_AT; sa4->sin_family = AF_INET;
sa4->sin_len = sizeof(struct sockaddr_in); sa4->sin_len = sizeof(struct sockaddr_in);
sa4->sin_port = htons((u16_t )port_nr); sa4->sin_port = htons((u16_t )port_nr);
ai->ai_family = AF_AT; ai->ai_family = AF_INET;
/* set up addrinfo */ /* set up addrinfo */
if (hints != RT_NULL) if (hints != RT_NULL)
...@@ -1114,9 +1116,13 @@ int at_getaddrinfo(const char *nodename, const char *servname, ...@@ -1114,9 +1116,13 @@ int at_getaddrinfo(const char *nodename, const char *servname,
void at_freeaddrinfo(struct addrinfo *ai) void at_freeaddrinfo(struct addrinfo *ai)
{ {
if (ai != RT_NULL) struct addrinfo *next;
while (ai != NULL)
{ {
next = ai->ai_next;
rt_free(ai); rt_free(ai);
ai = next;
} }
} }
......
...@@ -32,6 +32,10 @@ ...@@ -32,6 +32,10 @@
#include <netdb.h> #include <netdb.h>
#include <sys/socket.h> #include <sys/socket.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifndef AT_SOCKET_RECV_BFSZ #ifndef AT_SOCKET_RECV_BFSZ
#define AT_SOCKET_RECV_BFSZ 512 #define AT_SOCKET_RECV_BFSZ 512
#endif #endif
...@@ -144,7 +148,7 @@ void at_scoket_device_register(const struct at_device_ops *ops); ...@@ -144,7 +148,7 @@ void at_scoket_device_register(const struct at_device_ops *ops);
#ifndef RT_USING_SAL #ifndef RT_USING_SAL
#define socket(domain, type, protocol) at_socket(domain, type, protocol) #define socket(domain, type, protocol) at_socket(domain, type, protocol)
#define closescoket(socket) at_closesocket(socket) #define closesocket(socket) at_closesocket(socket)
#define shutdown(socket, how) at_shutdown(socket, how) #define shutdown(socket, how) at_shutdown(socket, how)
#define bind(socket, name, namelen) at_bind(socket, name, namelen) #define bind(socket, name, namelen) at_bind(socket, name, namelen)
#define connect(socket, name, namelen) at_connect(socket, name, namelen) #define connect(socket, name, namelen) at_connect(socket, name, namelen)
...@@ -160,4 +164,8 @@ void at_scoket_device_register(const struct at_device_ops *ops); ...@@ -160,4 +164,8 @@ void at_scoket_device_register(const struct at_device_ops *ops);
#endif /* RT_USING_SAL */ #endif /* RT_USING_SAL */
#ifdef __cplusplus
}
#endif
#endif /* AT_SOCKET_H__ */ #endif /* AT_SOCKET_H__ */
...@@ -27,6 +27,9 @@ ...@@ -27,6 +27,9 @@
#include <rtthread.h> #include <rtthread.h>
#ifdef __cplusplus
extern "C" {
#endif
#define AT_SW_VERSION "0.3.0" #define AT_SW_VERSION "0.3.0"
#define DBG_ENABLE #define DBG_ENABLE
...@@ -251,4 +254,8 @@ void at_port_reset(void); ...@@ -251,4 +254,8 @@ void at_port_reset(void);
void at_port_factory_reset(void); void at_port_factory_reset(void);
#endif #endif
#ifdef __cplusplus
}
#endif
#endif /* __AT_H__ */ #endif /* __AT_H__ */
...@@ -16,6 +16,9 @@ if GetDepend('SAL_USING_LWIP'): ...@@ -16,6 +16,9 @@ if GetDepend('SAL_USING_LWIP'):
if GetDepend('SAL_USING_AT'): if GetDepend('SAL_USING_AT'):
src += Glob('impl/af_inet_at.c') src += Glob('impl/af_inet_at.c')
if GetDepend('SAL_USING_LWIP') or GetDepend('SAL_USING_AT'):
CPPPATH += [cwd + '/impl']
if GetDepend('SAL_USING_POSIX'): if GetDepend('SAL_USING_POSIX'):
src += Glob('dfs_net/*.c') src += Glob('dfs_net/*.c')
......
/*
* File : af_inet.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
* 2018-08-25 ChenYong First version
*/
#ifndef __AF_INET_H__
#define __AF_INET_H__
#include <rtthread.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef SAL_USING_LWIP
/* lwIP protocol family register */
int lwip_inet_init(void);
#endif
#ifdef SAL_USING_AT
/* AT protocol family register */
int at_inet_init(void);
#endif
#ifdef __cplusplus
}
#endif
#endif /* __AF_INET_H__ */
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <sal.h> #include <sal.h>
#include <at_socket.h> #include <at_socket.h>
#include <af_inet.h>
#ifdef SAL_USING_POSIX #ifdef SAL_USING_POSIX
#include <dfs_poll.h> #include <dfs_poll.h>
...@@ -107,6 +108,7 @@ static int at_create(struct sal_socket *socket, int type, int protocol) ...@@ -107,6 +108,7 @@ static int at_create(struct sal_socket *socket, int type, int protocol)
} }
static const struct proto_family at_inet_family_ops = { static const struct proto_family at_inet_family_ops = {
"at",
AF_AT, AF_AT,
AF_INET, AF_INET,
at_create, at_create,
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#endif #endif
#include <sal.h> #include <sal.h>
#include <af_inet.h>
#if LWIP_VERSION < 0x2000000 #if LWIP_VERSION < 0x2000000
#define SELWAIT_T int #define SELWAIT_T int
...@@ -284,6 +285,7 @@ static int inet_create(struct sal_socket *socket, int type, int protocol) ...@@ -284,6 +285,7 @@ static int inet_create(struct sal_socket *socket, int type, int protocol)
} }
static const struct proto_family lwip_inet_family_ops = { static const struct proto_family lwip_inet_family_ops = {
"lwip",
AF_INET, AF_INET,
AF_INET, AF_INET,
inet_create, inet_create,
......
...@@ -26,12 +26,12 @@ ...@@ -26,12 +26,12 @@
#ifndef DFS_NET_H__ #ifndef DFS_NET_H__
#define DFS_NET_H__ #define DFS_NET_H__
#include <dfs_file.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include <dfs_file.h>
const struct dfs_file_ops* dfs_net_get_fops(void); const struct dfs_file_ops* dfs_net_get_fops(void);
int dfs_net_getsocket(int fd); int dfs_net_getsocket(int fd);
......
...@@ -28,6 +28,10 @@ ...@@ -28,6 +28,10 @@
#include <dfs_file.h> #include <dfs_file.h>
#include <rtdevice.h> #include <rtdevice.h>
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED) #if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
typedef uint32_t socklen_t; typedef uint32_t socklen_t;
#endif #endif
...@@ -82,8 +86,9 @@ struct sal_socket ...@@ -82,8 +86,9 @@ struct sal_socket
struct proto_family struct proto_family
{ {
int family; /* primary protocol families type*/ char name[RT_NAME_MAX];
int sec_family; /* secondary protocol families type*/ int family; /* primary protocol families type */
int sec_family; /* secondary protocol families type */
int (*create)(struct sal_socket *sal_socket, int type, int protocol); /* register socket options */ int (*create)(struct sal_socket *sal_socket, int type, int protocol); /* register socket options */
struct hostent* (*gethostbyname) (const char *name); struct hostent* (*gethostbyname) (const char *name);
...@@ -92,10 +97,18 @@ struct proto_family ...@@ -92,10 +97,18 @@ struct proto_family
int (*getaddrinfo) (const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res); int (*getaddrinfo) (const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res);
}; };
/* SAL socket initialization */ /* SAL(Socket Abstraction Layer) initialize */
int sal_init(void); int sal_init(void);
int sal_proto_family_register(const struct proto_family *pf);
struct sal_socket *sal_get_socket(int sock); struct sal_socket *sal_get_socket(int sock);
/* protocol family register and unregister operate */
int sal_proto_family_register(const struct proto_family *pf);
int sal_proto_family_unregister(const struct proto_family *pf);
struct proto_family *sal_proto_family_find(const char *name);
#ifdef __cplusplus
}
#endif
#endif /* SAL_H__ */ #endif /* SAL_H__ */
...@@ -26,6 +26,10 @@ ...@@ -26,6 +26,10 @@
#include "sal_type.h" #include "sal_type.h"
#ifdef __cplusplus
extern "C" {
#endif
/** IPv4 only: set the IP address given as an u32_t */ /** IPv4 only: set the IP address given as an u32_t */
#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) #define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
/** IPv4 only: get the IP address as an u32_t */ /** IPv4 only: get the IP address as an u32_t */
......
...@@ -26,6 +26,10 @@ ...@@ -26,6 +26,10 @@
#include <sal_socket.h> #include <sal_socket.h>
#ifdef __cplusplus
extern "C" {
#endif
#define EAI_NONAME 200 #define EAI_NONAME 200
#define EAI_SERVICE 201 #define EAI_SERVICE 201
#define EAI_FAIL 202 #define EAI_FAIL 202
...@@ -88,4 +92,8 @@ int sal_getaddrinfo(const char *nodename, ...@@ -88,4 +92,8 @@ int sal_getaddrinfo(const char *nodename,
const struct addrinfo *hints, const struct addrinfo *hints,
struct addrinfo **res); struct addrinfo **res);
#ifdef __cplusplus
}
#endif
#endif /* SAL_NETDB_H__ */ #endif /* SAL_NETDB_H__ */
...@@ -27,6 +27,10 @@ ...@@ -27,6 +27,10 @@
#include "sal_ipaddr.h" #include "sal_ipaddr.h"
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED) #if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
typedef uint32_t socklen_t; typedef uint32_t socklen_t;
#endif #endif
...@@ -175,4 +179,8 @@ int sal_socket(int domain, int type, int protocol); ...@@ -175,4 +179,8 @@ int sal_socket(int domain, int type, int protocol);
int sal_closesocket(int socket); int sal_closesocket(int socket);
int sal_ioctlsocket(int socket, long cmd, void *arg); int sal_ioctlsocket(int socket, long cmd, void *arg);
#ifdef __cplusplus
}
#endif
#endif /* SAL_SOCKET_H__ */ #endif /* SAL_SOCKET_H__ */
...@@ -28,6 +28,10 @@ ...@@ -28,6 +28,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef int8_t err_t; typedef int8_t err_t;
typedef uint8_t u8_t; typedef uint8_t u8_t;
typedef int8_t s8_t; typedef int8_t s8_t;
...@@ -37,4 +41,8 @@ typedef uint32_t u32_t; ...@@ -37,4 +41,8 @@ typedef uint32_t u32_t;
typedef int32_t s32_t; typedef int32_t s32_t;
typedef uintptr_t mem_ptr_t; typedef uintptr_t mem_ptr_t;
#ifdef __cplusplus
}
#endif
#endif /* SAL_TYPE_H__ */ #endif /* SAL_TYPE_H__ */
...@@ -38,6 +38,7 @@ int gethostbyname_r(const char *name, struct hostent *ret, char *buf, ...@@ -38,6 +38,7 @@ int gethostbyname_r(const char *name, struct hostent *ret, char *buf,
{ {
return sal_gethostbyname_r(name, ret, buf, buflen, result, h_errnop); return sal_gethostbyname_r(name, ret, buf, buflen, result, h_errnop);
} }
RTM_EXPORT(gethostbyname_r);
void freeaddrinfo(struct addrinfo *ai) void freeaddrinfo(struct addrinfo *ai)
{ {
......
...@@ -50,7 +50,7 @@ static struct rt_mutex sal_core_lock; ...@@ -50,7 +50,7 @@ static struct rt_mutex sal_core_lock;
static rt_bool_t init_ok = RT_FALSE; static rt_bool_t init_ok = RT_FALSE;
/** /**
* SAL (Socket Abstraction Layer) initialization. * SAL (Socket Abstraction Layer) initialize.
* *
* @return result * @return result
* >= 0: initialize success * >= 0: initialize success
...@@ -64,7 +64,7 @@ int sal_init(void) ...@@ -64,7 +64,7 @@ int sal_init(void)
} }
/* clean sal socket table */ /* clean sal socket table */
memset(&socket_table, 0, sizeof(socket_table)); rt_memset(&socket_table, 0, sizeof(socket_table));
/* create sal socket lock */ /* create sal socket lock */
rt_mutex_init(&sal_core_lock, "sal_lock", RT_IPC_FLAG_FIFO); rt_mutex_init(&sal_core_lock, "sal_lock", RT_IPC_FLAG_FIFO);
...@@ -76,12 +76,12 @@ int sal_init(void) ...@@ -76,12 +76,12 @@ int sal_init(void)
INIT_COMPONENT_EXPORT(sal_init); INIT_COMPONENT_EXPORT(sal_init);
/** /**
* this function will register the current protocol family to the global array of protocol families. * This function will register protocol family to the global array of protocol families.
* *
* @param pf protocol families structure * @param pf protocol family object
* *
* @return 0 : protocol families structure index * @return >=0 : protocol family object index
* -1 : the global array of available protocol families is full * -1 : the global array of available protocol families is full
*/ */
int sal_proto_family_register(const struct proto_family *pf) int sal_proto_family_register(const struct proto_family *pf)
{ {
...@@ -91,6 +91,18 @@ int sal_proto_family_register(const struct proto_family *pf) ...@@ -91,6 +91,18 @@ int sal_proto_family_register(const struct proto_family *pf)
/* disable interrupt */ /* disable interrupt */
level = rt_hw_interrupt_disable(); level = rt_hw_interrupt_disable();
/* check protocol family is already registered */
for(idx = 0; idx < SAL_PROTO_FAMILIES_NUM; idx++)
{
if(rt_strcmp(proto_families[idx].name, pf->name) == 0)
{
/* enable interrupt */
rt_hw_interrupt_enable(level);
LOG_E("%s protocol family is already registered!", pf->name);
return -1;
}
}
/* find an empty protocol family entry */ /* find an empty protocol family entry */
for(idx = 0; idx < SAL_PROTO_FAMILIES_NUM && proto_families[idx].create; idx++); for(idx = 0; idx < SAL_PROTO_FAMILIES_NUM && proto_families[idx].create; idx++);
...@@ -99,10 +111,10 @@ int sal_proto_family_register(const struct proto_family *pf) ...@@ -99,10 +111,10 @@ int sal_proto_family_register(const struct proto_family *pf)
{ {
/* enable interrupt */ /* enable interrupt */
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
return -1; return -1;
} }
rt_strncpy(proto_families[idx].name, pf->name, rt_strlen(pf->name));
proto_families[idx].family = pf->family; proto_families[idx].family = pf->family;
proto_families[idx].sec_family = pf->sec_family; proto_families[idx].sec_family = pf->sec_family;
proto_families[idx].create = pf->create; proto_families[idx].create = pf->create;
...@@ -119,11 +131,62 @@ int sal_proto_family_register(const struct proto_family *pf) ...@@ -119,11 +131,62 @@ int sal_proto_family_register(const struct proto_family *pf)
} }
/** /**
* this function will get socket structure by sal socket descriptor * This function removes a previously registered protocol family object.
*
* @param pf protocol family object
*
* @return >=0 : unregister protocol family index
* -1 : unregister failed
*/
int sal_proto_family_unregister(const struct proto_family *pf)
{
int idx = 0;
RT_ASSERT(pf != RT_NULL);
for(idx = 0; idx < SAL_PROTO_FAMILIES_NUM; idx++)
{
if(rt_strcmp(proto_families[idx].name, pf->name) == 0)
{
rt_memset(&proto_families[idx], 0x00, sizeof(struct proto_family));
return idx;
}
}
return -1;
}
/**
* This function will get protocol family by name.
*
* @param name protocol family name
*
* @return protocol family object
*/
struct proto_family *sal_proto_family_find(const char *name)
{
int idx = 0;
RT_ASSERT(name != RT_NULL);
for (idx = 0; idx < SAL_PROTO_FAMILIES_NUM; idx++)
{
if (rt_strcmp(proto_families[idx].name, name) == 0)
{
return &proto_families[idx];
}
}
return RT_NULL;
}
/**
* This function will get sal socket object by sal socket descriptor.
* *
* @param socket sal socket index * @param socket sal socket index
* *
* @return socket structure of the current sal socket index * @return sal socket object of the current sal socket index
*/ */
struct sal_socket *sal_get_socket(int socket) struct sal_socket *sal_get_socket(int socket)
{ {
...@@ -145,7 +208,7 @@ struct sal_socket *sal_get_socket(int socket) ...@@ -145,7 +208,7 @@ struct sal_socket *sal_get_socket(int socket)
} }
/** /**
* this function will lock sal socket. * This function will lock sal socket.
* *
* @note please don't invoke it on ISR. * @note please don't invoke it on ISR.
*/ */
...@@ -161,7 +224,7 @@ static void sal_lock(void) ...@@ -161,7 +224,7 @@ static void sal_lock(void)
} }
/** /**
* this function will lock sal socket. * This function will lock sal socket.
* *
* @note please don't invoke it on ISR. * @note please don't invoke it on ISR.
*/ */
...@@ -171,7 +234,7 @@ static void sal_unlock(void) ...@@ -171,7 +234,7 @@ static void sal_unlock(void)
} }
/** /**
* this function will get protocol family structure by family type * This function will get protocol family structure by family type
* *
* @param family protocol family * @param family protocol family
* *
...@@ -201,17 +264,17 @@ static struct proto_family *get_proto_family(int family) ...@@ -201,17 +264,17 @@ static struct proto_family *get_proto_family(int family)
} }
/** /**
* this function will initialize socket structure and set socket options * This function will initialize sal socket object and set socket options
* *
* @param family protocol family * @param family protocol family
* @param type socket type * @param type socket type
* @param protocol transfer Protocol * @param protocol transfer Protocol
* @param res socket structure address * @param res sal socket object address
* *
* @return 0 : socket initialize success * @return 0 : socket initialize success
* -1 : input the wrong family * -1 : input the wrong family
* -2 : input the wrong socket type * -2 : input the wrong socket type
* -3 : get protocol family structure failed * -3 : get protocol family object failed
* -4 : set socket options failed * -4 : set socket options failed
*/ */
static int socket_init(int family, int type, int protocol, struct sal_socket **res) static int socket_init(int family, int type, int protocol, struct sal_socket **res)
...@@ -234,7 +297,7 @@ static int socket_init(int family, int type, int protocol, struct sal_socket **r ...@@ -234,7 +297,7 @@ static int socket_init(int family, int type, int protocol, struct sal_socket **r
sock->type = type; sock->type = type;
sock->protocol = protocol; sock->protocol = protocol;
/* get socket protocol family structure */ /* get socket protocol family object */
if ((pf = get_proto_family(family)) == RT_NULL) if ((pf = get_proto_family(family)) == RT_NULL)
{ {
return -3; return -3;
...@@ -301,11 +364,6 @@ __result: ...@@ -301,11 +364,6 @@ __result:
} }
/**
* this function will return a empty sal socket structure address
*
* @return sal socket structure address
*/
static int socket_new(void) static int socket_new(void)
{ {
struct sal_socket *sock; struct sal_socket *sock;
...@@ -415,7 +473,7 @@ int sal_shutdown(int socket, int how) ...@@ -415,7 +473,7 @@ int sal_shutdown(int socket, int how)
if (sock->ops->shutdown((int) sock->user_data, how) == 0) if (sock->ops->shutdown((int) sock->user_data, how) == 0)
{ {
memset(sock, 0x00, sizeof(struct sal_socket)); rt_memset(sock, 0x00, sizeof(struct sal_socket));
return 0; return 0;
} }
...@@ -622,7 +680,7 @@ int sal_closesocket(int socket) ...@@ -622,7 +680,7 @@ int sal_closesocket(int socket)
if (sock->ops->closesocket((int) sock->user_data) == 0) if (sock->ops->closesocket((int) sock->user_data) == 0)
{ {
memset(sock, 0x00, sizeof(struct sal_socket)); rt_memset(sock, 0x00, sizeof(struct sal_socket));
return 0; return 0;
} }
...@@ -669,12 +727,17 @@ int sal_poll(struct dfs_fd *file, struct rt_pollreq *req) ...@@ -669,12 +727,17 @@ int sal_poll(struct dfs_fd *file, struct rt_pollreq *req)
struct hostent *sal_gethostbyname(const char *name) struct hostent *sal_gethostbyname(const char *name)
{ {
int i; int i;
struct hostent *hst;
for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i) for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i)
{ {
if (proto_families[i].gethostbyname) if (proto_families[i].gethostbyname)
{ {
return proto_families[i].gethostbyname(name); hst = proto_families[i].gethostbyname(name);
if (hst != RT_NULL)
{
return hst;
}
} }
} }
...@@ -684,13 +747,17 @@ struct hostent *sal_gethostbyname(const char *name) ...@@ -684,13 +747,17 @@ struct hostent *sal_gethostbyname(const char *name)
int sal_gethostbyname_r(const char *name, struct hostent *ret, char *buf, int sal_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
size_t buflen, struct hostent **result, int *h_errnop) size_t buflen, struct hostent **result, int *h_errnop)
{ {
int i; int i, res;
for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i) for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i)
{ {
if (proto_families[i].gethostbyname_r) if (proto_families[i].gethostbyname_r)
{ {
return proto_families[i].gethostbyname_r(name, ret, buf, buflen, result, h_errnop); res = proto_families[i].gethostbyname_r(name, ret, buf, buflen, result, h_errnop);
if (res == 0)
{
return res;
}
} }
} }
...@@ -716,13 +783,17 @@ int sal_getaddrinfo(const char *nodename, ...@@ -716,13 +783,17 @@ int sal_getaddrinfo(const char *nodename,
const struct addrinfo *hints, const struct addrinfo *hints,
struct addrinfo **res) struct addrinfo **res)
{ {
int i; int i, ret;
for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i) for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i)
{ {
if (proto_families[i].getaddrinfo) if (proto_families[i].getaddrinfo)
{ {
return proto_families[i].getaddrinfo(nodename, servname, hints, res); ret = proto_families[i].getaddrinfo(nodename, servname, hints, res);
if (ret == 0)
{
return ret;
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册