diff --git a/impl/src/layer2/packet_structs.c b/impl/src/layer2/packet_structs.c index ca11283..73bb469 100644 --- a/impl/src/layer2/packet_structs.c +++ b/impl/src/layer2/packet_structs.c @@ -33,13 +33,27 @@ size_t layer2_encode_packet_header(const layer2_packet_header_t *header, uint8_t } -bool layer2_decode_packet_header(const uint8_t *encoded, layer2_packet_header_t *header) +bool layer2_decode_packet_header(const uint8_t *encoded, size_t encoded_len, layer2_packet_header_t *header) { + // check if there are enough bytes for the minimum header size: + // - 1 byte packet info + // - 1 byte sequence numbers + // - 2 bytes source address + // - 2 bytes destination address + if(encoded_len < 6) { + return false; + } + header->msg_type = (encoded[0] >> 5) & 0x7; header->tx_request = (encoded[0] & 0x10) != 0; header->src_addr.length = (encoded[0] >> 2) & 0x3 + 1; header->dst_addr.length = (encoded[0] >> 0) & 0x3 + 1; + // check for the actually needed size + if(encoded_len < (2 + 2*header->src_addr.length + 2*header->dst_addr.length)) { + return false; + } + header->tx_seq_nr = (encoded[1] >> 4) & 0xF; header->tx_seq_nr = (encoded[1] >> 0) & 0xF; diff --git a/impl/src/layer2/packet_structs.h b/impl/src/layer2/packet_structs.h index e7429a7..82f42d4 100644 --- a/impl/src/layer2/packet_structs.h +++ b/impl/src/layer2/packet_structs.h @@ -19,8 +19,8 @@ typedef struct layer2_packet_header_s { layer2_message_type_t msg_type; //!< message type bool tx_request; //!< transmission request (marks the end of the burst) - uint8_t tx_seq_nr; //!< sequence number of this packet - uint8_t rx_seq_nr; //!< sequence number expected next from he other side + uint8_t tx_seq_nr; //!< sequence number (0 to 15) of this packet + uint8_t rx_seq_nr; //!< sequence number (0 to 15) expected next from he other side ham64_t src_addr; //!< source HAM-64 address ham64_t dst_addr; //!< destination HAM-64 address @@ -34,11 +34,12 @@ typedef struct layer2_packet_header_s { size_t layer2_encode_packet_header(const layer2_packet_header_t *header, uint8_t *encoded); /*!\brief Decode a layer2 packet header from the received form. - * \param encoded A byte array containing the received header. - * \param header The header structure where the decoded information is stored. - * \returns Whether the header was decoded successfully. + * \param encoded A byte array containing the received header. + * \param encoded_len Length (in bytes) of the given encoded data. + * \param header The header structure where the decoded information is stored. + * \returns Whether the header was decoded successfully. */ -bool layer2_decode_packet_header(const uint8_t *encoded, layer2_packet_header_t *header); +bool layer2_decode_packet_header(const uint8_t *encoded, size_t encoded_len, layer2_packet_header_t *header); /* Data Packet Structs */