From 40ea3f59dca497e5f4b5a8440a9c8c2e37396701 Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Sun, 16 Sep 2018 11:03:04 -0400 Subject: Register cdp_input when enabled for the first time Graceful handling of unknown tlv types Change-Id: Idbc9ed524fc8b865c8e12571813cc73548bde480 Signed-off-by: Dave Barach --- src/plugins/cdp/cdp_node.c | 48 ++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 19 deletions(-) (limited to 'src/plugins/cdp/cdp_node.c') diff --git a/src/plugins/cdp/cdp_node.c b/src/plugins/cdp/cdp_node.c index 1336c567287..ac7e7642dae 100644 --- a/src/plugins/cdp/cdp_node.c +++ b/src/plugins/cdp/cdp_node.c @@ -132,25 +132,7 @@ cdp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) /* So we can send events to the cdp process */ cm->cdp_process_node_index = cdp_process_node.index; - /* Dynamically register the cdp input node with the snap classifier */ - snap_register_input_protocol (vm, "cdp-input", 0xC /* ieee_oui, Cisco */ , - 0x2000 /* protocol CDP */ , - cdp_input_node.index); - - snap_register_input_protocol (vm, "cdp-input", 0xC /* ieee_oui, Cisco */ , - 0x2004 /* protocol CDP */ , - cdp_input_node.index); - -#if 0 /* retain for reference */ - /* with the hdlc classifier */ - hdlc_register_input_protocol (vm, HDLC_PROTOCOL_cdp, cdp_input_node.index); -#endif - - /* with ethernet input (for SRP) */ - ethernet_register_input_type (vm, ETHERNET_TYPE_CDP /* CDP */ , - cdp_input_node.index); - - /* Start w/ cdp effectively disabled */ + /* Start w/ cdp disabled */ poll_time_remaining = 86400.0; while (1) @@ -166,6 +148,34 @@ cdp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) break; case CDP_EVENT_ENABLE: + if (!cm->cdp_protocol_registered) + { + /* + * Dynamically register the cdp input node + * with the snap classifier + */ + snap_register_input_protocol (vm, "cdp-input", + 0xC /* ieee_oui, Cisco */ , + 0x2000 /* protocol CDP */ , + cdp_input_node.index); + + snap_register_input_protocol (vm, "cdp-input", + 0xC /* ieee_oui, Cisco */ , + 0x2004 /* protocol CDP */ , + cdp_input_node.index); +#if 0 + /* + * Keep this code for reference... + * Register with the hdlc classifier + */ + hdlc_register_input_protocol (vm, HDLC_PROTOCOL_cdp, + cdp_input_node.index); +#endif + /* with ethernet input (for SRP) */ + ethernet_register_input_type (vm, ETHERNET_TYPE_CDP /* CDP */ , + cdp_input_node.index); + cm->cdp_protocol_registered = 1; + } poll_time_remaining = 10.0; break; -- cgit 1.2.3-korg