aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/mfib/mfib_entry_src.h
blob: ab3cb3ebda7c231eed07427feb48482888dc6bca (plain)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/*
 * 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_SRC_H__
#define __MFIB_ENTRY_SRC_H__

#include <vnet/mfib/mfib_entry.h>

/**
 * MFIB extensions to each path
 */
typedef struct mfib_path_ext_t_
{
    mfib_itf_flags_t mfpe_flags;
    fib_node_index_t mfpe_path;
} mfib_path_ext_t;

/**
 * Flags for the source data
 */
typedef enum mfib_entry_src_attribute_t_ {
    /**
     * Marker. Add new values after this one.
     */
    MFIB_ENTRY_SRC_ATTRIBUTE_FIRST,
    /**
     * the source has been added to the entry
     */
    MFIB_ENTRY_SRC_ATTRIBUTE_STALE = MFIB_ENTRY_SRC_ATTRIBUTE_FIRST,
    /**
     * Marker. add new entries before this one.
     */
    MFIB_ENTRY_SRC_ATTRIBUTE_LAST = MFIB_ENTRY_SRC_ATTRIBUTE_STALE,
} mfib_entry_src_attribute_t;


#define MFIB_ENTRY_SRC_ATTRIBUTES {                  \
    [MFIB_ENTRY_SRC_ATTRIBUTE_STALE] = "stale",      \
}

#define FOR_EACH_MFIB_SRC_ATTRIBUTE(_item)                      \
    for (_item = MFIB_ENTRY_SRC_ATTRIBUTE_FIRST;		\
	 _item <= MFIB_ENTRY_SRC_ATTRIBUTE_LAST;		\
	 _item++)

typedef enum mfib_entry_src_flag_t_ {
    MFIB_ENTRY_SRC_FLAG_NONE   = 0,
    MFIB_ENTRY_SRC_FLAG_STALE = (1 << MFIB_ENTRY_SRC_ATTRIBUTE_STALE),
} __attribute__ ((packed)) mfib_entry_src_flags_t;

extern u8 * format_mfib_entry_src_flags(u8 *s, va_list *args);

/*
 * Keep the size of the flags field to 2 bytes, so it
 * can be placed next to the 2 bytes reference count
 */
STATIC_ASSERT (sizeof(mfib_entry_src_flags_t) <= 2,
	       "FIB entry flags field size too big");

/**
 * The source of an MFIB entry
 */
typedef struct mfib_entry_src_t_
{
    /**
     * Which source this is
     */
    mfib_source_t mfes_src;

    /**
     * Route flags
     */
    mfib_entry_flags_t mfes_route_flags;

    /**
     * Source flags
     */
    mfib_entry_src_flags_t mfes_flags;

    /**
     * The reference count on the entry. this is a u32
     * since there is no path-list sharing in mfib, so the number
     * os children could be high.
     */
    u32 mfes_ref_count;

    /**
     * The path-list of forwarding interfaces
     */
    fib_node_index_t mfes_pl;

    /**
     * RPF-ID
     */
    fib_rpf_id_t mfes_rpf_id;

    /**
     * Hash table of path extensions
     */
    uword *mfes_exts;

    /**
     * Covering entry (if needed)
     */
    struct {
        fib_node_index_t mfes_cover;
        u32 mfes_sibling;
    };

    /**
     * The hash table of all interfaces.
     *  This is forwarding time information derived from the paths
     *  and their extensions.
     */
    mfib_itf_t *mfes_itfs;
} mfib_entry_src_t;

/**
 * signals from the sources to the caller
 */
typedef enum mfib_src_res_t_
{
    MFIB_SRC_OK,
    MFIB_SRC_REEVALUATE,
} mfib_src_res_t;

/**
 * A function provided by each source to be invoked when it is activated
 */
typedef void (*mfib_entry_src_activiate_t) (mfib_entry_t*, mfib_entry_src_t*);

/**
 * A function provided by each source to be invoked when it is deactivated
 */
typedef void (*mfib_entry_src_deactiviate_t) (mfib_entry_t*, mfib_entry_src_t*);

/**
 * A function provided by each source to be invoked when the cover changes
 */
typedef mfib_src_res_t (*mfib_entry_src_cover_change_t) (mfib_entry_t*, mfib_entry_src_t*);

/**
 * A function provided by each source to be invoked when the cover is updated
 */
typedef mfib_src_res_t (*mfib_entry_src_cover_update_t) (mfib_entry_t*, mfib_entry_src_t*);

/**
 * Virtual function table provided by each_source
 */
typedef struct mfib_entry_src_vft_t_
{
    mfib_entry_src_activiate_t mev_activate;
    mfib_entry_src_deactiviate_t mev_deactivate;
    mfib_entry_src_cover_change_t mev_cover_change;
    mfib_entry_src_cover_update_t mev_cover_update;
} mfib_entry_src_vft;

extern void mfib_entry_src_register(mfib_source_t, const mfib_entry_src_vft*);

extern void mfib_entry_src_deactivate(mfib_entry_t *mfib_entry,
                                      mfib_entry_src_t *bsrc);

extern void mfib_entry_src_activate(mfib_entry_t *mfib_entry,
                                    mfib_entry_src_t *bsrc);

extern mfib_src_res_t mfib_entry_src_cover_change(mfib_entry_t *mfib_entry,
                                                  mfib_entry_src_t *bsrc);

extern mfib_src_res_t mfib_entry_src_cover_update(mfib_entry_t *mfib_entry,
                                                  mfib_entry_src_t *bsrc);

extern mfib_entry_src_t* mfib_entry_get_best_src(const mfib_entry_t *mfib_entry);

extern void mfib_entry_src_module_init(void);
extern void mfib_entry_src_rr_module_init(void);

#endif