lwip: handle CONFIG_VFS_SUPPORT_IO=n and CONFIG_VFS_SUPPORT_SELECT=n
* If CONFIG_VFS_SUPPORT_IO=y, keep everything as it is now * If CONFIG_VFS_SUPPORT_IO=n, defined syscalls which LwIP can implement, such as read/write/close * Make LWIP-only select implementation dependent on CONFIG_VFS_SUPPORT_SELECT, deprecate CONFIG_LWIP_USE_ONLY_LWIP_SELECT
This commit is contained in:
parent
cadab2cbcf
commit
b203ac7b02
5 changed files with 116 additions and 5 deletions
|
@ -85,7 +85,6 @@ set(srcs
|
||||||
"lwip/src/netif/ppp/upap.c"
|
"lwip/src/netif/ppp/upap.c"
|
||||||
"lwip/src/netif/ppp/utils.c"
|
"lwip/src/netif/ppp/utils.c"
|
||||||
"lwip/src/netif/ppp/vj.c"
|
"lwip/src/netif/ppp/vj.c"
|
||||||
"port/esp32/vfs_lwip.c"
|
|
||||||
"port/esp32/debug/lwip_debug.c"
|
"port/esp32/debug/lwip_debug.c"
|
||||||
"port/esp32/freertos/sys_arch.c"
|
"port/esp32/freertos/sys_arch.c"
|
||||||
"port/esp32/netif/dhcp_state.c"
|
"port/esp32/netif/dhcp_state.c"
|
||||||
|
@ -129,6 +128,12 @@ if(CONFIG_ETH_ENABLED)
|
||||||
list(APPEND srcs "port/esp32/netif/ethernetif.c")
|
list(APPEND srcs "port/esp32/netif/ethernetif.c")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_VFS_SUPPORT_IO)
|
||||||
|
list(APPEND srcs "port/esp32/vfs_lwip.c")
|
||||||
|
else()
|
||||||
|
list(APPEND srcs "port/esp32/no_vfs_syscalls.c")
|
||||||
|
endif()
|
||||||
|
|
||||||
idf_component_register(SRCS "${srcs}"
|
idf_component_register(SRCS "${srcs}"
|
||||||
INCLUDE_DIRS "${include_dirs}"
|
INCLUDE_DIRS "${include_dirs}"
|
||||||
LDFRAGMENTS linker.lf
|
LDFRAGMENTS linker.lf
|
||||||
|
|
|
@ -63,9 +63,12 @@ menu "LWIP"
|
||||||
to 16.
|
to 16.
|
||||||
|
|
||||||
config LWIP_USE_ONLY_LWIP_SELECT
|
config LWIP_USE_ONLY_LWIP_SELECT
|
||||||
bool "Support LWIP socket select() only"
|
bool "Support LWIP socket select() only (DEPRECATED)"
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
|
This option is deprecated. Use VFS_SUPPORT_SELECT instead, which is
|
||||||
|
the inverse of this option.
|
||||||
|
|
||||||
The virtual filesystem layer of select() redirects sockets to
|
The virtual filesystem layer of select() redirects sockets to
|
||||||
lwip_select() and non-socket file descriptors to their respective driver
|
lwip_select() and non-socket file descriptors to their respective driver
|
||||||
implementations. If this option is enabled then all calls of select()
|
implementations. If this option is enabled then all calls of select()
|
||||||
|
|
|
@ -29,6 +29,11 @@ COMPONENT_SRCDIRS := \
|
||||||
ifndef CONFIG_IDF_TARGET_ESP32
|
ifndef CONFIG_IDF_TARGET_ESP32
|
||||||
COMPONENT_OBJEXCLUDE := port/esp32/netif/ethernetif.o
|
COMPONENT_OBJEXCLUDE := port/esp32/netif/ethernetif.o
|
||||||
endif
|
endif
|
||||||
|
ifndef CONFIG_VFS_SUPPORT_IO
|
||||||
|
COMPONENT_OBJEXCLUDE += port/esp32/vfs_lwip.o
|
||||||
|
else
|
||||||
|
COMPONENT_OBJEXCLUDE += port/esp32/no_vfs_syscalls.o
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_LWIP_PPP_SUPPORT
|
ifdef CONFIG_LWIP_PPP_SUPPORT
|
||||||
COMPONENT_SRCDIRS += lwip/src/netif/ppp lwip/src/netif/ppp/polarssl
|
COMPONENT_SRCDIRS += lwip/src/netif/ppp lwip/src/netif/ppp/polarssl
|
||||||
|
|
83
components/lwip/port/esp32/no_vfs_syscalls.c
Normal file
83
components/lwip/port/esp32/no_vfs_syscalls.c
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
// Copyright 2020 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <sys/errno.h>
|
||||||
|
#include <sys/lock.h>
|
||||||
|
#include <sys/fcntl.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include "lwip/sockets.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_VFS_SUPPORT_IO
|
||||||
|
#error This file should only be built when CONFIG_VFS_SUPPORT_IO=n
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Default implementations of read/write provided in newlib component,
|
||||||
|
* used as a fallback for console I/O.
|
||||||
|
*/
|
||||||
|
extern ssize_t _write_r_console(struct _reent *r, int fd, const void * data, size_t size);
|
||||||
|
extern ssize_t _read_r_console(struct _reent *r, int fd, const void * data, size_t size);
|
||||||
|
|
||||||
|
ssize_t _write_r(struct _reent *r, int fd, const void * data, size_t size)
|
||||||
|
{
|
||||||
|
if (fd < LWIP_SOCKET_OFFSET) {
|
||||||
|
return _write_r_console(r, fd, data, size);
|
||||||
|
}
|
||||||
|
return lwip_write(fd, data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t _read_r(struct _reent *r, int fd, void * dst, size_t size)
|
||||||
|
{
|
||||||
|
if (fd < LWIP_SOCKET_OFFSET) {
|
||||||
|
return _read_r_console(r, fd, dst, size);
|
||||||
|
}
|
||||||
|
return lwip_read(fd, dst, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _close_r(struct _reent *r, int fd)
|
||||||
|
{
|
||||||
|
if (fd < LWIP_SOCKET_OFFSET) {
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return lwip_close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _fcntl_r(struct _reent *r, int fd, int cmd, int arg)
|
||||||
|
{
|
||||||
|
return lwip_fcntl(fd, cmd, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ioctl(int fd, int cmd, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, cmd);
|
||||||
|
int res = lwip_ioctl(fd, cmd, va_arg(args, void*));
|
||||||
|
va_end(args);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout)
|
||||||
|
{
|
||||||
|
return lwip_select(nfds, readfds, writefds, errorfds, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void esp_vfs_lwip_sockets_register(void)
|
||||||
|
{
|
||||||
|
/* Doesn't register anything, just a hook to force linking this file */
|
||||||
|
}
|
|
@ -18,15 +18,20 @@
|
||||||
#include <sys/errno.h>
|
#include <sys/errno.h>
|
||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
#include "esp_vfs.h"
|
|
||||||
#include "esp_vfs_dev.h"
|
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "lwip/sockets.h"
|
#include "esp_vfs.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
#include "lwip/sockets.h"
|
||||||
#include "lwip/sys.h"
|
#include "lwip/sys.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_VFS_SUPPORT_IO
|
||||||
|
#error This file should only be built when CONFIG_VFS_SUPPORT_IO=y
|
||||||
|
#endif
|
||||||
|
|
||||||
_Static_assert(MAX_FDS >= CONFIG_LWIP_MAX_SOCKETS, "MAX_FDS < CONFIG_LWIP_MAX_SOCKETS");
|
_Static_assert(MAX_FDS >= CONFIG_LWIP_MAX_SOCKETS, "MAX_FDS < CONFIG_LWIP_MAX_SOCKETS");
|
||||||
|
|
||||||
|
#ifdef CONFIG_VFS_SUPPORT_SELECT
|
||||||
|
|
||||||
static void lwip_stop_socket_select(void *sem)
|
static void lwip_stop_socket_select(void *sem)
|
||||||
{
|
{
|
||||||
sys_sem_signal(sem); //socket_select will return
|
sys_sem_signal(sem); //socket_select will return
|
||||||
|
@ -46,6 +51,14 @@ static void *lwip_get_socket_select_semaphore(void)
|
||||||
*/
|
*/
|
||||||
return (void *) sys_thread_sem_get();
|
return (void *) sys_thread_sem_get();
|
||||||
}
|
}
|
||||||
|
#else // CONFIG_VFS_SUPPORT_SELECT
|
||||||
|
|
||||||
|
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout)
|
||||||
|
{
|
||||||
|
return lwip_select(nfds, readfds, writefds, errorfds, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CONFIG_VFS_SUPPORT_SELECT
|
||||||
|
|
||||||
static int lwip_fcntl_r_wrapper(int fd, int cmd, int arg)
|
static int lwip_fcntl_r_wrapper(int fd, int cmd, int arg)
|
||||||
{
|
{
|
||||||
|
@ -68,10 +81,12 @@ void esp_vfs_lwip_sockets_register(void)
|
||||||
.read = &lwip_read,
|
.read = &lwip_read,
|
||||||
.fcntl = &lwip_fcntl_r_wrapper,
|
.fcntl = &lwip_fcntl_r_wrapper,
|
||||||
.ioctl = &lwip_ioctl_r_wrapper,
|
.ioctl = &lwip_ioctl_r_wrapper,
|
||||||
|
#ifdef CONFIG_VFS_SUPPORT_SELECT
|
||||||
.socket_select = &lwip_select,
|
.socket_select = &lwip_select,
|
||||||
.get_socket_select_semaphore = &lwip_get_socket_select_semaphore,
|
.get_socket_select_semaphore = &lwip_get_socket_select_semaphore,
|
||||||
.stop_socket_select = &lwip_stop_socket_select,
|
.stop_socket_select = &lwip_stop_socket_select,
|
||||||
.stop_socket_select_isr = &lwip_stop_socket_select_isr,
|
.stop_socket_select_isr = &lwip_stop_socket_select_isr,
|
||||||
|
#endif // CONFIG_VFS_SUPPORT_SELECT
|
||||||
};
|
};
|
||||||
/* Non-LWIP file descriptors are from 0 to (LWIP_SOCKET_OFFSET-1). LWIP
|
/* Non-LWIP file descriptors are from 0 to (LWIP_SOCKET_OFFSET-1). LWIP
|
||||||
* file descriptors are registered from LWIP_SOCKET_OFFSET to
|
* file descriptors are registered from LWIP_SOCKET_OFFSET to
|
||||||
|
|
Loading…
Reference in a new issue