From 1671aeb7c2b44ff05500d3ba3b5ddcc392f51d19 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Wed, 6 Apr 2016 16:26:06 -0400 Subject: [PATCH] Implemented full support for connecting as an UDS spectator. --- libctru/include/3ds/services/uds.h | 4 +++- libctru/source/services/uds.c | 33 ++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/libctru/include/3ds/services/uds.h b/libctru/include/3ds/services/uds.h index 84b4445..28e2495 100644 --- a/libctru/include/3ds/services/uds.h +++ b/libctru/include/3ds/services/uds.h @@ -68,6 +68,7 @@ typedef struct { typedef struct { u32 BindNodeID; Handle event; + bool spectator; } udsBindContext; /// General NWM input structure used for AP scanning. @@ -205,8 +206,9 @@ Result udsGetNetworkStructApplicationData(udsNetworkStruct *network, u8 *buf, u3 * @brief Create a bind. * @param bindcontext The output bind context. * @param NetworkNodeID This is the NetworkNodeID which this bind can receive data from. + * @param spectator False for a regular bind, true for a spectator. */ -Result udsBind(udsBindContext *bindcontext, u16 NetworkNodeID); +Result udsBind(udsBindContext *bindcontext, u16 NetworkNodeID, bool spectator); /** * @brief Remove a bind. diff --git a/libctru/source/services/uds.c b/libctru/source/services/uds.c index 70d1a74..cd34397 100644 --- a/libctru/source/services/uds.c +++ b/libctru/source/services/uds.c @@ -252,7 +252,7 @@ Result udsCreateNetwork(udsNetworkStruct *network, void* passphrase, size_t pass ret = udsipc_BeginHostingNetwork(network, passphrase, passphrase_size); if(R_FAILED(ret))return ret; - ret = udsBind(context, UDS_BROADCAST_NETWORKNODEID); + ret = udsBind(context, UDS_BROADCAST_NETWORKNODEID, false); if(R_FAILED(ret))udsDestroyNetwork(); @@ -262,11 +262,15 @@ Result udsCreateNetwork(udsNetworkStruct *network, void* passphrase, size_t pass Result udsConnectNetwork(udsNetworkStruct *network, void* passphrase, size_t passphrase_size, udsBindContext *context, u16 recv_NetworkNodeID, udsConnectionType connection_type) { Result ret=0; + bool spectator=false; + + if(connection_type==UDSCONTYPE_Spectator)spectator=true; + //printf("connecting...\n");//Removing these prints caused connecting to fail. ret = udsipc_ConnectToNetwork(network, passphrase, passphrase_size, connection_type); if(R_FAILED(ret))return ret; //printf("bind...\n"); - ret = udsBind(context, recv_NetworkNodeID); + ret = udsBind(context, recv_NetworkNodeID, spectator); if(R_FAILED(ret))udsDisconnectNetwork(); @@ -513,21 +517,32 @@ Result udsScanBeacons(u8 *outbuf, u32 maxsize, udsNetworkScanInfo **networks, u3 return ret; } -Result udsBind(udsBindContext *bindcontext, u16 NetworkNodeID) +Result udsBind(udsBindContext *bindcontext, u16 NetworkNodeID, bool spectator) { u32 pos; memset(bindcontext, 0, sizeof(udsBindContext)); - for(pos=0; posBindNodeID = (pos+1)<<1; + bindcontext->BindNodeID = (pos<<1); + if(spectator)bindcontext->BindNodeID |= spectator; + + bindcontext->spectator = spectator; return udsipc_Bind(bindcontext, 0x2e30, 0xf3, NetworkNodeID); } @@ -535,6 +550,7 @@ Result udsBind(udsBindContext *bindcontext, u16 NetworkNodeID) Result udsUnbind(udsBindContext *bindcontext) { Result ret=0; + u32 bitpos = 0; if(bindcontext->event) { @@ -543,7 +559,8 @@ Result udsUnbind(udsBindContext *bindcontext) ret = udsipc_Unbind(bindcontext); - bind_allocbitmask &= ~BIT((bindcontext->BindNodeID>>1) - 1); + if(!bindcontext->spectator)bitpos = bindcontext->BindNodeID>>1; + bind_allocbitmask &= ~BIT(bitpos); memset(bindcontext, 0, sizeof(udsBindContext)); -- 2.39.5