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

Reply via email to