FD.io VPP  v20.01-48-g3e0dafb74
Vector Packet Processing
adj_delegate.c
Go to the documentation of this file.
1 /*
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 #include <vnet/adj/adj_delegate.h>
17 #include <vnet/adj/adj.h>
18 #include <vnet/adj/adj_internal.h>
19 
20 /*
21  * The per-type vector of virtual function tables
22  */
24 
25 /**
26  * The value of the last dynamically allocated delegate value
27  */
29 
30 static adj_delegate_t *
33  u32 *index)
34 {
35  adj_delegate_t *delegate;
36  int ii;
37 
38  ii = 0;
39  vec_foreach(delegate, adj->ia_delegates)
40  {
41  if (delegate->ad_type == type)
42  {
43  if (NULL != index)
44  *index = ii;
45 
46  return (delegate);
47  }
48  else
49  {
50  ii++;
51  }
52  }
53 
54  return (NULL);
55 }
56 
60 {
61  return (adj_delegate_find_i(adj, type, NULL));
62 }
63 
64 void
67 {
68  ip_adjacency_t *adj;
69  adj_delegate_t *aed;
70  u32 index = ~0;
71 
72  adj = adj_get(ai);
73  aed = adj_delegate_find_i(adj, type, &index);
74 
75  ASSERT(NULL != aed);
76 
77  vec_del1(adj->ia_delegates, index);
78 }
79 
80 static int
82  void * v2)
83 {
84  adj_delegate_t *aed1 = v1, *aed2 = v2;
85 
86  return (aed1->ad_type - aed2->ad_type);
87 }
88 
89 static void
92  index_t adi)
93 
94 {
95  adj_delegate_t aed = {
97  .ad_type = adt,
98  .ad_index = adi,
99  };
100 
101  vec_add1(adj->ia_delegates, aed);
104 }
105 
106 int
109  index_t adi)
110 {
111  adj_delegate_t *delegate;
112 
113  delegate = adj_delegate_get(adj, adt);
114 
115  if (NULL == delegate)
116  {
117  adj_delegate_init(adj, adt, adi);
118  }
119  else
120  {
121  return (-1);
122  }
123 
124  return (0);
125 }
126 
127 void
129 {
130  adj_delegate_t *aed;
131 
132  vec_foreach(aed, adj->ia_delegates)
133  {
134  if (ad_vfts[aed->ad_type].adv_adj_deleted)
135  {
136  ad_vfts[aed->ad_type].adv_adj_deleted(aed);
137  }
138  }
139 
141 }
142 
143 void
145 {
146  adj_delegate_vft_t *vft;
147 
148  vec_foreach(vft, ad_vfts)
149  {
150  if (vft->adv_adj_created)
151  {
152  vft->adv_adj_created(adj_get_index(adj));
153  }
154  }
155 }
156 
157 u8*
159 {
160  adj_delegate_t *aed;
161 
162  vec_foreach(aed, adj->ia_delegates)
163  {
164  if (ad_vfts[aed->ad_type].adv_format)
165  {
166  s = format(s, "{");
167  s = ad_vfts[aed->ad_type].adv_format(aed, s);
168  s = format(s, "}");
169  }
170  else
171  {
172  s = format(s, "{unknown delegate}");
173  }
174  }
175 
176  return (s);
177 }
178 
179 /**
180  * adj_delegate_register_type
181  *
182  * Register the function table for a given type
183  */
184 void
186  const adj_delegate_vft_t *vft)
187 {
188  /*
189  * assert that one only registration is made per-node type
190  */
191  if (vec_len(ad_vfts) > type)
192  ASSERT(NULL == ad_vfts[type].adv_adj_deleted);
193 
194  vec_validate(ad_vfts, type);
195  ad_vfts[type] = *vft;
196 }
197 
198 /**
199  * adj_delegate_register_new_type
200  *
201  * Register the function table for a new type
202  */
205 {
207 
208  type = ++ad_max_id;
209 
210  vec_validate(ad_vfts, type);
211  ad_vfts[type] = *vft;
212 
213  return (type);
214 }
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:440
adj_delegate_type_t ad_type
The delagate type.
Definition: adj_delegate.h:60
static int adj_delegate_cmp_for_sort(void *v1, void *v2)
Definition: adj_delegate.c:81
void adj_delegate_adj_deleted(ip_adjacency_t *adj)
Definition: adj_delegate.c:128
adj_delegate_adj_deleted_t adv_adj_deleted
Definition: adj_delegate.h:90
static adj_delegate_t * adj_delegate_find_i(const ip_adjacency_t *adj, adj_delegate_type_t type, u32 *index)
Definition: adj_delegate.c:31
void adj_delegate_adj_created(ip_adjacency_t *adj)
Definition: adj_delegate.c:144
#define NULL
Definition: clib.h:58
IP unicast adjacency.
Definition: adj.h:221
static adj_delegate_vft_t * ad_vfts
Definition: adj_delegate.c:23
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
Definition: dpo.h:41
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:523
static adj_delegate_type_t ad_max_id
The value of the last dynamically allocated delegate value.
Definition: adj_delegate.c:28
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
unsigned char u8
Definition: types.h:56
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
static ip_adjacency_t * adj_get(adj_index_t adj_index)
Get a pointer to an adjacency object from its index.
Definition: adj.h:431
#define ADJ_DELEGATE_LAST
Definition: adj_delegate.h:45
Adj delegate.
Definition: adj_delegate.h:50
unsigned int u32
Definition: types.h:88
vl_api_fib_path_type_t type
Definition: fib_types.api:123
int adj_delegate_add(ip_adjacency_t *adj, adj_delegate_type_t adt, index_t adi)
Add a delegate to an adjacency.
Definition: adj_delegate.c:107
static adj_index_t adj_get_index(const ip_adjacency_t *adj)
Get a pointer to an adjacency object from its index.
Definition: adj_internal.h:101
enum adj_delegate_type_t_ adj_delegate_type_t
A Delagate is a means to implement the Delagation design pattern; the extension of an object&#39;s functi...
adj_index_t ad_adj_index
The ADJ entry object to which the delagate is attached.
Definition: adj_delegate.h:55
#define vec_del1(v, i)
Delete the element at index I.
Definition: vec.h:806
static void adj_delegate_init(ip_adjacency_t *adj, adj_delegate_type_t adt, index_t adi)
Definition: adj_delegate.c:90
u32 adj_index_t
An index for adjacencies.
Definition: adj_types.h:30
#define ASSERT(truth)
void adj_delegate_register_type(adj_delegate_type_t type, const adj_delegate_vft_t *vft)
adj_delegate_register_type
Definition: adj_delegate.c:185
adj_delegate_type_t adj_delegate_register_new_type(const adj_delegate_vft_t *vft)
adj_delegate_register_new_type
Definition: adj_delegate.c:204
adj_delegate_t * adj_delegate_get(const ip_adjacency_t *adj, adj_delegate_type_t type)
Get a delegate from an adjacency.
Definition: adj_delegate.c:58
adj_delegate_format_t adv_format
Definition: adj_delegate.h:89
u8 * adj_delegate_format(u8 *s, ip_adjacency_t *adj)
Definition: adj_delegate.c:158
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
Definition: vec.h:983
An ADJ delegate virtual function table.
Definition: adj_delegate.h:88
#define vec_foreach(var, vec)
Vector iterator.
void adj_delegate_remove(adj_index_t ai, adj_delegate_type_t type)
Remove a delegate from an adjacency.
Definition: adj_delegate.c:65
struct adj_delegate_t_ * ia_delegates
more control plane members that do not fit on the first cacheline
Definition: adj.h:327
adj_delegate_adj_created_t adv_adj_created
Definition: adj_delegate.h:91