diff options
Diffstat (limited to 'platform')
-rw-r--r-- | platform/linux-generic/include/odp_parse_internal.h | 8 | ||||
-rw-r--r-- | platform/linux-generic/odp_packet.c | 5 | ||||
-rw-r--r-- | platform/linux-generic/odp_parse.c | 13 | ||||
-rw-r--r-- | platform/linux-generic/pktio/loop.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/netmap.c | 3 | ||||
-rw-r--r-- | platform/linux-generic/pktio/pcap.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/socket.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/socket_mmap.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/tap.c | 3 |
9 files changed, 37 insertions, 19 deletions
diff --git a/platform/linux-generic/include/odp_parse_internal.h b/platform/linux-generic/include/odp_parse_internal.h index 13d0564dc..8aa5e118b 100644 --- a/platform/linux-generic/include/odp_parse_internal.h +++ b/platform/linux-generic/include/odp_parse_internal.h @@ -65,7 +65,8 @@ int _odp_packet_parse_common_l3_l4(packet_parser_t *prs, uint32_t frame_len, uint32_t seg_len, int layer, uint16_t ethtype, odp_proto_chksums_t chksums, - uint64_t *l4_part_sum); + uint64_t *l4_part_sum, + odp_pktin_config_opt_t opt); /** * Parse common packet headers up to given layer @@ -81,7 +82,8 @@ static inline int _odp_packet_parse_common(packet_parser_t *prs, uint32_t frame_len, uint32_t seg_len, int layer, odp_proto_chksums_t chksums, - uint64_t *l4_part_sum) + uint64_t *l4_part_sum, + odp_pktin_config_opt_t opt) { uint32_t offset; uint16_t ethtype; @@ -100,7 +102,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, opt); } #ifdef __cplusplus diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index a4be68181..b0d0fc03c 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -2033,6 +2033,7 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset, uint64_t l4_part_sum = 0; const uint32_t min_seglen = PARSE_ETH_BYTES + PARSE_L3_L4_BYTES; uint8_t buf[min_seglen]; + odp_pktin_config_opt_t opt; if (proto == ODP_PROTO_NONE || layer == ODP_PROTO_LAYER_NONE) return -1; @@ -2072,10 +2073,12 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset, ethtype = 0; /* Invalid */ } + opt.all_bits = 0; + ret = _odp_packet_parse_common_l3_l4(&pkt_hdr->p, data, offset, packet_len, seg_len, layer, ethtype, param->chksums, - &l4_part_sum); + &l4_part_sum, opt); if (ret) return -1; diff --git a/platform/linux-generic/odp_parse.c b/platform/linux-generic/odp_parse.c index 615aa9401..2342a7e49 100644 --- a/platform/linux-generic/odp_parse.c +++ b/platform/linux-generic/odp_parse.c @@ -359,7 +359,8 @@ int _odp_packet_parse_common_l3_l4(packet_parser_t *prs, uint32_t frame_len, uint32_t seg_len, int layer, uint16_t ethtype, odp_proto_chksums_t chksums, - uint64_t *l4_part_sum) + uint64_t *l4_part_sum, + odp_pktin_config_opt_t opt) { uint8_t ip_proto; @@ -378,6 +379,8 @@ int _odp_packet_parse_common_l3_l4(packet_parser_t *prs, ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len, chksums, l4_part_sum); prs->l4_offset = offset; + if (prs->flags.ip_err && opt.bit.drop_ipv4_err) + return -1; /* drop */ break; case _ODP_ETHTYPE_IPV6: @@ -385,6 +388,8 @@ int _odp_packet_parse_common_l3_l4(packet_parser_t *prs, ip_proto = parse_ipv6(prs, &parseptr, &offset, frame_len, seg_len, chksums, l4_part_sum); prs->l4_offset = offset; + if (prs->flags.ip_err && opt.bit.drop_ipv6_err) + return -1; /* drop */ break; case _ODP_ETHTYPE_ARP: @@ -422,6 +427,8 @@ int _odp_packet_parse_common_l3_l4(packet_parser_t *prs, prs->input_flags.tcp = 1; parse_tcp(prs, &parseptr, frame_len - prs->l4_offset, chksums, l4_part_sum); + if (prs->flags.tcp_err && opt.bit.drop_tcp_err) + return -1; /* drop */ break; case _ODP_IPPROTO_UDP: @@ -429,6 +436,8 @@ int _odp_packet_parse_common_l3_l4(packet_parser_t *prs, return -1; prs->input_flags.udp = 1; parse_udp(prs, &parseptr, chksums, l4_part_sum); + if (prs->flags.udp_err && opt.bit.drop_udp_err) + return -1; /* drop */ break; case _ODP_IPPROTO_AH: @@ -445,6 +454,8 @@ int _odp_packet_parse_common_l3_l4(packet_parser_t *prs, prs->input_flags.sctp = 1; parse_sctp(prs, &parseptr, frame_len - prs->l4_offset, chksums, l4_part_sum); + if (prs->flags.sctp_err && opt.bit.drop_sctp_err) + return -1; /* drop */ break; case _ODP_IPPROTO_NO_NEXT: diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index ed190904f..3e21efecd 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -164,6 +164,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, uint32_t octets = 0; const odp_proto_chksums_t chksums = pktio_entry->s.in_chksums; const odp_proto_layer_t layer = pktio_entry->s.parse_layer; + const odp_pktin_config_opt_t opt = pktio_entry->s.config.pktin; if (odp_unlikely(num > QUEUE_MULTI_MAX)) num = QUEUE_MULTI_MAX; @@ -173,8 +174,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, queue = pkt_priv(pktio_entry)->loopq; nbr = odp_queue_deq_multi(queue, (odp_event_t *)hdr_tbl, num); - if (pktio_entry->s.config.pktin.bit.ts_all || - pktio_entry->s.config.pktin.bit.ts_ptp) { + if (opt.bit.ts_all || opt.bit.ts_ptp) { ts_val = odp_time_global(); ts = &ts_val; } @@ -207,7 +207,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, packet_parse_reset(pkt_hdr, 1); ret = _odp_packet_parse_common(&pkt_hdr->p, pkt_addr, pkt_len, seg_len, layer, chksums, - &l4_part_sum); + &l4_part_sum, opt); if (ret) errors++; diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 77452a631..7abc2ddfa 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -830,6 +830,7 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry, int num_rx = 0; const odp_proto_chksums_t chksums = pktio_entry->s.in_chksums; const odp_proto_layer_t layer = pktio_entry->s.parse_layer; + const odp_pktin_config_opt_t opt = pktio_entry->s.config.pktin; /* Allocate maximum sized packets */ max_len = pkt_priv(pktio_entry)->mtu; @@ -854,7 +855,7 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry, if (layer) { if (_odp_packet_parse_common(&pkt_hdr->p, buf, len, len, - layer, chksums, &l4_part_sum) < 0) + layer, chksums, &l4_part_sum, opt) < 0) continue; if (pktio_cls_enabled(pktio_entry)) { diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index b66b3322c..2088c06d9 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -252,6 +252,7 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, uint16_t frame_offset = pktio_entry->s.pktin_frame_offset; const odp_proto_chksums_t chksums = pktio_entry->s.in_chksums; const odp_proto_layer_t layer = pktio_entry->s.parse_layer; + const odp_pktin_config_opt_t opt = pktio_entry->s.config.pktin; odp_ticketlock_lock(&pktio_entry->s.rxl); @@ -259,8 +260,7 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_ticketlock_unlock(&pktio_entry->s.rxl); return 0; } - if (pktio_entry->s.config.pktin.bit.ts_all || - pktio_entry->s.config.pktin.bit.ts_ptp) + if (opt.bit.ts_all || opt.bit.ts_ptp) ts = &ts_val; for (i = 0; i < num; ) { @@ -299,7 +299,7 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, ret = _odp_packet_parse_common(&pkt_hdr->p, data, pkt_len, pkt_len, layer, chksums, - &l4_part_sum); + &l4_part_sum, opt); if (ret < 0) { odp_packet_free(pkt); continue; diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 525a14295..16d375bd4 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -236,6 +236,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, uint32_t alloc_len = pkt_sock->mtu + frame_offset; const odp_proto_chksums_t chksums = pktio_entry->s.in_chksums; const odp_proto_layer_t layer = pktio_entry->s.parse_layer; + const odp_pktin_config_opt_t opt = pktio_entry->s.config.pktin; memset(msgvec, 0, sizeof(msgvec)); @@ -252,8 +253,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, recv_msgs = recvmmsg(sockfd, msgvec, nb_pkts, MSG_DONTWAIT, NULL); odp_ticketlock_unlock(&pkt_sock->rx_lock); - if (pktio_entry->s.config.pktin.bit.ts_all || - pktio_entry->s.config.pktin.bit.ts_ptp) { + if (opt.bit.ts_all || opt.bit.ts_ptp) { ts_val = odp_time_global(); ts = &ts_val; } @@ -289,7 +289,7 @@ 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, layer, chksums, - &l4_part_sum) < 0) { + &l4_part_sum, opt) < 0) { odp_packet_free(pkt); continue; } diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index 2ab4b59f6..b3c85652f 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -153,9 +153,9 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, uint16_t vlan_len = 0; const odp_proto_chksums_t chksums = pktio_entry->s.in_chksums; const odp_proto_layer_t layer = pktio_entry->s.parse_layer; + const odp_pktin_config_opt_t opt = pktio_entry->s.config.pktin; - if (pktio_entry->s.config.pktin.bit.ts_all || - pktio_entry->s.config.pktin.bit.ts_ptp) + if (opt.bit.ts_all || opt.bit.ts_ptp) ts = &ts_val; ring = &pkt_sock->rx_ring; @@ -220,7 +220,7 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, if (layer) { if (_odp_packet_parse_common(&hdr->p, pkt_buf, pkt_len, pkt_len, layer, chksums, - &l4_part_sum) < 0) { + &l4_part_sum, opt) < 0) { odp_packet_free(pkt); tp_hdr->tp_status = TP_STATUS_KERNEL; frame_num = next_frame_num; diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index 85a0a9972..40c46b43c 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -291,12 +291,13 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, uint16_t frame_offset = pktio_entry->s.pktin_frame_offset; const odp_proto_chksums_t chksums = pktio_entry->s.in_chksums; const odp_proto_layer_t layer = pktio_entry->s.parse_layer; + const odp_pktin_config_opt_t opt = pktio_entry->s.config.pktin; if (layer) { packet_parse_reset(&parsed_hdr, 1); packet_set_len(&parsed_hdr, len); if (_odp_packet_parse_common(&parsed_hdr.p, data, len, len, layer, - chksums, &l4_part_sum) < 0) { + chksums, &l4_part_sum, opt) < 0) { return ODP_PACKET_INVALID; } |