aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2018-09-11 12:54:42 +0300
committerMatias Elo <matias.elo@nokia.com>2018-09-17 13:30:45 +0300
commita316df435a1bd21a058b75eaf3840f78e03adcab (patch)
tree384b504c1133007e05e1394972f7edff66a04a2b
parent372590151b83e399c11b9e927e671eea41d2f12c (diff)
Port cd7c7b28 "linux-gen: packet: support SCTP packet insertion"
Signed-off-by: Matias Elo <matias.elo@nokia.com>
-rw-r--r--platform/linux-dpdk/include/odp_packet_internal.h1
-rw-r--r--platform/linux-dpdk/odp_packet.c51
2 files changed, 52 insertions, 0 deletions
diff --git a/platform/linux-dpdk/include/odp_packet_internal.h b/platform/linux-dpdk/include/odp_packet_internal.h
index 213e292f9..e9e867b6c 100644
--- a/platform/linux-dpdk/include/odp_packet_internal.h
+++ b/platform/linux-dpdk/include/odp_packet_internal.h
@@ -265,6 +265,7 @@ int _odp_packet_cmp_data(odp_packet_t pkt, uint32_t offset,
int _odp_packet_ipv4_chksum_insert(odp_packet_t pkt);
int _odp_packet_tcp_chksum_insert(odp_packet_t pkt);
int _odp_packet_udp_chksum_insert(odp_packet_t pkt);
+int _odp_packet_sctp_chksum_insert(odp_packet_t pkt);
/* We can't enforce tailroom reservation for received packets */
ODP_STATIC_ASSERT(CONFIG_PACKET_TAILROOM == 0,
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c
index 43860f36b..be01c4e8d 100644
--- a/platform/linux-dpdk/odp_packet.c
+++ b/platform/linux-dpdk/odp_packet.c
@@ -1245,6 +1245,33 @@ static uint16_t packet_sum_ones_comp16(odp_packet_hdr_t *pkt_hdr,
return sum;
}
+static uint32_t packet_sum_crc32c(odp_packet_hdr_t *pkt_hdr,
+ uint32_t offset,
+ uint32_t len,
+ uint32_t init_val)
+{
+ uint32_t sum = init_val;
+
+ if (offset + len > odp_packet_len(packet_handle(pkt_hdr)))
+ return sum;
+
+ while (len > 0) {
+ uint32_t seglen = 0; /* GCC */
+
+ void *mapaddr = odp_packet_offset(packet_handle(pkt_hdr),
+ offset, &seglen, NULL);
+
+ if (seglen > len)
+ seglen = len;
+
+ sum = odp_hash_crc32c(mapaddr, seglen, sum);
+ len -= seglen;
+ offset += seglen;
+ }
+
+ return sum;
+}
+
/** Parser helper function for Ethernet packets */
static inline uint16_t parse_eth(packet_parser_t *prs, const uint8_t **parseptr,
uint32_t *offset, uint32_t frame_len)
@@ -1844,6 +1871,30 @@ int _odp_packet_udp_chksum_insert(odp_packet_t pkt)
return _odp_packet_tcp_udp_chksum_insert(pkt, _ODP_IPPROTO_UDP);
}
+/**
+ * Calculate and fill in SCTP checksum
+ *
+ * @param pkt ODP packet
+ *
+ * @retval 0 on success
+ * @retval <0 on failure
+ */
+int _odp_packet_sctp_chksum_insert(odp_packet_t pkt)
+{
+ odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
+ uint32_t sum;
+ uint32_t len = odp_packet_len(pkt);
+
+ if (pkt_hdr->p.l4_offset == ODP_PACKET_OFFSET_INVALID)
+ return -1;
+
+ sum = 0;
+ odp_packet_copy_from_mem(pkt, pkt_hdr->p.l4_offset + 8, 4, &sum);
+ sum = ~packet_sum_crc32c(pkt_hdr, pkt_hdr->p.l4_offset,
+ len - pkt_hdr->p.l4_offset, ~0);
+ return odp_packet_copy_from_mem(pkt, pkt_hdr->p.l4_offset + 8, 4, &sum);
+}
+
static int packet_l4_chksum(odp_packet_hdr_t *pkt_hdr,
odp_proto_chksums_t chksums,
uint32_t l4_part_sum)