From patchwork Wed Nov 9 15:04:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?N=C3=A9lio_Laranjeiro?= X-Patchwork-Id: 16983 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id AB0192BC7; Wed, 9 Nov 2016 16:04:24 +0100 (CET) Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by dpdk.org (Postfix) with ESMTP id 343281E34 for ; Wed, 9 Nov 2016 16:04:23 +0100 (CET) Received: by mail-wm0-f49.google.com with SMTP id f82so247771916wmf.1 for ; Wed, 09 Nov 2016 07:04:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=qd5+WLJVg48XA3HMlgCA0wAP1RPtzyvhDd6lxluwgeY=; b=L3ZLRZw5qlsZG7pGX0ygWTzmcMAF08jstu8QdOEgxLmQEGO6im/BfilFuw3baHKVul 6OaEPANAnlmwfzGbjs2thjclOiCJJhYOiOil5sym62l5qhwB3kR9is+J58JocUbubbKj 1OixsYSCoZjCo7opp0zQBx2MGxiuYX2/5+Bqfe4kobzDT0lanFnSthjWt6EcFbG3Iqmj cRqZDFBpjsriiC3Na2o+F8Y/jpIH7qdq5K2kMk18U3UvtUdxd4SWCjveZELRjwDloZhJ RLYVQVaWFkcddtDI73T/0FSygo9zaCwJ9KzYcaLim4PcNOE9mbpO+9YpAEeWr0IFDuYm E84A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=qd5+WLJVg48XA3HMlgCA0wAP1RPtzyvhDd6lxluwgeY=; b=hI7ooD1FacmN0WsqYSOKcnh3aax3I3HCnACpg8TIzNU/qqAE4N3YT2f/WiHhlO0YJS 8S6ukQaAlcsq8sYvOerzveufnnWwwWeicRLRaAN6dhxpKwOAlV3u5pO9QWB1sk0Ef+pr CtZwKIbpoVr3/5bTqa0t3OjVDVK4IDzRs2zC0GQbCfiDEV0gHerbD75YG8TpSBXNYUi/ L64rc/FriQ7FYc27jTCSBz64+YSXZoIeHaSzLdz/y2HOcqhDP720UZ5oVIdcyYibLksk W6rKjdDiQX9hqx2wvYzqvSKQdlByE3qfzjKCLZynzPmc2uwWVgW3kblbPQaX3Hrwv5kd b6gw== X-Gm-Message-State: ABUngvcCiQuXyHUpfjks825u0xmRLAOyiYATlNU43EFWaHhjVWWlskhqyJglXQm61LMWr4Tu X-Received: by 10.194.74.102 with SMTP id s6mr16510wjv.9.1478703862397; Wed, 09 Nov 2016 07:04:22 -0800 (PST) Received: from ping.vm.6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by smtp.gmail.com with ESMTPSA id m5sm689501wmd.17.2016.11.09.07.04.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 09 Nov 2016 07:04:21 -0800 (PST) From: Nelio Laranjeiro To: dev@dpdk.org, Olivier Matz Cc: wenzhuo.lu@intel.com, Adrien Mazarguil Date: Wed, 9 Nov 2016 16:04:01 +0100 Message-Id: X-Mailer: git-send-email 2.1.4 Subject: [dpdk-dev] [PATCH] net: introduce big and little endian types X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- .../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 #include +#include #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 +#include #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 +#include /** * 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 +#include #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 +#include #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