This commit reworks socket poll implementation to support multiple socket implementations. To achieve that, two ioctl poll helper requests were added: ZFD_IOCTL_POLL_PREPARE and ZFD_IOCTL_POLL_UPDATE. The poll implementation calls ioctl with these requests for each socket requested in the fds table. The first request is responsible for preparing k_poll_event objects for specific socket. It can request to skip waiting in k_poll by returning EALREADY through errno. The latter request is responsible for processing outcome of k_poll for each socket. It can request to retry the k_poll by returning EAGAIN through errno. Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
53 lines
1.6 KiB
C
53 lines
1.6 KiB
C
/*
|
|
* Copyright (c) 2017 Linaro Limited
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef _SOCKETS_INTERNAL_H_
|
|
#define _SOCKETS_INTERNAL_H_
|
|
|
|
#include <misc/fdtable.h>
|
|
|
|
#define SOCK_EOF 1
|
|
#define SOCK_NONBLOCK 2
|
|
|
|
static inline void sock_set_flag(struct net_context *ctx, u32_t mask,
|
|
u32_t flag)
|
|
{
|
|
u32_t val = POINTER_TO_INT(ctx->user_data);
|
|
|
|
val = (val & ~mask) | flag;
|
|
(ctx)->user_data = INT_TO_POINTER(val);
|
|
}
|
|
|
|
static inline u32_t sock_get_flag(struct net_context *ctx, u32_t mask)
|
|
{
|
|
return POINTER_TO_INT(ctx->user_data) & mask;
|
|
}
|
|
|
|
#define sock_is_eof(ctx) sock_get_flag(ctx, SOCK_EOF)
|
|
#define sock_set_eof(ctx) sock_set_flag(ctx, SOCK_EOF, SOCK_EOF)
|
|
#define sock_is_nonblock(ctx) sock_get_flag(ctx, SOCK_NONBLOCK)
|
|
|
|
struct socket_op_vtable {
|
|
struct fd_op_vtable fd_vtable;
|
|
int (*bind)(void *obj, const struct sockaddr *addr, socklen_t addrlen);
|
|
int (*connect)(void *obj, const struct sockaddr *addr,
|
|
socklen_t addrlen);
|
|
int (*listen)(void *obj, int backlog);
|
|
int (*accept)(void *obj, struct sockaddr *addr, socklen_t *addrlen);
|
|
ssize_t (*sendto)(void *obj, const void *buf, size_t len, int flags,
|
|
const struct sockaddr *dest_addr, socklen_t addrlen);
|
|
ssize_t (*recvfrom)(void *obj, void *buf, size_t max_len, int flags,
|
|
struct sockaddr *src_addr, socklen_t *addrlen);
|
|
int (*getsockopt)(void *obj, int level, int optname,
|
|
void *optval, socklen_t *optlen);
|
|
int (*setsockopt)(void *obj, int level, int optname,
|
|
const void *optval, socklen_t optlen);
|
|
};
|
|
|
|
int ztls_socket(int family, int type, int proto);
|
|
|
|
#endif /* _SOCKETS_INTERNAL_H_ */
|