From cb9cadad578297ffd78fa8a33670bdf1ab669e7e Mon Sep 17 00:00:00 2001 From: Ed Warnicke Date: Tue, 8 Dec 2015 15:45:58 -0700 Subject: Initial commit of vpp code. Change-Id: Ib246f1fbfce93274020ee93ce461e3d8bd8b9f17 Signed-off-by: Ed Warnicke --- vnet/vnet/mcast/mcast_test.c | 149 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 vnet/vnet/mcast/mcast_test.c (limited to 'vnet/vnet/mcast/mcast_test.c') diff --git a/vnet/vnet/mcast/mcast_test.c b/vnet/vnet/mcast/mcast_test.c new file mode 100644 index 00000000000..4561d7cdc00 --- /dev/null +++ b/vnet/vnet/mcast/mcast_test.c @@ -0,0 +1,149 @@ +/* + * 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. + */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + /* convenience */ + vlib_main_t * vlib_main; + vnet_main_t * vnet_main; + mcast_main_t * mcast_main; +} mcast_test_main_t; + +mcast_test_main_t mcast_test_main; +vlib_node_registration_t mcast_prep_node; +vlib_node_registration_t mcast_recycle_node; + +static clib_error_t * +mcast_test_command_fn (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + u8 *rewrite_data; + mcast_test_main_t * mtm = &mcast_test_main; + mcast_main_t * mcm = mtm->mcast_main; + ip_adjacency_t adj; + u32 adj_index; + mcast_group_t * g; + mcast_group_member_t * member; + unformat_input_t _line_input, * line_input = &_line_input; + ip4_address_t dst_addr, zero; + ip4_main_t * im = &ip4_main; + ip_lookup_main_t * lm = &im->lookup_main; + + /* Get a line of input. */ + if (! unformat_user (input, unformat_line_input, line_input)) + return 0; + + pool_get (mcm->groups, g); + memset (g, 0, sizeof (*g)); + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + vnet_hw_interface_t *hw; + u32 next, sw_if_index; + + if (unformat (line_input, "%U", unformat_vnet_sw_interface, + mtm->vnet_main, &sw_if_index)) + { + vec_add2 (g->members, member, 1); + member->tx_sw_if_index = sw_if_index; + + hw = vnet_get_sup_hw_interface (mtm->vnet_main, + sw_if_index); + + next = vlib_node_add_next (mtm->vlib_main, + mcast_prep_node.index, + hw->output_node_index); + + /* Required to be the same next index... */ + vlib_node_add_next_with_slot (mtm->vlib_main, + mcast_recycle_node.index, + hw->output_node_index, next); + member->prep_and_recycle_node_next_index = next; + } + else + { + return unformat_parse_error (line_input); + } + } + + if (vec_len (g->members) == 0) + { + pool_put (mcm->groups, g); + vlib_cli_output (vm, "no group members specified"); + return 0; + } + + + adj.lookup_next_index = IP_LOOKUP_NEXT_REWRITE; + adj.mcast_group_index = g - mcm->groups; + rewrite_data = format (0, "abcdefg"); + + vnet_rewrite_for_tunnel + (mtm->vnet_main, + (u32)~0, /* tx_sw_if_index, we dont know yet */ + ip4_rewrite_node.index, + mcast_prep_node.index, + &adj.rewrite_header, + rewrite_data, vec_len(rewrite_data)); + + ip_add_adjacency (lm, &adj, 1 /* one adj */, + &adj_index); + + dst_addr.as_u32 = clib_host_to_net_u32 (0x0a000002); + zero.as_u32 = 0; + + ip4_add_del_route_next_hop (im, + IP4_ROUTE_FLAG_ADD, + &dst_addr, + 24 /* mask width */, + &zero /* no next hop */, + + 0, // next hop sw if index + 1, // weight + adj_index, + 0 /* explicit fib 0 */); + + return 0; +} + +static VLIB_CLI_COMMAND (mcast_test_command) = { + .path = "test mc", + .short_help = "test mc", + .function = mcast_test_command_fn, +}; + +clib_error_t *mcast_test_init (vlib_main_t *vm) +{ + mcast_test_main_t * mtm = &mcast_test_main; + + mtm->vlib_main = vm; + mtm->vnet_main = vnet_get_main(); + mtm->mcast_main = &mcast_main; + + return 0; +} + +VLIB_INIT_FUNCTION (mcast_test_init); -- cgit 1.2.3-korg