diff options
author | Jere Leppänen <jere.leppanen@nokia.com> | 2022-03-18 13:59:54 +0200 |
---|---|---|
committer | Petri Savolainen <petri.savolainen@nokia.com> | 2022-03-31 16:35:49 +0300 |
commit | ebf8ae94b65c8bdfad24c30f40f7317ec673dc2f (patch) | |
tree | c15ae03d32c103e4d58e8a5e09ab3536fde60f53 | |
parent | 491d1d2eea16c418af5e96f1fa9eaac96e6c9945 (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.h | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/loop.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/netmap.c | 10 | ||||
-rw-r--r-- | platform/linux-generic/pktio/pcap.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/socket.c | 8 | ||||
-rw-r--r-- | platform/linux-generic/pktio/socket_mmap.c | 10 | ||||
-rw-r--r-- | platform/linux-generic/pktio/tap.c | 10 |
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; |