PDU::metadata EAPOL::extract_metadata(const uint8_t *buffer, uint32_t total_sz) { if (TINS_UNLIKELY(total_sz < sizeof(eapol_header))) { throw malformed_packet(); } const eapol_header* header = (const eapol_header*)buffer; uint32_t advertised_size = Endian::be_to_host<uint16_t>(header->length) + 4; return metadata(min(total_sz, advertised_size), pdu_flag, PDU::UNKNOWN); }
EAPOL* EAPOL::from_bytes(const uint8_t* buffer, uint32_t total_sz) { if (TINS_UNLIKELY(total_sz < sizeof(eapol_header))) { throw malformed_packet(); } const eapol_header* ptr = (const eapol_header*)buffer; uint32_t data_len = Endian::be_to_host<uint16_t>(ptr->length); // at least 4 for fields always present total_sz = min( total_sz, data_len + 4 ); switch(ptr->type) { case RC4: return new Tins::RC4EAPOL(buffer, total_sz); break; case RSN: case EAPOL_WPA: return new Tins::RSNEAPOL(buffer, total_sz); break; } return 0; }
PDU::metadata ARP::extract_metadata(const uint8_t* /*buffer*/, uint32_t total_sz) { if (TINS_UNLIKELY(total_sz < sizeof(arp_header))) { throw malformed_packet(); } return metadata(sizeof(arp_header), pdu_flag, PDU::UNKNOWN); }