summaryrefslogtreecommitdiffstats
path: root/dpdk
AgeCommit message (Expand)AuthorFilesLines
2018-02-23DPDK: disabling DPAA since broken for 18.02Marco Varlese1-0/+6
2018-02-21dpdk: fix building dpdk debug images with dpdk 18.02Damjan Marion1-1/+1
2018-02-19dpdk: bump to 18.02Damjan Marion1-1/+1
2018-02-15dpdk: add support for DPDK 18.02, deprecate 17.08Damjan Marion1-48/+5
2018-01-09Patch ENA PMD to skip setting tx flags in rx pathMatthew Smith1-0/+21
2017-12-18Provide useful output when installed vpp-dpdk version is incorrectEd Warnicke1-0/+5
2017-12-05dpdk/ipsec: multiple fixesSergio Gonzalez Monroy1-0/+101
2017-11-30dpdk: bump to 17.11Damjan Marion1-2/+2
2017-11-29Revert "Dpdk: 17.08 tarball updated 11/27"Damjan Marion1-4/+3
2017-11-29Dpdk: 17.08 tarball updated 11/27Ed Kern1-3/+4
2017-11-20dpdk: add support for DPDK 17.11Damjan Marion1-1/+6
2017-11-13Reduce number of parallel buildsDamjan Marion1-1/+1
2017-11-05dpdk: build nasm from sourceSergio Gonzalez Monroy1-1/+21
2017-10-10dpdk: patch to support bonded interface for MLX NICSteve Shin2-1/+64
2017-10-05dpdk/ipsec: rework plus improved cli commandsSergio Gonzalez Monroy1-2/+2
2017-09-12Add option to build without multi-buffer crypto.Thomas F Herbert1-2/+3
2017-09-11Improved arm64 chip detectionBrian Brooks1-11/+46
2017-08-31Native arm64 build: dpdk/Makefile changeBrian Brooks1-2/+11
2017-08-25dpdk: bump to dpdk 17.08, remove support for dpdk 17.02Damjan Marion1-3/+2
2017-08-25dpdk: required changes for 17.08Sergio Gonzalez Monroy1-14/+33
2017-08-22dpdk: define MACHINE before it is usedDamjan Marion1-2/+1
2017-08-21dpdk: disable tun/tap PMDDamjan Marion1-0/+1
2017-08-15Previous version was still downloading, unpacking and building IPSEC / AESMarco Varlese1-6/+12
2017-08-14dpdk: force libdir for isa-l crypto librarySergio Gonzalez Monroy1-1/+2
2017-08-14Added MD5SUM for DPDK 17.08 tarball as a first step towards migrationMarco Varlese1-0/+1
2017-08-09dpdk: only build SW crypto for x86_64 platformsSergio Gonzalez Monroy1-3/+10
2017-07-14dpdk: update buildSergio Gonzalez Monroy1-28/+31
2017-06-24make: Fix parallel building with some container platforms (VPP-880)Chris Luke1-1/+7
2017-05-31Revert "dpdk: build sw cryptodev support with make verify"Peter Mikus1-9/+4
2017-05-30dpdk: build sw cryptodev support with make verifySergio Gonzalez Monroy1-4/+9
2017-05-17dpdk: disable 16-bit descriptors for X710/XL710Damjan Marion1-2/+1
2017-05-15dpdk: revert dpdk 17.05 change which causes virtio issuesDamjan Marion5-244/+59
2017-05-11dpdk: bump to dpdk 17.05Damjan Marion1-4/+5
2017-04-25Add support for 32-bit x86 compilation in MakefilesDamjan Marion1-3/+5
2017-03-31dpdk: add support for Mellanox ConnectX-5 devicesDamjan Marion9-1/+1703
2017-03-22dpdk: fix plugin linking with sw crypto librariesSergio Gonzalez Monroy1-19/+26
2017-02-28dpdk: retire support for dpdk 16.07Damjan Marion12-41832/+0
2017-02-21cryptodev: Automatically download and build ISA-L Crypto libraryRadu Nicolau1-1/+20
2017-02-20dpdk: updated build to automatically download Intel(R) Multi-Buffer Crypto fo...Radu Nicolau1-0/+22
2017-02-17dpdk: bump to DPDK 17.02Damjan Marion1-2/+3
2017-02-07Multiple platofrm support for dpdk/Makefile, fix optimizationsDamjan Marion1-27/+25
2017-02-02ENIC driver patch to fix MAC address add and removeSteve Shin2-1/+123
2017-01-31Bump up PKG_SUFFIX to vpp3Steve Shin1-1/+1
2017-01-30This patch fixes a bug in replaying MAC address to the hardwareSteve Shin1-0/+83
2017-01-27dpdk: rework cryptodev ipsec build and setupSergio Gonzalez Monroy1-5/+5
2017-01-21Fix cosmetic issue in dpdk/MakefileDamjan Marion1-1/+1
2017-01-20Add dpdk development packagingDamjan Marion8-32/+213
2017-01-02dpdk: do not build igb_uio moduleDamjan Marion1-0/+1
2016-12-26dpdk: Add support for Mellanox ConnectX-4 devicesDamjan Marion1-1/+3
2016-11-30dpdk patch: virtio: tx with can_push when VERSION_1 is setPierre Pfister1-0/+38
> frame) { u32 n_left_from, *from, *to_next; l2_patch_next_t next_index; l2_patch_main_t *l2pm = &l2_patch_main; vlib_node_t *n = vlib_get_node (vm, l2_patch_node.index); u32 node_counter_base_index = n->error_heap_index; vlib_error_main_t *em = &vm->error_main; from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; next_index = node->cached_next_index; while (n_left_from > 0) { u32 n_left_to_next; vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); while (n_left_from >= 4 && n_left_to_next >= 2) { u32 bi0, bi1; vlib_buffer_t *b0, *b1; u32 next0, next1; u32 sw_if_index0, sw_if_index1; /* Prefetch next iteration. */ { vlib_buffer_t *p2, *p3; p2 = vlib_get_buffer (vm, from[2]); p3 = vlib_get_buffer (vm, from[3]); vlib_prefetch_buffer_header (p2, LOAD); vlib_prefetch_buffer_header (p3, LOAD); /* So stupid / simple, we don't need to prefetch data */ } /* speculatively enqueue b0 and b1 to the current next frame */ to_next[0] = bi0 = from[0]; to_next[1] = bi1 = from[1]; from += 2; to_next += 2; n_left_from -= 2; n_left_to_next -= 2; b0 = vlib_get_buffer (vm, bi0); b1 = vlib_get_buffer (vm, bi1); sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX]; sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_RX]; ASSERT (l2pm->tx_next_by_rx_sw_if_index[sw_if_index0] != ~0); ASSERT (l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index0] != ~0); ASSERT (l2pm->tx_next_by_rx_sw_if_index[sw_if_index1] != ~0); ASSERT (l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index1] != ~0); next0 = l2pm->tx_next_by_rx_sw_if_index[sw_if_index0]; next1 = l2pm->tx_next_by_rx_sw_if_index[sw_if_index1]; vnet_buffer (b0)->sw_if_index[VLIB_TX] = l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index0]; vnet_buffer (b1)->sw_if_index[VLIB_TX] = l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index1]; if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE))) { if (b0->flags & VLIB_BUFFER_IS_TRACED) { l2_patch_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t)); t->rx_sw_if_index = sw_if_index0; t->tx_sw_if_index = l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index0]; } if (b1->flags & VLIB_BUFFER_IS_TRACED) { l2_patch_trace_t *t = vlib_add_trace (vm, node, b1, sizeof (*t)); t->rx_sw_if_index = sw_if_index1; t->tx_sw_if_index = l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index1]; } } /* verify speculative enqueues, maybe switch current next frame */ vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next, n_left_to_next, bi0, bi1, next0, next1); } while (n_left_from > 0 && n_left_to_next > 0) { u32 bi0; vlib_buffer_t *b0; u32 next0; u32 sw_if_index0; /* speculatively enqueue b0 to the current next frame */ bi0 = from[0]; to_next[0] = bi0; from += 1; to_next += 1; n_left_from -= 1; n_left_to_next -= 1; b0 = vlib_get_buffer (vm, bi0); sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX]; ASSERT (l2pm->tx_next_by_rx_sw_if_index[sw_if_index0] != ~0); ASSERT (l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index0] != ~0); next0 = l2pm->tx_next_by_rx_sw_if_index[sw_if_index0]; vnet_buffer (b0)->sw_if_index[VLIB_TX] = l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index0]; if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE))) { if (b0->flags & VLIB_BUFFER_IS_TRACED) { l2_patch_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t)); t->rx_sw_if_index = sw_if_index0; t->tx_sw_if_index = l2pm->tx_sw_if_index_by_rx_sw_if_index[sw_if_index0]; } } /* verify speculative enqueue, maybe switch current next frame */ vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, n_left_to_next, bi0, next0); } vlib_put_next_frame (vm, node, next_index, n_left_to_next); } em->counters[node_counter_base_index + L2_PATCH_ERROR_PATCHED] += frame->n_vectors; return frame->n_vectors; } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (l2_patch_node, static) = { .function = l2_patch_node_fn, .name = "l2-patch", .vector_size = sizeof (u32), .format_trace = format_l2_patch_trace, .type = VLIB_NODE_TYPE_INTERNAL, .n_errors = ARRAY_LEN(l2_patch_error_strings), .error_strings = l2_patch_error_strings, .n_next_nodes = L2_PATCH_N_NEXT, /* edit / add dispositions here */ .next_nodes = { [L2_PATCH_NEXT_DROP] = "error-drop", }, }; /* *INDENT-ON* */ VLIB_NODE_FUNCTION_MULTIARCH (l2_patch_node, l2_patch_node_fn) int vnet_l2_patch_add_del (u32 rx_sw_if_index, u32 tx_sw_if_index, int is_add) { l2_patch_main_t *l2pm = &l2_patch_main; vnet_hw_interface_t *rxhi, *txhi; u32 tx_next_index; /* * We assume that the API msg handler has used 2x VALIDATE_SW_IF_INDEX * macros... */ rxhi = vnet_get_sup_hw_interface (l2pm->vnet_main, rx_sw_if_index); /* Make sure caller didn't pass a vlan subif, etc. */ if (rxhi->sw_if_index != rx_sw_if_index) return VNET_API_ERROR_INVALID_SW_IF_INDEX; txhi = vnet_get_sup_hw_interface (l2pm->vnet_main, tx_sw_if_index); if (txhi->sw_if_index != tx_sw_if_index) return VNET_API_ERROR_INVALID_SW_IF_INDEX_2; if (is_add) { tx_next_index = vlib_node_add_next (l2pm->vlib_main, l2_patch_node.index, txhi->output_node_index); vec_validate_init_empty (l2pm->tx_next_by_rx_sw_if_index, rx_sw_if_index, ~0); l2pm->tx_next_by_rx_sw_if_index[rx_sw_if_index] = tx_next_index; vec_validate_init_empty (l2pm->tx_sw_if_index_by_rx_sw_if_index, rx_sw_if_index, ~0); l2pm->tx_sw_if_index_by_rx_sw_if_index[rx_sw_if_index] = txhi->sw_if_index; ethernet_set_flags (l2pm->vnet_main, rxhi->hw_if_index, ETHERNET_INTERFACE_FLAG_ACCEPT_ALL); vnet_feature_enable_disable ("device-input", "l2-patch", rxhi->hw_if_index, 1, 0, 0); } else { ethernet_set_flags (l2pm->vnet_main, rxhi->hw_if_index, 0 /* disable promiscuous mode */ ); vnet_feature_enable_disable ("device-input", "l2-patch", rxhi->hw_if_index, 0, 0, 0); if (vec_len (l2pm->tx_next_by_rx_sw_if_index) > rx_sw_if_index) { l2pm->tx_next_by_rx_sw_if_index[rx_sw_if_index] = ~0; l2pm->tx_sw_if_index_by_rx_sw_if_index[rx_sw_if_index] = ~0; } } return 0; } static clib_error_t * test_patch_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { l2_patch_main_t *l2pm = &l2_patch_main; unformat_input_t _line_input, *line_input = &_line_input; u32 rx_sw_if_index, tx_sw_if_index; int rv; int rx_set = 0; int tx_set = 0; int is_add = 1; clib_error_t *error = NULL; /* Get a line of input. */ if (!unformat_user (input, unformat_line_input, line_input)) return 0; while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "rx %U", unformat_vnet_sw_interface, l2pm->vnet_main, &rx_sw_if_index)) rx_set = 1; else if (unformat (line_input, "tx %U", unformat_vnet_sw_interface, l2pm->vnet_main, &tx_sw_if_index)) tx_set = 1; else if (unformat (line_input, "del")) is_add = 0; else break; } if (rx_set == 0) { error = clib_error_return (0, "rx interface not set"); goto done; } if (tx_set == 0) { error = clib_error_return (0, "tx interface not set"); goto done; } rv = vnet_l2_patch_add_del (rx_sw_if_index, tx_sw_if_index, is_add); switch (rv) { case 0: break; case VNET_API_ERROR_INVALID_SW_IF_INDEX: error = clib_error_return (0, "rx interface not a physical port"); goto done; case VNET_API_ERROR_INVALID_SW_IF_INDEX_2: error = clib_error_return (0, "tx interface not a physical port"); goto done; default: error = clib_error_return (0, "WARNING: vnet_l2_patch_add_del returned %d", rv); goto done; } done: unformat_free (line_input); return error; } /*? * Create or delete a Layer 2 patch. * * @cliexpar * @cliexstart{test l2patch rx <intfc> tx <intfc> [del]} * @cliexend * @todo This is incomplete. This needs a detailed description and a * practical example. ?*/ /* *INDENT-OFF* */ VLIB_CLI_COMMAND (test_patch_command, static) = { .path = "test l2patch", .short_help = "test l2patch rx <intfc> tx <intfc> [del]", .function = test_patch_command_fn, }; /* *INDENT-ON* */ /** Display the contents of the l2patch table. */ static clib_error_t * show_l2patch (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { l2_patch_main_t *l2pm = &l2_patch_main; u32 rx_sw_if_index; u32 no_entries = 1; ASSERT (vec_len (l2pm->tx_next_by_rx_sw_if_index) == vec_len (l2pm->tx_sw_if_index_by_rx_sw_if_index)); for (rx_sw_if_index = 0; rx_sw_if_index < vec_len (l2pm->tx_sw_if_index_by_rx_sw_if_index); rx_sw_if_index++) { u32 tx_sw_if_index = l2pm->tx_sw_if_index_by_rx_sw_if_index[rx_sw_if_index]; if (tx_sw_if_index != ~0) { no_entries = 0; vlib_cli_output (vm, "%26U -> %U", format_vnet_sw_if_index_name, l2pm->vnet_main, rx_sw_if_index, format_vnet_sw_if_index_name, l2pm->vnet_main, tx_sw_if_index); } } if (no_entries) vlib_cli_output (vm, "no l2patch entries"); return 0; } /*? * Show Layer 2 patch entries. * * @cliexpar * @cliexstart{show l2patch} * @cliexend * @todo This is incomplete. This needs a detailed description and a * practical example. ?*/ /* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_l2patch_cli, static) = { .path = "show l2patch", .short_help = "Show l2 interface cross-connect entries", .function = show_l2patch, }; /* *INDENT-ON* */ clib_error_t * l2_patch_init (vlib_main_t * vm) { l2_patch_main_t *mp = &l2_patch_main; mp->vlib_main = vm; mp->vnet_main = vnet_get_main (); return 0; } VLIB_INIT_FUNCTION (l2_patch_init); /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */