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;
}