aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/odp_packet_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/odp_packet_io.c')
-rw-r--r--platform/linux-generic/odp_packet_io.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
index 7c68b10c5..02d1a827c 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -612,12 +612,6 @@ int odp_pktio_config(odp_pktio_t hdl, const odp_pktio_config_t *config)
entry->s.config = *config;
- entry->s.in_chksums.all_chksum = 0;
- entry->s.in_chksums.chksum.ipv4 = config->pktin.bit.ipv4_chksum;
- entry->s.in_chksums.chksum.tcp = config->pktin.bit.tcp_chksum;
- entry->s.in_chksums.chksum.udp = config->pktin.bit.udp_chksum;
- entry->s.in_chksums.chksum.sctp = config->pktin.bit.sctp_chksum;
-
entry->s.enabled.tx_ts = config->pktout.bit.ts_ena;
entry->s.enabled.tx_compl = config->pktout.bit.tx_compl_ena;
@@ -3102,8 +3096,8 @@ int odp_packet_lso_request(odp_packet_t pkt, const odp_packet_lso_opt_t *lso_opt
return -1;
}
- if (odp_unlikely((payload_offset + lso_opt->max_payload_len) > packet_len(pkt_hdr))) {
- ODP_ERR("LSO options larger than packet data length\n");
+ if (odp_unlikely(payload_offset > packet_len(pkt_hdr))) {
+ ODP_ERR("LSO payload offset larger than packet data length\n");
return -1;
}
@@ -3212,11 +3206,19 @@ int _odp_lso_num_packets(odp_packet_t packet, const odp_packet_lso_opt_t *lso_op
return -1;
}
- if (odp_unlikely((hdr_len + payload_len) > pkt_len)) {
- ODP_ERR("LSO options larger than packet data length\n");
+ if (odp_unlikely(hdr_len > pkt_len)) {
+ ODP_ERR("LSO payload offset larger than packet data length\n");
return -1;
}
+ if (odp_unlikely(hdr_len + payload_len > odp_packet_len(packet))) {
+ /* Packet does not need segmentation */
+ *len_out = payload_len;
+ *left_over_out = 0;
+
+ return 1;
+ }
+
if (lso_prof->param.lso_proto == ODP_LSO_PROTO_IPV4) {
l3_offset = odp_packet_l3_offset(packet);
iphdr_len = hdr_len - l3_offset;
@@ -3364,6 +3366,14 @@ static int pktout_send_lso(odp_pktout_queue_t queue, odp_packet_t packet,
if (odp_unlikely(num_pkt <= 0))
return -1;
+ if (odp_unlikely(num_pkt == 1)) {
+ /* Segmentation not needed */
+ if (odp_pktout_send(queue, &packet, 1) != 1)
+ return -1;
+
+ return 0;
+ }
+
/* Create packets */
odp_packet_t pkt_out[num_pkt];