Skip to content

Commit a3f2b5f

Browse files
mniestrojcarlescufi
authored andcommitted
drivers: nsos: initial support for getsockopt() and setsockopt()
Add initial support for getsockopt() and setsockopt() on SOL_SOCKET level. Signed-off-by: Marcin Niestroj <[email protected]>
1 parent 29f8187 commit a3f2b5f

File tree

4 files changed

+556
-0
lines changed

4 files changed

+556
-0
lines changed

drivers/net/nsos.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ int nsos_adapt_sendto(int fd, const void *buf, size_t len, int flags,
126126
int nsos_adapt_sendmsg(int fd, const struct nsos_mid_msghdr *msg_mid, int flags);
127127
int nsos_adapt_recvfrom(int fd, void *buf, size_t len, int flags,
128128
struct nsos_mid_sockaddr *addr, size_t *addrlen);
129+
int nsos_adapt_getsockopt(int fd, int level, int optname,
130+
void *optval, size_t *optlen);
131+
int nsos_adapt_setsockopt(int fd, int level, int optname,
132+
const void *optval, size_t optlen);
129133

130134
void nsos_adapt_poll_add(struct nsos_mid_pollfd *pollfd);
131135
void nsos_adapt_poll_remove(struct nsos_mid_pollfd *pollfd);

drivers/net/nsos_adapt.c

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
* Linux (bottom) side of NSOS (Native Simulator Offloaded Sockets).
1111
*/
1212

13+
#define _DEFAULT_SOURCE
14+
1315
#include <errno.h>
1416
#include <fcntl.h>
1517
#include <netdb.h>
@@ -25,6 +27,7 @@
2527
#include "nsos_errno.h"
2628
#include "nsos_fcntl.h"
2729
#include "nsos_netdb.h"
30+
#include "nsos_socket.h"
2831

2932
#include "board_soc.h"
3033
#include "irq_ctrl.h"
@@ -511,6 +514,167 @@ int nsos_adapt_recvfrom(int fd, void *buf, size_t len, int flags,
511514
return ret;
512515
}
513516

517+
static int nsos_adapt_getsockopt_int(int fd, int level, int optname,
518+
void *optval, size_t *nsos_mid_optlen)
519+
{
520+
socklen_t optlen = *nsos_mid_optlen;
521+
int ret;
522+
523+
ret = getsockopt(fd, level, optname, optval, &optlen);
524+
if (ret < 0) {
525+
return -errno_to_nsos_mid(errno);
526+
}
527+
528+
*nsos_mid_optlen = optlen;
529+
530+
return 0;
531+
}
532+
533+
int nsos_adapt_getsockopt(int fd, int nsos_mid_level, int nsos_mid_optname,
534+
void *nsos_mid_optval, size_t *nsos_mid_optlen)
535+
{
536+
switch (nsos_mid_level) {
537+
case NSOS_MID_SOL_SOCKET:
538+
switch (nsos_mid_optname) {
539+
case NSOS_MID_SO_ERROR: {
540+
int err;
541+
socklen_t optlen = sizeof(err);
542+
int ret;
543+
544+
ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &optlen);
545+
if (ret < 0) {
546+
return -errno_to_nsos_mid(errno);
547+
}
548+
549+
*(int *)nsos_mid_optval = errno_to_nsos_mid(err);
550+
551+
return 0;
552+
}
553+
case NSOS_MID_SO_TYPE: {
554+
int type;
555+
socklen_t optlen = sizeof(type);
556+
int ret;
557+
int err;
558+
559+
ret = getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &optlen);
560+
if (ret < 0) {
561+
return -errno_to_nsos_mid(errno);
562+
}
563+
564+
err = socket_type_to_nsos_mid(type, nsos_mid_optval);
565+
if (err) {
566+
return err;
567+
}
568+
569+
return 0;
570+
}
571+
case NSOS_MID_SO_PROTOCOL: {
572+
int proto;
573+
socklen_t optlen = sizeof(proto);
574+
int ret;
575+
int err;
576+
577+
ret = getsockopt(fd, SOL_SOCKET, SO_PROTOCOL, &proto, &optlen);
578+
if (ret < 0) {
579+
return -errno_to_nsos_mid(errno);
580+
}
581+
582+
err = socket_proto_to_nsos_mid(proto, nsos_mid_optval);
583+
if (err) {
584+
return err;
585+
}
586+
587+
return 0;
588+
}
589+
case NSOS_MID_SO_DOMAIN: {
590+
int family;
591+
socklen_t optlen = sizeof(family);
592+
int ret;
593+
int err;
594+
595+
ret = getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &family, &optlen);
596+
if (ret < 0) {
597+
return -errno_to_nsos_mid(errno);
598+
}
599+
600+
err = socket_family_to_nsos_mid(family, nsos_mid_optval);
601+
if (err) {
602+
return err;
603+
}
604+
605+
return 0;
606+
}
607+
case NSOS_MID_SO_RCVBUF:
608+
return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_RCVBUF,
609+
nsos_mid_optval, nsos_mid_optlen);
610+
case NSOS_MID_SO_SNDBUF:
611+
return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_SNDBUF,
612+
nsos_mid_optval, nsos_mid_optlen);
613+
case NSOS_MID_SO_REUSEADDR:
614+
return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_REUSEADDR,
615+
nsos_mid_optval, nsos_mid_optlen);
616+
case NSOS_MID_SO_REUSEPORT:
617+
return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_REUSEPORT,
618+
nsos_mid_optval, nsos_mid_optlen);
619+
case NSOS_MID_SO_LINGER:
620+
return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_LINGER,
621+
nsos_mid_optval, nsos_mid_optlen);
622+
case NSOS_MID_SO_KEEPALIVE:
623+
return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE,
624+
nsos_mid_optval, nsos_mid_optlen);
625+
}
626+
}
627+
628+
return -NSOS_MID_EOPNOTSUPP;
629+
}
630+
631+
static int nsos_adapt_setsockopt_int(int fd, int level, int optname,
632+
const void *optval, size_t optlen)
633+
{
634+
int ret;
635+
636+
ret = setsockopt(fd, level, optname, optval, optlen);
637+
if (ret < 0) {
638+
return -errno_to_nsos_mid(errno);
639+
}
640+
641+
return 0;
642+
}
643+
644+
int nsos_adapt_setsockopt(int fd, int nsos_mid_level, int nsos_mid_optname,
645+
const void *nsos_mid_optval, size_t nsos_mid_optlen)
646+
{
647+
switch (nsos_mid_level) {
648+
case NSOS_MID_SOL_SOCKET:
649+
switch (nsos_mid_optname) {
650+
case NSOS_MID_SO_PRIORITY:
651+
return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY,
652+
nsos_mid_optval, nsos_mid_optlen);
653+
654+
case NSOS_MID_SO_RCVBUF:
655+
return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_RCVBUF,
656+
nsos_mid_optval, nsos_mid_optlen);
657+
case NSOS_MID_SO_SNDBUF:
658+
return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_SNDBUF,
659+
nsos_mid_optval, nsos_mid_optlen);
660+
case NSOS_MID_SO_REUSEADDR:
661+
return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_REUSEADDR,
662+
nsos_mid_optval, nsos_mid_optlen);
663+
case NSOS_MID_SO_REUSEPORT:
664+
return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_REUSEPORT,
665+
nsos_mid_optval, nsos_mid_optlen);
666+
case NSOS_MID_SO_LINGER:
667+
return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_LINGER,
668+
nsos_mid_optval, nsos_mid_optlen);
669+
case NSOS_MID_SO_KEEPALIVE:
670+
return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE,
671+
nsos_mid_optval, nsos_mid_optlen);
672+
}
673+
}
674+
675+
return -NSOS_MID_EOPNOTSUPP;
676+
}
677+
514678
#define MAP_POLL_EPOLL(_event_from, _event_to) \
515679
if (events_from & (_event_from)) { \
516680
events_from &= ~(_event_from); \

drivers/net/nsos_socket.h

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* Copyright (c) 2024 Marcin Niestroj
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef __DRIVERS_NET_NSOS_SOCKET_H__
8+
#define __DRIVERS_NET_NSOS_SOCKET_H__
9+
10+
/**
11+
* @name Socket level options (NSOS_MID_SOL_SOCKET)
12+
* @{
13+
*/
14+
/** Socket-level option */
15+
#define NSOS_MID_SOL_SOCKET 1
16+
17+
/* Socket options for NSOS_MID_SOL_SOCKET level */
18+
19+
/** Recording debugging information (ignored, for compatibility) */
20+
#define NSOS_MID_SO_DEBUG 1
21+
/** address reuse */
22+
#define NSOS_MID_SO_REUSEADDR 2
23+
/** Type of the socket */
24+
#define NSOS_MID_SO_TYPE 3
25+
/** Async error */
26+
#define NSOS_MID_SO_ERROR 4
27+
/** Bypass normal routing and send directly to host (ignored, for compatibility) */
28+
#define NSOS_MID_SO_DONTROUTE 5
29+
/** Transmission of broadcast messages is supported (ignored, for compatibility) */
30+
#define NSOS_MID_SO_BROADCAST 6
31+
32+
/** Size of socket send buffer */
33+
#define NSOS_MID_SO_SNDBUF 7
34+
/** Size of socket recv buffer */
35+
#define NSOS_MID_SO_RCVBUF 8
36+
37+
/** Enable sending keep-alive messages on connections */
38+
#define NSOS_MID_SO_KEEPALIVE 9
39+
/** Place out-of-band data into receive stream (ignored, for compatibility) */
40+
#define NSOS_MID_SO_OOBINLINE 10
41+
/** Socket priority */
42+
#define NSOS_MID_SO_PRIORITY 12
43+
/** Socket lingers on close (ignored, for compatibility) */
44+
#define NSOS_MID_SO_LINGER 13
45+
/** Allow multiple sockets to reuse a single port */
46+
#define NSOS_MID_SO_REUSEPORT 15
47+
48+
/** Receive low watermark (ignored, for compatibility) */
49+
#define NSOS_MID_SO_RCVLOWAT 18
50+
/** Send low watermark (ignored, for compatibility) */
51+
#define NSOS_MID_SO_SNDLOWAT 19
52+
53+
/**
54+
* Receive timeout
55+
* Applies to receive functions like recv(), but not to connect()
56+
*/
57+
#define NSOS_MID_SO_RCVTIMEO 20
58+
/** Send timeout */
59+
#define NSOS_MID_SO_SNDTIMEO 21
60+
61+
/** Bind a socket to an interface */
62+
#define NSOS_MID_SO_BINDTODEVICE 25
63+
64+
/** Socket accepts incoming connections (ignored, for compatibility) */
65+
#define NSOS_MID_SO_ACCEPTCONN 30
66+
67+
/** Timestamp TX packets */
68+
#define NSOS_MID_SO_TIMESTAMPING 37
69+
/** Protocol used with the socket */
70+
#define NSOS_MID_SO_PROTOCOL 38
71+
72+
/** Domain used with SOCKET */
73+
#define NSOS_MID_SO_DOMAIN 39
74+
75+
/** Enable SOCKS5 for Socket */
76+
#define NSOS_MID_SO_SOCKS5 60
77+
78+
/** Socket TX time (when the data should be sent) */
79+
#define NSOS_MID_SO_TXTIME 61
80+
81+
/** @} */
82+
83+
#endif /* __DRIVERS_NET_NSOS_SOCKET_H__ */

0 commit comments

Comments
 (0)