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
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/*
* Copyright (c) 2018 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 __MFIB_ENTRY_DELEGATE_T__
#define __MFIB_ENTRY_DELEGATE_T__
#include <vnet/fib/fib_node.h>
/**
* Delegate types
*/
typedef enum mfib_entry_delegate_type_t_ {
/**
* Dependency list of covered entries.
* these are more specific entries that are interested in changes
* to their respective cover
*/
MFIB_ENTRY_DELEGATE_COVERED,
} mfib_entry_delegate_type_t;
#define FOR_EACH_MFIB_DELEGATE(_entry, _fdt, _fed, _body) \
{ \
for (_fdt = MFIB_ENTRY_DELEGATE_CHAIN_UNICAST_IP4; \
_fdt <= MFIB_ENTRY_DELEGATE_ATTACHED_EXPORT; \
_fdt++) \
{ \
_fed = mfib_entry_delegate_get(_entry, _fdt); \
if (NULL != _fed) { \
_body; \
} \
} \
}
/**
* A Delagate is a means to implmenet the Delagation design pattern; the extension of an
* objects functionality through the composition of, and delgation to, other objects.
* These 'other' objects are delegates. Delagates are thus attached to other MFIB objects
* to extend their functionality.
*/
typedef struct mfib_entry_delegate_t_
{
/**
* The MFIB entry object to which the delagate is attached
*/
fib_node_index_t mfd_entry_index;
/**
* The delagate type
*/
mfib_entry_delegate_type_t mfd_type;
/**
* A union of data for the different delegate types
* These delegates are stored in a sparse vector on the entry, so they
* must all be of the same size.
*/
union
{
/**
* For the cover tracking. The node list;
*/
fib_node_list_t mfd_list;
};
} mfib_entry_delegate_t;
struct mfib_entry_t_;
extern void mfib_entry_delegate_remove(struct mfib_entry_t_ *mfib_entry,
mfib_entry_delegate_type_t type);
extern mfib_entry_delegate_t *mfib_entry_delegate_find_or_add(struct mfib_entry_t_ *mfib_entry,
mfib_entry_delegate_type_t fdt);
extern mfib_entry_delegate_t *mfib_entry_delegate_get(const struct mfib_entry_t_ *mfib_entry,
mfib_entry_delegate_type_t type);
extern u8 *format_mfib_entry_deletegate(u8 * s, va_list * args);
#endif
|