diff --git a/cafe/nn_nets2.def b/cafe/nn_nets2.def index fcbbf12a3..a995d5a4d 100644 --- a/cafe/nn_nets2.def +++ b/cafe/nn_nets2.def @@ -11,4 +11,6 @@ icmp_close_handle icmp_create_handle icmp_last_code_type icmp_ping + +:TEXT_WRAP somemopt diff --git a/include/nn/nets2.h b/include/nn/nets2.h new file mode 100644 index 000000000..8c26f84d8 --- /dev/null +++ b/include/nn/nets2.h @@ -0,0 +1,8 @@ +#pragma once + +/** + * \defgroup nn_nets2 nn_nets2 + * Network functions 2. + */ + +#include diff --git a/include/nn/nets2/somemopt.h b/include/nn/nets2/somemopt.h new file mode 100644 index 000000000..7105c3eb0 --- /dev/null +++ b/include/nn/nets2/somemopt.h @@ -0,0 +1,68 @@ +#pragma once +#include + +/** + * \defgroup nn_nets2_somemopt + * \ingroup nn_nets2 + * User provided socket memory options. + * @{ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum SOMemOptRequest +{ + //! Initialize buffer managment from user-provided buffer. + //! This is a blocking request, which only returns once nsysnet is shut down/the application quits. + SOMEMOPT_REQUEST_INIT = 1, + //! Return the amount of bytes used for buffer management. + SOMEMOPT_REQUEST_GET_BYTES_USED = 2, + //! Wait for buffer management initialization to be done. + SOMEMOPT_REQUEST_WAIT_FOR_INIT = 3, + //! Cancel pending wait for init. + SOMEMOPT_REQUEST_CANCEL_WAIT = 4, +} SOMemOptRequest; + +typedef enum SOMemOptFlags +{ + SOMEMOPT_FLAGS_NONE = 0, + //! Changes the distribution between small and big buffers to 50-50 instead of 80-20. + SOMEMOPT_FLAGS_BIG_BUFFERS = 1 << 0, +} SOMemOptFlags; + +/** + * Perform a somemopt request. + * + * \param request + * The request to perform. + * + * \param buffer + * A 0x40 aligned buffer for \link SOMEMOPT_REQUEST_INIT \endlink. + * + * \param size + * The size of the buffer for \link SOMEMOPT_REQUEST_INIT \endlink. + * Minimum size is \c 0x20000 bytes, maximum size is \c 0x300000. + * + * \param flags + * A combination of flags. + * + * \return + * -1 on error. + */ +int +somemopt(SOMemOptRequest request, + void *buffer, + uint32_t size, + SOMemOptFlags flags); + +int +RPLWRAP(somemopt)(SOMemOptRequest request, + void *buffer, + uint32_t size, + SOMemOptFlags flags); + +#ifdef __cplusplus +} +#endif diff --git a/include/sys/socket.h b/include/sys/socket.h index 1609c596f..08161cde2 100644 --- a/include/sys/socket.h +++ b/include/sys/socket.h @@ -51,7 +51,7 @@ #define SO_UNKNOWN101A 0x101A // tcp related #define SO_UNKNOWN101B 0x101B // tcp related #define SO_NOSLOWSTART 0x4000 // disable slowstart -#define SO_RUSRBUF 0x10000 // ? +#define SO_RUSRBUF 0x10000 // enable somemopt provided memory for receive buffer typedef uint32_t socklen_t; typedef uint16_t sa_family_t; diff --git a/libraries/wutsocket/somemopt.c b/libraries/wutsocket/somemopt.c new file mode 100644 index 000000000..866f35563 --- /dev/null +++ b/libraries/wutsocket/somemopt.c @@ -0,0 +1,13 @@ +#include "wut_socket.h" + +#include + +int +somemopt(SOMemOptRequest request, + void *buffer, + uint32_t size, + SOMemOptFlags flags) +{ + int rc = RPLWRAP(somemopt)(request, buffer, size, flags); + return __wut_get_nsysnet_result(NULL, rc); +} diff --git a/tests/test_compile_headers_common/test_compile_headers_list.h b/tests/test_compile_headers_common/test_compile_headers_list.h index 8baeae44e..3fdc5b25c 100644 --- a/tests/test_compile_headers_common/test_compile_headers_list.h +++ b/tests/test_compile_headers_common/test_compile_headers_list.h @@ -102,6 +102,7 @@ #include #include #include +#include #include #include #include @@ -116,6 +117,7 @@ #include #include #include +#include #include #include #include