aboutsummaryrefslogtreecommitdiffstats
path: root/src
AgeCommit message (Expand)AuthorFilesLines
2022-07-12perfmon: add Arm event bundlesZachary Leaf9-0/+874
2022-07-12perfmon: enable perfmon plugin for ArmZachary Leaf13-37/+659
2022-07-12perfmon: make less arch dependentZachary Leaf8-101/+161
2022-07-11wireguard: fix coverity warningsArtem Glazychev1-8/+8
2022-07-08dpdk: add ID for 4xxx QAT VFMatthew Smith1-3/+5
2022-07-06gre: fix returning the flags in the APIIvan Shvedunov1-0/+1
2022-07-06vppinfra: fix memory leak in sparse_vec_free()Sergey Matov1-1/+4
2022-07-06misc: pass NULL instead of 0 for pointer in variadic functionsAndreas Schultz5-18/+14
2022-07-01buffers: protect against bad thread indicesJon Loeliger1-0/+3
2022-06-30vcl: check if listener valid on disconnect cleanupFlorin Coras1-1/+2
2022-06-30vrrp: while delete vr can't delete multi virtual address.GaoChX1-1/+4
2022-06-30sr: SRv6 Path Tracing Sink node behaviorAhmed Abdelsalam1-0/+10
2022-06-29vlib: enqueue_to_next_with_aux implementationMohammed Hawari4-37/+233
2022-06-29classify: use 32 bits hashBenoît Ganne11-55/+54
2022-06-29sr: code refactor and style fixAhmed Abdelsalam2-15/+14
2022-06-29svm: check svm_msg_q_size_to_alloc successOfer Heifetz1-0/+3
2022-06-29sr: Add support for SRv6 Path Tracing InfrastructureAhmed Abdelsalam3-0/+349
2022-06-29hsa: reduce number of preallocated vcl test server sessionsFlorin Coras2-1/+2
2022-06-29tests: add ipsec flow performance unit testPiotr Bronowski1-0/+309
2022-06-29ipsec: show fast path flag in cliFan Zhang1-8/+27
2022-06-29ipsec: add fast path configuration parserPiotr Bronowski1-2/+19
2022-06-29ipsec: add spd fast path matchingPiotr Bronowski3-0/+584
2022-06-29ipsec: make match function inlinePiotr Bronowski2-145/+171
2022-06-29ipsec: add/delete ipsec fast path policyPiotr Bronowski6-59/+717
2022-06-28session: fix connected udp acceptsFlorin Coras1-0/+1
2022-06-28session quic: allow custom config of rx mqs seg sizeFlorin Coras1-2/+5
2022-06-28ipsec: introduce spd fast path typesPiotr Bronowski1-0/+63
2022-06-28ipsec: change wildcard value for any protocol of spd policyPiotr Bronowski8-58/+300
2022-06-17quic:fix crash rx_fifo full or growfanxb1-0/+16
2022-06-15stats: fix prometheus exporter crash on large number of FIB entriesAlexander Chernavin1-2/+2
2022-06-14ip: reassembly - Add node level stats, fix customapp behaviorVijayabhaskar Katamreddy2-16/+77
2022-06-10vcl: fix iperf3 server crash issue when it runs over vpp host stack.Liangxing Wang1-1/+8
2022-06-10vppinfra: fix bihash_8_16 entry format functionBenoît Ganne1-2/+1
2022-06-10hsa: allow first segments larger than 4g for proxyFlorin Coras2-14/+5
2022-06-10ip: improve ip ACL tracesBenoît Ganne3-10/+26
2022-06-09vppinfra: missing __clib_export for clib_pmalloc_alloc_alignedDamjan Marion1-2/+2
2022-06-08udp: add cli to dump registered portsBenoît Ganne1-0/+93
2022-06-08wireguard: increment interface RX countersMatthew Smith1-0/+15
2022-06-07classify: fix sesssion details apiNathan Skrzypczak1-1/+1
2022-06-07vlib: fix crash on packet on deleted interfacePim van Pelt1-3/+6
2022-06-07sr: SRv6 TEF behavior supportAhmed Abdelsalam3-3/+87
2022-06-05wireguard: fix crash by not sending arp via wg interfaceAlexander Chernavin2-1/+9
2022-06-03hsa: dealloc proxy fifos on right threadFlorin Coras2-1/+46
2022-06-03hsa: refactor proxy session lookup and cleanupFlorin Coras2-103/+52
2022-06-03session: fix double free in CLIFilip Tehlar1-7/+2
2022-06-02ipfix-export: Fix frame leak in flow_report_process_send()Jon Loeliger1-1/+9
2022-06-01session: make sure fifos are freed on right threadFlorin Coras1-0/+4
2022-06-01stats: swap used and total statsLeland Krych1-2/+2
2022-06-01papi: vpp_serializer.py - replace slow bytes() with fast bytearray()Viktor Velichkin1-8/+8
2022-06-01vlib: add VLIB_NUM_WORKERS_CHANGE_FN() handlerDamjan Marion4-10/+15
pan class="p">)))) index0 = hash & (vec_len (ihd0->workers) - 1); else index0 = hash % vec_len (ihd0->workers); ti[0] = hm->first_worker_index + ihd0->workers[index0]; /* next */ n_left_from -= 1; ti += 1; b += 1; } if (PREDICT_FALSE (node->flags & VLIB_NODE_FLAG_TRACE)) worker_handoff_trace_frame (vm, node, bufs, thread_indices, frame->n_vectors); n_enq = vlib_buffer_enqueue_to_thread (vm, node, hm->frame_queue_index, from, thread_indices, frame->n_vectors, 1); if (n_enq < frame->n_vectors) vlib_node_increment_counter (vm, node->node_index, WORKER_HANDOFF_ERROR_CONGESTION_DROP, frame->n_vectors - n_enq); return frame->n_vectors; } VLIB_REGISTER_NODE (worker_handoff_node) = { .name = "worker-handoff", .vector_size = sizeof (u32), .format_trace = format_worker_handoff_trace, .type = VLIB_NODE_TYPE_INTERNAL, .n_errors = ARRAY_LEN(worker_handoff_error_strings), .error_strings = worker_handoff_error_strings, .n_next_nodes = 1, .next_nodes = { [0] = "error-drop", }, }; #ifndef CLIB_MARCH_VARIANT int interface_handoff_enable_disable (vlib_main_t *vm, u32 sw_if_index, uword *bitmap, u8 is_sym, int is_l4, int enable_disable) { handoff_main_t *hm = &handoff_main; vnet_sw_interface_t *sw; vnet_main_t *vnm = vnet_get_main (); per_inteface_handoff_data_t *d; int i, rv = 0; if (pool_is_free_index (vnm->interface_main.sw_interfaces, sw_if_index)) return VNET_API_ERROR_INVALID_SW_IF_INDEX; sw = vnet_get_sw_interface (vnm, sw_if_index); if (sw->type != VNET_SW_INTERFACE_TYPE_HARDWARE) return VNET_API_ERROR_INVALID_SW_IF_INDEX; if (clib_bitmap_last_set (bitmap) >= hm->num_workers) return VNET_API_ERROR_INVALID_WORKER; if (hm->frame_queue_index == ~0) { vlib_node_t *n = vlib_get_node_by_name (vm, (u8 *) "ethernet-input"); hm->frame_queue_index = vlib_frame_queue_main_init (n->index, 0); } vec_validate (hm->if_data, sw_if_index); d = vec_elt_at_index (hm->if_data, sw_if_index); vec_free (d->workers); vec_free (d->workers_bitmap); if (enable_disable) { d->workers_bitmap = bitmap; clib_bitmap_foreach (i, bitmap) { vec_add1(d->workers, i); } if (is_sym) { if (is_l4) return VNET_API_ERROR_UNIMPLEMENTED; d->hash_fn = vnet_hash_function_from_name ( "handoff-eth-sym", VNET_HASH_FN_TYPE_ETHERNET); } else { if (is_l4) d->hash_fn = vnet_hash_default_function (VNET_HASH_FN_TYPE_ETHERNET); else d->hash_fn = vnet_hash_function_from_name ( "handoff-eth", VNET_HASH_FN_TYPE_ETHERNET); } } vnet_feature_enable_disable ("device-input", "worker-handoff", sw_if_index, enable_disable, 0, 0); return rv; } static clib_error_t * set_interface_handoff_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { u32 sw_if_index = ~0, is_sym = 0, is_l4 = 0; int enable_disable = 1; uword *bitmap = 0; int rv = 0; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "disable")) enable_disable = 0; else if (unformat (input, "workers %U", unformat_bitmap_list, &bitmap)) ; else if (unformat (input, "%U", unformat_vnet_sw_interface, vnet_get_main (), &sw_if_index)) ; else if (unformat (input, "symmetrical")) is_sym = 1; else if (unformat (input, "asymmetrical")) is_sym = 0; else if (unformat (input, "l4")) is_l4 = 1; else break; } if (sw_if_index == ~0) return clib_error_return (0, "Please specify an interface..."); if (bitmap == 0) return clib_error_return (0, "Please specify list of workers..."); rv = interface_handoff_enable_disable (vm, sw_if_index, bitmap, is_sym, is_l4, enable_disable); switch (rv) { case 0: break; case VNET_API_ERROR_INVALID_SW_IF_INDEX: return clib_error_return (0, "Invalid interface"); break; case VNET_API_ERROR_INVALID_WORKER: return clib_error_return (0, "Invalid worker(s)"); break; case VNET_API_ERROR_UNIMPLEMENTED: return clib_error_return (0, "Device driver doesn't support redirection"); break; default: return clib_error_return (0, "unknown return value %d", rv); } return 0; } /* *INDENT-OFF* */ VLIB_CLI_COMMAND (set_interface_handoff_command, static) = { .path = "set interface handoff", .short_help = "set interface handoff <interface-name> workers <workers-list>" " [symmetrical|asymmetrical]", .function = set_interface_handoff_command_fn, }; /* *INDENT-ON* */ clib_error_t * handoff_init (vlib_main_t * vm) { handoff_main_t *hm = &handoff_main; vlib_thread_main_t *tm = vlib_get_thread_main (); clib_error_t *error; uword *p; if ((error = vlib_call_init_function (vm, threads_init))) return error; vlib_thread_registration_t *tr; /* Only the standard vnet worker threads are supported */ p = hash_get_mem (tm->thread_registrations_by_name, "workers"); if (p) { tr = (vlib_thread_registration_t *) p[0]; if (tr) { hm->num_workers = tr->count; hm->first_worker_index = tr->first_index; } } hm->frame_queue_index = ~0; return 0; } VLIB_INIT_FUNCTION (handoff_init); #endif /* CLIB_MARCH_VARIANT */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */