aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJere Leppänen <jere.leppanen@nokia.com>2022-03-18 13:59:54 +0200
committerPetri Savolainen <petri.savolainen@nokia.com>2022-03-31 16:35:49 +0300
commitebf8ae94b65c8bdfad24c30f40f7317ec673dc2f (patch)
treec15ae03d32c103e4d58e8a5e09ab3536fde60f53
parent491d1d2eea16c418af5e96f1fa9eaac96e6c9945 (diff)
linux-gen: pktio: validate L4 checksum also when classifier is enabled
Unlike _odp_packet_parse_layer(), _odp_packet_parse_common() (which is called when classifier is enabled) does not validate L4 checksum. Call _odp_packet_l4_chksum() directly in each pktio, when classifier is enabled. Signed-off-by: Jere Leppänen <jere.leppanen@nokia.com> Reviewed-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
-rw-r--r--platform/linux-generic/include/odp_parse_internal.h6
-rw-r--r--platform/linux-generic/pktio/loop.c6
-rw-r--r--platform/linux-generic/pktio/netmap.c10
-rw-r--r--platform/linux-generic/pktio/pcap.c6
-rw-r--r--platform/linux-generic/pktio/socket.c8
-rw-r--r--platform/linux-generic/pktio/socket_mmap.c10
-rw-r--r--platform/linux-generic/pktio/tap.c10
7 files changed, 40 insertions, 16 deletions
diff --git a/platform/linux-generic/include/odp_parse_internal.h b/platform/linux-generic/include/odp_parse_internal.h
index e4fdb63f9..8132c1c7b 100644
--- a/platform/linux-generic/include/odp_parse_internal.h
+++ b/platform/linux-generic/include/odp_parse_internal.h
@@ -80,12 +80,12 @@ static inline int _odp_packet_parse_common(packet_parser_t *prs,
const uint8_t *ptr,
uint32_t frame_len, uint32_t seg_len,
int layer,
- odp_proto_chksums_t chksums)
+ odp_proto_chksums_t chksums,
+ uint64_t *l4_part_sum)
{
uint32_t offset;
uint16_t ethtype;
const uint8_t *parseptr;
- uint64_t l4_part_sum;
parseptr = ptr;
offset = 0;
@@ -100,7 +100,7 @@ static inline int _odp_packet_parse_common(packet_parser_t *prs,
return _odp_packet_parse_common_l3_l4(prs, parseptr, offset, frame_len,
seg_len, layer, ethtype, chksums,
- &l4_part_sum);
+ l4_part_sum);
}
/* Perform packet parse up to a given protocol layer */
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c
index 986be743c..9389d587c 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -192,6 +192,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
uint8_t buf[PARSE_BYTES];
int ret;
uint32_t seg_len = odp_packet_seg_len(pkt);
+ uint64_t l4_part_sum = 0;
/* Make sure there is enough data for the packet
* parser in the case of a segmented packet. */
@@ -206,7 +207,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
ret = _odp_packet_parse_common(&pkt_hdr->p, pkt_addr, pkt_len,
seg_len, ODP_PROTO_LAYER_ALL,
- pktio_entry->s.in_chksums);
+ pktio_entry->s.in_chksums,
+ &l4_part_sum);
if (ret)
errors++;
@@ -235,6 +237,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
pkt = new_pkt;
pkt_hdr = packet_hdr(new_pkt);
}
+
+ _odp_packet_l4_chksum(pkt_hdr, pktio_entry->s.in_chksums, l4_part_sum);
} else {
odp_packet_parse_param_t param;
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 22312f79b..91c929b4c 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -839,6 +839,7 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
for (i = 0; i < num; i++) {
netmap_slot_t slot;
uint16_t len;
+ uint64_t l4_part_sum = 0;
slot = slot_tbl[i];
len = slot.len;
@@ -852,7 +853,8 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
packet_set_len(&parsed_hdr, len);
if (_odp_packet_parse_common(&parsed_hdr.p, buf, len, len,
ODP_PROTO_LAYER_ALL,
- pktio_entry->s.in_chksums) < 0)
+ pktio_entry->s.in_chksums,
+ &l4_part_sum) < 0)
continue;
if (_odp_cls_classify_packet(pktio_entry, buf, &pool,
@@ -871,12 +873,14 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
pkt_hdr->input = pktio_entry->s.handle;
- if (pktio_cls_enabled(pktio_entry))
+ if (pktio_cls_enabled(pktio_entry)) {
_odp_packet_copy_cls_md(pkt_hdr, &parsed_hdr);
- else
+ _odp_packet_l4_chksum(pkt_hdr, pktio_entry->s.in_chksums, l4_part_sum);
+ } else {
_odp_packet_parse_layer(pkt_hdr,
pktio_entry->s.config.parser.layer,
pktio_entry->s.in_chksums);
+ }
packet_set_ts(pkt_hdr, ts);
num_rx++;
diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c
index 6efe0c22b..cef3fef86 100644
--- a/platform/linux-generic/pktio/pcap.c
+++ b/platform/linux-generic/pktio/pcap.c
@@ -294,10 +294,12 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
if (pktio_cls_enabled(pktio_entry)) {
odp_packet_t new_pkt;
+ uint64_t l4_part_sum = 0;
ret = _odp_packet_parse_common(&pkt_hdr->p, data, pkt_len,
pkt_len, ODP_PROTO_LAYER_ALL,
- pktio_entry->s.in_chksums);
+ pktio_entry->s.in_chksums,
+ &l4_part_sum);
if (ret < 0) {
odp_packet_free(pkt);
continue;
@@ -320,6 +322,8 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
pkt = new_pkt;
pkt_hdr = packet_hdr(new_pkt);
}
+
+ _odp_packet_l4_chksum(pkt_hdr, pktio_entry->s.in_chksums, l4_part_sum);
} else {
_odp_packet_parse_layer(pkt_hdr,
pktio_entry->s.config.parser.layer,
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c
index 0b46f2a33..a6c2e5018 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -263,6 +263,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
uint16_t pkt_len = msgvec[i].msg_len;
int ret;
+ uint64_t l4_part_sum = 0;
if (odp_unlikely(msgvec[i].msg_hdr.msg_flags & MSG_TRUNC)) {
odp_packet_free(pkt);
@@ -286,7 +287,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
if (_odp_packet_parse_common(&pkt_hdr->p, base, pkt_len,
seg_len, ODP_PROTO_LAYER_ALL,
- pktio_entry->s.in_chksums) < 0) {
+ pktio_entry->s.in_chksums,
+ &l4_part_sum) < 0) {
odp_packet_free(pkt);
continue;
}
@@ -307,7 +309,9 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
pkt_hdr->input = pktio_entry->s.handle;
- if (!pktio_cls_enabled(pktio_entry))
+ if (pktio_cls_enabled(pktio_entry))
+ _odp_packet_l4_chksum(pkt_hdr, pktio_entry->s.in_chksums, l4_part_sum);
+ else
_odp_packet_parse_layer(pkt_hdr,
pktio_entry->s.config.parser.layer,
pktio_entry->s.in_chksums);
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c
index c3c73851f..57c83506e 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -166,6 +166,7 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry,
odp_packet_hdr_t *hdr;
odp_packet_hdr_t parsed_hdr;
int ret;
+ uint64_t l4_part_sum = 0;
tp_hdr = (void *)next_ptr;
@@ -219,7 +220,8 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry,
if (_odp_packet_parse_common(&parsed_hdr.p, pkt_buf,
pkt_len, pkt_len,
ODP_PROTO_LAYER_ALL,
- pktio_entry->s.in_chksums) < 0) {
+ pktio_entry->s.in_chksums,
+ &l4_part_sum) < 0) {
odp_packet_free(pkt);
tp_hdr->tp_status = TP_STATUS_KERNEL;
frame_num = next_frame_num;
@@ -288,12 +290,14 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry,
hdr->input = pktio_entry->s.handle;
- if (pktio_cls_enabled(pktio_entry))
+ if (pktio_cls_enabled(pktio_entry)) {
_odp_packet_copy_cls_md(hdr, &parsed_hdr);
- else
+ _odp_packet_l4_chksum(hdr, pktio_entry->s.in_chksums, l4_part_sum);
+ } else {
_odp_packet_parse_layer(hdr,
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 67b893417..0e5b32e73 100644
--- a/platform/linux-generic/pktio/tap.c
+++ b/platform/linux-generic/pktio/tap.c
@@ -287,6 +287,7 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data,
odp_packet_hdr_t *pkt_hdr;
odp_packet_hdr_t parsed_hdr;
int num;
+ uint64_t l4_part_sum = 0;
uint16_t frame_offset = pktio_entry->s.pktin_frame_offset;
if (pktio_cls_enabled(pktio_entry)) {
@@ -294,7 +295,8 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data,
packet_set_len(&parsed_hdr, len);
if (_odp_packet_parse_common(&parsed_hdr.p, data, len, len,
ODP_PROTO_LAYER_ALL,
- pktio_entry->s.in_chksums) < 0) {
+ pktio_entry->s.in_chksums,
+ &l4_part_sum) < 0) {
return ODP_PACKET_INVALID;
}
@@ -321,12 +323,14 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data,
return ODP_PACKET_INVALID;
}
- if (pktio_cls_enabled(pktio_entry))
+ if (pktio_cls_enabled(pktio_entry)) {
_odp_packet_copy_cls_md(pkt_hdr, &parsed_hdr);
- else
+ _odp_packet_l4_chksum(pkt_hdr, pktio_entry->s.in_chksums, l4_part_sum);
+ } else {
_odp_packet_parse_layer(pkt_hdr,
pktio_entry->s.config.parser.layer,
pktio_entry->s.in_chksums);
+ }
packet_set_ts(pkt_hdr, ts);
pkt_hdr->input = pktio_entry->s.handle;