static bool _parse(MetisTlvSkeleton *skeleton) { bool success = false; _MetisTlvFixedHeaderV1 *hdr = (_MetisTlvFixedHeaderV1 *) metisTlvSkeleton_GetPacket(skeleton); // this function should only be called for version 1 packets trapUnexpectedStateIf(hdr->version != 1, "Version not 1"); if (_goodPacketType(hdr->packetType) && hdr->headerLength >= sizeof(_MetisTlvFixedHeaderV1)) { size_t endHeaders = hdr->headerLength; size_t endPacket = htons(hdr->packetLength); if (endPacket >= endHeaders) { if (_isPacketTypeInterest((uint8_t *) hdr)) { metisTlvSkeleton_SetHopLimit(skeleton, 4, 1); } _parsePerHopV1(metisTlvSkeleton_GetPacket(skeleton), sizeof(_MetisTlvFixedHeaderV1), endHeaders, skeleton); size_t offset = _parseMessage(metisTlvSkeleton_GetPacket(skeleton), endHeaders, endPacket, skeleton); _parseValidationAlg(metisTlvSkeleton_GetPacket(skeleton), offset, endPacket, skeleton); success = true; } } return success; }
static bool _parse(MetisTlvSkeleton *skeleton) { _MetisTlvFixedHeaderV0 *hdr = (_MetisTlvFixedHeaderV0 *) metisTlvSkeleton_GetPacket(skeleton); size_t headerLength = htons(hdr->headerLength); size_t endHeaders = FIXED_HEADER_LEN + headerLength; size_t endPacket = TotalPacketLength(hdr); trapUnexpectedStateIf(hdr->version != 0, "Version not 0"); switch (hdr->packetType) { case METIS_PACKET_TYPE_INTEREST: _parsePerHopV0(metisTlvSkeleton_GetPacket(skeleton), FIXED_HEADER_LEN, endHeaders, skeleton); _parseInterestV0(metisTlvSkeleton_GetPacket(skeleton), endHeaders, endPacket, skeleton); break; case METIS_PACKET_TYPE_CONTENT: _parsePerHopV0(metisTlvSkeleton_GetPacket(skeleton), FIXED_HEADER_LEN, endHeaders, skeleton); _parseObjectV0(metisTlvSkeleton_GetPacket(skeleton), endHeaders, endPacket, skeleton); break; case METIS_PACKET_TYPE_CONTROL: _parseControlPlaneInterface(metisTlvSkeleton_GetPacket(skeleton), endHeaders, endPacket, skeleton); break; default: break; } return true; }