aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/linux-generic/include/odp_packet_internal.h6
-rw-r--r--platform/linux-generic/odp_classification.c3
-rw-r--r--platform/linux-generic/odp_packet.c34
-rw-r--r--platform/linux-generic/pktio/loop.c3
-rw-r--r--platform/linux-generic/pktio/netmap.c3
-rw-r--r--platform/linux-generic/pktio/pcap.c3
-rw-r--r--platform/linux-generic/pktio/socket.c3
-rw-r--r--platform/linux-generic/pktio/socket_mmap.c3
-rw-r--r--platform/linux-generic/pktio/tap.c3
9 files changed, 43 insertions, 18 deletions
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index 933dd4bee..951903dd6 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -252,7 +252,8 @@ int packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len,
/* Perform packet parse up to a given protocol layer */
int packet_parse_layer(odp_packet_hdr_t *pkt_hdr,
- odp_proto_layer_t layer);
+ odp_proto_layer_t layer,
+ odp_proto_chksums_t chksums);
/* Reset parser metadata for a new parse */
void packet_parse_reset(odp_packet_hdr_t *pkt_hdr);
@@ -293,7 +294,8 @@ static inline void packet_set_ts(odp_packet_hdr_t *pkt_hdr, odp_time_t *ts)
}
int packet_parse_common(packet_parser_t *pkt_hdr, const uint8_t *ptr,
- uint32_t pkt_len, uint32_t seg_len, int layer);
+ uint32_t pkt_len, uint32_t seg_len, int layer,
+ odp_proto_chksums_t chksums);
int _odp_cls_parse(odp_packet_hdr_t *pkt_hdr, const uint8_t *parseptr);
diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c
index 46fcf67ee..ae4eb5854 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -998,7 +998,8 @@ int cls_classify_packet(pktio_entry_t *entry, const uint8_t *base,
packet_set_len(pkt_hdr, pkt_len);
packet_parse_common(&pkt_hdr->p, base, pkt_len, seg_len,
- ODP_PROTO_LAYER_ALL);
+ ODP_PROTO_LAYER_ALL,
+ entry->s.in_chksums);
}
cos = cls_select_cos(entry, base, pkt_hdr);
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index e06354440..77e00fcec 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -2084,7 +2084,8 @@ error:
* Parser helper function for IPv4
*/
static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr,
- uint32_t *offset, uint32_t frame_len)
+ uint32_t *offset, uint32_t frame_len,
+ odp_proto_chksums_t chksums)
{
const _odp_ipv4hdr_t *ipv4 = (const _odp_ipv4hdr_t *)*parseptr;
uint32_t dstaddr = _odp_be_to_cpu_32(ipv4->dst_addr);
@@ -2100,6 +2101,15 @@ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr,
return 0;
}
+ if (chksums.chksum.ipv4) {
+ prs->input_flags.l3_chksum_done = 1;
+ if (odp_chksum_ones_comp16(ipv4, ihl * 4) != 0xffff) {
+ prs->flags.ip_err = 1;
+ prs->flags.l3_chksum_err = 1;
+ return 0;
+ }
+ }
+
*offset += ihl * 4;
*parseptr += ihl * 4;
@@ -2230,7 +2240,8 @@ static inline
int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
uint32_t offset,
uint32_t frame_len, uint32_t seg_len,
- int layer, uint16_t ethtype)
+ int layer, uint16_t ethtype,
+ odp_proto_chksums_t chksums)
{
uint8_t ip_proto;
@@ -2246,7 +2257,8 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
switch (ethtype) {
case _ODP_ETHTYPE_IPV4:
prs->input_flags.ipv4 = 1;
- ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len);
+ ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len,
+ chksums);
prs->l4_offset = offset;
break;
@@ -2334,7 +2346,7 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
*/
int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr,
uint32_t frame_len, uint32_t seg_len,
- int layer)
+ int layer, odp_proto_chksums_t chksums)
{
uint32_t offset;
uint16_t ethtype;
@@ -2352,7 +2364,7 @@ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr,
ethtype = parse_eth(prs, &parseptr, &offset, frame_len);
return packet_parse_common_l3_l4(prs, parseptr, offset, frame_len,
- seg_len, layer, ethtype);
+ seg_len, layer, ethtype, chksums);
}
static inline int packet_ipv4_chksum(odp_packet_t pkt,
@@ -2512,13 +2524,14 @@ int _odp_packet_udp_chksum_insert(odp_packet_t pkt)
* Simple packet parser
*/
int packet_parse_layer(odp_packet_hdr_t *pkt_hdr,
- odp_proto_layer_t layer)
+ odp_proto_layer_t layer,
+ odp_proto_chksums_t chksums)
{
uint32_t seg_len = packet_first_seg_len(pkt_hdr);
void *base = packet_data(pkt_hdr);
return packet_parse_common(&pkt_hdr->p, base, pkt_hdr->frame_len,
- seg_len, layer);
+ seg_len, layer, chksums);
}
int odp_packet_parse(odp_packet_t pkt, uint32_t offset,
@@ -2545,7 +2558,8 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset,
if (proto == ODP_PROTO_ETH) {
ret = packet_parse_common(&pkt_hdr->p, data, packet_len,
- seg_len, layer);
+ seg_len, layer,
+ param->chksums);
if (ret)
return -1;
@@ -2557,7 +2571,9 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset,
ret = packet_parse_common_l3_l4(&pkt_hdr->p, data, offset,
packet_len, seg_len,
- layer, ethtype);
+ layer, ethtype,
+ param->chksums);
+
if (ret)
return -1;
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c
index 779e4c62b..d75102dc6 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -151,7 +151,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
}
} else {
packet_parse_layer(pkt_hdr,
- pktio_entry->s.config.parser.layer);
+ pktio_entry->s.config.parser.layer,
+ pktio_entry->s.in_chksums);
}
packet_set_ts(pkt_hdr, ts);
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 567bc9f95..1fb76d2ab 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -724,7 +724,8 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
copy_packet_cls_metadata(&parsed_hdr, pkt_hdr);
else
packet_parse_layer(pkt_hdr,
- pktio_entry->s.config.parser.layer);
+ pktio_entry->s.config.parser.layer,
+ pktio_entry->s.in_chksums);
packet_set_ts(pkt_hdr, ts);
}
diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c
index 3df7f9606..530a1600a 100644
--- a/platform/linux-generic/pktio/pcap.c
+++ b/platform/linux-generic/pktio/pcap.c
@@ -256,7 +256,8 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
}
packet_parse_layer(pkt_hdr,
- pktio_entry->s.config.parser.layer);
+ pktio_entry->s.config.parser.layer,
+ pktio_entry->s.in_chksums);
pktio_entry->s.stats.in_octets += pkt_hdr->frame_len;
packet_set_ts(pkt_hdr, ts);
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c
index 8b7200e6f..d77538509 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -682,7 +682,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
if (!pktio_cls_enabled(pktio_entry))
packet_parse_layer(pkt_hdr,
- pktio_entry->s.config.parser.layer);
+ pktio_entry->s.config.parser.layer,
+ pktio_entry->s.in_chksums);
pkt_hdr->input = pktio_entry->s.handle;
packet_set_ts(pkt_hdr, ts);
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c
index 847eb71ad..1731e60d8 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -259,7 +259,8 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry,
copy_packet_cls_metadata(&parsed_hdr, hdr);
else
packet_parse_layer(hdr,
- pktio_entry->s.config.parser.layer);
+ pktio_entry->s.config.parser.layer,
+ pktio_entry->s.in_chksums);
packet_set_ts(hdr, ts);
diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c
index af766e0de..d2f5cea16 100644
--- a/platform/linux-generic/pktio/tap.c
+++ b/platform/linux-generic/pktio/tap.c
@@ -286,7 +286,8 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data,
copy_packet_cls_metadata(&parsed_hdr, pkt_hdr);
else
packet_parse_layer(pkt_hdr,
- pktio_entry->s.config.parser.layer);
+ pktio_entry->s.config.parser.layer,
+ pktio_entry->s.in_chksums);
packet_set_ts(pkt_hdr, ts);
pkt_hdr->input = pktio_entry->s.handle;