This commit introduces new rte_{le,be}{16,32,64}_t types and updates
rte_{le,be,cpu}_to_{le,be,cpu}_*() and network header structures
accordingly.

Specific big/little endian types avoid uncertainty and conversion mistakes.

No ABI change since these are simply typedefs to the original types.

Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com>
---
 .../common/include/generic/rte_byteorder.h         | 31 +++++++++++-------
 lib/librte_net/rte_arp.h                           | 15 +++++----
 lib/librte_net/rte_ether.h                         | 10 +++---
 lib/librte_net/rte_gre.h                           | 30 ++++++++---------
 lib/librte_net/rte_icmp.h                          | 11 ++++---
 lib/librte_net/rte_ip.h                            | 38 +++++++++++-----------
 lib/librte_net/rte_net.c                           | 10 +++---
 lib/librte_net/rte_sctp.h                          |  9 ++---
 lib/librte_net/rte_tcp.h                           | 19 ++++++-----
 lib/librte_net/rte_udp.h                           |  9 ++---
 10 files changed, 97 insertions(+), 85 deletions(-)

diff --git a/lib/librte_eal/common/include/generic/rte_byteorder.h 
b/lib/librte_eal/common/include/generic/rte_byteorder.h
index e00bccb..059c2a5 100644
--- a/lib/librte_eal/common/include/generic/rte_byteorder.h
+++ b/lib/librte_eal/common/include/generic/rte_byteorder.h
@@ -75,6 +75,13 @@
 #define RTE_BYTE_ORDER RTE_LITTLE_ENDIAN
 #endif

+typedef uint16_t rte_be16_t;
+typedef uint32_t rte_be32_t;
+typedef uint64_t rte_be64_t;
+typedef uint16_t rte_le16_t;
+typedef uint32_t rte_le32_t;
+typedef uint64_t rte_le64_t;
+
 /*
  * An internal function to swap bytes in a 16-bit value.
  *
@@ -143,65 +150,65 @@ static uint64_t rte_bswap64(uint64_t x);
 /**
  * Convert a 16-bit value from CPU order to little endian.
  */
-static uint16_t rte_cpu_to_le_16(uint16_t x);
+static rte_le16_t rte_cpu_to_le_16(uint16_t x);

 /**
  * Convert a 32-bit value from CPU order to little endian.
  */
-static uint32_t rte_cpu_to_le_32(uint32_t x);
+static rte_le32_t rte_cpu_to_le_32(uint32_t x);

 /**
  * Convert a 64-bit value from CPU order to little endian.
  */
-static uint64_t rte_cpu_to_le_64(uint64_t x);
+static rte_le64_t rte_cpu_to_le_64(uint64_t x);


 /**
  * Convert a 16-bit value from CPU order to big endian.
  */
-static uint16_t rte_cpu_to_be_16(uint16_t x);
+static rte_be16_t rte_cpu_to_be_16(uint16_t x);

 /**
  * Convert a 32-bit value from CPU order to big endian.
  */
-static uint32_t rte_cpu_to_be_32(uint32_t x);
+static rte_be32_t rte_cpu_to_be_32(uint32_t x);

 /**
  * Convert a 64-bit value from CPU order to big endian.
  */
-static uint64_t rte_cpu_to_be_64(uint64_t x);
+static rte_be64_t rte_cpu_to_be_64(uint64_t x);


 /**
  * Convert a 16-bit value from little endian to CPU order.
  */
-static uint16_t rte_le_to_cpu_16(uint16_t x);
+static uint16_t rte_le_to_cpu_16(rte_le16_t x);

 /**
  * Convert a 32-bit value from little endian to CPU order.
  */
-static uint32_t rte_le_to_cpu_32(uint32_t x);
+static uint32_t rte_le_to_cpu_32(rte_le32_t x);

 /**
  * Convert a 64-bit value from little endian to CPU order.
  */
-static uint64_t rte_le_to_cpu_64(uint64_t x);
+static uint64_t rte_le_to_cpu_64(rte_le64_t x);


 /**
  * Convert a 16-bit value from big endian to CPU order.
  */
-static uint16_t rte_be_to_cpu_16(uint16_t x);
+static uint16_t rte_be_to_cpu_16(rte_be16_t x);

 /**
  * Convert a 32-bit value from big endian to CPU order.
  */
