summaryrefslogtreecommitdiffstats
path: root/test/vpp_neighbor.py
blob: 5919cf8e48ba80d212985d95c7a5e0a65fcadce4 (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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
"""
  Neighbour Entries

  object abstractions for ARP and ND
"""

from socket import inet_pton, inet_ntop, AF_INET, AF_INET6
from vpp_object import *
from util import mactobinary


def find_nbr(test, sw_if_index, ip_addr, is_static=0, inet=AF_INET):
    nbrs = test.vapi.ip_neighbor_dump(sw_if_index,
                                      is_ipv6=1 if AF_INET6 == inet else 0)
    if inet == AF_INET:
        s = 4
    else:
        s = 16
    nbr_addr = inet_pton(inet, ip_addr)

    for n in nbrs:
        if nbr_addr == n.ip_address[:s] \
           and is_static == n.is_static:
            return True
    return False


class VppNeighbor(VppObject):
    """
    ARP Entry
    """

    def __init__(self, test, sw_if_index, mac_addr, nbr_addr,
                 af=AF_INET, is_static=False, is_no_fib_entry=0):
        self._test = test
        self.sw_if_index = sw_if_index
        self.mac_addr = mactobinary(mac_addr)
        self.af = af
        self.is_static = is_static
        self.is_no_fib_entry = is_no_fib_entry
        self.nbr_addr = inet_pton(af, nbr_addr)

    def add_vpp_config(self):
        self._test.vapi.ip_neighbor_add_del(
            self.sw_if_index,
            self.mac_addr,
            self.nbr_addr,
            is_add=1,
            is_ipv6=1 if AF_INET6 == self.af else 0,
            is_static=self.is_static,
            is_no_adj_fib=self.is_no_fib_entry)
        self._test.registry.register(self, self._test.logger)

    def remove_vpp_config(self):
        self._test.vapi.ip_neighbor_add_del(
            self.sw_if_index,
            self.mac_addr,
            self.nbr_addr,
            is_ipv6=1 if AF_INET6 == self.af else 0,
            is_add=0,
            is_static=self.is_static)

    def query_vpp_config(self):
        dump = self._test.vapi.ip_neighbor_dump(
            self.sw_if_index,
            is_ipv6=1 if AF_INET6 == self.af else 0)
        for n in dump:
            if self.nbr_addr == n.ip_address \
               and self.is_static == n.is_static:
                return True
        return False

    def __str__(self):
        return self.object_id()

    def object_id(self):
        return ("%d:%s"
                % (self.sw_if_index,
                   inet_ntop(self.af, self.nbr_addr)))
ass="n">node, next_index, to_next, n_left_to_next); while (n_left_from > 0 && n_left_to_next > 0) { gbp_policy_next_t next0; gbp_contract_key_t key0; gbp_contract_value_t value0 = { .as_u64 = ~0, }; u32 bi0, sw_if_index0; vlib_buffer_t *b0; next0 = GBP_POLICY_NEXT_DENY; 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); /* * determine the src and dst EPG */ sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_TX]; key0.gck_dst = gbp_port_to_epg (sw_if_index0); key0.gck_src = vnet_buffer2 (b0)->gbp.src_epg; if (~0 != key0.gck_src) { if (PREDICT_FALSE (key0.gck_src == key0.gck_dst)) { /* * intra-epg allowed */ next0 = vnet_l2_feature_next (b0, gpm->l2_output_feat_next, L2OUTPUT_FEAT_GBP_POLICY); } else { value0.as_u64 = gbp_acl_lookup (&key0); if (~0 != value0.gc_lc_index) { fa_5tuple_opaque_t pkt_5tuple0; u8 action0 = 0; u32 acl_pos_p0, acl_match_p0; u32 rule_match_p0, trace_bitmap0; u8 *h0, l2_len0; u16 ether_type0; u8 is_ip60 = 0; l2_len0 = vnet_buffer (b0)->l2.l2_len; h0 = vlib_buffer_get_current (b0); ether_type0 = clib_net_to_host_u16 (*(u16 *) (h0 + l2_len0 - 2)); is_ip60 = (ether_type0 == ETHERNET_TYPE_IP6) ? 1 : 0; /* * tests against the ACL */ acl_plugin_fill_5tuple_inline (gm-> acl_plugin.p_acl_main, value0.gc_lc_index, b0, is_ip60, /* is_input */ 0, /* is_l2_path */ 1, &pkt_5tuple0); acl_plugin_match_5tuple_inline (gm-> acl_plugin.p_acl_main, value0.gc_lc_index, &pkt_5tuple0, is_ip60, &action0, &acl_pos_p0, &acl_match_p0, &rule_match_p0, &trace_bitmap0); if (action0 > 0) next0 = vnet_l2_feature_next (b0, gpm->l2_output_feat_next, L2OUTPUT_FEAT_GBP_POLICY); } } } else { /* * the src EPG is not set when the packet arrives on an EPG * uplink interface and we do not need to apply policy */ next0 = vnet_l2_feature_next (b0, gpm->l2_output_feat_next, L2OUTPUT_FEAT_GBP_POLICY); } if (PREDICT_FALSE ((b0->flags & VLIB_BUFFER_IS_TRACED))) { gbp_policy_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t)); t->src_epg = key0.gck_src; t->dst_epg = key0.gck_dst; t->acl_index = value0.gc_acl_index; } /* 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); } return frame->n_vectors; } /* packet trace format function */ static u8 * format_gbp_policy_trace (u8 * s, va_list * args) { CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *); gbp_policy_trace_t *t = va_arg (*args, gbp_policy_trace_t *); s = format (s, "src:%d, dst:%d, acl:%d", t->src_epg, t->dst_epg, t->acl_index); return s; } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (gbp_policy_node) = { .function = gbp_policy, .name = "gbp-policy", .vector_size = sizeof (u32), .format_trace = format_gbp_policy_trace, .type = VLIB_NODE_TYPE_INTERNAL, .n_errors = ARRAY_LEN(gbp_policy_error_strings), .error_strings = gbp_policy_error_strings, .n_next_nodes = GBP_POLICY_N_NEXT, .next_nodes = { [GBP_POLICY_NEXT_DENY] = "error-drop", }, }; VLIB_NODE_FUNCTION_MULTIARCH (gbp_policy_node, gbp_policy); /* *INDENT-ON* */ static clib_error_t * gbp_policy_init (vlib_main_t * vm) { gbp_policy_main_t *gpm = &gbp_policy_main; clib_error_t *error = 0; /* Initialize the feature next-node indexes */ feat_bitmap_init_next_nodes (vm, gbp_policy_node.index, L2OUTPUT_N_FEAT, l2output_get_feat_names (), gpm->l2_output_feat_next); return error; } VLIB_INIT_FUNCTION (gbp_policy_init); /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */