Skip to content

Commit 10bb61e

Browse files
Noemie Gilletnashif
authored andcommitted
drivers: nsos: support for AF_UNIX
Handle AF_UNIX family sockets for NSOS offloaded driver Note that the size of struct sockaddr_un is done conditionnaly based on CONFIG_NET_NATIVE_OFFLOADED_SOCKETS Also, NET_SOCKADDR_PTR_MAX_SIZE needs to be updated only if CONFIG_NET_SOCKETS_PACKET is not set. Otherwise, for a AF_PACKET socket, a struct net_context variable can be corrupted, as local would have be on 16 bytes instead of 20 bytes. Signed-off-by: Noemie Gillet <[email protected]>
1 parent 355d032 commit 10bb61e

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

drivers/net/nsos.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
#define NSOS_MID_PF_UNSPEC 0 /**< Unspecified protocol family. */
1515
#define NSOS_MID_PF_INET 1 /**< IP protocol family version 4. */
1616
#define NSOS_MID_PF_INET6 2 /**< IP protocol family version 6. */
17+
#define NSOS_MID_PF_UNIX 6 /**< Unix protocol. */
1718

1819
/* Address families. */
1920
#define NSOS_MID_AF_UNSPEC NSOS_MID_PF_UNSPEC /**< Unspecified address family. */
2021
#define NSOS_MID_AF_INET NSOS_MID_PF_INET /**< IP protocol family version 4. */
2122
#define NSOS_MID_AF_INET6 NSOS_MID_PF_INET6 /**< IP protocol family version 6. */
23+
#define NSOS_MID_AF_UNIX NSOS_MID_PF_UNIX /**< Unix protocol. */
2224

2325
/** Protocol numbers from IANA/BSD */
2426
enum nsos_mid_net_ip_protocol {
@@ -63,10 +65,18 @@ struct nsos_mid_sockaddr_in6 {
6365
uint32_t sin6_scope_id; /* Set of interfaces for a scope */
6466
};
6567

68+
#define UNIX_PATH_MAX 108
69+
struct nsos_mid_sockaddr_un {
70+
sa_family_t sun_family; /* AF_UNIX */
71+
char sun_path[UNIX_PATH_MAX]; /* pathname */
72+
};
73+
74+
6675
struct nsos_mid_sockaddr_storage {
6776
union {
6877
struct nsos_mid_sockaddr_in sockaddr_in;
6978
struct nsos_mid_sockaddr_in6 sockaddr_in6;
79+
struct nsos_mid_sockaddr_un sockaddr_un;
7080
};
7181
};
7282

drivers/net/nsos_adapt.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <sys/epoll.h>
2424
#include <sys/ioctl.h>
2525
#include <sys/socket.h>
26+
#include <sys/un.h>
2627
#include <unistd.h>
2728

2829
#include "nsos.h"
@@ -68,6 +69,9 @@ static int socket_family_from_nsos_mid(int family_mid, int *family)
6869
case NSOS_MID_AF_INET6:
6970
*family = AF_INET6;
7071
break;
72+
case NSOS_MID_AF_UNIX:
73+
*family = AF_UNIX;
74+
break;
7175
default:
7276
nsi_print_warning("%s: socket family %d not supported\n", __func__, family_mid);
7377
return -NSOS_MID_EAFNOSUPPORT;
@@ -88,6 +92,9 @@ static int socket_family_to_nsos_mid(int family, int *family_mid)
8892
case AF_INET6:
8993
*family_mid = NSOS_MID_AF_INET6;
9094
break;
95+
case AF_UNIX:
96+
*family_mid = NSOS_MID_AF_UNIX;
97+
break;
9198
default:
9299
nsi_print_warning("%s: socket family %d not supported\n", __func__, family);
93100
return -NSOS_MID_EAFNOSUPPORT;
@@ -296,6 +303,19 @@ static int sockaddr_from_nsos_mid(struct sockaddr **addr, socklen_t *addrlen,
296303

297304
return 0;
298305
}
306+
case NSOS_MID_AF_UNIX: {
307+
const struct nsos_mid_sockaddr_un *addr_un_mid =
308+
(const struct nsos_mid_sockaddr_un *)addr_mid;
309+
struct sockaddr_un *addr_un = (struct sockaddr_un *)*addr;
310+
311+
addr_un->sun_family = AF_UNIX;
312+
memcpy(addr_un->sun_path, addr_un_mid->sun_path,
313+
sizeof(addr_un->sun_path));
314+
315+
*addrlen = sizeof(*addr_un);
316+
317+
return 0;
318+
}
299319
}
300320

