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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 #include <vnet/adj/adj_delegate.h>
17 #include <vnet/adj/adj.h>
18 #include <vnet/adj/adj_internal.h>
20 static adj_delegate_t *
21 adj_delegate_find_i (const ip_adjacency_t *adj,
22 adj_delegate_type_t type,
25 adj_delegate_t *delegate;
29 vec_foreach(delegate, adj->ia_delegates)
31 if (delegate->ad_type == type)
48 adj_delegate_get (const ip_adjacency_t *adj,
49 adj_delegate_type_t type)
51 return (adj_delegate_find_i(adj, type, NULL));
55 adj_delegate_remove (ip_adjacency_t *adj,
56 adj_delegate_type_t type)
61 aed = adj_delegate_find_i(adj, type, &index);
65 vec_del1(adj->ia_delegates, index);
69 adj_delegate_cmp_for_sort (void * v1,
72 adj_delegate_t *delegate1 = v1, *delegate2 = v2;
74 return (delegate1->ad_type - delegate2->ad_type);
78 adj_delegate_init (ip_adjacency_t *adj,
79 adj_delegate_type_t type)
82 adj_delegate_t delegate = {
83 .ad_adj_index = adj_get_index(adj),
87 vec_add1(adj->ia_delegates, delegate);
88 vec_sort_with_function(adj->ia_delegates,
89 adj_delegate_cmp_for_sort);
93 adj_delegate_find_or_add (ip_adjacency_t *adj,
94 adj_delegate_type_t adt)
96 adj_delegate_t *delegate;
98 delegate = adj_delegate_get(adj, adt);
100 if (NULL == delegate)
102 adj_delegate_init(adj, adt);
105 return (adj_delegate_get(adj, adt));
109 * typedef for printing a delegate
111 typedef u8 * (*adj_delegate_format_t)(const adj_delegate_t *aed,
115 * Print a delegate that represents BFD tracking
118 adj_delegate_fmt_bfd (const adj_delegate_t *aed,
121 s = format(s, "BFD:[state:%d index:%d]",
129 * A delegate type to formatter map
131 static adj_delegate_format_t aed_formatters[] =
133 [ADJ_DELEGATE_BFD] = adj_delegate_fmt_bfd,
137 format_adj_deletegate (u8 * s, va_list * args)
141 aed = va_arg (*args, adj_delegate_t *);
143 return (aed_formatters[aed->ad_type](aed, s));