Files
vpp/src/plugins/memif/memif.h
Tianyu Li 40c11e604c memif: fix gcc-10 build error on arm platform
In function ‘memcpy’,
 inlined from ‘memif_device_input_zc_inline’
 at src/plugins/memif/node.c:850:7,
 string_fortified.h:34:10: error:
   writing 16 bytes into a region of size 0 [-Werror=stringop-overflow=]
 34 |   return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));
    |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/plugins/memif/node.c: In function ‘memif_input_node_fn_neoversen1’:
src/plugins/memif/memif.h:175:16: note:
  at offset 0 to object ‘desc’ with size 0 declared here
  175 |   memif_desc_t desc[0];
      |                ^~~~

Using C99 way empty brackets for flexible array members

Type: fix
Signed-off-by: Tianyu Li <tianyu.li@arm.com>
Change-Id: I7a6ad89f95e1b5e3f9aac36546a2559dbda9bd6c
2021-05-21 06:23:20 +00:00

187 lines
4.4 KiB
C

/*
*------------------------------------------------------------------
* Copyright (c) 2017 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*------------------------------------------------------------------
*/
#ifndef _MEMIF_H_
#define _MEMIF_H_
#ifndef MEMIF_CACHELINE_SIZE
#define MEMIF_CACHELINE_SIZE 64
#endif
#define MEMIF_COOKIE 0x3E31F20
#define MEMIF_VERSION_MAJOR 2
#define MEMIF_VERSION_MINOR 0
#define MEMIF_VERSION ((MEMIF_VERSION_MAJOR << 8) | MEMIF_VERSION_MINOR)
#define MEMIF_SECRET_SIZE 24
/*
* Type definitions
*/
typedef enum memif_msg_type
{
MEMIF_MSG_TYPE_NONE = 0,
MEMIF_MSG_TYPE_ACK = 1,
MEMIF_MSG_TYPE_HELLO = 2,
MEMIF_MSG_TYPE_INIT = 3,
MEMIF_MSG_TYPE_ADD_REGION = 4,
MEMIF_MSG_TYPE_ADD_RING = 5,
MEMIF_MSG_TYPE_CONNECT = 6,
MEMIF_MSG_TYPE_CONNECTED = 7,
MEMIF_MSG_TYPE_DISCONNECT = 8,
} memif_msg_type_t;
typedef enum
{
MEMIF_RING_S2M = 0,
MEMIF_RING_M2S = 1
} memif_ring_type_t;
typedef enum
{
MEMIF_INTERFACE_MODE_ETHERNET = 0,
MEMIF_INTERFACE_MODE_IP = 1,
MEMIF_INTERFACE_MODE_PUNT_INJECT = 2,
} memif_interface_mode_t;
typedef uint16_t memif_region_index_t;
typedef uint32_t memif_region_offset_t;
typedef uint64_t memif_region_size_t;
typedef uint16_t memif_ring_index_t;
typedef uint32_t memif_interface_id_t;
typedef uint16_t memif_version_t;
typedef uint8_t memif_log2_ring_size_t;
/*
* Socket messages
*/
typedef struct __attribute__ ((packed))
{
uint8_t name[32];
memif_version_t min_version;
memif_version_t max_version;
memif_region_index_t max_region;
memif_ring_index_t max_m2s_ring;
memif_ring_index_t max_s2m_ring;
memif_log2_ring_size_t max_log2_ring_size;
} memif_msg_hello_t;
typedef struct __attribute__ ((packed))
{
memif_version_t version;
memif_interface_id_t id;
memif_interface_mode_t mode:8;
uint8_t secret[MEMIF_SECRET_SIZE];
uint8_t name[32];
} memif_msg_init_t;
typedef struct __attribute__ ((packed))
{
memif_region_index_t index;
memif_region_size_t size;
} memif_msg_add_region_t;
typedef struct __attribute__ ((packed))
{
uint16_t flags;
#define MEMIF_MSG_ADD_RING_FLAG_S2M (1 << 0)
memif_ring_index_t index;
memif_region_index_t region;
memif_region_offset_t offset;
memif_log2_ring_size_t log2_ring_size;
uint16_t private_hdr_size; /* used for private metadata */
} memif_msg_add_ring_t;
typedef struct __attribute__ ((packed))
{
uint8_t if_name[32];
} memif_msg_connect_t;
typedef struct __attribute__ ((packed))
{
uint8_t if_name[32];
} memif_msg_connected_t;
typedef struct __attribute__ ((packed))
{
uint32_t code;
uint8_t string[96];
} memif_msg_disconnect_t;
typedef struct __attribute__ ((packed, aligned (128)))
{
memif_msg_type_t type:16;
union
{
memif_msg_hello_t hello;
memif_msg_init_t init;
memif_msg_add_region_t add_region;
memif_msg_add_ring_t add_ring;
memif_msg_connect_t connect;
memif_msg_connected_t connected;
memif_msg_disconnect_t disconnect;
};
} memif_msg_t;
_Static_assert (sizeof (memif_msg_t) == 128,
"Size of memif_msg_t must be 128");
/*
* Ring and Descriptor Layout
*/
typedef struct __attribute__ ((packed))
{
uint16_t flags;
#define MEMIF_DESC_FLAG_NEXT (1 << 0)
memif_region_index_t region;
uint32_t length;
memif_region_offset_t offset;
uint32_t metadata;
} memif_desc_t;
_Static_assert (sizeof (memif_desc_t) == 16,
"Size of memif_dsct_t must be 16 bytes");
#define MEMIF_CACHELINE_ALIGN_MARK(mark) \
uint8_t mark[0] __attribute__((aligned(MEMIF_CACHELINE_SIZE)))
typedef struct
{
MEMIF_CACHELINE_ALIGN_MARK (cacheline0);
uint32_t cookie;
uint16_t flags;
#define MEMIF_RING_FLAG_MASK_INT 1
volatile uint16_t head;
MEMIF_CACHELINE_ALIGN_MARK (cacheline1);
volatile uint16_t tail;
MEMIF_CACHELINE_ALIGN_MARK (cacheline2);
memif_desc_t desc[];
} memif_ring_t;
#endif /* _MEMIF_H_ */
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "gnu")
* End:
*/