/*
 * Copyright (c) 2018 Linaro Limited.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Socket Offload Redirect API
 */

#ifndef ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_OPS_H_
#define ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_OPS_H_

/**
 * @brief Socket Offload Redirect API
 * @defgroup socket_offload Socket offloading interface
 * @ingroup networking
 * @{
 */

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <net/net_ip.h>
#include <net/socket.h>  /* needed for struct pollfd */

/**
 * @brief An offloaded Socket API interface
 *
 * It is assumed that these offload functions follow the
 * POSIX socket API standard for arguments, return values and setting of errno.
 */
struct socket_offload {
	/* POSIX Socket Functions: */
	int (*socket)(int family, int type, int proto);
	int (*close)(int sock);
	int (*accept)(int sock, struct sockaddr *addr, socklen_t *addrlen);
	int (*bind)(int sock, const struct sockaddr *addr, socklen_t addrlen);
	int (*listen)(int sock, int backlog);
	int (*connect)(int sock, const struct sockaddr *addr,
		       socklen_t addrlen);
	int (*poll)(struct pollfd *fds, int nfds, int timeout);
	int (*setsockopt)(int sock, int level, int optname,
			  const void *optval, socklen_t optlen);
	int (*getsockopt)(int sock, int level, int optname, void *optval,
			  socklen_t *optlen);
	ssize_t (*recv)(int sock, void *buf, size_t max_len, int flags);
	ssize_t (*recvfrom)(int sock, void *buf, short int len,
			    short int flags, struct sockaddr *from,
			    socklen_t *fromlen);
	ssize_t (*send)(int sock, const void *buf, size_t len, int flags);
	ssize_t (*sendto)(int sock, const void *buf, size_t len, int flags,
			  const struct sockaddr *to, socklen_t tolen);
	int (*getaddrinfo)(const char *node, const char *service,
			   const struct addrinfo *hints,
			   struct addrinfo **res);
	void (*freeaddrinfo)(struct addrinfo *res);
	int (*fcntl)(int fd, int cmd, va_list args);
};

/**
 * @brief Register an offloaded socket API interface.
 *
 * @param ops A pointer to the offloaded socket API interface.
 */
extern void socket_offload_register(const struct socket_offload *ops);

#ifdef __cplusplus
}
#endif

/**
 * @}
 */

#endif /* ZEPHYR_INCLUDE_NET_SOCKET_OFFLOAD_OPS_H_ */
