ams::mitm::bsd::BsdMitmService
ams::mitm::bsd::BsdMitmService
Section titled “ams::mitm::bsd::BsdMitmService”BSD MITM Service implementation.
This class implements the bsd:u MITM service. It forwards most calls to the real service but intercepts and proxies LDN-related socket operations.
Members
Section titled “Members”m_client_pid
Section titled “m_client_pid”Type: u64
Client process ID for this session.
m_command_count
Section titled “m_command_count”Type: u32
Number of commands received on this session (for debugging)
m_session_id
Section titled “m_session_id”Type: u32
Unique session ID for debugging (assigned in constructor)
m_registered
Section titled “m_registered”Type: bool
Members
Section titled “Members”s_next_session_id
Section titled “s_next_session_id”Type: std::atomic< u32 >
Static counter for session IDs (atomic for thread safety)
Methods
Section titled “Methods”BsdMitmService
Section titled “BsdMitmService”void BsdMitmService(std::shared_ptr<::Service > && s, const sm::MitmProcessInfo & c)Constructor.
Construct BSD MITM service for a client process.Called by Atmosphere’s server manager when a process opens bsd:u andreturns true.Forward ServiceTheparameter is a shared_ptr to a Service structure that represents an open session to the real bsd:u service. This is stored in the inheritedmember and used for all forwarding calls viamacros. TrackingWe store the client’s PID for logging and future socket tracking. Each client process gets its owninstance with its own forward service session.sShared pointer to the original bsd:u service sessioncProcess information for the client (PID, program ID, etc.)param
Parameters:
s(std::shared_ptr<::Service > &&)c(const sm::MitmProcessInfo &)
~BsdMitmService
Section titled “~BsdMitmService”void ~BsdMitmService()Destructor - cleanup tracked sockets.
Destroy BSD MITM service.Called when the client process closes its bsd:u session or terminates. The forward_service session is automatically closed by the shared_ptr.Future Cleanup (Story 8.4)When socket tracking is implemented, this destructor will cleanup all tracked sockets for this client to prevent resource leaks.
RegisterClient
Section titled “RegisterClient”Result RegisterClient(sf::Out< u64 > out_result, const& config, const sf::ClientProcessId & client_pid, u64 tmem_size, sf::CopyHandle && transfer_memory)Initialize BSD socket library for a client (Command 0)
First command called by games to initialize the socket library. This sets up buffer sizes and transfer memory for socket operations.IPC Interface (from switchbrew)Input:[4]u32config_size(shouldbe32forLibraryConfigData)[0x21]-33buffer(configdata,auto-select)[0xA]Copyhandle(transfermemory)ClientProcessIdnormalOutput:[4]s32errno(0=success) MemoryThe transfer_memory handle is a shared memory region used for socket buffers. We must forward it to the real service as a copy handle.out_errnoBSD errno on failure (0 on success)config_sizeSize of config buffer (0x20 for LibraryConfigData)configLibraryConfigData with socket buffer settingsclient_pidClient’s process IDtransfer_memoryHandle to transfer memory for buffersparamResult code from forwarding to real servicereturn
Parameters:
out_result(sf::Out< u64 >)config(const&)client_pid(const sf::ClientProcessId &)tmem_size(u64)transfer_memory(sf::CopyHandle &&)
Returns: Result
StartMonitoring
Section titled “StartMonitoring”Result StartMonitoring(sf::Out< s32 > out_errno, u64 pid)Start socket monitoring (Command 1)
Starts monitoring socket activity for a process.IPC InterfaceInput:[8]u64pidnormalOutput:[4]s32errnoout_errnoBSD errno on failurepidProcess ID to monitorparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)pid(u64)
Returns: Result
Socket
Section titled “Socket”Result Socket(sf::Out< s32 > out_errno, sf::Out< s32 > out_fd, s32 domain, s32 type, s32 protocol)Create a new socket (Command 2)
Creates a new socket and returns its file descriptor. This is the primary entry point for socket creation.IPC InterfaceInput:[4]s32domain(AF_INET=2,AF_INET6=28)[4]s32type(SOCK_STREAM=1,SOCK_DGRAM=2)[4]s32protocol(0=auto,TCP=6,UDP=17)normalOutput:[4]s32errno[4]s32fd Tracking (Future Story 8.4)After creating the socket, we’ll register it in our tracking table. The socket is initially marked as “normal” and only becomes an LDN proxy socket when it binds/connects to 10.114.x.x.out_errnoBSD errno on failure (0 on success)out_fdFile descriptor for the new socketdomainAddress family (AF_INET=2, AF_INET6=28)typeSocket type (SOCK_STREAM=1, SOCK_DGRAM=2)protocolProtocol (0=default, TCP=6, UDP=17)paramResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_fd(sf::Out< s32 >)domain(s32)type(s32)protocol(s32)
Returns: Result
SocketExempt
Section titled “SocketExempt”Result SocketExempt(sf::Out< s32 > out_errno, sf::Out< s32 > out_fd, s32 domain, s32 type, s32 protocol)Create an exempt socket (Command 3)
Creates a socket exempt from certain restrictions. Same interface and tracking logic as Socket.IPC InterfaceSame as Socket (Command 2)out_errnoBSD errnoout_fdFile descriptordomainAddress familytypeSocket typeprotocolProtocolparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_fd(sf::Out< s32 >)domain(s32)type(s32)protocol(s32)
Returns: Result
Result Open(sf::Out< s32 > out_errno, sf::Out< s32 > out_fd, const sf::InBuffer & path)Open a device (Command 4)
Opens a device file. Limited to /dev/bpf on Switch. Not relevant for LDN proxy - just forward transparently.IPC InterfaceInput:[0x5]-Abuffer(pathstring)normalOutput:[4]s32errno[4]s32fdout_errnoBSD errnoout_fdFile descriptorpathDevice pathparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_fd(sf::Out< s32 >)path(const sf::InBuffer &)
Returns: Result
Select
Section titled “Select”Result Select(sf::Out< s32 > out_errno, sf::Out< s32 > out_count, s32 nfds, const sf::InAutoSelectBuffer & readfds_in, const sf::InAutoSelectBuffer & writefds_in, const sf::InAutoSelectBuffer & errorfds_in, const sf::InAutoSelectBuffer & timeout, sf::OutAutoSelectBuffer readfds_out, sf::OutAutoSelectBuffer writefds_out, sf::OutAutoSelectBuffer errorfds_out)Wait for socket activity - select (Command 5)
Waits for activity on multiple sockets.IPC InterfaceInput:[4]s32nfds[0x21]-33buffer(readfds,auto-select)[0x21]-33buffer(writefds,auto-select)[0x21]-33buffer(errorfds,auto-select)[0x21]-33buffer(timeout,auto-select)normalOutput:[4]s32errno[4]s32count[0x22]-34buffer(readfds,auto-select)[0x22]-34buffer(writefds,auto-select)[0x22]-34buffer(errorfds,auto-select)out_errnoBSD errnoout_countNumber of ready socketsnfdsHighest fd + 1readfds_inSockets to check for readingwritefds_inSockets to check for writingerrorfds_inSockets to check for errorstimeoutTimeoutreadfds_outReady for readingwritefds_outReady for writingerrorfds_outHave errorsparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_count(sf::Out< s32 >)nfds(s32)readfds_in(const sf::InAutoSelectBuffer &)writefds_in(const sf::InAutoSelectBuffer &)errorfds_in(const sf::InAutoSelectBuffer &)timeout(const sf::InAutoSelectBuffer &)readfds_out(sf::OutAutoSelectBuffer)writefds_out(sf::OutAutoSelectBuffer)errorfds_out(sf::OutAutoSelectBuffer)
Returns: Result
Result Poll(sf::Out< s32 > out_errno, sf::Out< s32 > out_count, const sf::InAutoSelectBuffer & fds_in, sf::OutAutoSelectBuffer fds_out, s32 nfds, s32 timeout)Wait for socket activity - poll (Command 6)
IPC InterfaceInput:[4]s32nfds[4]s32timeout[0x21]-33buffer(pollfdarray,auto-select)normalOutput:[4]s32errno[4]s32count[0x22]-34buffer(pollfdarraywithrevents,auto-select)out_errnoBSD errnoout_countNumber of ready socketsfds_inArray of PollFd structuresfds_outUpdated PollFd array with reventsnfdsNumber of file descriptorstimeoutTimeout in millisecondsparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_count(sf::Out< s32 >)fds_in(const sf::InAutoSelectBuffer &)fds_out(sf::OutAutoSelectBuffer)nfds(s32)timeout(s32)
Returns: Result
Sysctl
Section titled “Sysctl”Result Sysctl(sf::Out< s32 > out_errno, const sf::InBuffer & name, const sf::InBuffer & old_val_in, sf::OutBuffer old_val_out, const sf::InBuffer & new_val)System control (Command 7)
IPC InterfaceInput:[0x5]-Abuffer(name)[0x5]-Abuffer(old_val)[0x5]-Abuffer(new_val)normalOutput:[4]s32errno[0x6]-Bbuffer(old_val)out_errnoBSD errnonameSysctl nameold_val_inOld value bufferold_val_outCurrent valuenew_valNew value to setparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)name(const sf::InBuffer &)old_val_in(const sf::InBuffer &)old_val_out(sf::OutBuffer)new_val(const sf::InBuffer &)
Returns: Result
Result Recv(sf::Out< s32 > out_errno, sf::Out< s32 > out_size, s32 fd, s32 flags, sf::OutAutoSelectBuffer buffer)Receive data from connected socket (Command 8)
Receives data from a connected socket.IPC InterfaceInput:[4]s32fd[4]s32flagsnormalOutput:[4]s32errno[4]s32size[0x22]-34buffer(data,auto-select) Proxy (Future Story 8.6)For LDN sockets:out_errnoBSD errnoout_sizeBytes receivedfdSocket file descriptorflagsRecv flagsbufferBuffer to receive intoparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_size(sf::Out< s32 >)fd(s32)flags(s32)buffer(sf::OutAutoSelectBuffer)
Returns: Result
RecvFrom
Section titled “RecvFrom”Result RecvFrom(sf::Out< s32 > out_errno, sf::Out< s32 > out_size, s32 fd, s32 flags, sf::OutAutoSelectBuffer buffer, sf::OutAutoSelectBuffer addr_out)Receive data with source address (Command 9)
Receives data and the source address (used for UDP).IPC InterfaceInput:[4]s32fd[4]s32flagsnormalOutput:[4]s32errno[4]s32size[0x22]-34buffer(data,auto-select)[0x22]-34buffer(sockaddr,auto-select)out_errnoBSD errnoout_sizeBytes receivedfdSocket file descriptorflagsRecv flagsbufferData bufferaddr_outSource addressparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_size(sf::Out< s32 >)fd(s32)flags(s32)buffer(sf::OutAutoSelectBuffer)addr_out(sf::OutAutoSelectBuffer)
Returns: Result
Result Send(sf::Out< s32 > out_errno, sf::Out< s32 > out_size, s32 fd, s32 flags, const sf::InAutoSelectBuffer & buffer)Send data to connected socket (Command 10)
Sends data to a connected socket.IPC InterfaceInput:[4]s32fd[4]s32flags[0x21]-33buffer(data,auto-select)normalOutput:[4]s32errno[4]s32size(bytessent) Proxy (Future Story 8.6)For LDN sockets, instead of sending to real network:out_errnoBSD errnoout_sizeBytes sentfdSocket file descriptorflagsSend flags (MSG_DONTWAIT, etc.)bufferData to sendparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_size(sf::Out< s32 >)fd(s32)flags(s32)buffer(const sf::InAutoSelectBuffer &)
Returns: Result
SendTo
Section titled “SendTo”Result SendTo(sf::Out< s32 > out_errno, sf::Out< s32 > out_size, s32 fd, s32 flags, const sf::InAutoSelectBuffer & buffer, const sf::InAutoSelectBuffer & addr)Send data to specific address (Command 11)
Sends data to a specific address (used for UDP).IPC InterfaceInput:[4]s32fd[4]s32flags[0x21]-33buffer(data,auto-select)[0x21]-33buffer(sockaddr,auto-select)normalOutput:[4]s32errno[4]s32size Proxy (Future Story 8.6)If destination address is 10.114.x.x:out_errnoBSD errnoout_sizeBytes sentfdSocket file descriptorflagsSend flagsbufferData to sendaddrDestination addressparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_size(sf::Out< s32 >)fd(s32)flags(s32)buffer(const sf::InAutoSelectBuffer &)addr(const sf::InAutoSelectBuffer &)
Returns: Result
Accept
Section titled “Accept”Result Accept(sf::Out< s32 > out_errno, sf::Out< s32 > out_fd, s32 fd, sf::OutAutoSelectBuffer addr_out)Accept incoming connection (Command 12)
Accepts a connection on a listening socket.IPC InterfaceInput:[4]s32fdnormalOutput:[4]s32errno[4]s32new_fd[0x22]-34buffer(sockaddr,auto-select)out_errnoBSD errnoout_fdNew socket for accepted connectionfdListening socketaddr_outRemote address of connectorparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_fd(sf::Out< s32 >)fd(s32)addr_out(sf::OutAutoSelectBuffer)
Returns: Result
Result Bind(sf::Out< s32 > out_errno, s32 fd, const sf::InAutoSelectBuffer & addr)Bind socket to local address (Command 13)
Binds a socket to a local address for listening or sending.IPC InterfaceInput:[4]s32fd[0x21]-33buffer(sockaddr,auto-select)normalOutput:[4]s32errno Detection (Future Story 8.5)If the address is in 10.114.0.0/16, this socket becomes an LDN proxy:out_errnoBSD errnofdSocket file descriptoraddrAddress to bind (SockAddrIn for IPv4)paramResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)addr(const sf::InAutoSelectBuffer &)
Returns: Result
Connect
Section titled “Connect”Result Connect(sf::Out< s32 > out_errno, s32 fd, const sf::InAutoSelectBuffer & addr)Connect socket to remote address (Command 14)
Connects a socket to a remote address for communication.IPC InterfaceInput:[4]s32fd[0x21]-33buffer(sockaddr,auto-select)normalOutput:[4]s32errno Detection (Future Story 8.5)If the address is in 10.114.0.0/16, this socket becomes an LDN proxy:out_errnoBSD errnofdSocket file descriptoraddrRemote address to connect toparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)addr(const sf::InAutoSelectBuffer &)
Returns: Result
GetPeerName
Section titled “GetPeerName”Result GetPeerName(sf::Out< s32 > out_errno, s32 fd, sf::OutAutoSelectBuffer addr_out)Get peer address (Command 15)
Gets the address of the connected peer.IPC InterfaceInput:[4]s32fdnormalOutput:[4]s32errno[0x22]-34buffer(sockaddr,auto-select)out_errnoBSD errnofdSocket file descriptoraddr_outPeer address bufferparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)addr_out(sf::OutAutoSelectBuffer)
Returns: Result
GetSockName
Section titled “GetSockName”Result GetSockName(sf::Out< s32 > out_errno, s32 fd, sf::OutAutoSelectBuffer addr_out)Get local address (Command 16)
Gets the local address of a socket.IPC InterfaceSame as GetPeerNameout_errnoBSD errnofdSocket file descriptoraddr_outLocal address bufferparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)addr_out(sf::OutAutoSelectBuffer)
Returns: Result
GetSockOpt
Section titled “GetSockOpt”Result GetSockOpt(sf::Out< s32 > out_errno, s32 fd, s32 level, s32 optname, sf::OutAutoSelectBuffer optval)Get socket option (Command 17)
IPC InterfaceInput:[4]s32fd[4]s32level[4]s32optnamenormalOutput:[4]s32errno[0x22]-34buffer(optval,auto-select)out_errnoBSD errnofdSocket file descriptorlevelOption leveloptnameOption nameoptvalOption valueparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)level(s32)optname(s32)optval(sf::OutAutoSelectBuffer)
Returns: Result
Listen
Section titled “Listen”Result Listen(sf::Out< s32 > out_errno, s32 fd, s32 backlog)Mark socket as listening (Command 18)
IPC InterfaceInput:[4]s32fd[4]s32backlognormalOutput:[4]s32errnoout_errnoBSD errnofdSocket file descriptorbacklogConnection queue sizeparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)backlog(s32)
Returns: Result
Result Ioctl(sf::Out< s32 > out_errno, sf::Out< s32 > out_result, s32 fd, u32 request, u32 bufcount, const sf::InAutoSelectBuffer & buf_in, sf::OutAutoSelectBuffer buf_out)I/O control (Command 19)
IPC InterfaceInput:[4]s32fd[4]u32request[4]u32bufcount[0x21]-33buffer(auto-select)normalOutput:[4]s32errno[4]s32result[0x22]-34buffer(auto-select)out_errnoBSD errnoout_resultIoctl resultfdSocket file descriptorrequestIoctl request codebufcountNumber of buffersbuf_inInput bufferbuf_outOutput bufferparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_result(sf::Out< s32 >)fd(s32)request(u32)bufcount(u32)buf_in(const sf::InAutoSelectBuffer &)buf_out(sf::OutAutoSelectBuffer)
Returns: Result
Result Fcntl(sf::Out< s32 > out_errno, sf::Out< s32 > out_result, s32 fd, s32 cmd, s32 arg)File control (Command 20)
IPC InterfaceInput:[4]s32fd[4]s32cmd[4]s32argnormalOutput:[4]s32errno[4]s32resultout_errnoBSD errnoout_resultFcntl resultfdSocket file descriptorcmdFcntl commandargArgumentparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_result(sf::Out< s32 >)fd(s32)cmd(s32)arg(s32)
Returns: Result
SetSockOpt
Section titled “SetSockOpt”Result SetSockOpt(sf::Out< s32 > out_errno, s32 fd, s32 level, s32 optname, const sf::InAutoSelectBuffer & optval)Set socket option (Command 21)
IPC InterfaceInput:[4]s32fd[4]s32level[4]s32optname[0x21]-33buffer(optval,auto-select)normalOutput:[4]s32errnoout_errnoBSD errnofdSocket file descriptorlevelOption leveloptnameOption nameoptvalOption valueparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)level(s32)optname(s32)optval(const sf::InAutoSelectBuffer &)
Returns: Result
Shutdown
Section titled “Shutdown”Result Shutdown(sf::Out< s32 > out_errno, s32 fd, s32 how)Shutdown socket I/O (Command 22)
IPC InterfaceInput:[4]s32fd[4]s32hownormalOutput:[4]s32errnoout_errnoBSD errnofdSocket file descriptorhowShutdown directionparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)how(s32)
Returns: Result
ShutdownAllSockets
Section titled “ShutdownAllSockets”Result ShutdownAllSockets(sf::Out< s32 > out_errno, u64 pid, s32 how)Shutdown all sockets for a process (Command 23)
IPC InterfaceInput:[8]u64pid[4]s32hownormalOutput:[4]s32errnoout_errnoBSD errnopidProcess IDhowShutdown directionparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)pid(u64)how(s32)
Returns: Result
Result Write(sf::Out< s32 > out_errno, sf::Out< s32 > out_size, s32 fd, const sf::InAutoSelectBuffer & buffer)Write to socket (Command 24)
Equivalent to Send with no flags.IPC InterfaceInput:[4]s32fd[0x21]-33buffer(data,auto-select)normalOutput:[4]s32errno[4]s32sizeout_errnoBSD errnoout_sizeBytes writtenfdSocket file descriptorbufferData to writeparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_size(sf::Out< s32 >)fd(s32)buffer(const sf::InAutoSelectBuffer &)
Returns: Result
Result Read(sf::Out< s32 > out_errno, sf::Out< s32 > out_size, s32 fd, sf::OutAutoSelectBuffer buffer)Read from socket (Command 25)
Equivalent to Recv with no flags.IPC InterfaceInput:[4]s32fdnormalOutput:[4]s32errno[4]s32size[0x22]-34buffer(data,auto-select)out_errnoBSD errnoout_sizeBytes readfdSocket file descriptorbufferBuffer to read intoparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_size(sf::Out< s32 >)fd(s32)buffer(sf::OutAutoSelectBuffer)
Returns: Result
Result Close(sf::Out< s32 > out_errno, s32 fd)Close a socket (Command 26)
Closes a socket and releases its resources.IPC InterfaceInput:[4]s32fdnormalOutput:[4]s32errno Cleanup (Future Story 8.4)When socket tracking is implemented, we’ll remove the socket from our tracking table before forwarding the close.out_errnoBSD errnofdFile descriptor to closeparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)fd(s32)
Returns: Result
DuplicateSocket
Section titled “DuplicateSocket”Result DuplicateSocket(sf::Out< s32 > out_errno, sf::Out< s32 > out_fd, s32 fd, u64 target_pid)Duplicate socket for another process (Command 27)
Duplicates a socket for use by another process.IPC InterfaceInput:[4]s32fd[8]u64target_pidnormalOutput:[4]s32errno[4]s32new_fdout_errnoBSD errnoout_fdNew file descriptorfdSocket to duplicatetarget_pidTarget process IDparamResult code from forwardingreturn
Parameters:
out_errno(sf::Out< s32 >)out_fd(sf::Out< s32 >)fd(s32)target_pid(u64)
Returns: Result
GetResourceStatistics
Section titled “GetResourceStatistics”Result GetResourceStatistics(sf::Out< s32 > out_errno, sf::OutBuffer out_stats, u64 pid)Parameters:
out_errno(sf::Out< s32 >)out_stats(sf::OutBuffer)pid(u64)
Returns: Result
RecvMMsg
Section titled “RecvMMsg”Result RecvMMsg(sf::Out< s32 > out_errno, sf::Out< s32 > out_count, s32 fd, s32 vlen, s32 flags, s32 timeout, sf::OutAutoSelectBuffer out_data)Parameters:
out_errno(sf::Out< s32 >)out_count(sf::Out< s32 >)fd(s32)vlen(s32)flags(s32)timeout(s32)out_data(sf::OutAutoSelectBuffer)
Returns: Result
SendMMsg
Section titled “SendMMsg”Result SendMMsg(sf::Out< s32 > out_errno, sf::Out< s32 > out_count, s32 fd, s32 vlen, s32 flags, const sf::InAutoSelectBuffer & in_data)Parameters:
out_errno(sf::Out< s32 >)out_count(sf::Out< s32 >)fd(s32)vlen(s32)flags(s32)in_data(const sf::InAutoSelectBuffer &)
Returns: Result
EventFd
Section titled “EventFd”Result EventFd(sf::Out< s32 > out_errno, sf::Out< s32 > out_fd, u64 initval, s32 flags)Parameters:
out_errno(sf::Out< s32 >)out_fd(sf::Out< s32 >)initval(u64)flags(s32)
Returns: Result
RegisterResourceStatisticsName
Section titled “RegisterResourceStatisticsName”Result RegisterResourceStatisticsName(sf::Out< s32 > out_errno, u64 pid, const sf::InBuffer & name)Parameters:
out_errno(sf::Out< s32 >)pid(u64)name(const sf::InBuffer &)
Returns: Result
RegisterClientShared
Section titled “RegisterClientShared”Result RegisterClientShared(sf::Out< u64 > out_result, const& config, const sf::ClientProcessId & client_pid, u64 tmem_size)Initialize BSD socket library (shared memory variant) (Command 33)
Same as RegisterClient but the work-buffer is allocated in the sysmodule’s memory instead of using TransferMemory from the client. Available from 10.0.0+.IPC Interface (from switchbrew)Same input/output as RegisterClient except this doesn’t take an input handle. Output: s32 bsd_errno (0 on success)out_errnoBSD errno on failure (0 on success)configLibraryConfigData with socket buffer settingsclient_pidClient’s process IDtmem_sizeSize for work bufferparamResult code from forwarding to real servicereturn
Parameters:
out_result(sf::Out< u64 >)config(const&)client_pid(const sf::ClientProcessId &)tmem_size(u64)
Returns: Result
Methods
Section titled “Methods”ShouldMitm
Section titled “ShouldMitm”bool ShouldMitm(const sm::MitmProcessInfo & client_info)Determine if we should MITM this process.
Determine if we should MITM a process’s BSD calls.We MITM all processes for now to ensure we catch any LDN traffic. In the future, we could filter by title ID.Atmosphere calls this for each process that opens bsd:u. If we return true, our MITM service handles all their BSD calls.StrategyWe intercept BSD sessions from applications that are in the LDN game whitelist (fetched from Ryujinx server at startup).client_infoProcess information (PID, program ID, etc.)paramtrue For games in the whitelist, false otherwisereturn
Parameters:
client_info(const sm::MitmProcessInfo &)
Returns: bool
CleanupAbandonedServices
Section titled “CleanupAbandonedServices”void CleanupAbandonedServices()Clean up abandoned forward services.
Sessions that never received RegisterClient have their forward_service moved to an abandoned list to prevent system freeze. This function cleans up those services. Should be called when LDN disconnects or when the game process exits.Sessions that never received RegisterClient have their forward_service moved to an abandoned list to prevent system freeze. This function cleans up those services by closing them safely.Should be called when LDN disconnects or when the game process exits.