150 lines
5.0 KiB
C
150 lines
5.0 KiB
C
/**
|
|
* Copyright (c) 2023-2024 Marcin Niestroj
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef __DRIVERS_NET_NSOS_H__
|
|
#define __DRIVERS_NET_NSOS_H__
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
/* Protocol families. */
|
|
#define NSOS_MID_PF_UNSPEC 0 /**< Unspecified protocol family. */
|
|
#define NSOS_MID_PF_INET 1 /**< IP protocol family version 4. */
|
|
#define NSOS_MID_PF_INET6 2 /**< IP protocol family version 6. */
|
|
|
|
/* Address families. */
|
|
#define NSOS_MID_AF_UNSPEC NSOS_MID_PF_UNSPEC /**< Unspecified address family. */
|
|
#define NSOS_MID_AF_INET NSOS_MID_PF_INET /**< IP protocol family version 4. */
|
|
#define NSOS_MID_AF_INET6 NSOS_MID_PF_INET6 /**< IP protocol family version 6. */
|
|
|
|
/** Protocol numbers from IANA/BSD */
|
|
enum nsos_mid_net_ip_protocol {
|
|
NSOS_MID_IPPROTO_IP = 0, /**< IP protocol (pseudo-val for setsockopt() */
|
|
NSOS_MID_IPPROTO_ICMP = 1, /**< ICMP protocol */
|
|
NSOS_MID_IPPROTO_IGMP = 2, /**< IGMP protocol */
|
|
NSOS_MID_IPPROTO_IPIP = 4, /**< IPIP tunnels */
|
|
NSOS_MID_IPPROTO_TCP = 6, /**< TCP protocol */
|
|
NSOS_MID_IPPROTO_UDP = 17, /**< UDP protocol */
|
|
NSOS_MID_IPPROTO_IPV6 = 41, /**< IPv6 protocol */
|
|
NSOS_MID_IPPROTO_ICMPV6 = 58, /**< ICMPv6 protocol */
|
|
NSOS_MID_IPPROTO_RAW = 255, /**< RAW IP packets */
|
|
};
|
|
|
|
/** Socket type */
|
|
enum nsos_mid_net_sock_type {
|
|
NSOS_MID_SOCK_STREAM = 1, /**< Stream socket type */
|
|
NSOS_MID_SOCK_DGRAM, /**< Datagram socket type */
|
|
NSOS_MID_SOCK_RAW /**< RAW socket type */
|
|
};
|
|
|
|
#define NSOS_MID_MSG_PEEK 0x02
|
|
#define NSOS_MID_MSG_TRUNC 0x20
|
|
#define NSOS_MID_MSG_DONTWAIT 0x40
|
|
#define NSOS_MID_MSG_WAITALL 0x100
|
|
|
|
struct nsos_mid_sockaddr {
|
|
uint16_t sa_family; /* Address family */
|
|
char sa_data[]; /* Socket address */
|
|
};
|
|
|
|
struct nsos_mid_sockaddr_in {
|
|
uint16_t sin_family; /* AF_INET */
|
|
uint16_t sin_port; /* Port number */
|
|
uint32_t sin_addr; /* IPv4 address */
|
|
};
|
|
|
|
struct nsos_mid_sockaddr_in6 {
|
|
uint16_t sin6_family; /* AF_INET6 */
|
|
uint16_t sin6_port; /* Port number */
|
|
uint8_t sin6_addr[16];
|
|
uint32_t sin6_scope_id; /* Set of interfaces for a scope */
|
|
};
|
|
|
|
struct nsos_mid_sockaddr_storage {
|
|
union {
|
|
struct nsos_mid_sockaddr_in sockaddr_in;
|
|
struct nsos_mid_sockaddr_in6 sockaddr_in6;
|
|
};
|
|
};
|
|
|
|
struct nsos_mid_pollfd {
|
|
int fd;
|
|
short events;
|
|
short revents;
|
|
|
|
void (*cb)(struct nsos_mid_pollfd *pollfd_mid);
|
|
};
|
|
|
|
struct nsos_mid_addrinfo {
|
|
int ai_flags;
|
|
int ai_family;
|
|
int ai_socktype;
|
|
int ai_protocol;
|
|
size_t ai_addrlen;
|
|
struct nsos_mid_sockaddr *ai_addr;
|
|
char *ai_canonname;
|
|
struct nsos_mid_addrinfo *ai_next;
|
|
};
|
|
|
|
struct nsos_mid_iovec {
|
|
void *iov_base;
|
|
size_t iov_len;
|
|
};
|
|
|
|
struct nsos_mid_msghdr {
|
|
void *msg_name; /* optional socket address, big endian */
|
|
size_t msg_namelen; /* size of socket address */
|
|
struct nsos_mid_iovec *msg_iov; /* scatter/gather array */
|
|
size_t msg_iovlen; /* number of elements in msg_iov */
|
|
void *msg_control; /* ancillary data */
|
|
size_t msg_controllen; /* ancillary data buffer len */
|
|
int msg_flags; /* flags on received message */
|
|
};
|
|
|
|
static inline void nsos_socket_flag_convert(int *flags_a, int flag_a,
|
|
int *flags_b, int flag_b)
|
|
{
|
|
if ((*flags_a) & flag_a) {
|
|
*flags_a &= ~flag_a;
|
|
*flags_b |= flag_b;
|
|
}
|
|
}
|
|
|
|
int nsos_adapt_get_errno(void);
|
|
|
|
int nsos_adapt_socket(int family, int type, int proto);
|
|
|
|
int nsos_adapt_bind(int fd, const struct nsos_mid_sockaddr *addr, size_t addrlen);
|
|
int nsos_adapt_connect(int fd, const struct nsos_mid_sockaddr *addr, size_t addrlen);
|
|
int nsos_adapt_listen(int fd, int backlog);
|
|
int nsos_adapt_accept(int fd, struct nsos_mid_sockaddr *addr, size_t *addrlen);
|
|
int nsos_adapt_sendto(int fd, const void *buf, size_t len, int flags,
|
|
const struct nsos_mid_sockaddr *addr, size_t addrlen);
|
|
int nsos_adapt_sendmsg(int fd, const struct nsos_mid_msghdr *msg_mid, int flags);
|
|
int nsos_adapt_recvfrom(int fd, void *buf, size_t len, int flags,
|
|
struct nsos_mid_sockaddr *addr, size_t *addrlen);
|
|
int nsos_adapt_getsockopt(int fd, int level, int optname,
|
|
void *optval, size_t *optlen);
|
|
int nsos_adapt_setsockopt(int fd, int level, int optname,
|
|
const void *optval, size_t optlen);
|
|
|
|
void nsos_adapt_poll_add(struct nsos_mid_pollfd *pollfd);
|
|
void nsos_adapt_poll_remove(struct nsos_mid_pollfd *pollfd);
|
|
void nsos_adapt_poll_update(struct nsos_mid_pollfd *pollfd);
|
|
|
|
int nsos_adapt_fcntl_getfl(int fd);
|
|
int nsos_adapt_fcntl_setfl(int fd, int flags);
|
|
|
|
int nsos_adapt_fionread(int fd, int *avail);
|
|
|
|
int nsos_adapt_getaddrinfo(const char *node, const char *service,
|
|
const struct nsos_mid_addrinfo *hints,
|
|
struct nsos_mid_addrinfo **res,
|
|
int *system_errno);
|
|
void nsos_adapt_freeaddrinfo(struct nsos_mid_addrinfo *res);
|
|
|
|
#endif /* __DRIVERS_NET_NSOS_H__ */
|