summaryrefslogtreecommitdiffstats
path: root/test/vpp_vhost_interface.py
blob: fd2928eac1d38687c20ffb7ed4a0c73881a76521 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from vpp_interface import VppInterface


class VppVhostInterface(VppInterface):
    """VPP vhost interface."""

    def __init__(self, test, sock_filename, is_server=0, renumber=0,
                 disable_mrg_rxbuf=0, disable_indirect_desc=0, gso=0,
                 packed_ring=0, custom_dev_instance=0, use_custom_mac=0,
                 mac_address='', tag=''):

        """ Create VPP Vhost interface """
        super(VppVhostInterface, self).__init__(test)
        self.is_server = is_server
        self.sock_filename = sock_filename
        self.renumber = renumber
        self.disable_mrg_rxbuf = disable_mrg_rxbuf
        self.disable_indirect_desc = disable_indirect_desc
        self.gso = gso
        self.packed_ring = packed_ring
        self.custom_dev_instance = custom_dev_instance
        self.use_custom_mac = use_custom_mac
        self.mac_address = mac_address
        self.tag = tag

    def add_vpp_config(self):
        r = self.test.vapi.create_vhost_user_if(self.is_server,
                                                self.sock_filename,
                                                self.renumber,
                                                self.disable_mrg_rxbuf,
                                                self.disable_indirect_desc,
                                                self.gso,
                                                self.packed_ring,
                                                self.custom_dev_instance,
                                                self.use_custom_mac,
                                                self.mac_address,
                                                self.tag)
        self.set_sw_if_index(r.sw_if_index)

    def remove_vpp_config(self):
        self.test.vapi.delete_vhost_user_if(self.sw_if_index)

    def is_interface_config_in_dump(self, dump):
        for i in dump:
            if i.sw_if_index == self.sw_if_index:
                return True
        else:
            return False
/span>urpf; index_t ui; u32 *swi; ui = va_arg(*args, index_t); if (INDEX_INVALID != ui) { urpf = fib_urpf_list_get(ui); s = format(s, "uPRF-list:%d len:%d itfs:[", ui, vec_len(urpf->furpf_itfs)); vec_foreach(swi, urpf->furpf_itfs) { s = format(s, "%d, ", *swi); } s = format(s, "]"); } else { s = format(s, "uRPF-list: None"); } return (s); } index_t fib_urpf_list_alloc_and_lock (void) { fib_urpf_list_t *urpf; pool_get(fib_urpf_list_pool, urpf); clib_memset(urpf, 0, sizeof(*urpf)); urpf->furpf_locks++; return (urpf - fib_urpf_list_pool); } void fib_urpf_list_unlock (index_t ui) { fib_urpf_list_t *urpf; if (INDEX_INVALID == ui) return; urpf = fib_urpf_list_get(ui); urpf->furpf_locks--; if (0 == urpf->furpf_locks) { vec_free(urpf->furpf_itfs); pool_put(fib_urpf_list_pool, urpf); } } void fib_urpf_list_lock (index_t ui) { fib_urpf_list_t *urpf; urpf = fib_urpf_list_get(ui); urpf->furpf_locks++; } /** * @brief Append another interface to the list. */ void fib_urpf_list_append (index_t ui, u32 sw_if_index) { fib_urpf_list_t *urpf; urpf = fib_urpf_list_get(ui); vec_add1(urpf->furpf_itfs, sw_if_index); } /** * @brief Combine to interface lists */ void fib_urpf_list_combine (index_t ui1, index_t ui2) { fib_urpf_list_t *urpf1, *urpf2; urpf1 = fib_urpf_list_get(ui1); urpf2 = fib_urpf_list_get(ui2); vec_append(urpf1->furpf_itfs, urpf2->furpf_itfs); } /** * @brief Sort the interface indicies. * The sort is the first step in obtaining a unique list, so the order, * w.r.t. next-hop, interface,etc is not important. So a sort based on the * index is all we need. */ static int fib_urpf_itf_cmp_for_sort (void * v1, void * v2) { const adj_index_t *i1 = v1, *i2 = v2; return (*i2 < *i1); } /** * @brief Convert the uRPF list from the itf set obtained during the walk * to a unique list. */ void fib_urpf_list_bake (index_t ui) { fib_urpf_list_t *urpf; urpf = fib_urpf_list_get(ui); ASSERT(!(urpf->furpf_flags & FIB_URPF_LIST_BAKED)); if (vec_len(urpf->furpf_itfs) > 1) { u32 i, j; /* * cat list | sort | uniq > rpf_list */ /* sort */ vec_sort_with_function(urpf->furpf_itfs, fib_urpf_itf_cmp_for_sort); /* remove duplicates */ i = 0; for (j=1; j<vec_len(urpf->furpf_itfs); j++) if (urpf->furpf_itfs[i] != urpf->furpf_itfs[j]) urpf->furpf_itfs[++i] = urpf->furpf_itfs[j]; /* set the length of the vector to the number of unique itfs */ _vec_len(urpf->furpf_itfs) = i+1; } urpf->furpf_flags |= FIB_URPF_LIST_BAKED; } void fib_urpf_list_show_mem (void) { fib_show_memory_usage("uRPF-list", pool_elts(fib_urpf_list_pool), pool_len(fib_urpf_list_pool), sizeof(fib_urpf_list_t)); } static clib_error_t * show_fib_urpf_list_command (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { index_t ui; if (unformat (input, "%d", &ui)) { /* * show one in detail */ if (!pool_is_free_index(fib_urpf_list_pool, ui)) { vlib_cli_output (vm, "%d@%U", ui, format_fib_urpf_list, ui); } else { vlib_cli_output (vm, "uRPF %d invalid", ui); } } else { /* * show all */ vlib_cli_output (vm, "FIB uRPF Entries:"); pool_foreach_index(ui, fib_urpf_list_pool, ({ vlib_cli_output (vm, "%d@%U", ui, format_fib_urpf_list, ui); })); } return (NULL); } /* *INDENT-OFF* */ /*? * The '<em>sh fib uRPF [index] </em>' command displays the uRPF lists * * @cliexpar * @cliexstart{show fib uRPF} * FIB uRPF Entries: * 0@uPRF-list:0 len:0 itfs:[] * 1@uPRF-list:1 len:2 itfs:[1, 2, ] * 2@uPRF-list:2 len:1 itfs:[3, ] * 3@uPRF-list:3 len:1 itfs:[9, ] * @cliexend ?*/ VLIB_CLI_COMMAND (show_fib_urpf_list, static) = { .path = "show fib uRPF", .function = show_fib_urpf_list_command, .short_help = "show fib uRPF", }; /* *INDENT-OFF* */