@@ -79,10 +79,12 @@ static inline int odph_ipv4_csum_valid(odp_packet_t pkt)
odph_ipv4hdr_t ip;
uint16be_t chksum;
- if (!odp_packet_l3_offset(pkt))
+ if (!odp_packet_inflag_ipv4(pkt))
return 0;
- memcpy(&ip, odp_packet_l3(pkt), sizeof(odph_ipv4hdr_t));
+ odp_packet_copy_to_memory(&ip, pkt, odp_packet_l3_offset(pkt),
+ sizeof(odph_ipv4hdr_t));
+
w = (uint16_t *)(void *)&ip;
chksum = ip.chksum;
ip.chksum = 0x0;
@@ -105,12 +107,13 @@ static inline uint16sum_t odph_ipv4_csum_update(odp_packet_t pkt)
{
uint16_t *w;
odph_ipv4hdr_t *ip;
+ size_t seglen;
int nleft = sizeof(odph_ipv4hdr_t);
- if (!odp_packet_l3_offset(pkt))
+ if (!odp_packet_inflag_ipv4(pkt))
return 0;
- ip = (odph_ipv4hdr_t *)odp_packet_l3(pkt);
+ ip = (odph_ipv4hdr_t *)odp_packet_l3_map(pkt, &seglen);
w = (uint16_t *)(void *)ip;
ip->chksum = odp_chksum(w, nleft);
return ip->chksum;
@@ -126,7 +129,14 @@ static inline uint16sum_t odph_ipv4_csum_update(odp_packet_t pkt)
* IPv6 header
*/
typedef struct ODP_PACKED {
- uint32be_t ver_tc_flow; /**< Version / Traffic class / Flow label */
+ union {
+ uint32be_t ver_tc_flow; /**< Version / TC / Flow label */
+ struct {
+ uint32be_t ver:4; /**< Version (must be 6) */
+ uint32be_t tc:8; /**< Traffic class */
+ uint32be_t flow:20; /**< Flow label */
+ };
+ };
uint16be_t payload_len; /**< Payload length */
uint8_t next_hdr; /**< Next header */
uint8_t hop_limit; /**< Hop limit */
@@ -137,16 +147,29 @@ typedef struct ODP_PACKED {
/** @internal Compile time assert */
ODP_STATIC_ASSERT(sizeof(odph_ipv6hdr_t) == ODPH_IPV6HDR_LEN, "ODPH_IPV6HDR_T__SIZE_ERROR");
+/**
+ * IPv6 Header extensions
+ */
+typedef struct ODP_PACKED {
+ uint8_t next_hdr; /**< Protocol of next header */
+ uint8_t ext_len; /**< Length of this extention in 8 byte units,
+ not counting first 8 bytes, so 0 = 8 bytes
+ 1 = 16 bytes, etc. */
+ uint8_t filler[6]; /**< Fill out first 8 byte segment */
+} odph_ipv6hdr_ext_t;
+
/** @name
* IP protocol values (IPv4:'proto' or IPv6:'next_hdr')
* @{*/
-#define ODPH_IPPROTO_ICMP 0x01 /**< Internet Control Message Protocol (1) */
-#define ODPH_IPPROTO_TCP 0x06 /**< Transmission Control Protocol (6) */
-#define ODPH_IPPROTO_UDP 0x11 /**< User Datagram Protocol (17) */
-#define ODPH_IPPROTO_SCTP 0x84 /**< Stream Control Transmission Protocol (132) */
-#define ODPH_IPPROTO_FRAG 0x2C /**< Fragment (44) */
-#define ODPH_IPPROTO_AH 0x33 /**< Authentication Header (51) */
-#define ODPH_IPPROTO_ESP 0x32 /**< Encapsulating Security Payload (50) */
+#define ODPH_IPPROTO_HOPOPTS 0x00 /**< IPv6 hop-by-hop options */
+#define ODPH_IPPROTO_ICMP 0x01 /**< Internet Control Message Protocol (1) */
+#define ODPH_IPPROTO_TCP 0x06 /**< Transmission Control Protocol (6) */
+#define ODPH_IPPROTO_UDP 0x11 /**< User Datagram Protocol (17) */
+#define ODPH_IPPROTO_ROUTE 0x2B /**< IPv6 Routing header (43) */
+#define ODPH_IPPROTO_FRAG 0x2C /**< IPv6 Fragment (44) */
+#define ODPH_IPPROTO_AH 0x33 /**< Authentication Header (51) */
+#define ODPH_IPPROTO_ESP 0x32 /**< Encapsulating Security Payload (50) */
+#define ODPH_IPPROTO_INVALID 0xFF /**< Reserved invalid by IANA */
/**@}*/
#ifdef __cplusplus
deleted file mode 100644
@@ -1,97 +0,0 @@
-/* Copyright (c) 2014, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-
-/**
- * @file
- *
- * Optional ODP packet helper functions
- */
-
-#ifndef ODPH_PACKET_HELPER_H_
-#define ODPH_PACKET_HELPER_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <odp.h>
-
-/**
- * Helper: Tests if packet is valid
- *
- * Allows for more thorough checking than "if (pkt == ODP_PACKET_INVALID)"
- *
- * @param pkt Packet handle
- *
- * @return 1 if valid, otherwise 0
- */
-static inline int odph_packet_is_valid(odp_packet_t pkt)
-{
- odp_buffer_t buf = odp_packet_to_buffer(pkt);
-
- return odp_buffer_is_valid(buf);
-}
-
-/**
- * Helper: Allocate and initialize a packet buffer from a packet pool
- *
- * @param pool_id Pool handle
- *
- * @note The pool must have been created with 'buf_type=ODP_BUFFER_TYPE_PACKET'
- *
- * @return Packet handle or ODP_PACKET_INVALID
- */
-static inline odp_packet_t odph_packet_alloc(odp_buffer_pool_t pool_id)
-{
- odp_packet_t pkt;
- odp_buffer_t buf;
-
- buf = odp_buffer_alloc(pool_id);
- if (odp_unlikely(!odp_buffer_is_valid(buf)))
- return ODP_PACKET_INVALID;
-
- pkt = odp_packet_from_buffer(buf);
- odp_packet_init(pkt);
-
- return pkt;
-}
-
-/**
- * Helper: Free a packet buffer back into the packet pool
- *
- * @param pkt Packet handle
- */
-static inline void odph_packet_free(odp_packet_t pkt)
-{
- odp_buffer_t buf = odp_packet_to_buffer(pkt);
-
- odp_buffer_free(buf);
-}
-
-/**
- * Helper: Packet buffer maximum data size
- *
- * @note odp_packet_buf_size(pkt) != odp_packet_get_len(pkt), the former returns
- * the max length of the buffer, the latter the size of a received packet.
- *
- * @param pkt Packet handle
- *
- * @return Packet buffer maximum data size
- */
-static inline size_t odph_packet_buf_size(odp_packet_t pkt)
-{
- odp_buffer_t buf = odp_packet_to_buffer(pkt);
-
- return odp_buffer_size(buf);
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
new file mode 100644
@@ -0,0 +1,61 @@
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+
+/**
+ * @file
+ *
+ * ODP TCP header
+ */
+
+#ifndef ODPH_TCP_H_
+#define ODPH_TCP_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp_align.h>
+#include <odp_debug.h>
+#include <odp_byteorder.h>
+
+/** UDP header length */
+#define ODPH_TCPHDR_LEN 8
+
+/** TCP header */
+typedef struct ODP_PACKED {
+ uint16be_t src_port; /**< Source port */
+ uint16be_t dst_port; /**< Destinatino port */
+ uint32be_t seq_no; /**< Sequence number */
+ uint32be_t ack_no; /**< Acknowledgment number */
+ union {
+ uint32be_t flags_and_window;
+ struct {
+ uint32be_t rsvd1:8;
+ uint32be_t flags:8; /**< TCP flags as a byte */
+ uint32be_t rsvd2:16;
+ };
+ struct {
+ uint32be_t hl:4; /**< Hdr len, in words */
+ uint32be_t rsvd3:6; /**< Reserved */
+ uint32be_t urg:1; /**< ACK */
+ uint32be_t ack:1;
+ uint32be_t psh:1;
+ uint32be_t rst:1;
+ uint32be_t syn:1;
+ uint32be_t fin:1;
+ uint32be_t window:16; /**< Window size */
+ };
+ };
+ uint16be_t cksm; /**< Checksum */
+ uint16be_t urgptr; /**< Urgent pointer */
+} odph_tcphdr_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
@@ -57,15 +57,14 @@ static inline uint16_t odph_ipv4_udp_chksum(odp_packet_t pkt)
odph_udphdr_t *udph;
odph_ipv4hdr_t *iph;
uint16_t udplen;
+ size_t l3_seglen, l4_seglen;
- if (!odp_packet_l3_offset(pkt))
+ if (odp_packet_l3_protocol(pkt) != 0x800 ||
+ odp_packet_l4_protocol(pkt) != ODPH_IPPROTO_UDP)
return 0;
- if (!odp_packet_l4_offset(pkt))
- return 0;
-
- iph = (odph_ipv4hdr_t *)odp_packet_l3(pkt);
- udph = (odph_udphdr_t *)odp_packet_l4(pkt);
+ iph = (odph_ipv4hdr_t *)odp_packet_l3_map(pkt, &l3_seglen);
+ udph = (odph_udphdr_t *)odp_packet_l4_map(pkt, &l4_seglen);
udplen = odp_be_to_cpu_16(udph->length);
/* the source ip */
Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org> --- helper/include/odph_ip.h | 47 +++++++++++++++------ helper/include/odph_packet.h | 97 -------------------------------------------- helper/include/odph_tcp.h | 61 ++++++++++++++++++++++++++++ helper/include/odph_udp.h | 11 +++-- 4 files changed, 101 insertions(+), 115 deletions(-) delete mode 100644 helper/include/odph_packet.h create mode 100644 helper/include/odph_tcp.h