Sockets services: Difference between revisions
No edit summary |
No edit summary |
||
Line 12: | Line 12: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || | | 0 || [[#RegisterClient]] | ||
|- | |- | ||
| 1 || StartMonitoring | | 1 || StartMonitoring | ||
Line 76: | Line 76: | ||
| 31 || [7.0.0+] EventFd | | 31 || [7.0.0+] EventFd | ||
|- | |- | ||
| 32 || [7.0.0+] [[# | | 32 || [7.0.0+] [[#RegisterResourceStatisticsName]] | ||
|- | |- | ||
| 33 || [10.0.0+] [[# | | 33 || [10.0.0+] [[#RegisterClientShared]] | ||
|- | |- | ||
| 34 || [15.0.0+] GetSocketStatistics | | 34 || [15.0.0+] GetSocketStatistics | ||
|- | |||
| 35 || [17.0.0+] NifIoctl | |||
|- | |- | ||
| 200 || [15.0.0+] SetThreadCoreMask | | 200 || [15.0.0+] SetThreadCoreMask | ||
Line 87: | Line 89: | ||
|} | |} | ||
== | == RegisterClient == | ||
Takes a [[# | Takes a [[#LibraryConfigData]], the PID, the size of the transfer memory and a copy-handle of the latter. | ||
== Socket == | == Socket == | ||
Line 166: | Line 139: | ||
[7.0.0+] The buffers were replaced with a type-0x6 output buffer. | [7.0.0+] The buffers were replaced with a type-0x6 output buffer. | ||
== | == RegisterResourceStatisticsName == | ||
With [10.0.0+] this now takes an additional 8-bytes of input. | With [10.0.0+] this now takes an additional 8-bytes of input. | ||
== | == RegisterClientShared == | ||
Same input/output as [[# | Same input/output as [[#RegisterClient]] except this doesn't take an input handle. | ||
The work-buffer (size is still specified with this cmd) is backed by memory in the sysmodule, instead of TransferMemory. The size (after alignment) must be >=0x1000 and <=0x13F000. | The work-buffer (size is still specified with this cmd) is backed by memory in the sysmodule, instead of TransferMemory. The size (after alignment) must be >=0x1000 and <=0x13F000. | ||
sdknso will only use this cmd when two flags in the input config are set: the first one being set indicates that the bsd:s service is used, while the second flag enables using this cmd. An error is thrown if the work-buffer size is <0x1000. Otherwise when these flags aren't set, [[# | sdknso will only use this cmd when two flags in the input config are set: the first one being set indicates that the bsd:s service is used, while the second flag enables using this cmd. An error is thrown if the work-buffer size is <0x1000. Otherwise when these flags aren't set, [[#RegisterClient]] is used as usual. | ||
= bsdcfg = | = bsdcfg = | ||
Line 663: | Line 636: | ||
The handle is the service-session handle for "nn::anif::detail::ISfNetworkInterfaceService". | The handle is the service-session handle for "nn::anif::detail::ISfNetworkInterfaceService". | ||
=== LibraryConfigData === | |||
This is "nn::socket::sf::LibraryConfigData". | |||
/// Configuration structure for bsdInitalize | |||
typedef struct { | |||
u32 version; ///< Observed 1 on 2.0 LibAppletWeb, 2 on 3.0. | |||
u32 tcp_tx_buf_size; ///< Size of the TCP transfer (send) buffer (initial or fixed). | |||
u32 tcp_rx_buf_size; ///< Size of the TCP recieve buffer (initial or fixed). | |||
u32 tcp_tx_buf_max_size; ///< Maximum size of the TCP transfer (send) buffer. If it is 0, the size of the buffer is fixed to its initial value. | |||
u32 tcp_rx_buf_max_size; ///< Maximum size of the TCP receive buffer. If it is 0, the size of the buffer is fixed to its initial value. | |||
u32 udp_tx_buf_size; ///< Size of the UDP transfer (send) buffer (typically 0x2400 bytes). | |||
u32 udp_rx_buf_size; ///< Size of the UDP receive buffer (typically 0xA500 bytes). | |||
u32 sb_efficiency; ///< Number of buffers for each socket (standard values range from 1 to 8). | |||
} BsdBufferConfig; | |||
The transfer memory must be larger than a the computed size below. Should the transfer memory be smaller than that, the BSD sockets service would only send ZeroWindow packets (for TCP), resulting in a transfer rate not exceeding 1 byte/s. | |||
static size_t _bsdGetTransferMemSizeForBufferConfig(const BsdBufferConfig *config) | |||
{ | |||
u32 tcp_tx_buf_max_size = config->tcp_tx_buf_max_size != 0 ? config->tcp_tx_buf_max_size : config->tcp_tx_buf_size; | |||
u32 tcp_rx_buf_max_size = config->tcp_rx_buf_max_size != 0 ? config->tcp_rx_buf_max_size : config->tcp_rx_buf_size; | |||
u32 sum = tcp_tx_buf_max_size + tcp_rx_buf_max_size + config->udp_tx_buf_size + config->udp_rx_buf_size; | |||
sum = ((sum + 0xFFF) >> 12) << 12; // page round-up | |||
return (size_t)(config->sb_efficiency * sum); | |||
} | |||
= DeleteMode = | = DeleteMode = |