Hi,

Code:
typedef struct structAuthDelivery
{
	u32			nSig;				// For message integrity purposes.
	AuthSetRes 	eRes;
	char			pzIMSI[20];
	u32			nMMHandle;
	u32			nNumVectors;
} AuthDelivery;


function()
{
	    CSignal sSig;
		
		AuthDelivery * pAuth = (AuthDelivery*)(sSig.Alloc(0));
		
		if (pAuthInfo)
		{
			list<CDiaAVP *>	lGroup;
			if (m_eRATType == RANTypeEUTRAN || m_eRATType == RANTypeIMS)
			{
				pAuthInfo->FindAllSameAVPs(DiameterVendorId3GPP, AVP3GPP_EUTRANVector, lGroup);
			}
			else
			{
				pAuthInfo->FindAllSameAVPs(DiameterVendorId3GPP, AVP3GPP_UTRANVector, lGroup);
			}

			LogTrace(<< "Auth info contained num of vectors: " << lGroup.size())

			list<CDiaAVP*>::iterator iIter = lGroup.begin();
			while (nNumVectors < 5 && iIter != lGroup.end())
			{
				CDiaAVP * pAuthvector = *iIter;
				CDiaAVP * pField = pAuthvector->FindAVP(DiameterVendorId3GPP, AVP3GPP_RAND);

				if (pField)
				{
					if (pField->GetOctetStringLen() >= 16)
					{
						
						AuthVector	pVector = (AuthVector*)(((u8*)pAuth) + sizeof(AuthDelivery));

						memcpy((void *)&(pVector->aRAND[0]), pField->GetOctetStringPtr(), 16);
					}
				}
				
				:
				nNumVectors++;
				iIter++;
			}
			
			pAuth->nNumVectors = nNumVectors;
		}
		
		sSig.Post(SigMsgAuthDelivery, m_sDeliveryAddr, SigAddr(SigModDiaConn, 0));
}
Currently I am trying to change the above pseudocode (legacy), based on flag, i either fill the sSig Or a new struct.

Code:
function()
{
	    CSignal sSig;
	
    // new flag m_bFromAdmin
	if(m_bFromAdmin)
	{
		AuthDelivery sAuthDel;
		AuthDelivery * pAuth = &sAuthDel;
	}
	else
	{
		AuthDelivery * pAuth = (AuthDelivery*)(sSig.Alloc(0));
		pAuth->nSig = AuthDeliverySig;
		pAuth->eRes = m_bDoingResync?AuthSetResResyncOk:AuthSetResOk;
		pAuth->nMMHandle = m_sDeliveryAddr.second;
		strcpy(pAuth->pzIMSI, m_sIMSI.c_str());
	}
		
		if (pAuthInfo)
		{
			list<CDiaAVP *>	lGroup;
			if (m_eRATType == RANTypeEUTRAN || m_eRATType == RANTypeIMS)
			{
				pAuthInfo->FindAllSameAVPs(DiameterVendorId3GPP, AVP3GPP_EUTRANVector, lGroup);
			}
			else
			{
				pAuthInfo->FindAllSameAVPs(DiameterVendorId3GPP, AVP3GPP_UTRANVector, lGroup);
			}

			LogTrace(<< "Auth info contained num of vectors: " << lGroup.size())

			list<CDiaAVP*>::iterator iIter = lGroup.begin();
			while (nNumVectors < 5 && iIter != lGroup.end())
			{
				CDiaAVP * pAuthvector = *iIter;
				CDiaAVP * pField = pAuthvector->FindAVP(DiameterVendorId3GPP, AVP3GPP_RAND);

				if (pField)
				{
					if (pField->GetOctetStringLen() >= 16)
					{
						
						AuthVector * pVector;

						if(m_bFromAdmin)
						{
						    // Best way to allocate this memory, so pVector now holds the first vector 
							pVector =  ;
						}
						else
						{
							pVector = (AuthVector*)(((u8*)pAuth) + sizeof(AuthDelivery));
						}

						memcpy((void *)&(pVector->aRAND[0]), pField->GetOctetStringPtr(), 16);
					}
				}
				
				:
				nNumVectors++;
				iIter++;
			}
			
			pAuth->nNumVectors = nNumVectors;
		}
		
		if(m_bFromAdmin)
		{
			CGetSubsInfoVLR::HandleAuthVectorResponse(m_req, m_sIMSI, m_sUniqueId, pAuth, VLRQueryRespSuccess, DataType4G);
		}
		else
		{

		   sSig.Post(SigMsgAuthDelivery, m_sDeliveryAddr, SigAddr(SigModDiaConn, 0));
		}
}