This patch fixes a bug in parse_ipv6 caused because the IPv6 payload length does not include the IPv6 header and a bug in parse_udp where l4_offset was subtracted from l3_offset instead of the other way around. Also made a number of cosmetic changes to satisfy checkpatch.
Signed-off-by: Barry Spinney <[email protected]> --- platform/linux-generic/odp_packet.c | 42 ++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 9329397..01c2288 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -206,6 +206,7 @@ odp_event_t odp_packet_to_event(odp_packet_t pkt) void *odp_packet_head(odp_packet_t pkt) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + return buffer_map(&pkt_hdr->buf_hdr, 0, NULL, 0); } @@ -219,6 +220,7 @@ uint32_t odp_packet_buf_len(odp_packet_t pkt) void *odp_packet_data(odp_packet_t pkt) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + return packet_map(pkt_hdr, 0, NULL); } @@ -250,6 +252,7 @@ uint32_t odp_packet_tailroom(odp_packet_t pkt) void *odp_packet_tail(odp_packet_t pkt) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + return packet_map(pkt_hdr, pkt_hdr->frame_len, NULL); } @@ -306,6 +309,7 @@ void *odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len, if (addr != NULL && seg != NULL) { odp_buffer_bits_t seghandle; + seghandle.handle = (odp_buffer_t)pkt; seghandle.seg = (pkt_hdr->headroom + offset) / pkt_hdr->buf_hdr.segsize; @@ -360,6 +364,7 @@ uint32_t odp_packet_user_area_size(odp_packet_t pkt) void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + if (!packet_hdr_has_l2(pkt_hdr)) return NULL; return packet_map(pkt_hdr, pkt_hdr->l2_offset, len); @@ -368,6 +373,7 @@ void *odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len) uint32_t odp_packet_l2_offset(odp_packet_t pkt) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + if (!packet_hdr_has_l2(pkt_hdr)) return ODP_PACKET_OFFSET_INVALID; return pkt_hdr->l2_offset; @@ -388,6 +394,7 @@ int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset) void *odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + if (packet_parse_not_complete(pkt_hdr)) packet_parse_full(pkt_hdr); return packet_map(pkt_hdr, pkt_hdr->l3_offset, len); @@ -396,6 +403,7 @@ void *odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len) uint32_t odp_packet_l3_offset(odp_packet_t pkt) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + if (packet_parse_not_complete(pkt_hdr)) packet_parse_full(pkt_hdr); return pkt_hdr->l3_offset; @@ -417,6 +425,7 @@ int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset) void *odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + if (packet_parse_not_complete(pkt_hdr)) packet_parse_full(pkt_hdr); return packet_map(pkt_hdr, pkt_hdr->l4_offset, len); @@ -425,6 +434,7 @@ void *odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len) uint32_t odp_packet_l4_offset(odp_packet_t pkt) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); + if (packet_parse_not_complete(pkt_hdr)) packet_parse_full(pkt_hdr); return pkt_hdr->l4_offset; @@ -696,26 +706,27 @@ void odp_packet_print(odp_packet_t pkt) int max_len = 512; char str[max_len]; int len = 0; - int n = max_len-1; + int n = max_len - 1; odp_packet_hdr_t *hdr = odp_packet_hdr(pkt); - len += snprintf(&str[len], n-len, "Packet "); - len += odp_buffer_snprint(&str[len], n-len, (odp_buffer_t) pkt); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, "Packet "); + len += odp_buffer_snprint(&str[len], n - len, (odp_buffer_t)pkt); + len += snprintf(&str[len], n - len, " input_flags 0x%" PRIx32 "\n", hdr->input_flags.all); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " error_flags 0x%" PRIx32 "\n", hdr->error_flags.all); - len += snprintf(&str[len], n-len, - " output_flags 0x%" PRIx32 "\n", hdr->output_flags.all); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, + " output_flags 0x%" PRIx32 "\n", + hdr->output_flags.all); + len += snprintf(&str[len], n - len, " l2_offset %" PRIu32 "\n", hdr->l2_offset); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " l3_offset %" PRIu32 "\n", hdr->l3_offset); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " l4_offset %" PRIu32 "\n", hdr->l4_offset); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " frame_len %" PRIu32 "\n", hdr->frame_len); - len += snprintf(&str[len], n-len, + len += snprintf(&str[len], n - len, " input %" PRIu64 "\n", odp_pktio_to_u64(hdr->input)); str[len] = '\0'; @@ -844,7 +855,8 @@ static inline uint8_t parse_ipv6(odp_packet_hdr_t *pkt_hdr, const odph_ipv6hdr_ext_t *ipv6ext; uint32_t dstaddr0 = odp_be_to_cpu_32(ipv6->dst_addr[0]); - pkt_hdr->l3_len = odp_be_to_cpu_16(ipv6->payload_len); + pkt_hdr->l3_len = odp_be_to_cpu_16(ipv6->payload_len) + + ODPH_IPV6HDR_LEN; /* Basic sanity checks on IPv6 header */ if ((odp_be_to_cpu_32(ipv6->ver_tc_flow) >> 28) != 6 || @@ -904,7 +916,7 @@ static inline void parse_tcp(odp_packet_hdr_t *pkt_hdr, { const odph_tcphdr_t *tcp = (const odph_tcphdr_t *)*parseptr; - if (tcp->hl < sizeof(odph_tcphdr_t)/sizeof(uint32_t)) + if (tcp->hl < sizeof(odph_tcphdr_t) / sizeof(uint32_t)) pkt_hdr->error_flags.tcp_err = 1; else if ((uint32_t)tcp->hl * 4 > sizeof(odph_tcphdr_t)) pkt_hdr->input_flags.tcpopt = 1; @@ -927,7 +939,7 @@ static inline void parse_udp(odp_packet_hdr_t *pkt_hdr, if (udplen < sizeof(odph_udphdr_t) || udplen > (pkt_hdr->l3_len + - pkt_hdr->l3_offset - pkt_hdr->l4_offset)) { + pkt_hdr->l4_offset - pkt_hdr->l3_offset)) { pkt_hdr->error_flags.udp_err = 1; } -- 2.7.2 _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
