blob: f877df3cd33a1cf262bca22cd88c971f0dbc38fe [file] [log] [blame]
/*
* Copyright (c) 2015 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 __included_ssvm_eth_h__
#define __included_ssvm_eth_h__
#include <vnet/vnet.h>
#include <vppinfra/elog.h>
#include <vppinfra/error.h>
#include <vppinfra/format.h>
#include <vppinfra/hash.h>
#include <vppinfra/vec.h>
#include <vppinfra/elog.h>
#include <vlib/vlib.h>
#include <vnet/ethernet/ethernet.h>
#include <vnet/devices/devices.h>
#include <vnet/ip/ip.h>
#include <vnet/pg/pg.h>
#include <vlibmemory/unix_shared_memory_queue.h>
#include <svm/ssvm.h>
extern vnet_device_class_t ssvm_eth_device_class;
extern vlib_node_registration_t ssvm_eth_input_node;
#define SSVM_BUFFER_SIZE \
(VLIB_BUFFER_DATA_SIZE + VLIB_BUFFER_PRE_DATA_SIZE)
#define SSVM_PACKET_TYPE 1
typedef struct
{
/* Type of queue element */
u8 type;
u8 flags;
#define SSVM_BUFFER_NEXT_PRESENT (1<<0)
u8 owner;
u8 tag;
i16 current_data_hint;
u16 length_this_buffer;
u16 total_length_not_including_first_buffer;
u16 pad;
u32 next_index;
/* offset 16 */
u8 data[SSVM_BUFFER_SIZE];
/* pad to an even multiple of 64 octets */
u8 pad2[CLIB_CACHE_LINE_BYTES - 16];
} ssvm_eth_queue_elt_t;
typedef struct
{
/* vector of point-to-point connections */
ssvm_private_t *intfcs;
u32 *buffer_cache;
u32 *chunk_cache;
/* Configurable parameters */
/* base address for next placement */
u64 next_base_va;
u64 segment_size;
u64 nbuffers;
u64 queue_elts;
/* Segment names */
u8 **names;
/* convenience */
vlib_main_t *vlib_main;
vnet_main_t *vnet_main;
elog_main_t *elog_main;
} ssvm_eth_main_t;
ssvm_eth_main_t ssvm_eth_main;
typedef enum
{
CHUNK_POOL_FREELIST_INDEX = 0,
CHUNK_POOL_INDEX,
CHUNK_POOL_NFREE,
TO_MASTER_Q_INDEX,
TO_SLAVE_Q_INDEX,
MASTER_ADMIN_STATE_INDEX,
SLAVE_ADMIN_STATE_INDEX,
} ssvm_eth_opaque_index_t;
/*
* debug scaffolding.
*/
static inline void
ssvm_eth_validate_freelists (int need_lock)
{
#if CLIB_DEBUG > 0
ssvm_eth_main_t *em = &ssvm_eth_main;
ssvm_private_t *intfc;
ssvm_shared_header_t *sh;
u32 *elt_indices;
u32 n_available;
int i;
for (i = 0; i < vec_len (em->intfcs); i++)
{
intfc = em->intfcs + i;
sh = intfc->sh;
u32 my_pid = intfc->my_pid;
if (need_lock)
ssvm_lock (sh, my_pid, 15);
elt_indices = (u32 *) (sh->opaque[CHUNK_POOL_FREELIST_INDEX]);
n_available = (u32) (uword) (sh->opaque[CHUNK_POOL_NFREE]);
for (i = 0; i < n_available; i++)
ASSERT (elt_indices[i] < 2048);
if (need_lock)
ssvm_unlock (sh);
}
#endif
}
#endif /* __included_ssvm_eth_h__ */
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "gnu")
* End:
*/