#ifndef ETHERLIB_IP_ASSEMBLER_H #define ETHERLIB_IP_ASSEMBLER_H #include #include "../../packet_parsers/ipv4_packet.h" typedef struct IPv4Fragment_ { uint16_t offset; ///< Address offset of this segment uint16_t size; ///< Size of this segment struct IPv4Fragment_ * next; ///< Pointer to next segment bool8_t lastFrag; ///< It's the last fragment from a packet uint8_t payload[]; ///< Fragment payload } IPv4Fragment; /** * Fragment chain descriptor */ typedef struct FragChainDesc_ { IPv4Fragment * fragChain; ///< Fragment chain uint32_t alarmID; ///< Alarm ID for reassembly timeout uint16_t id; ///< IP packet identification uint16_t fullSize; ///< Reassembled IP packet size struct FragChainDesc_ * next; ///< Next fragment chain } FragChainDesc; typedef struct { FragChainDesc * chains; ///< Linked list of fragment chains struct EthInterface_ * intf; ///< Interface instantiated this reassembler } IPv4Assembler; /** * Create new IPv4 packet reassembler. * @return pointer to newly allocated assembler */ IPv4Assembler * ipra_new(struct EthInterface_ * intf); /** * Input packet packet fragment. * @param ipra pointer to IP reassembler * @param ipProps pointer to IP properties structure */ void ipra_input(IPv4Assembler * ipra, const IPv4Props * ipProps, const uint8_t * payload, uint32_t size); /** * Attempt to reassemble a packet. * @param ipra pointer to IPv4 reassembly object * @param id packet sequence identification * @param payload pointer to uint8_t* pointer; filled only on successful reassembly * @param size pointer to uint16_t field; filled only on successful reassembly * @return reassembly was successful */ bool ipra_try_reassemble(IPv4Assembler *ipra, uint16_t id, uint8_t **payload, uint16_t *size, PcktHeaderElement *pcktHdrLe); #endif //ETHERLIB_IP_ASSEMBLER_H