10 #include "odp_ipfragreass_ip.h"
11 #include "odp_ipfragreass_fragment.h"
19 uint32_t header_len = ipv4hdr_ihl(*orig_header);
21 uint32_t bytes_remaining = orig_len - header_len;
22 uint32_t frag_offset = 0;
26 if (bytes_remaining <= MTU)
33 while (bytes_remaining) {
34 odph_ipv4hdr_t *header;
37 frag_len = (bytes_remaining > MTU ? (MTU + header_len)
40 bytes_remaining -= (frag_len - header_len);
41 if (bytes_remaining) {
45 split_point = first_fragment ? (frag_len)
46 : (frag_len - header_len);
49 if (split_success < 0) {
51 "ERROR: odp_packet_split\n");
53 }
else if (first_fragment && split_success > 0) {
65 "ERROR: odp_packet_extend_head\n");
71 "ERROR: odp_packet_copy_from_mem\n");
78 ipv4hdr_set_more_fragments(header, bytes_remaining != 0);
80 ipv4hdr_set_fragment_offset_oct(header, (frag_offset / 8));
81 assert((bytes_remaining == 0) ||
83 assert((bytes_remaining != 0) ||
84 (ipv4hdr_reass_payload_len(*header) + header_len
88 odph_ipv4_csum_update(frag);
90 out[fragments++] = frag;
92 frag_offset += (frag_len - header_len);
odp_u16be_t odp_cpu_to_be_16(uint16_t cpu16)
Convert cpu native uint16_t to 16bit big endian.
int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 3 start offset.
void * odp_packet_data(odp_packet_t pkt)
Packet data pointer.
int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Extend packet head.
int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail)
Split packet into two packets.
uint32_t odp_packet_len(odp_packet_t pkt)
Packet data length.
int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset, uint32_t len, const void *src)
Copy data from memory to packet.
#define ODP_PACKET_INVALID
Invalid packet.
bool odp_bool_t
Boolean type.