diff --git a/components/net/sal_socket/SConscript b/components/net/sal_socket/SConscript index 76becca09..3dcb5c3fe 100644 --- a/components/net/sal_socket/SConscript +++ b/components/net/sal_socket/SConscript @@ -16,6 +16,9 @@ if GetDepend('SAL_USING_LWIP'): if GetDepend('SAL_USING_AT'): 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'): src += Glob('dfs_net/*.c') diff --git a/components/net/sal_socket/impl/af_inet.h b/components/net/sal_socket/impl/af_inet.h new file mode 100644 index 000000000..10a77d587 --- /dev/null +++ b/components/net/sal_socket/impl/af_inet.h @@ -0,0 +1,40 @@ +/* + * 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 + +#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 + +#endif /* __AF_INET_H__ */ diff --git a/components/net/sal_socket/impl/af_inet_at.c b/components/net/sal_socket/impl/af_inet_at.c index 8ddb236e8..3337af419 100644 --- a/components/net/sal_socket/impl/af_inet_at.c +++ b/components/net/sal_socket/impl/af_inet_at.c @@ -26,6 +26,7 @@ #include #include +#include #ifdef SAL_USING_POSIX #include @@ -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 = { + "at", AF_AT, AF_INET, at_create, diff --git a/components/net/sal_socket/impl/af_inet_lwip.c b/components/net/sal_socket/impl/af_inet_lwip.c index deb9239bf..c45e39e39 100644 --- a/components/net/sal_socket/impl/af_inet_lwip.c +++ b/components/net/sal_socket/impl/af_inet_lwip.c @@ -34,6 +34,7 @@ #endif #include +#include #if LWIP_VERSION < 0x2000000 #define SELWAIT_T int @@ -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 = { + "lwip", AF_INET, AF_INET, inet_create, diff --git a/components/net/sal_socket/include/sal.h b/components/net/sal_socket/include/sal.h index 8a9dd61b6..e1a6dbedb 100644 --- a/components/net/sal_socket/include/sal.h +++ b/components/net/sal_socket/include/sal.h @@ -82,8 +82,9 @@ struct sal_socket struct proto_family { - int family; /* primary protocol families type*/ - int sec_family; /* secondary protocol families type*/ + char name[RT_NAME_MAX]; + 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 */ struct hostent* (*gethostbyname) (const char *name); @@ -92,10 +93,14 @@ struct proto_family 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_proto_family_register(const struct proto_family *pf); 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); + #endif /* SAL_H__ */ diff --git a/components/net/sal_socket/socket/net_netdb.c b/components/net/sal_socket/socket/net_netdb.c index 5acab3640..1f10afe33 100644 --- a/components/net/sal_socket/socket/net_netdb.c +++ b/components/net/sal_socket/socket/net_netdb.c @@ -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); } +RTM_EXPORT(gethostbyname_r); void freeaddrinfo(struct addrinfo *ai) { diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index 71aaa2c65..920ce720c 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -50,7 +50,7 @@ static struct rt_mutex sal_core_lock; static rt_bool_t init_ok = RT_FALSE; /** - * SAL (Socket Abstraction Layer) initialization. + * SAL (Socket Abstraction Layer) initialize. * * @return result * >= 0: initialize success @@ -64,7 +64,7 @@ int sal_init(void) } /* clean sal socket table */ - memset(&socket_table, 0, sizeof(socket_table)); + rt_memset(&socket_table, 0, sizeof(socket_table)); /* create sal socket lock */ rt_mutex_init(&sal_core_lock, "sal_lock", RT_IPC_FLAG_FIFO); @@ -76,12 +76,12 @@ int sal_init(void) 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 - * -1 : the global array of available protocol families is full + * @return >=0 : protocol family object index + * -1 : the global array of available protocol families is full */ 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 */ 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 */ 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) { /* enable interrupt */ rt_hw_interrupt_enable(level); - return -1; } + rt_strncpy(proto_families[idx].name, pf->name, rt_strlen(pf->name)); proto_families[idx].family = pf->family; proto_families[idx].sec_family = pf->sec_family; proto_families[idx].create = pf->create; @@ -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 * - * @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) { @@ -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. */ @@ -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. */ @@ -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 * @@ -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 type socket type * @param protocol transfer Protocol - * @param res socket structure address + * @param res sal socket object address * * @return 0 : socket initialize success * -1 : input the wrong family * -2 : input the wrong socket type - * -3 : get protocol family structure failed + * -3 : get protocol family object failed * -4 : set socket options failed */ 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 sock->type = type; sock->protocol = protocol; - /* get socket protocol family structure */ + /* get socket protocol family object */ if ((pf = get_proto_family(family)) == RT_NULL) { return -3; @@ -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) { struct sal_socket *sock; @@ -415,7 +473,7 @@ int sal_shutdown(int socket, int how) 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; } @@ -622,7 +680,7 @@ int sal_closesocket(int socket) 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; } @@ -669,12 +727,18 @@ int sal_poll(struct dfs_fd *file, struct rt_pollreq *req) struct hostent *sal_gethostbyname(const char *name) { int i; + struct hostent *hst; for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i) { if (proto_families[i].gethostbyname) { - return proto_families[i].gethostbyname(name); + hst = proto_families[i].gethostbyname(name); + if (hst != RT_NULL) + { + return hst; + } + continue; } } @@ -684,13 +748,18 @@ struct hostent *sal_gethostbyname(const char *name) int sal_gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop) { - int i; + int i, res; for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i) { 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; + } + continue; } } @@ -716,13 +785,18 @@ int sal_getaddrinfo(const char *nodename, const struct addrinfo *hints, struct addrinfo **res) { - int i; + int i, ret; for (i = 0; i < SAL_PROTO_FAMILIES_NUM; ++i) { 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; + } + continue; } }