FD.io VPP  v17.04.2-2-ga8f93f8
Vector Packet Processing
interface.c
Go to the documentation of this file.
1 /*
2  * interface.c: mpls interfaces
3  *
4  * Copyright (c) 2012 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #include <vnet/vnet.h>
19 #include <vnet/pg/pg.h>
20 #include <vnet/mpls/mpls.h>
21 #include <vnet/fib/ip4_fib.h>
22 #include <vnet/adj/adj_midchain.h>
23 #include <vnet/dpo/classify_dpo.h>
24 
25 
26 u8
28 {
29  mpls_main_t * mm = &mpls_main;
30 
31  if (vec_len(mm->mpls_enabled_by_sw_if_index) < sw_if_index)
32  return (0);
33 
34  return (mm->mpls_enabled_by_sw_if_index[sw_if_index]);
35 }
36 
37 void
39  u32 sw_if_index,
40  u8 is_enable)
41 {
42  fib_node_index_t lfib_index;
43 
45 
46  /*
47  * enable/disable only on the 1<->0 transition
48  */
49  if (is_enable)
50  {
51  if (1 != ++mm->mpls_enabled_by_sw_if_index[sw_if_index])
52  return;
53 
57  mm->fib_index_by_sw_if_index[sw_if_index] = lfib_index;
58  }
59  else
60  {
61  ASSERT(mm->mpls_enabled_by_sw_if_index[sw_if_index] > 0);
62  if (0 != --mm->mpls_enabled_by_sw_if_index[sw_if_index])
63  return;
64 
67  }
68 
69  vnet_feature_enable_disable ("mpls-input", "mpls-not-enabled",
70  sw_if_index, !is_enable, 0, 0);
71 
72 }
73 
74 static clib_error_t *
76  unformat_input_t * input,
77  vlib_cli_command_t * cmd)
78 {
79  vnet_main_t * vnm = vnet_get_main();
80  clib_error_t * error = 0;
81  u32 sw_if_index, enable;
82 
83  sw_if_index = ~0;
84 
85  if (! unformat_user (input, unformat_vnet_sw_interface, vnm, &sw_if_index))
86  {
87  error = clib_error_return (0, "unknown interface `%U'",
88  format_unformat_error, input);
89  goto done;
90  }
91 
92  if (unformat (input, "enable"))
93  enable = 1;
94  else if (unformat (input, "disable"))
95  enable = 0;
96  else
97  {
98  error = clib_error_return (0, "expected 'enable' or 'disable'",
99  format_unformat_error, input);
100  goto done;
101  }
102 
103  mpls_sw_interface_enable_disable(&mpls_main, sw_if_index, enable);
104 
105  done:
106  return error;
107 }
108 
109 /*?
110  * This command enables an interface to accpet MPLS packets
111  *
112  * @cliexpar
113  * @cliexstart{set interface mpls}
114  * set interface mpls GigEthernet0/8/0 enable
115  * @cliexend
116  ?*/
117 VLIB_CLI_COMMAND (set_interface_ip_table_command, static) = {
118  .path = "set interface mpls",
119  .function = mpls_interface_enable_disable,
120  .short_help = "Enable/Disable an interface for MPLS forwarding",
121 };
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:436
void mpls_sw_interface_enable_disable(mpls_main_t *mm, u32 sw_if_index, u8 is_enable)
Definition: interface.c:38
static clib_error_t * mpls_interface_enable_disable(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: interface.c:75
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
u32 * fib_index_by_sw_if_index
Definition: mpls.h:65
u8 mpls_sw_interface_is_enabled(u32 sw_if_index)
Definition: interface.c:27
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:982
unformat_function_t unformat_vnet_sw_interface
u8 * mpls_enabled_by_sw_if_index
Definition: mpls.h:78
#define clib_error_return(e, args...)
Definition: error.h:111
void fib_table_unlock(u32 fib_index, fib_protocol_t proto)
Take a reference counting lock on the table.
Definition: fib_table.c:1058
struct _unformat_input_t unformat_input_t
mpls_main_t mpls_main
Definition: mpls.c:25
vlib_main_t * vm
Definition: buffer.c:276
#define MPLS_FIB_DEFAULT_TABLE_ID
Definition: mpls.h:33
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:28
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:154
#define ASSERT(truth)
unsigned int u32
Definition: types.h:88
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
Definition: fib_table.c:954
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header, unspecified alignment)
Definition: vec.h:485
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:971
int vnet_feature_enable_disable(const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes)
Definition: feature.c:225