Signed-off-by: Bill Fischofer <[email protected]>
---
 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

diff --git a/helper/include/odph_ip.h b/helper/include/odph_ip.h
index 2c83c0f..2dab164 100644
--- a/helper/include/odph_ip.h
+++ b/helper/include/odph_ip.h
@@ -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
diff --git a/helper/include/odph_packet.h b/helper/include/odph_packet.h
deleted file mode 100644
index 3d53593..0000000
--- a/helper/include/odph_packet.h
+++ /dev/null
@@ -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
diff --git a/helper/include/odph_tcp.h b/helper/include/odph_tcp.h
new file mode 100644
index 0000000..4c5912b
--- /dev/null
+++ b/helper/include/odph_tcp.h
@@ -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
diff --git a/helper/include/odph_udp.h b/helper/include/odph_udp.h
index b2eaf03..bd0fb68 100644
--- a/helper/include/odph_udp.h
+++ b/helper/include/odph_udp.h
@@ -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 */
-- 
1.8.3.2


_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to