Add Zephyr Support (#19003)
* Porting Nim to run on Zephyr.
Includes changes to `std/net`.
Squashed commit of the following:
tweaking more memory / malloc things
revert back bitmasks
tweaking nim to use kernel heap as C malloc doesn't work
fixing socket polling on zephyr
cleanup getting maximum sockets for process or for rtos'es
reorganizing and fixing net for async / system
merge netlite changes back into nativesockets
merge netlite changes back into nativesockets
reverting native sockets back
tweaking nim / zephyr network
adding option to run 'net-lite' from linux
bridging zephyr's max connections
fixing net errors
fixing compilation with getAddrString
fixing compilation with getAddrString
experimenting with a nativesockets_lite ... getAddrString
experimenting with a nativesockets_lite ... getAddrString
experimenting with a nativesockets_lite ... getLocalAddr
experimenting with a nativesockets_lite ... getLocalAddr
experimenting with a nativesockets_lite ...
add note regarding incorrect FreeRTOS Sockadd_in fields
changing to NIM_STATIC_ASSERT
cleaning up the static_assert error messages
cleaning up the static_assert error messages
setting up static assert ftw!
testing compile time asserts
reworking Sockaddr objects to more closely match various platforms
reworking Sockaddr objects to more closely match various platforms
reworking Sockaddr objects to more closely match various platforms
finding missing items (issue #18684)
fixup posix constants (issue #18684)
adding plumbing for zephyr os (issue #18684)
adding plumbing for zephyr os (issue #18684)
* fixing constant capitalizations
* remove extra debug prints and fix TSa_Family/cint issue
* remove extra debug prints and fix TSa_Family/cint issue
* Porting Nim to run on Zephyr.
Includes changes to `std/net`.
Squashed commit of the following:
tweaking more memory / malloc things
revert back bitmasks
tweaking nim to use kernel heap as C malloc doesn't work
fixing socket polling on zephyr
cleanup getting maximum sockets for process or for rtos'es
reorganizing and fixing net for async / system
merge netlite changes back into nativesockets
merge netlite changes back into nativesockets
reverting native sockets back
tweaking nim / zephyr network
adding option to run 'net-lite' from linux
bridging zephyr's max connections
fixing net errors
fixing compilation with getAddrString
fixing compilation with getAddrString
experimenting with a nativesockets_lite ... getAddrString
experimenting with a nativesockets_lite ... getAddrString
experimenting with a nativesockets_lite ... getLocalAddr
experimenting with a nativesockets_lite ... getLocalAddr
experimenting with a nativesockets_lite ...
add note regarding incorrect FreeRTOS Sockadd_in fields
changing to NIM_STATIC_ASSERT
cleaning up the static_assert error messages
cleaning up the static_assert error messages
setting up static assert ftw!
testing compile time asserts
reworking Sockaddr objects to more closely match various platforms
reworking Sockaddr objects to more closely match various platforms
reworking Sockaddr objects to more closely match various platforms
finding missing items (issue #18684)
fixup posix constants (issue #18684)
adding plumbing for zephyr os (issue #18684)
adding plumbing for zephyr os (issue #18684)
* fixing constant capitalizations
* remove extra debug prints and fix TSa_Family/cint issue
* remove extra debug prints and fix TSa_Family/cint issue
* fixing PR issues
* Porting Nim to run on Zephyr.
Includes changes to `std/net`.
Squashed commit of the following:
tweaking more memory / malloc things
revert back bitmasks
tweaking nim to use kernel heap as C malloc doesn't work
fixing socket polling on zephyr
cleanup getting maximum sockets for process or for rtos'es
reorganizing and fixing net for async / system
merge netlite changes back into nativesockets
merge netlite changes back into nativesockets
reverting native sockets back
tweaking nim / zephyr network
adding option to run 'net-lite' from linux
bridging zephyr's max connections
fixing net errors
fixing compilation with getAddrString
fixing compilation with getAddrString
experimenting with a nativesockets_lite ... getAddrString
experimenting with a nativesockets_lite ... getAddrString
experimenting with a nativesockets_lite ... getLocalAddr
experimenting with a nativesockets_lite ... getLocalAddr
experimenting with a nativesockets_lite ...
add note regarding incorrect FreeRTOS Sockadd_in fields
changing to NIM_STATIC_ASSERT
cleaning up the static_assert error messages
cleaning up the static_assert error messages
setting up static assert ftw!
testing compile time asserts
reworking Sockaddr objects to more closely match various platforms
reworking Sockaddr objects to more closely match various platforms
reworking Sockaddr objects to more closely match various platforms
finding missing items (issue #18684)
fixup posix constants (issue #18684)
adding plumbing for zephyr os (issue #18684)
adding plumbing for zephyr os (issue #18684)
* fixing constant capitalizations
* remove extra debug prints and fix TSa_Family/cint issue
* remove extra debug prints and fix TSa_Family/cint issue
* Remerge
* fixing constant capitalizations
* remove extra debug prints and fix TSa_Family/cint issue
* remove extra debug prints and fix TSa_Family/cint issue
* fixing PR issues
* fix maxDescriptors on zephyr/freertos
* move maxDescriptors to selector.nim -- fixes compile issue
* change realloc impl on zephyr to match ansi c behavior
* change realloc impl on zephyr to match ansi c behavior
* force compileOnly mode for tlwip
Co-authored-by: Jaremy J. Creechley <jaremy.creechley@wavebaselabs.com>
Co-authored-by: Jaremy Creechley <jaremy.creechley@panthalassa.com>
This commit is contained in:
parent
41d9918591
commit
141b76e365
20 changed files with 522 additions and 346 deletions
|
|
@ -151,8 +151,10 @@ proc htons*(a1: uint16): uint16 {.importc, header: "<arpa/inet.h>".}
|
|||
proc ntohl*(a1: uint32): uint32 {.importc, header: "<arpa/inet.h>".}
|
||||
proc ntohs*(a1: uint16): uint16 {.importc, header: "<arpa/inet.h>".}
|
||||
|
||||
proc inet_addr*(a1: cstring): InAddrT {.importc, header: "<arpa/inet.h>".}
|
||||
proc inet_ntoa*(a1: InAddr): cstring {.importc, header: "<arpa/inet.h>".}
|
||||
when not defined(zephyr):
|
||||
proc inet_addr*(a1: cstring): InAddrT {.importc, header: "<arpa/inet.h>".}
|
||||
proc inet_ntoa*(a1: InAddr): cstring {.importc, header: "<arpa/inet.h>".}
|
||||
|
||||
proc inet_ntop*(a1: cint, a2: pointer, a3: cstring, a4: int32): cstring {.
|
||||
importc:"(char *)$1", header: "<arpa/inet.h>".}
|
||||
proc inet_pton*(a1: cint, a2: cstring, a3: pointer): cint {.
|
||||
|
|
|
|||
|
|
@ -363,6 +363,8 @@ var SEM_FAILED* {.importc: "SEM_FAILED", header: "<semaphore.h>".}: pointer
|
|||
# <sys/resource.h>
|
||||
# var RLIMIT_NOFILE* {.importc: "RLIMIT_NOFILE", header: "<sys/resource.h>".}: cint
|
||||
|
||||
var FD_MAX* {.importc: "CONFIG_LWIP_MAX_SOCKETS", header: "<lwipopts.h>".}: cint
|
||||
|
||||
# <sys/select.h>
|
||||
var FD_SETSIZE* {.importc: "FD_SETSIZE", header: "<sys/select.h>".}: cint
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
when defined(nimHasStyleChecks):
|
||||
{.push styleChecks: off.}
|
||||
|
||||
when defined(freertos):
|
||||
when defined(freertos) or defined(zephyr):
|
||||
const
|
||||
hasSpawnH = false # should exist for every Posix system nowadays
|
||||
hasAioH = false
|
||||
|
|
@ -391,9 +391,29 @@ when hasSpawnH:
|
|||
header: "<spawn.h>", final, pure.} = object
|
||||
|
||||
when defined(linux):
|
||||
const Sockaddr_max_length* = 255
|
||||
# from sys/un.h
|
||||
const Sockaddr_un_path_length* = 108
|
||||
elif defined(zephyr):
|
||||
when defined(net_ipv6):
|
||||
const Sockaddr_max_length* = 24
|
||||
elif defined(net_raw):
|
||||
const Sockaddr_max_length* = 20
|
||||
else:
|
||||
const Sockaddr_max_length* = 8
|
||||
const Sockaddr_un_path_length* = Sockaddr_max_length
|
||||
# Zephyr is heavily customizable so it's easy to get to a state
|
||||
# where Nim & Zephyr IPv6 settings are out of sync, causing painful runtime failures.
|
||||
{.emit: ["NIM_STATIC_ASSERT(NET_SOCKADDR_MAX_SIZE == ",
|
||||
Sockaddr_max_length,
|
||||
",\"NET_SOCKADDR_MAX_SIZE and Sockaddr_max_length size mismatch!",
|
||||
" Check that Nim and Zephyr IPv4/IPv6 settings match.",
|
||||
" Try adding -d:net_ipv6 to enable IPv6 for Nim on Zephyr.\" );"].}
|
||||
elif defined(freertos) or defined(lwip):
|
||||
const Sockaddr_max_length* = 14
|
||||
const Sockaddr_un_path_length* = 108
|
||||
else:
|
||||
const Sockaddr_max_length* = 255
|
||||
# according to http://pubs.opengroup.org/onlinepubs/009604499/basedefs/sys/un.h.html
|
||||
# this is >=92
|
||||
const Sockaddr_un_path_length* = 92
|
||||
|
|
@ -408,48 +428,50 @@ when defined(lwip):
|
|||
pure, final.} = object ## struct sockaddr
|
||||
sa_len*: uint8 ## Address family.
|
||||
sa_family*: TSa_Family ## Address family.
|
||||
sa_data*: array[0..255, char] ## Socket address (variable-length data).
|
||||
sa_data*: array[0..Sockaddr_max_length-sizeof(uint8)-sizeof(TSa_Family), char] ## Socket address (variable-length data).
|
||||
|
||||
Sockaddr_storage* {.importc: "struct sockaddr_storage",
|
||||
header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr_storage
|
||||
s2_len*: uint8 ## Address family.
|
||||
ss_family*: TSa_Family ## Address family.
|
||||
s2_data1*: array[2, char] ## Address family.
|
||||
s2_data2*: array[3, uint32] ## Address family.
|
||||
when defined(lwip6) or defined(net_ipv6):
|
||||
s2_data3*: array[3, uint32] ## Address family.
|
||||
elif defined(zephyr):
|
||||
type
|
||||
SockAddr* {.importc: "struct sockaddr", header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr
|
||||
sa_family*: TSa_Family ## Address family.
|
||||
data*: array[0..Sockaddr_max_length-sizeof(TSa_Family), char] ## Socket address (variable-length data).
|
||||
|
||||
Sockaddr_storage* {.importc: "struct sockaddr_storage",
|
||||
header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr_storage
|
||||
ss_family*: TSa_Family ## Address family.
|
||||
data*: array[0..Sockaddr_max_length-sizeof(TSa_Family), char] ## Socket address (variable-length data).
|
||||
{.emit: ["NIM_STATIC_ASSERT(sizeof(struct sockaddr) == ", sizeof(Sockaddr), ",\"struct size mismatch\" );"].}
|
||||
{.emit: ["NIM_STATIC_ASSERT(sizeof(struct sockaddr_storage) == ", sizeof(Sockaddr_storage), ",\"struct size mismatch\" );"].}
|
||||
else:
|
||||
type
|
||||
SockAddr* {.importc: "struct sockaddr", header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr
|
||||
sa_family*: TSa_Family ## Address family.
|
||||
sa_data*: array[0..255, char] ## Socket address (variable-length data).
|
||||
sa_data*: array[0..Sockaddr_max_length-sizeof(TSa_Family), char] ## Socket address (variable-length data).
|
||||
|
||||
Sockaddr_storage* {.importc: "struct sockaddr_storage",
|
||||
header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr_storage
|
||||
ss_family*: TSa_Family ## Address family.
|
||||
|
||||
type
|
||||
Sockaddr_un* {.importc: "struct sockaddr_un", header: "<sys/un.h>",
|
||||
pure, final.} = object ## struct sockaddr_un
|
||||
sun_family*: TSa_Family ## Address family.
|
||||
sun_path*: array[0..Sockaddr_un_path_length-1, char] ## Socket path
|
||||
sun_path*: array[0..Sockaddr_un_path_length-sizeof(TSa_Family), char] ## Socket path
|
||||
|
||||
|
||||
when defined(lwip):
|
||||
when not defined(lwip6):
|
||||
type
|
||||
Sockaddr_storage* {.importc: "struct sockaddr_storage",
|
||||
header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr_storage
|
||||
s2_len*: uint8 ## Address family.
|
||||
ss_family*: TSa_Family ## Address family.
|
||||
s2_data1*: array[2, char] ## Address family.
|
||||
s2_data2*: array[3, uint32] ## Address family.
|
||||
else:
|
||||
type
|
||||
Sockaddr_storage* {.importc: "struct sockaddr_storage",
|
||||
header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr_storage
|
||||
s2_len*: uint8 ## Address family.
|
||||
ss_family*: TSa_Family ## Address family.
|
||||
s2_data1*: array[2, char] ## Address family.
|
||||
s2_data2*: array[3, uint32] ## Address family.
|
||||
s2_data3*: array[3, uint32] ## Address family.
|
||||
else:
|
||||
type
|
||||
Sockaddr_storage* {.importc: "struct sockaddr_storage",
|
||||
header: "<sys/socket.h>",
|
||||
pure, final.} = object ## struct sockaddr_storage
|
||||
ss_family*: TSa_Family ## Address family.
|
||||
|
||||
type
|
||||
Tif_nameindex* {.importc: "struct if_nameindex", final,
|
||||
pure, header: "<net/if.h>".} = object ## struct if_nameindex
|
||||
|
|
@ -494,6 +516,7 @@ type
|
|||
header: "<netinet/in.h>".} = object ## struct in_addr
|
||||
s_addr*: InAddrScalar
|
||||
|
||||
# TODO: Fixme for FreeRTOS/LwIP, these are incorrect
|
||||
Sockaddr_in* {.importc: "struct sockaddr_in", pure, final,
|
||||
header: "<netinet/in.h>".} = object ## struct sockaddr_in
|
||||
sin_family*: TSa_Family ## AF_INET.
|
||||
|
|
@ -577,7 +600,12 @@ when not defined(lwip):
|
|||
events*: cshort ## The input event flags (see below).
|
||||
revents*: cshort ## The output event flags (see below).
|
||||
|
||||
Tnfds* {.importc: "nfds_t", header: "<poll.h>".} = cint
|
||||
when defined(zephyr):
|
||||
type
|
||||
Tnfds* = distinct cint
|
||||
else:
|
||||
type
|
||||
Tnfds* {.importc: "nfds_t", header: "<poll.h>".} = cint
|
||||
|
||||
var
|
||||
errno* {.importc, header: "<errno.h>".}: cint ## error variable
|
||||
|
|
@ -625,7 +653,7 @@ elif defined(solaris):
|
|||
# Solaris doesn't have MSG_NOSIGNAL
|
||||
const
|
||||
MSG_NOSIGNAL* = 0'i32
|
||||
elif defined(freertos) or defined(lwip):
|
||||
elif defined(zephyr) or defined(freertos) or defined(lwip):
|
||||
# LwIP/FreeRTOS doesn't have MSG_NOSIGNAL
|
||||
const
|
||||
MSG_NOSIGNAL* = 0x20'i32
|
||||
|
|
|
|||
|
|
@ -462,6 +462,9 @@ var RLIMIT_NOFILE* {.importc: "RLIMIT_NOFILE", header: "<sys/resource.h>".}: cin
|
|||
|
||||
# <sys/select.h>
|
||||
var FD_SETSIZE* {.importc: "FD_SETSIZE", header: "<sys/select.h>".}: cint
|
||||
when defined(zephyr):
|
||||
# Zephyr specific hardcoded value
|
||||
var FD_MAX* {.importc: "CONFIG_POSIX_MAX_FDS ", header: "<sys/select.h>".}: cint
|
||||
|
||||
# <sys/socket.h>
|
||||
var MSG_CTRUNC* {.importc: "MSG_CTRUNC", header: "<sys/socket.h>".}: cint
|
||||
|
|
@ -487,10 +490,15 @@ var SO_SNDTIMEO* {.importc: "SO_SNDTIMEO", header: "<sys/socket.h>".}: cint
|
|||
var SO_TYPE* {.importc: "SO_TYPE", header: "<sys/socket.h>".}: cint
|
||||
var SOCK_DGRAM* {.importc: "SOCK_DGRAM", header: "<sys/socket.h>".}: cint
|
||||
var SOCK_RAW* {.importc: "SOCK_RAW", header: "<sys/socket.h>".}: cint
|
||||
var SOCK_SEQPACKET* {.importc: "SOCK_SEQPACKET", header: "<sys/socket.h>".}: cint
|
||||
when defined(zephyr):
|
||||
const SOCK_SEQPACKET* = cint(5)
|
||||
var SOMAXCONN* {.importc: "CONFIG_NET_SOCKETS_POLL_MAX", header: "<sys/socket.h>".}: cint
|
||||
else:
|
||||
var SOCK_SEQPACKET* {.importc: "SOCK_SEQPACKET", header: "<sys/socket.h>".}: cint
|
||||
var SOMAXCONN* {.importc: "SOMAXCONN", header: "<sys/socket.h>".}: cint
|
||||
|
||||
var SOCK_STREAM* {.importc: "SOCK_STREAM", header: "<sys/socket.h>".}: cint
|
||||
var SOL_SOCKET* {.importc: "SOL_SOCKET", header: "<sys/socket.h>".}: cint
|
||||
var SOMAXCONN* {.importc: "SOMAXCONN", header: "<sys/socket.h>".}: cint
|
||||
var MSG_PEEK* {.importc: "MSG_PEEK", header: "<sys/socket.h>".}: cint
|
||||
var MSG_TRUNC* {.importc: "MSG_TRUNC", header: "<sys/socket.h>".}: cint
|
||||
var MSG_WAITALL* {.importc: "MSG_WAITALL", header: "<sys/socket.h>".}: cint
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue