From 8a2e408a3fc20f1055a8ca796a4d32ebc9fb9aa0 Mon Sep 17 00:00:00 2001 From: Jordan Augé Date: Mon, 21 Jan 2019 13:25:59 +0100 Subject: HICN-4 - Fix Windows compilation issue with named struct initializers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I9c9e8780ec1132d3d74b6202b9b142ed64b4e13f Signed-off-by: Jordan Augé --- lib/src/base.h | 33 ++- lib/src/common.h | 19 ++ lib/src/compat.c | 45 +--- lib/src/mapme.h | 11 +- lib/src/ops.h | 643 ++++++++++++++++++++++++++++--------------------------- 5 files changed, 385 insertions(+), 366 deletions(-) diff --git a/lib/src/base.h b/lib/src/base.h index c1bd23aeb..2c082af89 100755 --- a/lib/src/base.h +++ b/lib/src/base.h @@ -64,6 +64,11 @@ typedef union u8 l3; /**< Third layer */ u8 l2; /**< Second layer */ u8 l1; /**< First layer */ +#elif _WIN32 /* Windows is assumed little-endian */ + u8 l1; + u8 l2; + u8 l3; + u8 l4; #else #error "Unsupported endianness" #endif @@ -73,11 +78,31 @@ typedef union } hicn_type_t; /* Common protocol layers */ -#define HICN_TYPE_IPV4_TCP (hicn_type_t) {{ .l4 = IPPROTO_NONE, .l3 = IPPROTO_NONE, .l2 = IPPROTO_TCP, .l1 = IPPROTO_IP }} -#define HICN_TYPE_IPV4_ICMP (hicn_type_t) {{ .l4 = IPPROTO_NONE, .l3 = IPPROTO_NONE, .l2 = IPPROTO_ICMP, .l1 = IPPROTO_IP }} -#define HICN_TYPE_IPV6_TCP (hicn_type_t) {{ .l4 = IPPROTO_NONE, .l3 = IPPROTO_NONE, .l2 = IPPROTO_TCP, .l1 = IPPROTO_IPV6 }} -#define HICN_TYPE_IPV6_ICMP (hicn_type_t) {{ .l4 = IPPROTO_NONE, .l3 = IPPROTO_NONE, .l2 = IPPROTO_ICMPV6, .l1 = IPPROTO_IPV6 }} +/* Common protocol layers */ +#ifndef _WIN32 +#define HICN_TYPE(x,y,z,t) (hicn_type_t) {{ .l1 = x, .l2 = y, .l3 = z, .l4 = t }} +#else +inline hicn_type_t +HICN_TYPE(int x, int y, int z, int t) +{ + hicn_type_t type; + type.l1 = x; + type.l2 = y; + type.l3 = z; + type.l4 = t; + return type; +} +#endif +#define HICN_TYPE_IPV4_TCP HICN_TYPE(IPPROTO_IP, IPPROTO_TCP, IPPROTO_NONE, IPPROTO_NONE); +#define HICN_TYPE_IPV4_ICMP HICN_TYPE(IPPROTO_IP, IPPROTO_ICMP, IPPROTO_NONE, IPPROTO_NONE); +#define HICN_TYPE_IPV6_TCP HICN_TYPE(IPPROTO_IPV6, IPPROTO_TCP, IPPROTO_NONE, IPPROTO_NONE); +#define HICN_TYPE_IPV6_ICMP HICN_TYPE(IPPROTO_IPV6, IPPROTO_ICMPV6, IPPROTO_NONE, IPPROTO_NONE); +#define HICN_TYPE_IPV4_TCP_AH HICN_TYPE(IPPROTO_IP, IPPROTO_TCP, IPPROTO_NONE, IPPROTO_NONE); +#define HICN_TYPE_IPV4_ICMP_AH HICN_TYPE(IPPROTO_IP, IPPROTO_ICMP, IPPROTO_NONE, IPPROTO_NONE); +#define HICN_TYPE_IPV6_TCP_AH HICN_TYPE(IPPROTO_IPV6, IPPROTO_TCP, IPPROTO_AH, IPPROTO_NONE); +#define HICN_TYPE_IPV6_ICMP_AH HICN_TYPE(IPPROTO_IPV6, IPPROTO_ICMPV6, IPPROTO_AH, IPPROTO_NONE); +#define HICN_TYPE_NONE HICN_TYPE(IPPROTO_NONE, IPPROTO_NONE, IPPROTO_NONE, IPPROTO_NONE); /** * @brief hICN Payload type diff --git a/lib/src/common.h b/lib/src/common.h index 9ddbdeb09..dd488d43b 100755 --- a/lib/src/common.h +++ b/lib/src/common.h @@ -62,6 +62,25 @@ typedef uint8_t u8; #endif /* ! HICN_VPP_PLUGIN */ +/* + * Windows compilers do not support named initilizers when .h files are included + * inside C++ files. For readability, we either use the following macro, or + * duplicate some code, with the intent of preserving those safeguards for + * non-Windows platforms. + */ +#ifndef _WIN32 +#define ATTR_INIT(key, value) .key = value +#else +#define ATTR_INIT(key, value) value +#endif + +/* Endianness detection for Windows platforms */ +#ifdef _WIN32 +#define __ORDER_LITTLE_ENDIAN__ 0x41424344UL +#define __ORDER_BIG_ENDIAN__ 0x44434241UL +#define __BYTE_ORDER__ ('ABCD') +#endif + /* * IP address types */ diff --git a/lib/src/compat.c b/lib/src/compat.c index 7d9eef025..8b558a56e 100755 --- a/lib/src/compat.c +++ b/lib/src/compat.c @@ -91,52 +91,25 @@ hicn_format_to_type (hicn_format_t format) switch (format) { case HF_INET_TCP: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_NONE,.l2 = IPPROTO_TCP,.l1 = - IPPROTO_IP}; + return HICN_TYPE_IPV4_TCP; case HF_INET6_TCP: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_NONE,.l2 = IPPROTO_TCP,.l1 = - IPPROTO_IPV6}; + return HICN_TYPE_IPV6_TCP; case HF_INET_ICMP: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_NONE,.l2 = IPPROTO_ICMP,.l1 = - IPPROTO_IP}; + return HICN_TYPE_IPV4_ICMP; case HF_INET6_ICMP: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_NONE,.l2 = IPPROTO_ICMPV6,.l1 = - IPPROTO_IPV6}; + return HICN_TYPE_IPV6_ICMP; case HF_INET_TCP_AH: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_AH,.l2 = IPPROTO_TCP,.l1 = IPPROTO_IP}; + return HICN_TYPE_IPV4_TCP_AH; case HF_INET6_TCP_AH: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_AH,.l2 = IPPROTO_TCP,.l1 = - IPPROTO_IPV6}; + return HICN_TYPE_IPV6_TCP_AH; case HF_INET_ICMP_AH: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_AH,.l2 = IPPROTO_ICMP,.l1 = - IPPROTO_IP}; + return HICN_TYPE_IPV4_ICMP_AH; case HF_INET6_ICMP_AH: - return (hicn_type_t) - { - .l4 = IPPROTO_NONE,.l3 = IPPROTO_AH,.l2 = IPPROTO_ICMPV6,.l1 = - IPPROTO_IPV6}; + return HICN_TYPE_IPV6_ICMP_AH; default: break; } - return (hicn_type_t) - { - { - IPPROTO_NONE} - }; + return HICN_TYPE_NONE; } /** diff --git a/lib/src/mapme.h b/lib/src/mapme.h index 460c15282..00c7ca798 100755 --- a/lib/src/mapme.h +++ b/lib/src/mapme.h @@ -47,10 +47,10 @@ typedef struct /** @brief Default MAP-Me configuration */ static const hicn_mapme_conf_t hicn_mapme_conf = { - .enabled = false, - .timescale = 0, - .retx = 50, - .discovery = true, + ATTR_INIT(enabled, false), + ATTR_INIT(timescale, 0), + ATTR_INIT(retx, 50), + ATTR_INIT(discovery, true), }; /** @brief MAP-Me update sequence number */ @@ -84,9 +84,6 @@ int hicn_mapme_parse_packet (const u8 * packet, hicn_prefix_t * prefix, /* Implementation & parsing : ICMP Redirect */ -#define HEADER_TYPE_MAPME4 (hicn_type_t) {0, IPPROTO_ICMPRD, IPPROTO_ICMP, IPPROTO_IP} -#define HEADER_TYPE_MAPME6 (hicn_type_t) {0, IPPROTO_ICMPRD, IPPROTO_ICMP, IPPROTO_IPV6} - #define HICN_MAPME_ACK_FLAG (0x20 | 0x60) #define HICN_MAPME_ICMP_TYPE_IPV4 5 diff --git a/lib/src/ops.h b/lib/src/ops.h index d56e6ae4a..b698a53fd 100755 --- a/lib/src/ops.h +++ b/lib/src/ops.h @@ -37,430 +37,430 @@ typedef struct hicn_ops_s { - /** Protocol name */ - const char *name; - - /** - * @brief Initialize the headers of the hicn packet - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the packet - */ + /** + * @brief Initialize the headers of the hicn packet + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the packet + */ int (*init_packet_header) (hicn_type_t type, hicn_protocol_t * h); - /** - * @brief Retrieves an Interest locator - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Interest packet - * @param [out] ip_address - Retrieved locator - * @return hICN error code - */ + /** + * @brief Retrieves an Interest locator + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Interest packet + * @param [out] ip_address - Retrieved locator + * @return hICN error code + */ int (*get_interest_locator) (hicn_type_t type, const hicn_protocol_t * h, ip46_address_t * ip_address); - /** - * @brief Sets an Interest locator - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest packet - * @param [in] ip_address - Locator to set - * @return hICN error code - */ + /** + * @brief Sets an Interest locator + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest packet + * @param [in] ip_address - Locator to set + * @return hICN error code + */ int (*set_interest_locator) (hicn_type_t type, hicn_protocol_t * h, const ip46_address_t * ip_address); - /** - * @brief Retrieves an Interest name - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Interest packet - * @param [out] name - Retrieved name - * @return hICN error code - */ + /** + * @brief Retrieves an Interest name + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Interest packet + * @param [out] name - Retrieved name + * @return hICN error code + */ int (*get_interest_name) (hicn_type_t type, const hicn_protocol_t * h, hicn_name_t * name); - /** - * @brief Sets an Interest name - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest packet - * @param [in] name - Name to set - * @return hICN error code - */ + /** + * @brief Sets an Interest name + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest packet + * @param [in] name - Name to set + * @return hICN error code + */ int (*set_interest_name) (hicn_type_t type, hicn_protocol_t * h, const hicn_name_t * name); - /** - * @brief Retrieves an Interest name suffix - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Interest packet - * @param [out] suffix - Retrieved name suffix - * @return hICN error code - */ + /** + * @brief Retrieves an Interest name suffix + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Interest packet + * @param [out] suffix - Retrieved name suffix + * @return hICN error code + */ int (*get_interest_name_suffix) (hicn_type_t type, const hicn_protocol_t * h, hicn_name_suffix_t * suffix); - /** - * @brief Sets an Interest name suffix - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest packet - * @param [in] suffix - Name suffix to set - * @return hICN error code - */ + /** + * @brief Sets an Interest name suffix + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest packet + * @param [in] suffix - Name suffix to set + * @return hICN error code + */ int (*set_interest_name_suffix) (hicn_type_t type, hicn_protocol_t * h, const hicn_name_suffix_t * suffix); - /** - * @brief Clear the necessary Interest fields in order to hash it - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest packet - * @return hICN error code - */ + /** + * @brief Clear the necessary Interest fields in order to hash it + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest packet + * @return hICN error code + */ int (*reset_interest_for_hash) (hicn_type_t type, hicn_protocol_t * h); - /** - * @brief Retrieves a Data locator - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Data packet - * @param [out] ip_address - Retrieved locator - * @return hICN error code - */ + /** + * @brief Retrieves a Data locator + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Data packet + * @param [out] ip_address - Retrieved locator + * @return hICN error code + */ int (*get_data_locator) (hicn_type_t type, const hicn_protocol_t * h, ip46_address_t * ip_address); - /** - * @brief Sets a Data locator - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Data packet - * @param [in] ip_address - Locator to set - * @return hICN error code - */ + /** + * @brief Sets a Data locator + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Data packet + * @param [in] ip_address - Locator to set + * @return hICN error code + */ int (*set_data_locator) (hicn_type_t type, hicn_protocol_t * h, const ip46_address_t * ip_address); - /** - * @brief Retrieves a Data name - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Data packet - * @param [out] name - Retrieved name - * @return hICN error code - */ + /** + * @brief Retrieves a Data name + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Data packet + * @param [out] name - Retrieved name + * @return hICN error code + */ int (*get_data_name) (hicn_type_t type, const hicn_protocol_t * h, hicn_name_t * name); - /** - * @brief Sets a Data name - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Data packet - * @param [in] name - Name to set - * @return hICN error code - */ + /** + * @brief Sets a Data name + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Data packet + * @param [in] name - Name to set + * @return hICN error code + */ int (*set_data_name) (hicn_type_t type, hicn_protocol_t * h, const hicn_name_t * name); - /** - * @brief Retrieves a Data name suffix - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Data packet - * @param [out] suffix - Retrieved name suffix - * @return hICN error code - */ + /** + * @brief Retrieves a Data name suffix + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Data packet + * @param [out] suffix - Retrieved name suffix + * @return hICN error code + */ int (*get_data_name_suffix) (hicn_type_t type, const hicn_protocol_t * h, hicn_name_suffix_t * suffix); - /** - * @brief Sets a Data name suffix - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Data packet - * @param [in] suffix - Name suffix to set - * @return hICN error code - */ + /** + * @brief Sets a Data name suffix + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Data packet + * @param [in] suffix - Name suffix to set + * @return hICN error code + */ int (*set_data_name_suffix) (hicn_type_t type, hicn_protocol_t * h, const hicn_name_suffix_t * suffix); - /** - * @brief Retrieves a Data pathlabel - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Data packet - * @param [out] pathlabel - Retrieved pathlabel - * @return hICN error code - */ + /** + * @brief Retrieves a Data pathlabel + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Data packet + * @param [out] pathlabel - Retrieved pathlabel + * @return hICN error code + */ int (*get_data_pathlabel) (hicn_type_t type, const hicn_protocol_t * h, u32 * pathlabel); - /** - * @brief Sets a Data pathlabel - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Data packet - * @param [in] pathlabel - Pathlabel to set - * @return hICN error code - */ + /** + * @brief Sets a Data pathlabel + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Data packet + * @param [in] pathlabel - Pathlabel to set + * @return hICN error code + */ int (*set_data_pathlabel) (hicn_type_t type, hicn_protocol_t * h, const u32 pathlabel); - /** - * @brief Update a Data pathlabel with a new face identifier - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Data packet - * @param [in] pathlabel - Face identifier used to update pathlabel - * @return hICN error code - */ + /** + * @brief Update a Data pathlabel with a new face identifier + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Data packet + * @param [in] pathlabel - Face identifier used to update pathlabel + * @return hICN error code + */ int (*update_data_pathlabel) (hicn_type_t type, hicn_protocol_t * h, const hicn_faceid_t face_id); - /** - * @brief Clear the necessary Data fields in order to hash it - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Data packet - * @return hICN error code - */ + /** + * @brief Clear the necessary Data fields in order to hash it + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Data packet + * @return hICN error code + */ int (*reset_data_for_hash) (hicn_type_t type, hicn_protocol_t * h); - /** - * @brief Retrieves an Interest or Data lifetime - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Interest or Data packet - * @param [out] pathlabel - Retrieved lifetime - * @return hICN error code - */ + /** + * @brief Retrieves an Interest or Data lifetime + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Interest or Data packet + * @param [out] pathlabel - Retrieved lifetime + * @return hICN error code + */ int (*get_lifetime) (hicn_type_t type, const hicn_protocol_t * h, hicn_lifetime_t * lifetime); - /** - * @brief Sets an Interest or Data lifetime - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [in] pathlabel - Lifetime to set - * @return hICN error code - */ + /** + * @brief Sets an Interest or Data lifetime + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [in] pathlabel - Lifetime to set + * @return hICN error code + */ int (*set_lifetime) (hicn_type_t type, hicn_protocol_t * h, const hicn_lifetime_t lifetime); - /** - * @brief Update all checksums in packet headers - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the packet - * @param [in] partial_csum - Partial checksum (set to 0, used internally to - * carry intermediate values from IP pseudo-header) - * @param [in] payload_length - Payload length (can be set to 0, retrieved - * and used internally to carry payload length across protocol headers) - * @return hICN error code - */ + /** + * @brief Update all checksums in packet headers + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the packet + * @param [in] partial_csum - Partial checksum (set to 0, used internally to + * carry intermediate values from IP pseudo-header) + * @param [in] payload_length - Payload length (can be set to 0, retrieved + * and used internally to carry payload length across protocol headers) + * @return hICN error code + */ int (*update_checksums) (hicn_type_t type, hicn_protocol_t * h, u16 partial_csum, size_t payload_length); - /** - * @brief Validate all checksums in packet headers - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the packet - * @param [in] partial_csum - Partial checksum (set to 0, used internally to - * carry intermediate values from IP pseudo-header) - * @param [in] payload_length - Payload length (can be set to 0, retrieved - * and used internally to carry payload length across protocol headers) - * @return hICN error code - */ + /** + * @brief Validate all checksums in packet headers + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the packet + * @param [in] partial_csum - Partial checksum (set to 0, used internally to + * carry intermediate values from IP pseudo-header) + * @param [in] payload_length - Payload length (can be set to 0, retrieved + * and used internally to carry payload length across protocol headers) + * @return hICN error code + */ int (*verify_checksums) (hicn_type_t type, hicn_protocol_t * h, u16 partial_csum, size_t payload_length); - /** - * @brief Rewrite an Interest packet header (locator) - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Interest packet - * @param [in] addr_new - New locator - * @param [in] addr_old - Old locator (set to NULL, used internally to - * compute incremental checksums) - * @return hICN error code - */ + /** + * @brief Rewrite an Interest packet header (locator) + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Interest packet + * @param [in] addr_new - New locator + * @param [in] addr_old - Old locator (set to NULL, used internally to + * compute incremental checksums) + * @return hICN error code + */ int (*rewrite_interest) (hicn_type_t type, hicn_protocol_t * h, const ip46_address_t * addr_new, ip46_address_t * addr_old); - /** - * @brief Rewrite a Data packet header (locator + pathlabel) - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Data packet - * @param [in] addr_new - New locator - * @param [in] addr_old - Old locator (set to NULL, used internally to - * compute incremental checksums) - * @param [in] face_id - Face identifier used to update pathlabel - * @return hICN error code - */ + /** + * @brief Rewrite a Data packet header (locator + pathlabel) + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Data packet + * @param [in] addr_new - New locator + * @param [in] addr_old - Old locator (set to NULL, used internally to + * compute incremental checksums) + * @param [in] face_id - Face identifier used to update pathlabel + * @return hICN error code + */ int (*rewrite_data) (hicn_type_t type, hicn_protocol_t * h, const ip46_address_t * addr_new, ip46_address_t * addr_old, const hicn_faceid_t face_id); - /** - * @brief Return the packet length - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the packet - * @parma [out] length - Returned packet length - * @return hICN error code - */ + /** + * @brief Return the packet length + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the packet + * @parma [out] length - Returned packet length + * @return hICN error code + */ int (*get_length) (hicn_type_t type, const hicn_protocol_t * h, size_t * length); - /** - * @brief Return the current packet header length - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the packet - * @parma [out] header_length - Returned packet current header length - * @return hICN error code - */ + /** + * @brief Return the current packet header length + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the packet + * @parma [out] header_length - Returned packet current header length + * @return hICN error code + */ int (*get_current_header_length) (hicn_type_t type, const hicn_protocol_t * h, size_t * header_length); - /** - * @brief Return the packet header length - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the packet - * @parma [out] header_length - Returned packet header length - * @return hICN error code - */ + /** + * @brief Return the packet header length + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the packet + * @parma [out] header_length - Returned packet header length + * @return hICN error code + */ int (*get_header_length) (hicn_type_t type, const hicn_protocol_t * h, size_t * header_length); - /** - * @brief Return the packet payload length - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the packet - * @parma [out] payload_length - Returned packet payload length - * @return hICN error code - */ + /** + * @brief Return the packet payload length + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the packet + * @parma [out] payload_length - Returned packet payload length + * @return hICN error code + */ int (*get_payload_length) (hicn_type_t type, const hicn_protocol_t * h, size_t * payload_length); - /** - * @brief Sets the packet paylaod length - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the packet - * @parma [out] payload_length - Payload length to set - * @return hICN error code - */ + /** + * @brief Sets the packet paylaod length + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the packet + * @parma [out] payload_length - Payload length to set + * @return hICN error code + */ int (*set_payload_length) (hicn_type_t type, hicn_protocol_t * h, size_t payload_length); - /** - * @brief Retrieves an Interest or Data signature size - * @param [in] type - hICN packet type - * @param [in] h - Buffer holding the Interest or Data packet - * @param [out] signature_size - Retrieved signature size - * @return hICN error code - */ + /** + * @brief Retrieves an Interest or Data signature size + * @param [in] type - hICN packet type + * @param [in] h - Buffer holding the Interest or Data packet + * @param [out] signature_size - Retrieved signature size + * @return hICN error code + */ int (*get_signature_size) (hicn_type_t type, const hicn_protocol_t * h, size_t * signature_size); - /** - * @brief Sets an Interest or Data signature size - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [in] signature_size - Signature size to set - * @return hICN error code - */ + /** + * @brief Sets an Interest or Data signature size + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [in] signature_size - Signature size to set + * @return hICN error code + */ int (*set_signature_size) (hicn_type_t type, hicn_protocol_t * h, size_t signature_size); - /** - * @brief Sets the signature timestamp - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [in] signature_timestamp - Signature timestamp to set - * @return hICN error code - */ + /** + * @brief Gets the signature timestamp + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [out] signature_timestamp - Retrieved signature timestamp + * @return hICN error code + */ + int (*get_signature_timestamp) (hicn_type_t type, const hicn_protocol_t * h, + uint64_t *signature_timestamp); + + /** + * @brief Sets the signature timestamp + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [in] signature_timestamp - Signature timestamp to set + * @return hICN error code + */ int (*set_signature_timestamp) (hicn_type_t type, hicn_protocol_t * h, uint64_t signature_timestamp); - /** - * @brief Gets the signature timestamp - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [out] signature_timestamp - Retrieved signature timestamp - * @return hICN error code - */ - int (*get_signature_timestamp) (hicn_type_t type, const hicn_protocol_t * h, - uint64_t *signature_timestamp); - /** - * @brief Sets the signature validation algorithm - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [in] validation_algorithm - Validation algorithm enumeration - * @return hICN error code - */ + /** + * @brief Gets the signature validation algorithm + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [out] validation_algorithm - Retrieved validation_algorithm + * @return hICN error code + */ + int (*get_validation_algorithm) (hicn_type_t type, const hicn_protocol_t * h, + uint8_t *validation_algorithm); + + /** + * @brief Sets the signature validation algorithm + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [in] validation_algorithm - Validation algorithm enumeration + * @return hICN error code + */ int (*set_validation_algorithm) (hicn_type_t type, hicn_protocol_t * h, uint8_t validation_algorithm); - /** - * @brief Gets the signature validation algorithm - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [out] validation_algorithm - Retrieved validation_algorithm - * @return hICN error code - */ - int (*get_validation_algorithm) (hicn_type_t type, const hicn_protocol_t * h, - uint8_t *validation_algorithm); - /** - * @brief Sets the key id - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [in] key_id - Key id first byte address - * @return hICN error code - */ + /** + * @brief Gets the key id + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [out] key_id - Retrieved key id first byte address + * @return hICN error code + */ + int (*get_key_id) (hicn_type_t type, hicn_protocol_t * h, + uint8_t **key_id, uint8_t *key_id_size); + + /** + * @brief Sets the key id + * @param [in] type - hICN packet type + * @param [in,out] h - Buffer holding the Interest or Data packet + * @param [in] key_id - Key id first byte address + * @return hICN error code + */ int (*set_key_id) (hicn_type_t type, hicn_protocol_t * h, uint8_t *key_id); - /** - * @brief Gets the key id - * @param [in] type - hICN packet type - * @param [in,out] h - Buffer holding the Interest or Data packet - * @param [out] key_id - Retrieved key id first byte address - * @return hICN error code - */ - int (*get_key_id) (hicn_type_t type, hicn_protocol_t * h, - uint8_t **key_id, uint8_t *key_id_size); } hicn_ops_t; #define DECLARE_HICN_OPS(protocol) \ - const hicn_ops_t hicn_ops_ ## protocol = { \ - .init_packet_header = protocol ## _init_packet_header, \ - .get_interest_locator = protocol ## _get_interest_locator, \ - .set_interest_locator = protocol ## _set_interest_locator, \ - .get_interest_name = protocol ## _get_interest_name, \ - .set_interest_name = protocol ## _set_interest_name, \ - .get_interest_name_suffix = protocol ## _get_interest_name_suffix, \ - .set_interest_name_suffix = protocol ## _set_interest_name_suffix, \ - .reset_interest_for_hash = protocol ## _reset_interest_for_hash, \ - .get_data_locator = protocol ## _get_data_locator, \ - .set_data_locator = protocol ## _set_data_locator, \ - .get_data_name = protocol ## _get_data_name, \ - .set_data_name = protocol ## _set_data_name, \ - .get_data_name_suffix = protocol ## _get_data_name_suffix, \ - .set_data_name_suffix = protocol ## _set_data_name_suffix, \ - .get_data_pathlabel = protocol ## _get_data_pathlabel, \ - .set_data_pathlabel = protocol ## _set_data_pathlabel, \ - .update_data_pathlabel = protocol ## _update_data_pathlabel, \ - .reset_data_for_hash = protocol ## _reset_data_for_hash, \ - .get_lifetime = protocol ## _get_lifetime, \ - .set_lifetime = protocol ## _set_lifetime, \ - .update_checksums = protocol ## _update_checksums, \ - .verify_checksums = protocol ## _verify_checksums, \ - .rewrite_interest = protocol ## _rewrite_interest, \ - .rewrite_data = protocol ## _rewrite_data, \ - .get_length = protocol ## _get_length, \ - .get_current_header_length= protocol ## _get_current_header_length, \ - .get_header_length = protocol ## _get_header_length, \ - .get_payload_length = protocol ## _get_payload_length, \ - .set_payload_length = protocol ## _set_payload_length, \ - .get_signature_size = protocol ## _get_signature_size, \ - .set_signature_size = protocol ## _set_signature_size, \ - .set_signature_timestamp = protocol ## _set_signature_timestamp, \ - .get_signature_timestamp = protocol ## _get_signature_timestamp, \ - .set_validation_algorithm = protocol ## _set_validation_algorithm, \ - .get_validation_algorithm = protocol ## _get_validation_algorithm, \ - .set_key_id = protocol ## _set_key_id, \ - .get_key_id = protocol ## _get_key_id, \ - } + const hicn_ops_t hicn_ops_ ## protocol = { \ + ATTR_INIT(init_packet_header, protocol ## _init_packet_header), \ + ATTR_INIT(get_interest_locator, protocol ## _get_interest_locator), \ + ATTR_INIT(set_interest_locator, protocol ## _set_interest_locator), \ + ATTR_INIT(get_interest_name, protocol ## _get_interest_name), \ + ATTR_INIT(set_interest_name, protocol ## _set_interest_name), \ + ATTR_INIT(get_interest_name_suffix, protocol ## _get_interest_name_suffix), \ + ATTR_INIT(set_interest_name_suffix, protocol ## _set_interest_name_suffix), \ + ATTR_INIT(reset_interest_for_hash, protocol ## _reset_interest_for_hash), \ + ATTR_INIT(get_data_locator, protocol ## _get_data_locator), \ + ATTR_INIT(set_data_locator, protocol ## _set_data_locator), \ + ATTR_INIT(get_data_name, protocol ## _get_data_name), \ + ATTR_INIT(set_data_name, protocol ## _set_data_name), \ + ATTR_INIT(get_data_name_suffix, protocol ## _get_data_name_suffix), \ + ATTR_INIT(set_data_name_suffix, protocol ## _set_data_name_suffix), \ + ATTR_INIT(get_data_pathlabel, protocol ## _get_data_pathlabel), \ + ATTR_INIT(set_data_pathlabel, protocol ## _set_data_pathlabel), \ + ATTR_INIT(update_data_pathlabel, protocol ## _update_data_pathlabel), \ + ATTR_INIT(reset_data_for_hash, protocol ## _reset_data_for_hash), \ + ATTR_INIT(get_lifetime, protocol ## _get_lifetime), \ + ATTR_INIT(set_lifetime, protocol ## _set_lifetime), \ + ATTR_INIT(update_checksums, protocol ## _update_checksums), \ + ATTR_INIT(verify_checksums, protocol ## _verify_checksums), \ + ATTR_INIT(rewrite_interest, protocol ## _rewrite_interest), \ + ATTR_INIT(rewrite_data, protocol ## _rewrite_data), \ + ATTR_INIT(get_length, protocol ## _get_length), \ + ATTR_INIT(get_current_header_length,protocol ## _get_current_header_length),\ + ATTR_INIT(get_header_length, protocol ## _get_header_length), \ + ATTR_INIT(get_payload_length, protocol ## _get_payload_length), \ + ATTR_INIT(set_payload_length, protocol ## _set_payload_length), \ + ATTR_INIT(get_signature_size, protocol ## _get_signature_size), \ + ATTR_INIT(set_signature_size, protocol ## _set_signature_size), \ + ATTR_INIT(get_signature_timestamp, protocol ## _get_signature_timestamp), \ + ATTR_INIT(set_signature_timestamp, protocol ## _set_signature_timestamp), \ + ATTR_INIT(get_validation_algorithm, protocol ## _get_validation_algorithm), \ + ATTR_INIT(set_validation_algorithm, protocol ## _set_validation_algorithm), \ + ATTR_INIT(get_key_id, protocol ## _get_key_id), \ + ATTR_INIT(set_key_id, protocol ## _set_key_id), \ + } /** * @brief Protocol-independent packet operations VFT @@ -476,11 +476,16 @@ extern const hicn_ops_t *const hicn_ops_vft[]; always_inline hicn_type_t TYPE_POP (hicn_type_t type) { - return (hicn_type_t) - { - { - .l1 = type.l2,.l2 = type.l3,.l3 = type.l4,.l4 = IPPROTO_NONE,} - }; +#ifndef _WIN32 + return HICN_TYPE(type.l2, type.l3, type.l4, IPPROTO_NONE); +#else + hicn_type_t new_type; + new_type.l1 = type.l2; + new_type.l2 = type.l3; + new_type.l3 = type.l4; + new_type.l4 = IPPROTO_NONE; + return new_type; +#endif } always_inline hicn_protocol_t * -- cgit 1.2.3-korg