summaryrefslogtreecommitdiffstats
path: root/src/vnet/fib/fib_entry_src_rr.h
blob: e8592d9e53ba087470fd459e5efb0db92defbcc1 (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
/*
 * Copyright (c) 2016 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.
 */

#ifndef __FIB_ENTRY_SRC_RR_H__
#define __FIB_ENTRY_SRC_RR_H__

#include "fib_entry_src.h"

/*
 * the flags that an RR sourced entry can inherit from its cover
 */
#define FIB_ENTRY_FLAGS_RR_INHERITED (FIB_ENTRY_FLAG_CONNECTED | \
                                      FIB_ENTRY_FLAG_ATTACHED)

/*
 * fib_entry_src_rr_resolve_via_connected
 *
 * Resolve via a connected cover.
 */
void
fib_entry_src_rr_resolve_via_connected (fib_entry_src_t *src,
					const fib_entry_t *fib_entry,
					const fib_entry_t *cover);

/*
 * use the path-list of the cover, unless it would form a loop.
 * that is unless the cover is via this entry.
 * If a loop were to form it would be a 1 level loop (i.e. X via X),
 * and there would be 2 locks on the path-list; one since its used
 * by the cover, and 1 from here. The first lock will go when the
 * cover is removed, the second, and last, when the covered walk
 * occurs during the cover's removel - this is not a place where
 * we can handle last lock gone.
 * In short, don't let the loop form. The usual rules of 'we must
 * let it form so we know when it breaks' don't apply here, since
 * the loop will break when the cover changes, and this function
 * will be called again when that happens.
 */
void
fib_entry_src_rr_use_covers_pl (fib_entry_src_t *src,
                                const fib_entry_t *fib_entry,
                                const fib_entry_t *cover);


/*
 * fib_entry_src_rr_cover_update
 *
 * This entry's cover has changed. This entry
 * will need to re-inheret.
 */
fib_entry_src_cover_res_t
fib_entry_src_rr_cover_change (fib_entry_src_t *src,
			       const fib_entry_t *fib_entry);

/*
 * fib_entry_src_rr_cover_update
 *
 * This entry's cover has updated its forwarding info. This entry
 * will need to re-inheret.
 */
fib_entry_src_cover_res_t
fib_entry_src_rr_cover_update (fib_entry_src_t *src,
			       const fib_entry_t *fib_entry);

#endif
eof (*mp)); mp->_vl_msg_id = htons (VL_API_SW_INTERFACE_LACP_DETAILS + lm->msg_id_base); mp->sw_if_index = htonl (lacp_if->sw_if_index); /* These fields in network order already */ mp->actor_system_priority = lacp_if->actor_system_priority; mp->actor_key = lacp_if->actor_key; mp->actor_port_priority = lacp_if->actor_port_priority; mp->actor_port_number = lacp_if->actor_port_number; mp->actor_state = lacp_if->actor_state; clib_memcpy (mp->actor_system, lacp_if->actor_system, 6); mp->partner_system_priority = lacp_if->partner_system_priority; mp->partner_key = lacp_if->partner_key; mp->partner_port_priority = lacp_if->partner_port_priority; mp->partner_port_number = lacp_if->partner_port_number; mp->partner_state = lacp_if->partner_state; clib_memcpy (mp->partner_system, lacp_if->partner_system, 6); clib_memcpy (mp->interface_name, lacp_if->interface_name, MIN (ARRAY_LEN (mp->interface_name) - 1, strlen ((const char *) lacp_if->interface_name))); clib_memcpy (mp->bond_interface_name, lacp_if->bond_interface_name, MIN (ARRAY_LEN (mp->bond_interface_name) - 1, strlen ((const char *) lacp_if->bond_interface_name))); mp->rx_state = htonl (lacp_if->rx_state); mp->tx_state = htonl (lacp_if->tx_state); mp->mux_state = htonl (lacp_if->mux_state); mp->ptx_state = htonl (lacp_if->ptx_state); mp->context = context; vl_api_send_msg (reg, (u8 *) mp); } /** * @brief Message handler for lacp_dump API. * @param mp vl_api_lacp_dump_t * mp the api message */ void vl_api_sw_interface_lacp_dump_t_handler (vl_api_sw_interface_lacp_dump_t * mp) { int rv; vl_api_registration_t *reg; lacp_interface_details_t *lacpifs = NULL; lacp_interface_details_t *lacp_if = NULL; reg = vl_api_client_index_to_registration (mp->client_index); if (!reg) return; rv = lacp_dump_ifs (&lacpifs); if (rv) return; vec_foreach (lacp_if, lacpifs) { lacp_send_sw_interface_details (reg, lacp_if, mp->context); } vec_free (lacpifs); } /* Set up the API message handling tables */ #include <lacp/lacp.api.c> clib_error_t * lacp_plugin_api_hookup (vlib_main_t * vm) { lacp_main_t *lm = &lacp_main; api_main_t *am = &api_main; /* Ask for a correctly-sized block of API message decode slots */ lm->msg_id_base = setup_message_id_table (); /* Mark these APIs as mp safe */ am->is_mp_safe[VL_API_SW_INTERFACE_LACP_DUMP] = 1; am->is_mp_safe[VL_API_SW_INTERFACE_LACP_DETAILS] = 1; return 0; } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */