| /* |
| * 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: |
| */ |