fix assertion by implementing kplr_nameForAddress() fully

This commit is contained in:
Eric House 2024-08-15 17:38:34 -07:00
parent cc82d88fcc
commit 2993e82ec7
4 changed files with 36 additions and 50 deletions

View file

@ -1318,8 +1318,8 @@ comms_getChannelAddr( const CommsCtxt* comms, XP_PlayerAddr channelNo,
XP_ASSERT( found );
}
static XP_Bool
addrs_same( const CommsAddrRec* addr1, const CommsAddrRec* addr2 )
XP_Bool
addrsAreSame( const CommsAddrRec* addr1, const CommsAddrRec* addr2 )
{
/* Empty addresses are the same only if both are empty */
XP_Bool same = addr1->_conTypes == 0 && addr2->_conTypes == 0;
@ -1347,15 +1347,6 @@ addrs_same( const CommsAddrRec* addr1, const CommsAddrRec* addr2 )
return same;
}
XP_Bool
comms_addrsAreSame( const CommsCtxt* XP_UNUSED(comms),
const CommsAddrRec* addr1,
const CommsAddrRec* addr2 )
{
XP_Bool result = addrs_same( addr1, addr2 );
return result;
}
typedef struct _NonAcks {
int count;
} NonAcks;
@ -1685,7 +1676,7 @@ pickChannel( const CommsCtxt* comms, const NetLaunchInfo* nli,
if ( 0 == result ) {
/* First, do we already have an invitation for this address */
for ( AddressRecord* rec = comms->recs; !!rec; rec = rec->next ) {
if ( addrs_same( destAddr, &rec->addr ) ) {
if ( addrsAreSame( destAddr, &rec->addr ) ) {
result = rec->channelNo;
XP_LOGFF( "addrs match; reusing channel" );
break;
@ -2792,7 +2783,7 @@ getChannelFromInvite( const CommsCtxt* comms, const CommsAddrRec* retAddr,
XP_Bool found = XP_FALSE;
for ( const AddressRecord* rec = comms->recs; !!rec && !found;
rec = rec->next ) {
found = addrs_same( retAddr, &rec->addr );
found = addrsAreSame( retAddr, &rec->addr );
if ( found ) {
COMMS_LOGFF( "channelNo before: %x", *channelNoP );
*channelNoP |= rec->channelNo;

View file

@ -221,8 +221,7 @@ XP_S16 comms_resendAll( CommsCtxt* comms, XWEnv xwe, CommsConnType filter,
XP_U16 comms_getChannelSeed( CommsCtxt* comms );
void comms_getChannelAddr( const CommsCtxt* comms, XP_PlayerAddr channelNo,
CommsAddrRec* addr );
XP_Bool comms_addrsAreSame( const CommsCtxt* comms, const CommsAddrRec* addr1,
const CommsAddrRec* addr2 );
XP_Bool addrsAreSame( const CommsAddrRec* addr1, const CommsAddrRec* addr2 );
#ifdef XWFEATURE_COMMSACK
void comms_ackAny( CommsCtxt* comms, XWEnv xwe );

View file

@ -365,21 +365,31 @@ kplr_getAddr( XW_DUtilCtxt* dutil, XWEnv xwe, const XP_UCHAR* name,
return found;
}
const XP_UCHAR*
kplr_nameForMqttDev( XW_DUtilCtxt* dutil, XWEnv xwe,
const MQTTDevID* devID )
{
CommsAddrRec addr = {
.u.mqtt.devID = *devID,
};
addr_setType( &addr, COMMS_CONN_MQTT );
return kplr_nameForAddress( dutil, xwe, &addr );
}
typedef struct _MDevState {
MQTTDevID devID;
const CommsAddrRec* addr;
const XP_UCHAR* name;
} MDevState;
static ForEachAct
mqttProc( const DLHead* dl, void* closure )
addrProc( const DLHead* dl, void* closure )
{
ForEachAct result = FEA_OK;
const KnownPlayer* kp = (KnownPlayer*)dl;
MDevState* msp = (MDevState*)closure;
const CommsAddrRec* addr = &kp->addr;
if ( addr_hasType( addr, COMMS_CONN_MQTT )
&& 0 == XP_MEMCMP( &addr->u.mqtt.devID, &msp->devID,
sizeof(msp->devID) ) ) {
if ( addrsAreSame( &kp->addr, msp->addr ) ) {
msp->name = kp->name;
result = FEA_EXIT;
}
@ -387,32 +397,20 @@ mqttProc( const DLHead* dl, void* closure )
}
const XP_UCHAR*
kplr_nameForMqttDev( XW_DUtilCtxt* dutil, XWEnv xwe,
const MQTTDevID* devID )
kplr_nameForAddress( XW_DUtilCtxt* dutil, XWEnv xwe,
const CommsAddrRec* addr )
{
MDevState ms = {.devID = *devID};
MDevState ms = {.addr = addr};
KPState* state = loadState( dutil, xwe );
#ifdef DEBUG
DLHead* head =
#endif
dll_map( &state->players->links, mqttProc, NULL, &ms );
dll_map( &state->players->links, addrProc, NULL, &ms );
XP_ASSERT( head == &state->players->links );
releaseState( dutil, xwe, state );
return ms.name;
}
const XP_UCHAR*
kplr_nameForAddress( XW_DUtilCtxt* dutil, XWEnv xwe,
const CommsAddrRec* addr )
{
const XP_UCHAR* result = NULL;
if ( addr_hasType( addr, COMMS_CONN_MQTT ) ) {
result = kplr_nameForMqttDev( dutil, xwe,
&addr->u.mqtt.devID );
} else {
XP_ASSERT(0); /* FIXME */
}
return result;
XP_LOGFF( "=> %s", ms.name );
return ms.name;
}
static void

View file

@ -298,8 +298,8 @@ static void ri_fromStream( RematchInfo* rip, XWStreamCtxt* stream,
const ServerCtxt* server );
static void ri_toStream( XWStreamCtxt* stream, const RematchInfo* rip,
const ServerCtxt* server );
static void ri_addAddrAt( RematchInfo* rip, const ServerCtxt* server,
const CommsAddrRec* addr, XP_U16 playerIndex );
static void ri_addAddrAt( RematchInfo* rip, const CommsAddrRec* addr,
XP_U16 playerIndex );
static void ri_addHostAddrs( RematchInfo* rip, const ServerCtxt* server );
static void ri_addLocal( RematchInfo* rip );
@ -896,7 +896,7 @@ buildGuestRI( const ServerCtxt* server, XP_U16 guestIndex, RematchInfo* rip )
const LocalPlayer* lp = &gi->players[ii];
if ( lp->isLocal ) { /* that's me, the host */
CommsAddrRec addr = {};
ri_addAddrAt( rip, server, &addr, ii );
ri_addAddrAt( rip, &addr, ii );
} else {
XP_S8 deviceIndex = server->srvPlyrs[ii].deviceIndex;
if ( guestIndex == deviceIndex ) {
@ -906,7 +906,7 @@ buildGuestRI( const ServerCtxt* server, XP_U16 guestIndex, RematchInfo* rip )
= server->nv.addresses[deviceIndex].channelNo;
CommsAddrRec addr;
comms_getChannelAddr( server->vol.comms, channelNo, &addr );
ri_addAddrAt( rip, server, &addr, ii );
ri_addAddrAt( rip, &addr, ii );
}
}
}
@ -2146,7 +2146,7 @@ findOrderedSlot( ServerCtxt* server, XWStreamCtxt* stream,
ServerPlayer* sp = &server->srvPlyrs[ii];
if ( UNKNOWN_DEVICE == sp->deviceIndex ) {
int addrIndx = rip->addrIndices[ii];
if ( comms_addrsAreSame( comms, &guestAddr, &rip->addrs[addrIndx] ) ) {
if ( addrsAreSame( &guestAddr, &rip->addrs[addrIndx] ) ) {
*spp = sp;
*lpp = &gi->players[ii];
XP_ASSERT( !(*lpp)->isLocal );
@ -4321,7 +4321,7 @@ getRematchInfoImpl( const ServerCtxt* server, CurGameInfo* newGI,
} else {
comms_getHostAddr( comms, &addr );
}
ri_addAddrAt( &ri, server, &addr, ii );
ri_addAddrAt( &ri, &addr, ii );
}
}
} else if ( !!server->nv.rematch.addrs ) {
@ -4359,7 +4359,7 @@ getRematchInfoImpl( const ServerCtxt* server, CurGameInfo* newGI,
if ( newGI->players[ii].isLocal ) {
ri_addLocal( &ri );
} else if ( nextRemote < nAddrs ) {
ri_addAddrAt( &ri, server, &addrs[nextRemote++], ii );
ri_addAddrAt( &ri, &addrs[nextRemote++], ii );
} else {
SRVR_LOGFF( "ERROR: not enough addresses for all"
" remote players" );
@ -4599,15 +4599,13 @@ ri_fromStream( RematchInfo* rip, XWStreamCtxt* stream,
/* Given an address, insert it if it's new, or point to an existing copy
otherwise */
static void
ri_addAddrAt( RematchInfo* rip, const ServerCtxt* server,
const CommsAddrRec* addr, const XP_U16 player )
ri_addAddrAt( RematchInfo* rip, const CommsAddrRec* addr, const XP_U16 player )
{
const CommsCtxt* comms = server->vol.comms;
XP_S8 newIndex = RIP_LOCAL_INDX;
for ( int ii = 0; ii < player; ++ii ) {
int index = rip->addrIndices[ii];
if ( index != RIP_LOCAL_INDX &&
comms_addrsAreSame( comms, addr, &rip->addrs[index] ) ) {
addrsAreSame( addr, &rip->addrs[index] ) ) {
newIndex = index;
break;
}