Merge branch 'bugfix/select_fdset' into 'master'

LWIP: Fix select() FD_SET/FD_GET/etc

See merge request !1435
This commit is contained in:
Angus Gratton 2017-10-23 10:55:33 +08:00
commit 454e47385c
6 changed files with 13 additions and 9 deletions

View file

@ -431,9 +431,9 @@ typedef struct ip_mreq {
/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
#define FD_SETSIZE MEMP_NUM_NETCONN #define FD_SETSIZE MEMP_NUM_NETCONN
#define FDSETSAFESET(n, code) do { \ #define FDSETSAFESET(n, code) do { \
if (n >= LWIP_SOCKET_OFFSET && ((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \ if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \
code; }} while(0) code; }} while(0)
#define FDSETSAFEGET(n, code) (n >= LWIP_SOCKET_OFFSET && ((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\ #define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\
(code) : 0) (code) : 0)
#define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) #define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
#define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) #define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))

View file

@ -19,7 +19,7 @@ extern "C" {
/* Internal declarations used to ingreate LWIP port layer /* Internal declarations used to ingreate LWIP port layer
to ESP-IDF VFS for POSIX I/O. to ESP-IDF VFS for POSIX I/O.
*/ */
extern unsigned lwip_socket_offset; extern int lwip_socket_offset;
void esp_vfs_lwip_sockets_register(); void esp_vfs_lwip_sockets_register();

View file

@ -37,7 +37,7 @@
FDs that the user sees are the same FDs. FDs that the user sees are the same FDs.
*/ */
unsigned lwip_socket_offset; int lwip_socket_offset;
static int lwip_fcntl_r_wrapper(int fd, int cmd, va_list args); static int lwip_fcntl_r_wrapper(int fd, int cmd, va_list args);
static int lwip_ioctl_r_wrapper(int fd, int cmd, va_list args); static int lwip_ioctl_r_wrapper(int fd, int cmd, va_list args);
@ -54,14 +54,14 @@ void esp_vfs_lwip_sockets_register()
.fcntl = &lwip_fcntl_r_wrapper, .fcntl = &lwip_fcntl_r_wrapper,
.ioctl = &lwip_ioctl_r_wrapper, .ioctl = &lwip_ioctl_r_wrapper,
}; };
unsigned max_fd; int max_fd;
ESP_ERROR_CHECK(esp_vfs_register_socket_space(&vfs, NULL, &lwip_socket_offset, &max_fd)); ESP_ERROR_CHECK(esp_vfs_register_socket_space(&vfs, NULL, &lwip_socket_offset, &max_fd));
/* LWIP can't be allowed to create more sockets than fit in the per-VFS fd space. Currently this isn't configurable /* LWIP can't be allowed to create more sockets than fit in the per-VFS fd space. Currently this isn't configurable
* but it's set much larger than CONFIG_LWIP_MAX_SOCKETS should ever be (max 2^12 FDs). * but it's set much larger than CONFIG_LWIP_MAX_SOCKETS should ever be (max 2^12 FDs).
*/ */
assert(CONFIG_LWIP_MAX_SOCKETS <= max_fd - lwip_socket_offset); assert(max_fd >= lwip_socket_offset && CONFIG_LWIP_MAX_SOCKETS <= max_fd - lwip_socket_offset);
} }
static int lwip_fcntl_r_wrapper(int fd, int cmd, va_list args) static int lwip_fcntl_r_wrapper(int fd, int cmd, va_list args)

View file

@ -221,6 +221,9 @@ typedef unsigned int mode_t _ST_INT32;
typedef unsigned short nlink_t; typedef unsigned short nlink_t;
/* FD_SET and friends are still LWIP only */
# if !defined(ESP_PLATFORM)
/* We don't define fd_set and friends if we are compiling POSIX /* We don't define fd_set and friends if we are compiling POSIX
source, or if we have included (or may include as indicated source, or if we have included (or may include as indicated
by __USE_W32_SOCKETS) the W32api winsock[2].h header which by __USE_W32_SOCKETS) the W32api winsock[2].h header which
@ -266,6 +269,7 @@ typedef struct _types_fd_set {
})) }))
# endif /* !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) */ # endif /* !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) */
#endif /* !defined(ESP_PLATFORM) */
#undef __MS_types__ #undef __MS_types__
#undef _ST_INT32 #undef _ST_INT32

View file

@ -205,7 +205,7 @@ esp_err_t esp_vfs_register(const char* base_path, const esp_vfs_t* vfs, void* ct
* @return ESP_OK if successful, ESP_ERR_NO_MEM if too many VFSes are * @return ESP_OK if successful, ESP_ERR_NO_MEM if too many VFSes are
* registered. * registered.
*/ */
esp_err_t esp_vfs_register_socket_space(const esp_vfs_t *vfs, void *ctx, unsigned *p_min_fd, unsigned *p_max_fd); esp_err_t esp_vfs_register_socket_space(const esp_vfs_t *vfs, void *ctx, int *p_min_fd, int *p_max_fd);
/** /**
* Unregister a virtual filesystem for given path prefix * Unregister a virtual filesystem for given path prefix

View file

@ -54,7 +54,7 @@ typedef struct vfs_entry_ {
static vfs_entry_t* s_vfs[VFS_MAX_COUNT] = { 0 }; static vfs_entry_t* s_vfs[VFS_MAX_COUNT] = { 0 };
static size_t s_vfs_count = 0; static size_t s_vfs_count = 0;
static esp_err_t esp_vfs_register_common(const char* base_path, size_t len, const esp_vfs_t* vfs, void* ctx, unsigned *p_minimum_fd, unsigned *p_maximum_fd) static esp_err_t esp_vfs_register_common(const char* base_path, size_t len, const esp_vfs_t* vfs, void* ctx, int *p_minimum_fd, int *p_maximum_fd)
{ {
if (len != LEN_PATH_PREFIX_IGNORED) { if (len != LEN_PATH_PREFIX_IGNORED) {
if ((len != 0 && len < 2) || (len > ESP_VFS_PATH_MAX)) { if ((len != 0 && len < 2) || (len > ESP_VFS_PATH_MAX)) {
@ -107,7 +107,7 @@ esp_err_t esp_vfs_register(const char* base_path, const esp_vfs_t* vfs, void* ct
return esp_vfs_register_common(base_path, strlen(base_path), vfs, ctx, NULL, NULL); return esp_vfs_register_common(base_path, strlen(base_path), vfs, ctx, NULL, NULL);
} }
esp_err_t esp_vfs_register_socket_space(const esp_vfs_t *vfs, void *ctx, unsigned *p_min_fd, unsigned *p_max_fd) esp_err_t esp_vfs_register_socket_space(const esp_vfs_t *vfs, void *ctx, int *p_min_fd, int *p_max_fd)
{ {
return esp_vfs_register_common("", LEN_PATH_PREFIX_IGNORED, vfs, ctx, p_min_fd, p_max_fd); return esp_vfs_register_common("", LEN_PATH_PREFIX_IGNORED, vfs, ctx, p_min_fd, p_max_fd);
} }