-static uint32_t rte_be_to_cpu_32(uint32_t x);
+static uint32_t rte_be_to_cpu_32(rte_be32_t x);

 /**
  * Convert a 64-bit value from big endian to CPU order.
  */
-static uint64_t rte_be_to_cpu_64(uint64_t x);
+static uint64_t rte_be_to_cpu_64(rte_be64_t x);

 #endif /* __DOXYGEN__ */

diff --git a/lib/librte_net/rte_arp.h b/lib/librte_net/rte_arp.h
index 1836418..95f123e 100644
--- a/lib/librte_net/rte_arp.h
+++ b/lib/librte_net/rte_arp.h
@@ -40,6 +40,7 @@

 #include <stdint.h>
 #include <rte_ether.h>
+#include <rte_byteorder.h>

 #ifdef __cplusplus
 extern "C" {
@@ -50,22 +51,22 @@ extern "C" {
  */
 struct arp_ipv4 {
        struct ether_addr arp_sha;  /**< sender hardware address */
-       uint32_t          arp_sip;  /**< sender IP address */
+       rte_be32_t        arp_sip;  /**< sender IP address */
        struct ether_addr arp_tha;  /**< target hardware address */
-       uint32_t          arp_tip;  /**< target IP address */
+       rte_be32_t        arp_tip;  /**< target IP address */
 } __attribute__((__packed__));

 /**
  * ARP header.
  */
 struct arp_hdr {
-       uint16_t arp_hrd;    /* format of hardware address */
+       rte_be16_t arp_hrd;  /* format of hardware address */
 #define ARP_HRD_ETHER     1  /* ARP Ethernet address format */

-       uint16_t arp_pro;    /* format of protocol address */
-       uint8_t  arp_hln;    /* length of hardware address */
-       uint8_t  arp_pln;    /* length of protocol address */
-       uint16_t arp_op;     /* ARP opcode (command) */
+       rte_be16_t arp_pro;  /* format of protocol address */
+       uint8_t    arp_hln;  /* length of hardware address */
+       uint8_t    arp_pln;  /* length of protocol address */
+       rte_be16_t arp_op;   /* ARP opcode (command) */
 #define        ARP_OP_REQUEST    1 /* request to resolve address */
 #define        ARP_OP_REPLY      2 /* response to previous request */
 #define        ARP_OP_REVREQUEST 3 /* request proto addr given hardware */
diff --git a/lib/librte_net/rte_ether.h b/lib/librte_net/rte_ether.h
index ff3d065..159e061 100644
--- a/lib/librte_net/rte_ether.h
+++ b/lib/librte_net/rte_ether.h
@@ -300,7 +300,7 @@ ether_format_addr(char *buf, uint16_t size,
 struct ether_hdr {
        struct ether_addr d_addr; /**< Destination address. */
        struct ether_addr s_addr; /**< Source address. */
-       uint16_t ether_type;      /**< Frame type. */
+       rte_be16_t ether_type;    /**< Frame type. */
 } __attribute__((__packed__));

 /**
@@ -309,8 +309,8 @@ struct ether_hdr {
  * of the encapsulated frame.
  */
 struct vlan_hdr {
-       uint16_t vlan_tci; /**< Priority (3) + CFI (1) + Identifier Code (12) */
-       uint16_t eth_proto;/**< Ethernet type of encapsulated frame. */
+       rte_be16_t vlan_tci; /**< Priority (3) + CFI (1) + Identifier Code (12) 
*/
+       rte_be16_t eth_proto;/**< Ethernet type of encapsulated frame. */
 } __attribute__((__packed__));

 /**
@@ -319,8 +319,8 @@ struct vlan_hdr {
  * Reserved fields (24 bits and 8 bits)
  */
 struct vxlan_hdr {
-       uint32_t vx_flags; /**< flag (8) + Reserved (24). */
-       uint32_t vx_vni;   /**< VNI (24) + Reserved (8). */
+       rte_be32_t vx_flags; /**< flag (8) + Reserved (24). */
+       rte_be32_t vx_vni;   /**< VNI (24) + Reserved (8). */
 } __attribute__((__packed__));

 /* Ethernet frame types */
diff --git a/lib/librte_net/rte_gre.h b/lib/librte_net/rte_gre.h
index 46568ff..b651af0 100644
--- a/lib/librte_net/rte_gre.h
+++ b/lib/librte_net/rte_gre.h
@@ -45,23 +45,23 @@ extern "C" {
  */
 struct gre_hdr {
 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
-       uint16_t res2:4; /**< Reserved */
-       uint16_t s:1;    /**< Sequence Number Present bit */
-       uint16_t k:1;    /**< Key Present bit */
-       uint16_t res1:1; /**< Reserved */
-       uint16_t c:1;    /**< Checksum Present bit */
-       uint16_t ver:3;  /**< Version Number */
-       uint16_t res3:5; /**< Reserved */
+       uint16_t res2:4;  /**< Reserved */
+       uint16_t s:1;     /**< Sequence Number Present bit */
+       uint16_t k:1;     /**< Key Present bit */
+       uint16_t res1:1;  /**< Reserved */
+       uint16_t c:1;     /**< Checksum Present bit */
+       uint16_t ver:3;   /**< Version Number */
+       uint16_t res3:5;  /**< Reserved */
 #elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN
-       uint16_t c:1;    /**< Checksum Present bit */
-       uint16_t res1:1; /**< Reserved */
-       uint16_t k:1;    /**< Key Present bit */
-       uint16_t s:1;    /**< Sequence Number Present bit */
-       uint16_t res2:4; /**< Reserved */
-       uint16_t res3:5; /**< Reserved */
-       uint16_t ver:3;  /**< Version Number */
+       uint16_t c:1;     /**< Checksum Present bit */
+       uint16_t res1:1;  /**< Reserved */
+       uint16_t k:1;     /**< Key Present bit */
+       uint16_t s:1;     /**< Sequence Number Present bit */
+       uint16_t res2:4;  /**< Reserved */
+       uint16_t res3:5;  /**< Reserved */
+       uint16_t ver:3;   /**< Version Number */
 #endif
-       uint16_t proto;  /**< Protocol Type */
+       rte_be16_t proto; /**< Protocol Type */
 } __attribute__((__packed__));

 #ifdef __cplusplus
diff --git a/lib/librte_net/rte_icmp.h b/lib/librte_net/rte_icmp.h
index 8b287f6..81bd907 100644
--- a/lib/librte_net/rte_icmp.h
+++ b/lib/librte_net/rte_icmp.h
@@ -74,6 +74,7 @@
  */

 #include <stdint.h>
+#include <rte_byteorder.h>

 #ifdef __cplusplus
 extern "C" {
@@ -83,11 +84,11 @@ extern "C" {
  * ICMP Header
  */
 struct icmp_hdr {
-       uint8_t  icmp_type;   /* ICMP packet type. */
-       uint8_t  icmp_code;   /* ICMP packet code. */
-       uint16_t icmp_cksum;  /* ICMP packet checksum. */
-       uint16_t icmp_ident;  /* ICMP packet identifier. */
-       uint16_t icmp_seq_nb; /* ICMP packet sequence number. */
+       uint8_t  icmp_type;     /* ICMP packet type. */
+       uint8_t  icmp_code;     /* ICMP packet code. */
+       rte_be16_t icmp_cksum;  /* ICMP packet checksum. */
+       rte_be16_t icmp_ident;  /* ICMP packet identifier. */
+       rte_be16_t icmp_seq_nb; /* ICMP packet sequence number. */
 } __attribute__((__packed__));

 /* ICMP packet types */
diff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h
index 4491b86..6f7da36 100644
--- a/lib/librte_net/rte_ip.h
+++ b/lib/librte_net/rte_ip.h
@@ -93,14 +93,14 @@ extern "C" {
 struct ipv4_hdr {
        uint8_t  version_ihl;           /**< version and header length */
        uint8_t  type_of_service;       /**< type of service */
-       uint16_t total_length;          /**< length of packet */
-       uint16_t packet_id;             /**< packet ID */
-       uint16_t fragment_offset;       /**< fragmentation offset */
+       rte_be16_t total_length;        /**< length of packet */
+       rte_be16_t packet_id;           /**< packet ID */
+       rte_be16_t fragment_offset;     /**< fragmentation offset */
        uint8_t  time_to_live;          /**< time to live */
        uint8_t  next_proto_id;         /**< protocol ID */
-       uint16_t hdr_checksum;          /**< header checksum */
-       uint32_t src_addr;              /**< source address */
-       uint32_t dst_addr;              /**< destination address */
+       rte_be16_t hdr_checksum;        /**< header checksum */
+       rte_be32_t src_addr;            /**< source address */
+       rte_be32_t dst_addr;            /**< destination address */
 } __attribute__((__packed__));

 /** Create IPv4 address */
@@ -340,11 +340,11 @@ static inline uint16_t
 rte_ipv4_phdr_cksum(const struct ipv4_hdr *ipv4_hdr, uint64_t ol_flags)
 {
        struct ipv4_psd_header {
-               uint32_t src_addr; /* IP address of source host. */
-               uint32_t dst_addr; /* IP address of destination host. */
-               uint8_t  zero;     /* zero. */
-               uint8_t  proto;    /* L4 protocol type. */
-               uint16_t len;      /* L4 length. */
+               rte_be32_t src_addr; /* IP address of source host. */
+               rte_be32_t dst_addr; /* IP address of destination host. */
+               uint8_t    zero;     /* zero. */
+               uint8_t    proto;    /* L4 protocol type. */
+               rte_be16_t len;      /* L4 length. */
        } psd_hdr;

        psd_hdr.src_addr = ipv4_hdr->src_addr;
@@ -398,12 +398,12 @@ rte_ipv4_udptcp_cksum(const struct ipv4_hdr *ipv4_hdr, 
const void *l4_hdr)
  * IPv6 Header
  */
 struct ipv6_hdr {
-       uint32_t vtc_flow;     /**< IP version, traffic class & flow label. */
-       uint16_t payload_len;  /**< IP packet length - includes 
sizeof(ip_header). */
-       uint8_t  proto;        /**< Protocol, next header. */
-       uint8_t  hop_limits;   /**< Hop limits. */
-       uint8_t  src_addr[16]; /**< IP address of source host. */
-       uint8_t  dst_addr[16]; /**< IP address of destination host(s). */
+       rte_be32_t vtc_flow;     /**< IP version, traffic class & flow label. */
+       rte_be16_t payload_len;  /**< IP packet length - includes 
sizeof(ip_header). */
+       uint8_t    proto;        /**< Protocol, next header. */
+       uint8_t    hop_limits;   /**< Hop limits. */
+       uint8_t    src_addr[16]; /**< IP address of source host. */
+       uint8_t    dst_addr[16]; /**< IP address of destination host(s). */
 } __attribute__((__packed__));

 /**
@@ -427,8 +427,8 @@ rte_ipv6_phdr_cksum(const struct ipv6_hdr *ipv6_hdr, 
uint64_t ol_flags)
 {
        uint32_t sum;
        struct {
-               uint32_t len;   /* L4 length. */
-               uint32_t proto; /* L4 protocol - top 3 bytes must be zero */
+               rte_be32_t len;   /* L4 length. */
+               rte_be32_t proto; /* L4 protocol - top 3 bytes must be zero */
        } psd_hdr;

        psd_hdr.proto = (ipv6_hdr->proto << 24);
diff --git a/lib/librte_net/rte_net.c b/lib/librte_net/rte_net.c
index a8c7aff..9014ca5 100644
--- a/lib/librte_net/rte_net.c
+++ b/lib/librte_net/rte_net.c
@@ -153,8 +153,8 @@ ptype_inner_l4(uint8_t proto)

 /* get the tunnel packet type if any, update proto and off. */
 static uint32_t
-ptype_tunnel(uint16_t *proto, const struct rte_mbuf *m,
-       uint32_t *off)
+ptype_tunnel(rte_be16_t *proto, const struct rte_mbuf *m,
+            uint32_t *off)
 {
        switch (*proto) {
        case IPPROTO_GRE: {
@@ -208,8 +208,8 @@ ip4_hlen(const struct ipv4_hdr *hdr)

 /* parse ipv6 extended headers, update offset and return next proto */
 static uint16_t
-skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
-       int *frag)
+skip_ip6_ext(rte_be16_t proto, const struct rte_mbuf *m, uint32_t *off,
+            int *frag)
 {
        struct ext_hdr {
                uint8_t next_hdr;
@@ -261,7 +261,7 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m,
        struct ether_hdr eh_copy;
        uint32_t pkt_type = RTE_PTYPE_L2_ETHER;
        uint32_t off = 0;
-       uint16_t proto;
+       rte_be16_t proto;

        if (hdr_lens == NULL)
                hdr_lens = &local_hdr_lens;
diff --git a/lib/librte_net/rte_sctp.h b/lib/librte_net/rte_sctp.h
index 688e126..8c646c7 100644
--- a/lib/librte_net/rte_sctp.h
+++ b/lib/librte_net/rte_sctp.h
@@ -81,15 +81,16 @@ extern "C" {
 #endif

 #include <stdint.h>
+#include <rte_byteorder.h>

 /**
  * SCTP Header
  */
 struct sctp_hdr {
-       uint16_t src_port; /**< Source port. */
-       uint16_t dst_port; /**< Destin port. */
-       uint32_t tag;      /**< Validation tag. */
-       uint32_t cksum;    /**< Checksum. */
+       rte_be16_t src_port; /**< Source port. */
+       rte_be16_t dst_port; /**< Destin port. */
+       rte_be32_t tag;      /**< Validation tag. */
+       rte_le32_t cksum;    /**< Checksum. */
 } __attribute__((__packed__));

 #ifdef __cplusplus
diff --git a/lib/librte_net/rte_tcp.h b/lib/librte_net/rte_tcp.h
index 28b61e6..545d4ab 100644
--- a/lib/librte_net/rte_tcp.h
+++ b/lib/librte_net/rte_tcp.h
@@ -77,6 +77,7 @@
  */

 #include <stdint.h>
+#include <rte_byteorder.h>

 #ifdef __cplusplus
 extern "C" {
@@ -86,15 +87,15 @@ extern "C" {
  * TCP Header
  */
 struct tcp_hdr {
-       uint16_t src_port;  /**< TCP source port. */
-       uint16_t dst_port;  /**< TCP destination port. */
-       uint32_t sent_seq;  /**< TX data sequence number. */
-       uint32_t recv_ack;  /**< RX data acknowledgement sequence number. */
-       uint8_t  data_off;  /**< Data offset. */
-       uint8_t  tcp_flags; /**< TCP flags */
-       uint16_t rx_win;    /**< RX flow control window. */
-       uint16_t cksum;     /**< TCP checksum. */
-       uint16_t tcp_urp;   /**< TCP urgent pointer, if any. */
+       rte_be16_t src_port;  /**< TCP source port. */
+       rte_be16_t dst_port;  /**< TCP destination port. */
+       rte_be32_t sent_seq;  /**< TX data sequence number. */
+       rte_be32_t recv_ack;  /**< RX data acknowledgement sequence number. */
+       uint8_t    data_off;  /**< Data offset. */
+       uint8_t    tcp_flags; /**< TCP flags */
+       rte_be16_t rx_win;    /**< RX flow control window. */
+       rte_be16_t cksum;     /**< TCP checksum. */
+       rte_be16_t tcp_urp;   /**< TCP urgent pointer, if any. */
 } __attribute__((__packed__));

 #ifdef __cplusplus
diff --git a/lib/librte_net/rte_udp.h b/lib/librte_net/rte_udp.h
index bc5be4a..89fdded 100644
--- a/lib/librte_net/rte_udp.h
+++ b/lib/librte_net/rte_udp.h
@@ -77,6 +77,7 @@
  */

 #include <stdint.h>
+#include <rte_byteorder.h>

 #ifdef __cplusplus
 extern "C" {
@@ -86,10 +87,10 @@ extern "C" {
  * UDP Header
  */
 struct udp_hdr {
-       uint16_t src_port;    /**< UDP source port. */
-       uint16_t dst_port;    /**< UDP destination port. */
-       uint16_t dgram_len;   /**< UDP datagram length */
-       uint16_t dgram_cksum; /**< UDP datagram checksum */
+       rte_be16_t src_port;    /**< UDP source port. */
+       rte_be16_t dst_port;    /**< UDP destination port. */
+       rte_be16_t dgram_len;   /**< UDP datagram length */
+       rte_be16_t dgram_cksum; /**< UDP datagram checksum */
 } __attribute__((__packed__));

 #ifdef __cplusplus
-- 
2.1.4

Reply via email to