ANSC_STATUS BbhmDiagipRecv ( ANSC_HANDLE hThisObject, ANSC_HANDLE hSinkObject, PVOID buffer, ULONG ulSize ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PBBHM_DIAG_IP_PING_OBJECT pMyObject = (PBBHM_DIAG_IP_PING_OBJECT)hThisObject; PBBHM_IP_PING_PROPERTY pProperty = (PBBHM_IP_PING_PROPERTY )&pMyObject->Property; PBBHM_IP_PING_TDO_OBJECT pStateTimer = (PBBHM_IP_PING_TDO_OBJECT )pMyObject->hStateTimer; PBBHM_IP_PING_SINK_OBJECT pSink = (PBBHM_IP_PING_SINK_OBJECT )hSinkObject; PANSC_XSOCKET_OBJECT pSocket = (PANSC_XSOCKET_OBJECT )pSink->GetXsocket((ANSC_HANDLE)pSink); PIPV4_HEADER pIpv4Header = (PIPV4_HEADER )NULL; /*PIPV6_HEADER pIpv6Header = (PIPV6_HEADER )NULL;*/ PICMPV4_ECHO_MESSAGE pIcmpHeader = (PICMPV4_ECHO_MESSAGE )NULL; PBBHM_IP_PING_ECHO_ENTRY pMEchoEntry = NULL; ULONG StopTime = 0; StopTime = AnscGetTickInMilliSeconds(); if ( pProperty->Status != BBHM_IP_PING_STATUS_RUNNING ) { return ANSC_STATUS_UNAPPLICABLE; } if ( pMyObject->IPProtocol == XSKT_SOCKET_AF_INET ) { pIpv4Header = (PIPV4_HEADER)buffer; pIcmpHeader = (PICMPV4_ECHO_MESSAGE)AnscIpv4GetPayload(pIpv4Header); if ( ! AnscEqualString(pSocket->PeerName, pProperty->pDstAddrName, TRUE)/*(pSocket->PeerAddress.Value != pProperty->DstIp.Value)*/ || (AnscIcmpv4EchoGetId(pIcmpHeader) != tempId) ) { return ANSC_STATUS_FAILURE; } if ( (AnscIcmpv4EchoGetType(pIcmpHeader) == ICMP_TYPE_DESTINATION_UNREACHABLE) || (AnscIcmpv4EchoGetType(pIcmpHeader) == ICMP_TYPE_TIME_EXCEEDED) || (AnscIcmpv4EchoGetType(pIcmpHeader) == ICMP_TYPE_PARAMETER_PROBLEM) || (AnscIcmpv4EchoGetType(pIcmpHeader) == ICMP_TYPE_SOURCE_QUENCH) || (AnscIcmpv4EchoGetType(pIcmpHeader) == ICMP_TYPE_REDIRECT)) { pProperty->NumIcmpError ++; pProperty->IcmpError = AnscIcmpv4EchoGetType(pIcmpHeader); pMEchoEntry = (PBBHM_IP_PING_ECHO_ENTRY)AnscAllocateMemory(sizeof(BBHM_IP_PING_ECHO_ENTRY)); if ( pMEchoEntry ) { pMEchoEntry->ICMPType = AnscIcmpv4EchoGetType(pIcmpHeader); AnscAcquireLock(&pMyObject->MiddleResultLock); AnscSListPushEntryAtBack(&pMyObject->MiddleResult, &pMEchoEntry->Linkage); AnscReleaseLock(&pMyObject->MiddleResultLock); } return ANSC_STATUS_FAILURE; } returnStatus = pMyObject->SetStopTime ( (ANSC_HANDLE)pMyObject, AnscIcmpv4EchoGetSeqNumber(pIcmpHeader), AnscIpv4GetTotalLength(pIpv4Header) - sizeof(IPV4_HEADER) - sizeof(ICMPV4_HEADER), AnscIpv4GetTtl(pIpv4Header), StopTime ); } else if ( pMyObject->IPProtocol == XSKT_SOCKET_AF_INET6 ) { pIcmpHeader = (PICMPV6_ECHO_MESSAGE)buffer; if ( ! AnscEqualString(pSocket->PeerName, pProperty->pDstAddrName, TRUE)/*(pSocket->PeerAddress.Value != pProperty->DstIp.Value)*/ || (AnscIcmpv6EchoGetId(pIcmpHeader) != tempId) ) { return ANSC_STATUS_FAILURE; } if ( (AnscIcmpv6EchoGetType(pIcmpHeader) == ICMP6_TYPE_DESTINATION_UNREACHABLE) || (AnscIcmpv6EchoGetType(pIcmpHeader) == ICMP6_TYPE_TIME_EXCEEDED) || (AnscIcmpv6EchoGetType(pIcmpHeader) == ICMP6_TYPE_PARAMETER_PROBLEM) || (AnscIcmpv6EchoGetType(pIcmpHeader) == ICMP6_TYPE_PACKET_TOO_BIG)) { pProperty->NumIcmpError ++; pProperty->IcmpError = AnscIcmpv6EchoGetType(pIcmpHeader); pMEchoEntry = (PBBHM_IP_PING_ECHO_ENTRY)AnscAllocateMemory(sizeof(BBHM_IP_PING_ECHO_ENTRY)); if ( pMEchoEntry ) { pMEchoEntry->ICMPType = AnscIcmpv6EchoGetType(pIcmpHeader); AnscAcquireLock(&pMyObject->MiddleResultLock); AnscSListPushEntryAtBack(&pMyObject->MiddleResult, &pMEchoEntry->Linkage); AnscReleaseLock(&pMyObject->MiddleResultLock); } return ANSC_STATUS_FAILURE; } returnStatus = pMyObject->SetStopTime ( (ANSC_HANDLE)pMyObject, AnscIcmpv6EchoGetSeqNumber(pIcmpHeader), ulSize, 0, /* Hop Limit */ StopTime ); } if ( returnStatus == ANSC_STATUS_SUCCESS ) { pProperty->PktsRecv ++; } if ( pProperty->PktsRecv == pProperty->NumPkts ) { pMyObject->SetStatus((ANSC_HANDLE)pMyObject, BBHM_IP_PING_STATUS_COMPLETE); pMyObject->Stop((ANSC_HANDLE)pMyObject); } return returnStatus; }