summaryrefslogtreecommitdiffstats
path: root/src/vnet/bier/bier_bift_table.c
blob: 6de4f979b178574925ef93ec3f864781d5c208a0 (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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
/*
 * Copyright (c) 2016 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.
 */

#include <vnet/bier/bier_bift_table.h>
#include <vnet/dpo/drop_dpo.h>
#include <vnet/udp/udp_local.h>

typedef enum {
#define bier_error(n,s) BIER_INPUT_ERROR_##n,
#include <vnet/bier/bier_input_error.def>
#undef bier_error
    BIER_INPUT_N_ERROR,
} bier_input_error_t;

static char * bier_error_strings[] = {
#define bier_error(n,s) s,
#include <vnet/bier/bier_input_error.def>
#undef bier_error
};

/**
 * Global BIFT table
 */
bier_bfit_table_t *bier_bift_table;

/**
 * Forward declare the node
 */
vlib_node_registration_t bier_bift_input_node;

void
bier_bift_table_entry_add (bier_bift_id_t id,
                           const dpo_id_t *dpo)
{
    if (NULL == bier_bift_table)
    {
        u32 ii;

        /*
         * allocate the table and
         * set each of the entries therein to a BIER drop
         */
        bier_bift_table = clib_mem_alloc_aligned(sizeof(*bier_bift_table),
                                                 CLIB_CACHE_LINE_BYTES);
        clib_memset(bier_bift_table, 0, sizeof(*bier_bift_table));

        for (ii = 0; ii < BIER_BIFT_N_ENTRIES; ii++)
        {
            dpo_stack_from_node(bier_bift_input_node.index,
                                &bier_bift_table->bblt_dpos[ii],
                                drop_dpo_get(DPO_PROTO_BIER));
        }

        /*
         * register to handle packets that arrive on the assigned
         * UDP port
         */
        udp_register_dst_port(vlib_get_main(),
                              UDP_DST_PORT_BIER,
                              bier_bift_input_node.index,
                              0);
        udp_register_dst_port(vlib_get_main(),
                              UDP_DST_PORT_BIER,
                              bier_bift_input_node.index,
                              1);
    }

    dpo_stack_from_node(bier_bift_input_node.index,
                        &bier_bift_table->bblt_dpos[id],
                        dpo);

    bier_bift_table->bblt_n_entries++;
}

void
bier_bift_table_entry_remove (bier_bift_id_t id)
{
    ASSERT(NULL != bier_bift_table);

    dpo_reset(&bier_bift_table->bblt_dpos[id]);

    bier_bift_table->bblt_n_entries--;

    if (0 == bier_bift_table->bblt_n_entries)
    {
        udp_unregister_dst_port(vlib_get_main(),
                                UDP_DST_PORT_BIER,
                                0);
        udp_unregister_dst_port(vlib_get_main(),
                                UDP_DST_PORT_BIER,
                                1);

        clib_mem_free(bier_bift_table);
        bier_bift_table = NULL;
    }
}

/**
 * @brief Packet trace record for BIER input
 */
typedef struct bier_bift_input_trace_t_
{
    u32 bift_id;
} bier_bift_input_trace_t;

static uword
bier_bift_input (vlib_main_t * vm,
                 vlib_node_runtime_t * node,
                 vlib_frame_t * from_frame)
{
    u32 n_left_from, next_index, * from, * to_next;

    from = vlib_frame_vector_args (from_frame);
    n_left_from = from_frame->n_vectors;
    next_index = node->cached_next_index;

    while (n_left_from > 0)
    {
        u32 n_left_to_next;

        vlib_get_next_frame (vm, node, next_index,
                             to_next, n_left_to_next);

        while (n_left_from > 0 && n_left_to_next > 0)
        {
            bier_bift_id_t *biftp0, bift0;
            const dpo_id_t *dpo0;
            vlib_buffer_t * b0;
            u32 bi0, next0;

            bi0 = from[0];
            to_next[0] = bi0;
            from += 1;
            to_next += 1;
            n_left_from -= 1;
            n_left_to_next -= 1;

            b0 = vlib_get_buffer (vm, bi0);
            biftp0 = vlib_buffer_get_current (b0);
            vlib_buffer_advance(b0, sizeof(bift0));
            bift0 = clib_net_to_host_u32(*biftp0);

            /*
             * Do the lookup based on the first 20 bits, i.e. the
             * encoding of the set, sub-domain and BSL
             */
            dpo0 = bier_bift_dp_lookup(bift0);

            /*
             * save the TTL for later during egress
             */
            vnet_buffer(b0)->mpls.ttl = vnet_mpls_uc_get_ttl(bift0);

            next0 = dpo0->dpoi_next_node;
            vnet_buffer(b0)->ip.adj_index[VLIB_TX] = dpo0->dpoi_index;

            if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
            {
                bier_bift_input_trace_t *tr;

                tr = vlib_add_trace(vm, node, b0, sizeof (*tr));
                tr->bift_id = bift0;
            }

            vlib_validate_buffer_enqueue_x1(vm, node, next_index,
                                            to_next, n_left_to_next,
                                            bi0, next0);
        }

        vlib_put_next_frame(vm, node, next_index, n_left_to_next);
    }

    vlib_node_increment_counter(vm, bier_bift_input_node.index,
                                BIER_INPUT_ERROR_PKTS_VALID,
                                from_frame->n_vectors);
    return (from_frame->n_vectors);
}

static u8 *
format_bier_bift_input_trace (u8 * s, va_list * args)
{
    CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
    CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
    bier_bift_input_trace_t * t = va_arg (*args, bier_bift_input_trace_t *);

    s = format (s, "BIFT-ID:[%U]", format_bier_bift_id,
                vnet_mpls_uc_get_label(t->bift_id));
    return s;
}

VLIB_REGISTER_NODE (bier_bift_input_node) = {
    .function = bier_bift_input,
    .name = "bier-bift-input",
    /* Takes a vector of packets. */
    .vector_size = sizeof (u32),
    .n_errors = BIER_INPUT_N_ERROR,
    .error_strings = bier_error_strings,
    .n_next_nodes = 0,
    .format_trace = format_bier_bift_input_trace,
};

clib_error_t *
show_bier_bift_cmd (vlib_main_t * vm,
                    unformat_input_t * input,
                    vlib_cli_command_t * cmd)
{
    clib_error_t * error = NULL;
    u32 hdr_len, set, sub_domain;

    set = hdr_len = sub_domain = ~0;

    while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
        if (unformat (input, "sd %d", &sub_domain)) {
            ;
        } else if (unformat (input, "set %d", &set)) {
            ;
        } else if (unformat (input, "bsl %d", &hdr_len)) {
            ;
        }
        else
        {
            error = unformat_parse_error (input);
            goto done;
        }
    }

    if (NULL == bier_bift_table)
    {
        vlib_cli_output(vm, "no BIFT entries");
        goto done;
    }

    if (~0 == set)
    {
        u32 ii;

        for (ii = 0; ii < BIER_BIFT_N_ENTRIES; ii++)
        {
            if (!dpo_is_drop(&bier_bift_table->bblt_dpos[ii]))
            {
                bier_hdr_len_id_t bsl;

                bier_bift_id_decode(ii, &set, &sub_domain, &bsl);

                vlib_cli_output(vm, "set: %d, sub-domain:%d, BSL:%U",
                                set, sub_domain,
                                format_bier_hdr_len_id, bsl);
                vlib_cli_output(vm, "  %U",
                                format_dpo_id,
                                &bier_bift_table->bblt_dpos[ii], 0);
            }
        }
    }
    else
    {
        bier_bift_id_t id;

        id = bier_bift_id_encode(set, sub_domain,
                                 bier_hdr_bit_len_to_id(hdr_len));

        if (!dpo_is_drop(&bier_bift_table->bblt_dpos[id]))
        {
            vlib_cli_output(vm, "set: %d, sub-domain:%d, BSL:%U",
                            set, sub_domain,
                            format_bier_hdr_len_id, hdr_len);
            vlib_cli_output(vm, "  %U",
                            format_dpo_id,
                            &bier_bift_table->bblt_dpos[id], 0);
        }
    }
done:
    return (error);
}

