diff --git a/libctru/include/3ds/services/uds.h b/libctru/include/3ds/services/uds.h index 8f0de88..e04388f 100644 --- a/libctru/include/3ds/services/uds.h +++ b/libctru/include/3ds/services/uds.h @@ -27,6 +27,14 @@ typedef struct { u32 word_x24; } udsNodeInfo; +/// Connection status struct. +typedef struct { + u32 event_type; + u32 unk_x4[0x28>>2]; + u8 id8; + u8 pad_x2d[3]; +} udsConnectionStatus; + /// Network struct stored as big-endian. typedef struct { u8 host_macaddress[6]; @@ -291,6 +299,12 @@ Result udsUpdateNetworkAttribute(u16 bitmask, bool flag); */ Result udsSetNewConnectionsBlocked(bool block, bool clients, bool spectators); +/** + * @brief This loads the current ConnectionStatus struct. + * @param output Output ConnectionStatus struct. + */ +Result udsGetConnectionStatus(udsConnectionStatus *output); + /** * @brief This loads a NodeInfo struct for the specified NetworkNodeID. The broadcast alias can't be used with this. * @param NetworkNodeID Target NetworkNodeID. diff --git a/libctru/source/services/uds.c b/libctru/source/services/uds.c index 1f76fc6..788f15d 100644 --- a/libctru/source/services/uds.c +++ b/libctru/source/services/uds.c @@ -371,6 +371,24 @@ Result udsDisconnectNetwork(void) return cmdbuf[1]; } +Result udsGetConnectionStatus(udsConnectionStatus *output) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=IPC_MakeHeader(0xB,0,0); // 0xB0000 + + Result ret=0; + if(R_FAILED(ret=svcSendSyncRequest(__uds_servhandle)))return ret; + ret = cmdbuf[1]; + + if(R_SUCCEEDED(ret)) + { + if(output)memcpy(output, &cmdbuf[2], sizeof(udsConnectionStatus)); + } + + return ret; +} + Result udsGetNodeInformation(u16 NetworkNodeID, udsNodeInfo *output) { u32* cmdbuf=getThreadCommandBuffer();