FD.io VPP  v16.12-rc0-308-g931be3a
Vector Packet Processing
fib_entry_cover.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 
17 #include <vnet/fib/fib_entry_src.h>
18 #include <vnet/fib/fib_node_list.h>
19 
20 u32
22  fib_node_index_t covered)
23 {
24  FIB_ENTRY_DBG(cover, "cover-track %d", covered);
25 
26  ASSERT(fib_entry_get_index(cover) != covered);
27 
28  if (FIB_NODE_INDEX_INVALID == cover->fe_covered)
29  {
31  }
32 
33  return (fib_node_list_push_front(cover->fe_covered,
35  covered));
36 }
37 
38 void
40  u32 tracked_index)
41 {
42  FIB_ENTRY_DBG(cover, "cover-untrack @ %d", tracked_index);
43 
44  if (FIB_NODE_INDEX_INVALID == cover->fe_covered)
45  return;
46 
47  fib_node_list_remove(cover->fe_covered, tracked_index);
48 
49  if (0 == fib_node_list_get_size(cover->fe_covered))
50  {
52  }
53 }
54 
55 /**
56  * Internal struct to hold user supplied paraneters for the cover walk
57  */
61  void *ctx;
63 
64 static int
66  void *args)
67 {
69 
70  ctx->walk(ctx->cover, depend->fnp_index, ctx->ctx);
71 
72  /* continue */
73  return (1);
74 }
75 
76 void
79  void *args)
80 {
81  if (FIB_NODE_INDEX_INVALID != cover->fe_covered)
82  {
84  .cover = cover,
85  .walk = walk,
86  .ctx = args,
87  };
88 
91  &ctx);
92  }
93 }
94 
95 u32
97 {
98  if (FIB_NODE_INDEX_INVALID != cover->fe_covered)
99  return (fib_node_list_get_size(cover->fe_covered));
100  return (0);
101 }
102 
104  u8 *s;
106 
107 static int
109  fib_node_index_t covered,
110  void *args)
111 {
113 
114  ctx->s = format(ctx->s, "%d, ", covered);
115 
116  /* continue */
117  return (1);
118 }
119 
120 u8*
122  u8 *s)
123 {
125  .s = s,
126  };
127 
128  fib_entry_cover_walk(fib_entry,
130  &ctx);
131 
132  return (ctx.s);
133 }
134 
135 static int
137  fib_node_index_t covered,
138  void *args)
139 {
140  fib_node_index_t new_cover;
141 
142  /*
143  * The 3 entries involved here are:
144  * cover - the least specific. It will cover both the others
145  * new_cover - the enty just inserted below the cover
146  * covered - the entry that was tracking the cover.
147  *
148  * The checks below are to determine if new_cover is a cover for covered.
149  */
150  new_cover = pointer_to_uword(args);
151 
152  if (FIB_NODE_INDEX_INVALID == new_cover)
153  {
154  /*
155  * nothing has been inserted, which implies the cover was removed.
156  * 'cover' is thus the new cover.
157  */
158  fib_entry_cover_changed(covered);
159  }
160  else if (new_cover != covered)
161  {
162  fib_prefix_t pfx_covered, pfx_new_cover;
163 
164  fib_entry_get_prefix(covered, &pfx_covered);
165  fib_entry_get_prefix(new_cover, &pfx_new_cover);
166 
167  if (fib_prefix_is_cover(&pfx_new_cover, &pfx_covered))
168  {
169  fib_entry_cover_changed(covered);
170  }
171  }
172  /* continue */
173  return (1);
174 }
175 
176 void
178  fib_node_index_t covered)
179 {
181 
182  cover = fib_entry_get(cover_index);
183 
184  fib_entry_cover_walk(cover,
186  uword_to_pointer(covered, void*));
187 }
188 
189 static int
191  fib_node_index_t covered,
192  void *args)
193 {
194  fib_entry_cover_updated(covered);
195 
196  /* continue */
197  return (1);
198 }
199 
200 void
202 {
203  fib_entry_cover_walk(fib_entry,
205  NULL);
206 }
static int fib_entry_cover_change_one(fib_entry_t *cover, fib_node_index_t covered, void *args)
static int fib_entry_cover_update_one(fib_entry_t *cover, fib_node_index_t covered, void *args)
#define FIB_ENTRY_DBG(_e, _fmt, _args...)
Debug macro.
Definition: fib_entry_src.h:42
An entry in a FIB table.
Definition: fib_entry.h:360
void fib_entry_cover_untrack(fib_entry_t *cover, u32 tracked_index)
int(* fib_entry_covered_walk_t)(fib_entry_t *cover, fib_node_index_t covered, void *ctx)
callback function used when walking the covered entries
void fib_entry_get_prefix(fib_node_index_t fib_entry_index, fib_prefix_t *pfx)
Definition: fib_entry.c:1476
#define NULL
Definition: clib.h:55
void fib_node_list_walk(fib_node_list_t list, fib_node_list_walk_cb_t fn, void *args)
Walk the list of node.
struct fib_entry_cover_list_format_ctx_t_ fib_entry_cover_list_format_ctx_t
u32 fib_entry_cover_track(fib_entry_t *cover, fib_node_index_t covered)
fib_node_index_t fnp_index
node&#39;s index
Definition: fib_node.h:149
void fib_node_list_remove(fib_node_list_t list, u32 sibling)
Aggregrate type for a prefix.
Definition: fib_types.h:149
fib_node_index_t fib_entry_get_index(const fib_entry_t *fib_entry)
Definition: fib_entry.c:56
int fib_prefix_is_cover(const fib_prefix_t *p1, const fib_prefix_t *p2)
Compare two prefixes for covering relationship.
Definition: fib_types.c:103
A representation of one pointer to another node.
Definition: fib_node.h:141
struct fib_enty_cover_walk_ctx_t_ fib_enty_cover_walk_ctx_t
Internal struct to hold user supplied paraneters for the cover walk.
static uword pointer_to_uword(const void *p)
Definition: types.h:131
static int fib_entry_covered_list_format_one(fib_entry_t *cover, fib_node_index_t covered, void *args)
fib_node_list_t fe_covered
Dependency list of covered entries.
Definition: fib_entry.h:408
u32 fib_entry_cover_get_size(fib_entry_t *cover)
u32 fib_node_list_push_front(fib_node_list_t list, int owner_id, fib_node_type_t type, fib_node_index_t index)
Insert an element at the from of the list.
#define uword_to_pointer(u, type)
Definition: types.h:136
void fib_entry_cover_change_notify(fib_node_index_t cover_index, fib_node_index_t covered)
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:28
fib_entry_t * fib_entry_get(fib_node_index_t index)
Definition: fib_entry.c:44
u32 fib_node_list_get_size(fib_node_list_t list)
#define ASSERT(truth)
fib_node_list_t fib_node_list_create(void)
Create a new node list.
unsigned int u32
Definition: types.h:88
fib_entry_covered_walk_t walk
void fib_node_list_destroy(fib_node_list_t *list)
void fib_entry_cover_changed(fib_node_index_t fib_entry_index)
Definition: fib_entry.c:1164
u8 * s
void fib_entry_cover_walk(fib_entry_t *cover, fib_entry_covered_walk_t walk, void *args)
#define FIB_NODE_INDEX_INVALID
Definition: fib_types.h:29
unsigned char u8
Definition: types.h:56
void fib_entry_cover_updated(fib_node_index_t fib_entry_index)
Definition: fib_entry.c:1236
static int fib_entry_cover_walk_node_ptr(fib_node_ptr_t *depend, void *args)
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:418
void fib_entry_cover_update_notify(fib_entry_t *fib_entry)
Internal struct to hold user supplied paraneters for the cover walk.
u8 * fib_entry_cover_list_format(fib_entry_t *fib_entry, u8 *s)