int CUDPConnection::PacketReceived (const void *pPacket, unsigned nLength, CIPAddress &rSenderIP, int nProtocol) { if (nProtocol != IPPROTO_UDP) { return 0; } m_Checksum.SetSourceAddress (rSenderIP); // TODO: may not work with some UDP based protocol, would need receiver IP from network layer here if ( m_bActiveOpen && m_ForeignIP.IsBroadcast ()) { m_Checksum.SetDestinationAddress (m_ForeignIP); } else { if ( m_bActiveOpen && m_ForeignIP != rSenderIP) { return 0; } assert (m_pNetConfig != 0); m_Checksum.SetDestinationAddress (*m_pNetConfig->GetIPAddress ()); } if (nLength <= sizeof (TUDPHeader)) { return 0; } TUDPHeader *pHeader = (TUDPHeader *) pPacket; if (m_nOwnPort != be2le16 (pHeader->nDestPort)) { return 0; } u16 nSourcePort = be2le16 (pHeader->nSourcePort); if ( m_bActiveOpen && m_nForeignPort != nSourcePort) { return 0; } if (nLength < be2le16 (pHeader->nLength)) { return -1; } if ( pHeader->nChecksum != UDP_CHECKSUM_NONE && m_Checksum.Calculate (pPacket, nLength) != CHECKSUM_OK) { return -1; } nLength -= sizeof (TUDPHeader); assert (nLength > 0); TUDPPrivateData *pData = new TUDPPrivateData; assert (pData != 0); rSenderIP.CopyTo (pData->SourceAddress); pData->nSourcePort = nSourcePort; m_RxQueue.Enqueue ((u8 *) pPacket + sizeof (TUDPHeader), nLength, pData); return 1; }
int CUDPConnection::PacketReceived (const void *pPacket, unsigned nLength, CIPAddress &rSenderIP, CIPAddress &rReceiverIP, int nProtocol) { if (nProtocol != IPPROTO_UDP) { return 0; } if (nLength <= sizeof (TUDPHeader)) { return -1; } TUDPHeader *pHeader = (TUDPHeader *) pPacket; if (m_nOwnPort != be2le16 (pHeader->nDestPort)) { return 0; } assert (m_pNetConfig != 0); u16 nSourcePort = be2le16 (pHeader->nSourcePort); if (m_bActiveOpen) { if (m_nForeignPort != nSourcePort) { return 0; } if ( m_ForeignIP != rSenderIP && !m_ForeignIP.IsBroadcast () && m_ForeignIP != *m_pNetConfig->GetBroadcastAddress ()) { return 0; } } if (nLength < be2le16 (pHeader->nLength)) { return -1; } if (pHeader->nChecksum != UDP_CHECKSUM_NONE) { m_Checksum.SetSourceAddress (rSenderIP); m_Checksum.SetDestinationAddress (rReceiverIP); if (m_Checksum.Calculate (pPacket, nLength) != CHECKSUM_OK) { return -1; } } if ( !m_bBroadcastsAllowed && ( rReceiverIP.IsBroadcast () || rReceiverIP == *m_pNetConfig->GetBroadcastAddress ())) { return 1; } nLength -= sizeof (TUDPHeader); assert (nLength > 0); TUDPPrivateData *pData = new TUDPPrivateData; assert (pData != 0); rSenderIP.CopyTo (pData->SourceAddress); pData->nSourcePort = nSourcePort; m_RxQueue.Enqueue ((u8 *) pPacket + sizeof (TUDPHeader), nLength, pData); m_Event.Set (); return 1; }