FD.io VPP  v19.08-27-gf4dcae4
Vector Packet Processing
cdp.c
Go to the documentation of this file.
1 /*
2  * cdp.c - cdp protocol plug-in
3  *
4  * Copyright (c) 2011-2018 by 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/plugin/plugin.h>
20 #include <cdp/cdp.h>
21 
22 #include <vlibapi/api.h>
23 #include <vlibmemory/api.h>
24 #include <vpp/app/version.h>
25 
26 /* define message IDs */
27 #include <cdp/cdp_msg_enum.h>
28 
29 /* define message structures */
30 #define vl_typedefs
31 #include <cdp/cdp_all_api_h.h>
32 #undef vl_typedefs
33 
34 /* define generated endian-swappers */
35 #define vl_endianfun
36 #include <cdp/cdp_all_api_h.h>
37 #undef vl_endianfun
38 
39 /* instantiate all the print functions we know about */
40 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
41 #define vl_printfun
42 #include <cdp/cdp_all_api_h.h>
43 #undef vl_printfun
44 
45 /* Get the API version number */
46 #define vl_api_version(n,v) static u32 api_version=(v);
47 #include <cdp/cdp_all_api_h.h>
48 #undef vl_api_version
49 
50 #define REPLY_MSG_ID_BASE cm->msg_id_base
52 
53 /* List of message types that this plugin understands */
54 
55 #define foreach_cdp_plugin_api_msg \
56 _(CDP_ENABLE_DISABLE, cdp_enable_disable)
57 
58 /* Action function shared between message handler and debug CLI */
59 
60 int
61 cdp_enable_disable (cdp_main_t * cm, int enable_disable)
62 {
63  int rv = 0;
64 
65  if (enable_disable)
66  {
69  CDP_EVENT_ENABLE, 0);
70  }
71  else
72  {
76  }
77  cm->enabled = enable_disable;
78 
79  return rv;
80 }
81 
82 static clib_error_t *
84  unformat_input_t * input, vlib_cli_command_t * cmd)
85 {
87  int enable_disable = 1;
88 
89  int rv;
90 
92  {
93  if (unformat (input, "disable"))
94  enable_disable = 0;
95  else if (unformat (input, "enable"))
96  enable_disable = 1;
97  else
98  break;
99  }
100 
101  rv = cdp_enable_disable (cm, enable_disable);
102 
103  switch (rv)
104  {
105  case 0:
106  break;
107 
108  default:
109  return clib_error_return (0, "cdp_enable_disable returned %d", rv);
110  }
111  return 0;
112 }
113 
114 /* *INDENT-OFF* */
115 VLIB_CLI_COMMAND (cdp_command, static) =
116 {
117  .path = "cdp",
118  .short_help = "cdp enable | disable",
119  .function = cdp_command_fn,
120 };
121 /* *INDENT-ON* */
122 
123 /* API message handler */
126 {
127  vl_api_cdp_enable_disable_reply_t *rmp;
128  cdp_main_t *cm = &cdp_main;
129  int rv;
130 
131  rv = cdp_enable_disable (cm, (int) (mp->enable_disable));
132 
133  REPLY_MACRO (VL_API_CDP_ENABLE_DISABLE_REPLY);
134 }
135 
136 /* Set up the API message handling tables */
137 static clib_error_t *
139 {
140  cdp_main_t *cm = &cdp_main;
141 #define _(N,n) \
142  vl_msg_api_set_handlers((VL_API_##N + cm->msg_id_base), \
143  #n, \
144  vl_api_##n##_t_handler, \
145  vl_noop_handler, \
146  vl_api_##n##_t_endian, \
147  vl_api_##n##_t_print, \
148  sizeof(vl_api_##n##_t), 1);
150 #undef _
151 
152  return 0;
153 }
154 
155 #define vl_msg_name_crc_list
156 #include <cdp/cdp_all_api_h.h>
157 #undef vl_msg_name_crc_list
158 
159 static void
161 {
162 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + cm->msg_id_base);
163  foreach_vl_msg_name_crc_cdp;
164 #undef _
165 }
166 
167 static clib_error_t *
169 {
170  cdp_main_t *cm = &cdp_main;
171  clib_error_t *error = 0;
172  u8 *name;
173 
174  cm->vlib_main = vm;
175 
176  name = format (0, "cdp_%08x%c", api_version, 0);
177 
178  /* Ask for a correctly-sized block of API message decode slots */
180  ((char *) name, VL_MSG_FIRST_AVAILABLE);
181 
182  error = cdp_plugin_api_hookup (vm);
183 
184  /* Add our API messages to the global name_crc hash table */
186 
187  vec_free (name);
188 
189  return error;
190 }
191 
193 
194 /* *INDENT-OFF* */
196 {
197  .version = VPP_BUILD_VER,
198  .description = "Cisco Discovery Protocol (CDP)",
199 };
200 /* *INDENT-ON* */
201 
202 /*
203  * fd.io coding-style-patch-verification: ON
204  *
205  * Local Variables:
206  * eval: (c-set-style "gnu")
207  * End:
208  */
u16 msg_id_base
Definition: cdp.h:85
#define foreach_cdp_plugin_api_msg
Definition: cdp.c:55
int enabled
Definition: cdp.h:97
cdp_main_t cdp_main
Definition: cdp_input.c:17
u32 cdp_process_node_index
Definition: cdp.h:94
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
static void setup_message_id_table(cdp_main_t *cm, api_main_t *am)
Definition: cdp.c:160
unsigned char u8
Definition: types.h:56
static clib_error_t * cdp_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: cdp.c:83
VLIB_PLUGIN_REGISTER()
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:173
#define clib_error_return(e, args...)
Definition: error.h:99
static void vl_api_cdp_enable_disable_t_handler(vl_api_cdp_enable_disable_t *mp)
Definition: cdp.c:125
vnet_crypto_main_t * cm
Definition: quic_crypto.c:41
static void vlib_process_signal_event(vlib_main_t *vm, uword node_index, uword type_opaque, uword data)
Definition: node_funcs.h:934
struct _unformat_input_t unformat_input_t
#define REPLY_MACRO(t)
u8 name[64]
Definition: memclnt.api:152
API main structure, used by both vpp and binary API clients.
Definition: api_common.h:203
void vnet_cdp_create_periodic_process(cdp_main_t *cmp)
Definition: cdp_node.c:201
#define UNFORMAT_END_OF_INPUT
Definition: format.h:145
vlib_main_t * vm
Definition: buffer.c:312
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:341
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:155
vlib_main_t * vlib_main
Definition: cdp.h:104
Definition: cdp.h:79
static clib_error_t * cdp_plugin_api_hookup(vlib_main_t *vm)
Definition: cdp.c:138
api_main_t api_main
Definition: api_shared.c:35
int cdp_enable_disable(cdp_main_t *cm, int enable_disable)
Definition: cdp.c:61
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:171
u16 vl_msg_api_get_msg_ids(const char *name, int n)
Definition: api_shared.c:957
static clib_error_t * cdp_init(vlib_main_t *vm)
Definition: cdp.c:168