aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/include/odp_parse_internal.h8
-rw-r--r--platform/linux-generic/odp_packet.c5
-rw-r--r--platform/linux-generic/odp_parse.c13
-rw-r--r--platform/linux-generic/pktio/loop.c6
-rw-r--r--platform/linux-generic/pktio/netmap.c3
-rw-r--r--platform/linux-generic/pktio/pcap.c6
-rw-r--r--platform/linux-generic/pktio/socket.c6
-rw-r--r--platform/linux-generic/pktio/socket_mmap.c6
-rw-r--r--platform/linux-generic/pktio/tap.c3
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;
}