static portBASE_TYPE xBlockChecksum(BlockCheckOp enOperation, unsigned portLONG ulBlockAddr, GSA_BLOCK_SIZE BlockSize) { unsigned portLONG ulDataSum; //set checksum field to 0 if applying checksum if (enOperation == OP_BLOCK_CHECK_APPLY) ((Header *)ulBlockAddr)->Checksum = 0; //add header data value together ulDataSum = ulAddToSum(0, ulBlockAddr, sizeof(Header) / sizeof(short)); //add tree info data value together ulDataSum = ulAddToSum(ulDataSum, ulBlockAddr + BlockSize - sizeof(TreeInfo), sizeof(TreeInfo) / sizeof(short)); //return verification result if verifying if (enOperation == OP_BLOCK_CHECK_VERIFY) return xVerifyChecksum(ulDataSum); //assign checksum value ((Header *)ulBlockAddr)->Checksum = usGenerateChecksum(ulDataSum); //return don't care value as pdPASS return pdPASS; }
void vGMACGenerateChecksum( uint8_t *apBuffer ) { ProtocolPacket_t *xProtPacket = (ProtocolPacket_t *)apBuffer; if ( xProtPacket->xTCPPacket.xEthernetHeader.usFrameType == ipIPv4_FRAME_TYPE ) { IPHeader_t *pxIPHeader = &( xProtPacket->xTCPPacket.xIPHeader ); /* Calculate the IP header checksum. */ pxIPHeader->usHeaderChecksum = 0x00; pxIPHeader->usHeaderChecksum = usGenerateChecksum( 0u, ( uint8_t * ) &( pxIPHeader->ucVersionHeaderLength ), ipSIZE_OF_IPv4_HEADER ); pxIPHeader->usHeaderChecksum = ~FreeRTOS_htons( pxIPHeader->usHeaderChecksum ); /* Calculate the TCP checksum for an outgoing packet. */ usGenerateProtocolChecksum( ( uint8_t * ) apBuffer, pdTRUE ); } }
static void prvReplyDNSMessage( NetworkBufferDescriptor_t *pxNetworkBuffer, BaseType_t lNetLength ) { UDPPacket_t *pxUDPPacket; IPHeader_t *pxIPHeader; UDPHeader_t *pxUDPHeader; pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer; pxIPHeader = &pxUDPPacket->xIPHeader; pxUDPHeader = &pxUDPPacket->xUDPHeader; /* HT: started using defines like 'ipSIZE_OF_xxx' */ pxIPHeader->usLength = FreeRTOS_htons( lNetLength + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_UDP_HEADER ); /* HT:endian: should not be translated, copying from packet to packet */ pxIPHeader->ulDestinationIPAddress = pxIPHeader->ulSourceIPAddress; pxIPHeader->ulSourceIPAddress = *ipLOCAL_IP_ADDRESS_POINTER; pxIPHeader->ucTimeToLive = ipconfigUDP_TIME_TO_LIVE; pxIPHeader->usIdentification = FreeRTOS_htons( usPacketIdentifier ); usPacketIdentifier++; pxUDPHeader->usLength = FreeRTOS_htons( lNetLength + ipSIZE_OF_UDP_HEADER ); vFlip_16( pxUDPPacket->xUDPHeader.usSourcePort, pxUDPPacket->xUDPHeader.usDestinationPort ); #if( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 ) { /* calculate the IP header checksum */ pxIPHeader->usHeaderChecksum = 0x00; pxIPHeader->usHeaderChecksum = usGenerateChecksum( 0UL, ( uint8_t * ) &( pxIPHeader->ucVersionHeaderLength ), ipSIZE_OF_IPv4_HEADER ); pxIPHeader->usHeaderChecksum = ~FreeRTOS_htons( pxIPHeader->usHeaderChecksum ); /* calculate the UDP checksum for outgoing package */ usGenerateProtocolChecksum( ( uint8_t* ) pxUDPPacket, pdTRUE ); } #endif /* Important: tell NIC driver how many bytes must be sent */ pxNetworkBuffer->xDataLength = ( size_t ) ( lNetLength + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_UDP_HEADER + ipSIZE_OF_ETH_HEADER ); /* This function will fill in the eth addresses and send the packet */ vReturnEthernetFrame( pxNetworkBuffer, pdFALSE ); }
void vProcessGeneratedUDPPacket( xNetworkBufferDescriptor_t * const pxNetworkBuffer ) { xUDPPacket_t *pxUDPPacket; xIPHeader_t *pxIPHeader; eARPLookupResult_t eReturned; uint32_t ulIPAddress = pxNetworkBuffer->ulIPAddress; /* Map the UDP packet onto the start of the frame. */ pxUDPPacket = ( xUDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer; /* Determine the ARP cache status for the requested IP address. */ eReturned = eARPGetCacheEntry( &( ulIPAddress ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ) ); if( eReturned != eCantSendPacket ) { if( eReturned == eARPCacheHit ) { #if( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 ) uint8_t xSocketOptions; #endif iptraceSENDING_UDP_PACKET( pxNetworkBuffer->ulIPAddress ); /* Create short cuts to the data within the packet. */ pxIPHeader = &( pxUDPPacket->xIPHeader ); #if ( ipconfigSUPPORT_OUTGOING_PINGS == 1 ) /* Is it possible that the packet is not actually a UDP packet after all, but an ICMP packet. */ if( pxNetworkBuffer->usPort != ipPACKET_CONTAINS_ICMP_DATA ) #endif /* ipconfigSUPPORT_OUTGOING_PINGS */ { xUDPHeader_t *pxUDPHeader; pxUDPHeader = &( pxUDPPacket->xUDPHeader ); pxUDPHeader->usDestinationPort = pxNetworkBuffer->usPort; pxUDPHeader->usSourcePort = pxNetworkBuffer->usBoundPort; pxUDPHeader->usLength = ( uint16_t ) ( pxNetworkBuffer->xDataLength + sizeof( xUDPHeader_t ) ); pxUDPHeader->usLength = FreeRTOS_htons( pxUDPHeader->usLength ); pxUDPHeader->usChecksum = 0; } /* memcpy() the constant parts of the header information into the correct location within the packet. This fills in: xEthernetHeader.xSourceAddress xEthernetHeader.usFrameType xIPHeader.ucVersionHeaderLength xIPHeader.ucDifferentiatedServicesCode xIPHeader.usLength xIPHeader.usIdentification xIPHeader.usFragmentOffset xIPHeader.ucTimeToLive xIPHeader.ucProtocol and xIPHeader.usHeaderChecksum */ /* Save options now, as they will be overwritten by memcpy */ #if( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 ) xSocketOptions = pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ]; #endif memcpy( ( void *) &( pxUDPPacket->xEthernetHeader.xSourceAddress ), ( void * ) xDefaultPartUDPPacketHeader.ucBytes, sizeof( xDefaultPartUDPPacketHeader ) ); #if ipconfigSUPPORT_OUTGOING_PINGS == 1 if( pxNetworkBuffer->usPort == ipPACKET_CONTAINS_ICMP_DATA ) { pxIPHeader->ucProtocol = ipPROTOCOL_ICMP; pxIPHeader->usLength = ( uint16_t ) ( pxNetworkBuffer->xDataLength + sizeof( xIPHeader_t ) ); } else #endif /* ipconfigSUPPORT_OUTGOING_PINGS */ { pxIPHeader->usLength = ( uint16_t ) ( pxNetworkBuffer->xDataLength + sizeof( xIPHeader_t ) + sizeof( xUDPHeader_t ) ); } /* The total transmit size adds on the Ethernet header. */ pxNetworkBuffer->xDataLength = pxIPHeader->usLength + sizeof( xEthernetHeader_t ); pxIPHeader->usLength = FreeRTOS_htons( pxIPHeader->usLength ); /* HT:endian: changed back to network endian */ pxIPHeader->ulDestinationIPAddress = pxNetworkBuffer->ulIPAddress; #if( ipconfigUSE_LLMNR == 1 ) { /* LLMNR messages are typically used on a LAN and they're * not supposed to cross routers */ if( pxNetworkBuffer->ulIPAddress == ipLLMNR_IP_ADDR ) { pxIPHeader->ucTimeToLive = 0x01; } } #endif #if( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 ) { pxIPHeader->usHeaderChecksum = 0; pxIPHeader->usHeaderChecksum = usGenerateChecksum( 0UL, ( uint8_t * ) &( pxIPHeader->ucVersionHeaderLength ), ipSIZE_OF_IP_HEADER ); pxIPHeader->usHeaderChecksum = ~FreeRTOS_htons( pxIPHeader->usHeaderChecksum ); if( ( xSocketOptions & FREERTOS_SO_UDPCKSUM_OUT ) != 0 ) { usGenerateProtocolChecksum( (uint8_t*)pxUDPPacket, pdTRUE ); } else { pxUDPPacket->xUDPHeader.usChecksum = 0; } } #endif } else if( eReturned == eARPCacheMiss ) { /* Add an entry to the ARP table with a null hardware address. This allows the ARP timer to know that an ARP reply is outstanding, and perform retransmissions if necessary. */ vARPRefreshCacheEntry( NULL, ulIPAddress ); /* Generate an ARP for the required IP address. */ iptracePACKET_DROPPED_TO_GENERATE_ARP( pxNetworkBuffer->ulIPAddress ); pxNetworkBuffer->ulIPAddress = ulIPAddress; vARPGenerateRequestPacket( pxNetworkBuffer ); } else { /* The lookup indicated that an ARP request has already been sent out for the queried IP address. */ eReturned = eCantSendPacket; } } if( eReturned != eCantSendPacket ) { /* The network driver is responsible for freeing the network buffer after the packet has been sent. */ xNetworkInterfaceOutput( pxNetworkBuffer, pdTRUE ); } else { /* The packet can't be sent (DHCP not completed?). Just drop the packet. */ vReleaseNetworkBufferAndDescriptor( pxNetworkBuffer ); } }