VLIB_CLI_COMMAND (show_bier_bift_command, static) = {
    .path = "show bier bift",
    .short_help = "show bier bift [set <value>] [sd <value>] [bsl <value>]",
    .function = show_bier_bift_cmd,
};
bravatar'>Andrew Yourtchenko4 years v20.01commit fce396738f...Andrew Yourtchenko5 years v20.01-rc2commit 29acfa2ad5...Andrew Yourtchenko5 years v20.01-rc1commit c7fe31cfff...Andrew Yourtchenko5 years v20.05-rc0commit 8ad070e102...Andrew Yourtchenko5 years v19.04.4-rc0commit dfec10d137...Dave Wallace5 years v19.04.3commit bdb89b9897...Dave Wallace5 years v19.08.1commit f4dcae4164...Andrew Yourtchenko5 years v19.08commit 1c586de48c...Andrew Yourtchenko5 years v19.08-rc2commit 2f51729bb3...Andrew Yourtchenko5 years v19.08-rc1commit 23526f78a8...Andrew Yourtchenko5 years v20.01-rc0commit e41fd65381...Andrew Yourtchenko5 years v19.04.2commit d95a226047...Dave Wallace5 years v19.01.3commit bef25c30a1...Andrew Yourtchenko5 years v19.04.2-rc0commit e4a0f9fdc0...Dave Wallace5 years v19.01.3-rc0commit 6af8243814...Dave Wallace5 years v19.04.1commit 1662c9cd23...Dave Wallace5 years v19.01.2commit fa63602fcb...Andrew Yourtchenko5 years v19.01.2-rc0commit 67a3e2d130...Dave Wallace5 years v19.04.1-rc0commit 873b9ed405...Dave Wallace5 years v19.04commit 3d18a191aa...Dave Wallace6 years v19.04-rc2commit 0d7332e43f...Dave Wallace6 years v19.08-rc0commit 40fd1f3dfd...Dave Wallace6 years v19.04-rc1commit e29b8228a2...Dave Wallace6 years v19.01.1commit cbd68cb711...Dave Wallace6 years v19.01commit 67d9475ae3...Andrew Yourtchenko6 years v19.01-rc2commit 0cb68778ec...Andrew Yourtchenko6 years v19.01-rc1commit 3e2bc759f4...Damjan Marion6 years v19.04-rc0commit ef080e1f9b...Andrew Yourtchenko6 years v18.10commit 3a9a6f72d1...Marco Varlese6 years v18.10-rc2commit b3aff922ff...Marco Varlese6 years v19.01-rc0commit 4f611176e9...Marco Varlese6 years v18.10-rc1commit 90395743d3...Marco Varlese6 years v18.07.1commit 55fbdb9941...Ed Warnicke6 years v18.07commit db6d6b3058...Ed Warnicke6 years v18.07-rc2commit c16a23c596...Ed Warnicke6 years v18.10-rc0commit 0e6f4d6af4...Ed Warnicke6 years v18.07-rc0commit 3e21eba4d2...Ed Warnicke6 years v18.07-rc1commit e400a6d1a5...Ed Warnicke6 years v18.01.2commit 540b31ac8f...Dave Wallace6 years v18.04commit ac2b7363f4...Chris Luke6 years v18.04-rc2commit 18744ee680...Chris Luke7 years v18.04-rc1commit 7ace56b9d8...Chris Luke7 years v18.01.1commit f13bac295d...Dave Wallace7 years v18.01commit 9d21268d0a...Dave Wallace7 years v18.01-rc2commit bbdfeaebf2...Dave Wallace7 years v18.01-rc1commit 8c2bacde4f...Dave Wallace7 years v18.04-rc0commit a3a6ec63d3...Dave Wallace7 years v17.10commit 116af2170e...Florin Coras7 years v17.10-rc2commit cf6c343710...Florin Coras7 years v18.01-rc0commit 75a17ecddc...Florin Coras7 years v17.10-rc1commit 7ea28045aa...Florin Coras7 years v17.07.01commit 839fa732c1...Neale Ranns7 years v17.07commit f4f635e7c0...Neale Ranns7 years v17.07-rc2commit 01d2b4b13a...Neale Ranns7 years v17.10-rc0commit cdc74273df...Neale Ranns7 years v17.07-rc1commit ea89b8cf66...Neale Ranns7 years v17.04.2commit fc69a97116...Ole Troan7 years v17.04.1commit 7d68ec6134...Ole Troan7 years v17.04commit 511ee63cbb...Ole Troan8 years v17.04-rc2commit 92bcecfdcc...Ole Troan8 years v17.07-rc0commit 87edd671d7...Ole Troan8 years v17.04-rc1commit cb92fc6edc...Ole Troan8 years v17.01.1commit 8099e90346...Damjan Marion8 years v17.01commit cd111b2228...Damjan Marion8 years v17.01-rc2commit 235c64f067...Damjan Marion8 years v17.04-rc0commit 2e70d8b31d...Damjan Marion8 years v17.01-rc1commit 436b319354...Damjan Marion8 years v17.01-rc0commit 931be3aca2...Ed Warnicke8 years v16.09commit 21bc8624f5...Keith Burns (alagalah)8 years v16.09-rc2commit 08377f8ff7...Keith Burns (alagalah)8 years v16.12-rc0commit 694265d4f1...Dave Barach8 years v16.09-rc1commit dbc6e3f0bb...Dave Barach8 years v16.06commit 693f4358de...Ed Warnicke8 years v16.06-rc3commit cf6511560e...Dave Barach8 years v16.06-rc2commit b98a3a87a9...Dave Barach8 years v16.09-rc0commit 862623da6e...Ed Warnicke8 years v16.06-rc1commit 826d4f7b1f...Ed Warnicke8 years v1.0.0commit cb9cadad57...Ed Warnicke9 years