301321
return -NSOS_MID_EINVAL;
@@ -347,6 +367,23 @@ static int sockaddr_to_nsos_mid(const struct sockaddr *addr, socklen_t addrlen,
347367

348368
return 0;
349369
}
370+
case AF_UNIX: {
371+
struct nsos_mid_sockaddr_un *addr_un_mid =
372+
(struct nsos_mid_sockaddr_un *)addr_mid;
373+
const struct sockaddr_un *addr_un = (const struct sockaddr_un *)addr;
374+
375+
if (addr_un_mid) {
376+
addr_un_mid->sun_family = NSOS_MID_AF_UNIX;
377+
memcpy(addr_un_mid->sun_path, addr_un->sun_path,
378+
sizeof(addr_un_mid->sun_path));
379+
}
380+
381+
if (addrlen_mid) {
382+
*addrlen_mid = sizeof(*addr_un);
383+
}
384+
385+
return 0;
386+
}
350387
}
351388

352389
nsi_print_warning("%s: socket family %d not supported\n", __func__, addr->sa_family);

drivers/net/nsos_sockets.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ static int socket_family_to_nsos_mid(int family, int *family_mid)
7272
case AF_INET6:
7373
*family_mid = NSOS_MID_AF_INET6;
7474
break;
75+
case AF_UNIX:
76+
*family_mid = NSOS_MID_AF_UNIX;
77+
break;
7578
default:
7679
return -NSOS_MID_EAFNOSUPPORT;
7780
}
@@ -448,6 +451,24 @@ static int sockaddr_to_nsos_mid(const struct sockaddr *addr, socklen_t addrlen,
448451

449452
return 0;
450453
}
454+
case AF_UNIX: {
455+
const struct sockaddr_un *addr_un =
456+
(const struct sockaddr_un *)addr;
457+
struct nsos_mid_sockaddr_un *addr_un_mid =
458+
(struct nsos_mid_sockaddr_un *)*addr_mid;
459+
460+
if (addrlen < sizeof(*addr_un)) {
461+
return -NSOS_MID_EINVAL;
462+
}
463+
464+
addr_un_mid->sun_family = NSOS_MID_AF_UNIX;
465+
memcpy(addr_un_mid->sun_path, addr_un->sun_path,
466+
sizeof(addr_un_mid->sun_path));
467+
468+
*addrlen_mid = sizeof(*addr_un_mid);
469+
470+
return 0;
471+
}
451472
}
452473

453474
return -NSOS_MID_EINVAL;
@@ -946,6 +967,9 @@ static int socket_family_from_nsos_mid(int family_mid, int *family)
946967
case NSOS_MID_AF_INET6:
947968
*family = AF_INET6;
948969
break;
970+
case NSOS_MID_AF_UNIX:
971+
*family = AF_UNIX;
972+
break;
949973
default:
950974
return -NSOS_MID_EAFNOSUPPORT;
951975
}

include/zephyr/net/net_ip.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,12 @@ struct sockaddr_ll_ptr {
231231
uint8_t *sll_addr; /**< Physical-layer address, big endian */
232232
};
233233

234+
/** Socket address struct for unix socket where address is a pointer */
235+
struct sockaddr_un_ptr {
236+
sa_family_t sun_family; /**< Always AF_UNIX */
237+
char *sun_path; /**< pathname */
238+
};
239+
234240
struct sockaddr_can_ptr {
235241
sa_family_t can_family;
236242
int can_ifindex;
@@ -373,14 +379,27 @@ struct cmsghdr {
373379
#endif
374380
#endif
375381

382+
#if defined(CONFIG_NET_NATIVE_OFFLOADED_SOCKETS)
383+
#define UNIX_PATH_MAX 108
384+
#undef NET_SOCKADDR_MAX_SIZE
385+
/* Define NET_SOCKADDR_MAX_SIZE to be struct of sa_family_t + char[UNIX_PATH_MAX] */
386+
#define NET_SOCKADDR_MAX_SIZE (UNIX_PATH_MAX+sizeof(sa_family_t))
387+
#if !defined(CONFIG_NET_SOCKETS_PACKET)
388+
#undef NET_SOCKADDR_PTR_MAX_SIZE
389+
#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_un_ptr))
390+
#endif
391+
#endif
392+
376393
#if !defined(CONFIG_NET_IPV4)
377394
#if !defined(CONFIG_NET_IPV6)
378395
#if !defined(CONFIG_NET_SOCKETS_PACKET)
396+
#if !defined(CONFIG_NET_NATIVE_OFFLOADED_SOCKETS)
379397
#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in6))
380398
#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in6_ptr))
381399
#endif
382400
#endif
383401
#endif
402+
#endif
384403

385404
/** @endcond */
386405

0 commit comments

Comments
 (0)