summaryrefslogtreecommitdiffstats
path: root/src/plugins/memif/node.c
AgeCommit message (Expand)AuthorFilesLines
2019-09-24vlib: add flag to explicitelly mark nodes which can init per-node packet traceDamjan Marion1-0/+1
2019-07-25memif: Fix uninitialized variable as reported by coveritySteven Luong1-1/+2
2019-07-18vlib: convert frame_index into real pointersAndreas Schultz1-1/+1
2019-02-22Add no-append flag to vlib_frame_tDamjan Marion1-0/+1
2019-02-09buffers: fix typoDamjan Marion1-2/+2
2019-02-06buffers: make buffer data size configurable from startup configDamjan Marion1-2/+2
2019-02-01memif: fix buffer prefetchDamjan Marion1-4/+5
2019-01-30buffers: add missing ref_count = 1 in driversDamjan Marion1-0/+1
2019-01-30buffers: major cleanup and improvementsDamjan Marion1-3/+6
2019-01-18deprecate clib_memcpy64_x4Damjan Marion1-10/+17
2018-11-20memif input-node improvementsDamjan Marion1-11/+34
2018-11-14Remove c-11 memcpy checks from perf-critical codeDave Barach1-16/+16
2018-10-23c11 safe string handling supportDave Barach1-1/+1
2018-08-13Multiarch handling in different constructor macrosDamjan Marion1-2/+0
2018-07-17memif: vectorized buffer enqueue in input nodeDamjan Marion1-146/+121
2018-07-11avoid using thread local storage for thread indexDamjan Marion1-2/+2
2018-05-29Add VLIB_NODE_FN() macro to simplify multiversioning of node functionsDamjan Marion1-20/+5
2018-04-05memif: bug fixesDamjan Marion1-21/+72
2018-04-04memif: zero copy slaveDamjan Marion1-5/+327
2018-03-22memif: version 2Damjan Marion1-359/+326
2018-02-09memif: fix crash caused by zero pkt len in memif and clear dirty cache while ...Chun Li1-2/+80
2017-11-23memif: fix input node multiversion constructorDamjan Marion1-6/+6
2017-11-23memif: multiversioningDamjan Marion1-6/+22
2017-11-08memif: do not mask head and tail pointersDamjan Marion1-32/+15
2017-10-04[aarch64] Fixes CLI crashes on dpaa2 platform.Christophe Fontaine1-1/+1
2017-06-19memif: add ip modeDamjan Marion1-18/+82
2017-06-16memif: jumbo frames supportSteven1-109/+201
2017-06-12memif: complete refactor of socket handling codeDamjan Marion1-41/+42
2017-05-31memif: multi-queues supportSteven1-11/+7
2017-05-15memif: migrate memif to use vnet device infra APIsSteven1-20/+20
2017-04-06Use thread local storage for thread indexDamjan Marion1-17/+18
2017-04-05Fix two more memif coverity issuesMilan Lenco1-24/+20
2017-03-22Add memif - packet memory interface for intra-host communicationDamjan Marion1-0/+383
span class="p">{ return ("fixme"); } else { return ("unknown"); } } } /** * fib_node_register_type * * Register the function table for a given type */ void fib_node_register_type (fib_node_type_t type, const fib_node_vft_t *vft) { /* * assert that one only registration is made per-node type */ if (vec_len(fn_vfts) > type) ASSERT(NULL == fn_vfts[type].fnv_get); /* * Assert that we are getting each of the required functions */ ASSERT(NULL != vft->fnv_get); ASSERT(NULL != vft->fnv_last_lock); vec_validate(fn_vfts, type); fn_vfts[type] = *vft; } fib_node_type_t fib_node_register_new_type (const fib_node_vft_t *vft) { fib_node_type_t new_type; new_type = ++last_new_type; fib_node_register_type(new_type, vft); return (new_type); } static u8* fib_node_format (fib_node_ptr_t *fnp, u8*s) { return (format(s, "{%s:%d}", fn_type_names[fnp->fnp_type], fnp->fnp_index)); } u32 fib_node_child_add (fib_node_type_t parent_type, fib_node_index_t parent_index, fib_node_type_t type, fib_node_index_t index) { fib_node_t *parent; parent = fn_vfts[parent_type].fnv_get(parent_index); /* * return the index of the sibling in the child list */ fib_node_lock(parent); if (FIB_NODE_INDEX_INVALID == parent->fn_children) { parent->fn_children = fib_node_list_create(); } return (fib_node_list_push_front(parent->fn_children, 0, type, index)); } void fib_node_child_remove (fib_node_type_t parent_type, fib_node_index_t parent_index, fib_node_index_t sibling_index) { fib_node_t *parent; parent = fn_vfts[parent_type].fnv_get(parent_index); fib_node_list_remove(parent->fn_children, sibling_index); if (0 == fib_node_list_get_size(parent->fn_children)) { fib_node_list_destroy(&parent->fn_children); } fib_node_unlock(parent); } u32 fib_node_get_n_children (fib_node_type_t parent_type, fib_node_index_t parent_index) { fib_node_t *parent; parent = fn_vfts[parent_type].fnv_get(parent_index); return (fib_node_list_get_size(parent->fn_children)); } fib_node_back_walk_rc_t fib_node_back_walk_one (fib_node_ptr_t *ptr, fib_node_back_walk_ctx_t *ctx) { fib_node_t *node; node = fn_vfts[ptr->fnp_type].fnv_get(ptr->fnp_index); return (fn_vfts[ptr->fnp_type].fnv_back_walk(node, ctx)); } static int fib_node_ptr_format_one_child (fib_node_ptr_t *ptr, void *arg) { u8 **s = (u8**) arg; *s = fib_node_format(ptr, *s); return (1); } u8* fib_node_children_format (fib_node_list_t list, u8 *s) { fib_node_list_walk(list, fib_node_ptr_format_one_child, (void*)&s); return (s); } void fib_node_init (fib_node_t *node, fib_node_type_t type) { /** * The node's type. used to retrieve the VFT. */ node->fn_type = type; node->fn_locks = 0; node->fn_children = FIB_NODE_INDEX_INVALID; } void fib_node_deinit (fib_node_t *node) { fib_node_list_destroy(&node->fn_children); } void fib_node_lock (fib_node_t *node) { node->fn_locks++; } void fib_node_unlock (fib_node_t *node) { node->fn_locks--; if (0 == node->fn_locks) { fn_vfts[node->fn_type].fnv_last_lock(node); } } void fib_show_memory_usage (const char *name, u32 in_use_elts, u32 allocd_elts, size_t size_elt) { vlib_cli_output (vlib_get_main(), "%=30s %=5d %=8d/%=9d %d/%d ", name, size_elt, in_use_elts, allocd_elts, in_use_elts*size_elt, allocd_elts*size_elt); } static clib_error_t * fib_memory_show (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { fib_node_vft_t *vft; vlib_cli_output (vm, "FIB memory"); vlib_cli_output (vm, " Tables:"); vlib_cli_output (vm, "%=30s %=6s %=12s", "SAFI", "Number", "Bytes"); vlib_cli_output (vm, "%U", format_fib_table_memory); vlib_cli_output (vm, "%U", format_mfib_table_memory); vlib_cli_output (vm, " Nodes:"); vlib_cli_output (vm, "%=30s %=5s %=8s/%=9s totals", "Name","Size", "in-use", "allocated"); vec_foreach(vft, fn_vfts) { if (NULL != vft->fnv_mem_show) vft->fnv_mem_show(); } fib_node_list_memory_show(); return (NULL); } /* *INDENT-OFF* */ /*? * The '<em>sh fib memory </em>' command displays the memory usage for each * FIB object type. * * @cliexpar * @cliexstart{show fib memory} *FIB memory * Tables: * SAFI Number Bytes * IPv4 unicast 2 673066 * IPv6 unicast 2 1054608 * MPLS 1 4194312 * IPv4 multicast 2 2322 * IPv6 multicast 2 ??? * Nodes: * Name Size in-use /allocated totals * Entry 96 20 / 20 1920/1920 * Entry Source 32 0 / 0 0/0 * Entry Path-Extensions 60 0 / 0 0/0 * multicast-Entry 192 12 / 12 2304/2304 * Path-list 40 28 / 28 1120/1120 * uRPF-list 16 20 / 20 320/320 * Path 72 28 / 28 2016/2016 * Node-list elements 20 28 / 28 560/560 * Node-list heads 8 30 / 30 240/240 * @cliexend ?*/ VLIB_CLI_COMMAND (show_fib_memory, static) = { .path = "show fib memory", .function = fib_memory_show, .short_help = "show fib memory", }; /* *INDENT-ON* */