blob: 4874e73a45cabee220fb59666bf4e8aa5ffbbd1a [file] [log] [blame]
Neale Ranns0bfe5d82016-08-25 15:29:12 +01001/*
2 * Copyright (c) 2016 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15/**
16 * @brief
17 * Neighbour Adjacency sub-type. These adjs represent an L3 peer on a
18 * connected link.
19 */
20
21#ifndef __ADJ_NBR_H__
22#define __ADJ_NBR_H__
23
24#include <vnet/vnet.h>
25#include <vnet/adj/adj_types.h>
26#include <vnet/fib/fib_node.h>
27#include <vnet/dpo/dpo.h>
28
29/**
30 * @brief
31 * Add (and lock) a new or lock an existing neighbour adjacency
32 *
33 * @param nh_proto
34 * The protocol for the next-hop address (v4 or v6)
35 *
36 * @param link_type
37 * A description of the protocol of the packets that will forward
38 * through this adj. On an ethernet interface this is the MAC header's
39 * ether-type
40 *
41 * @param nh_addr
42 * The address of the next-hop/peer to send the packet to
43 *
44 * @param sw_if_index
45 * The interface on which the peer resides
46 */
47extern adj_index_t adj_nbr_add_or_lock(fib_protocol_t nh_proto,
Neale Ranns924d03a2016-10-19 08:25:46 +010048 vnet_link_t link_type,
Neale Ranns0bfe5d82016-08-25 15:29:12 +010049 const ip46_address_t *nh_addr,
50 u32 sw_if_index);
51
52/**
53 * @brief
54 * Add (and lock) a new or lock an existing neighbour adjacency
55 *
56 * @param nh_proto
57 * The protocol for the next-hop address (v4 or v6)
58 *
59 * @param link_type
60 * A description of the protocol of the packets that will forward
61 * through this adj. On an ethernet interface this is the MAC header's
62 * ether-type
63 *
64 * @param nh_addr
65 * The address of the next-hop/peer to send the packet to
66 *
67 * @param sw_if_index
68 * The interface on which the peer resides
69 *
70 * @param rewrite
71 * The rewrite to prepend to packets
72 */
73extern adj_index_t adj_nbr_add_or_lock_w_rewrite(fib_protocol_t nh_proto,
Neale Ranns924d03a2016-10-19 08:25:46 +010074 vnet_link_t link_type,
Neale Ranns0bfe5d82016-08-25 15:29:12 +010075 const ip46_address_t *nh_addr,
76 u32 sw_if_index,
77 u8 *rewrite);
Neale Ranns8f5fef22020-12-21 08:29:34 +000078
79/**
80 * Set the MTU on an adjacency
81 *
82 */
83extern void adj_nbr_set_mtu(adj_index_t ai, u16 mtu);
84
Neale Rannsb80c5362016-10-08 13:03:40 +010085/**
86 * @brief When adding a rewrite to an adjacency these are flags that
87 * apply to that rewrite
88 */
89typedef enum adj_nbr_rewrite_flag_t_
90{
91 ADJ_NBR_REWRITE_FLAG_NONE,
92
93 /**
94 * An indication that the rewrite is incomplete, i.e. that it describes the
95 * ARP/ND rewrite when probing.
96 */
97 ADJ_NBR_REWRITE_FLAG_INCOMPLETE = ADJ_NBR_REWRITE_FLAG_NONE,
98
99 /**
100 * An indication that the rewrite is complete, i.e. that it fully describes
Jim Thompsonf324dec2019-04-08 03:22:21 -0500101 * the link-layer addressing for the destintation.
Neale Rannsb80c5362016-10-08 13:03:40 +0100102 * The opposite of this is an incomplete rewrite that describes the ARP/ND
103 * rewrite when probing.
104 */
105 ADJ_NBR_REWRITE_FLAG_COMPLETE = (1 << 0),
106} adj_nbr_rewrite_flag_t;
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100107
108/**
109 * @brief
110 * Update the rewrite string for an existing adjacecny.
111 *
112 * @param
113 * The index of the adj to update
114 *
115 * @param
116 * The new rewrite
117 */
118extern void adj_nbr_update_rewrite(adj_index_t adj_index,
Neale Rannsb80c5362016-10-08 13:03:40 +0100119 adj_nbr_rewrite_flag_t flags,
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100120 u8 *rewrite);
121
122/**
123 * @brief
124 * Format aa incomplete neigbour (ARP) adjacency
125 */
126extern u8* format_adj_nbr_incomplete(u8* s, va_list *ap);
127
128/**
129 * @brief
130 * Format a neigbour (REWRITE) adjacency
131 */
132extern u8* format_adj_nbr(u8* s, va_list *ap);
133
134/**
Neale Rannsb80c5362016-10-08 13:03:40 +0100135 * @brief Walk the neighbour Adjacencies on a given interface
136 */
137extern void adj_nbr_walk (u32 sw_if_index,
138 fib_protocol_t adj_nh_proto,
139 adj_walk_cb_t cb,
140 void *ctx);
141/**
142 * @brief Walk the neighbour Adjacencies on a given interface with a given next-hop
143 */
144void
145adj_nbr_walk_nh (u32 sw_if_index,
146 fib_protocol_t adj_nh_proto,
147 const ip46_address_t *nh,
148 adj_walk_cb_t cb,
149 void *ctx);
150
151/**
152 * @brief Walk adjacencies on a link with a given v4 next-hop.
153 * that is visit the adjacencies with different link types.
154 */
155void
156adj_nbr_walk_nh4 (u32 sw_if_index,
157 const ip4_address_t *addr,
158 adj_walk_cb_t cb,
159 void *ctx);
160
161/**
162 * @brief Walk adjacencies on a link with a given v6 next-hop.
163 * that is visit the adjacencies with different link types.
164 */
165void
166adj_nbr_walk_nh6 (u32 sw_if_index,
167 const ip6_address_t *addr,
168 adj_walk_cb_t cb,
169 void *ctx);
170
171/**
Florin Corasf9d05682018-04-26 08:26:52 -0700172 * @brief Lookup neighbor adjancency.
173 */
174adj_index_t
175adj_nbr_find (fib_protocol_t nh_proto,
176 vnet_link_t link_type,
177 const ip46_address_t *nh_addr,
178 u32 sw_if_index);
179/**
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100180 * @brief
181 * Module initialisation
182 */
183extern void adj_nbr_module_init(void);
184
185/**
186 * @brief
187 * Return the size of the adjacency database. for testing purposes
188 */
189extern u32 adj_nbr_db_size(void);
190
191#endif