From be511d00bf418f15dd08e14754f741e56f911867 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Wed, 8 May 2013 12:23:27 +0200 Subject: [PATCH] lldpd: make fast start work only when receiving LLDP-MED LLDPDU --- src/daemon/event.c | 7 ++++--- src/daemon/lldpd.c | 14 +++++++++----- src/lldpd-structs.h | 4 +++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/daemon/event.c b/src/daemon/event.c index 91aef84d..2e7dced3 100644 --- a/src/daemon/event.c +++ b/src/daemon/event.c @@ -709,19 +709,20 @@ static void levent_send_pdu(evutil_socket_t fd, short what, void *arg) { struct lldpd_hardware *hardware = arg; - int tx_interval; + int tx_interval = hardware->h_cfg->g_config.c_tx_interval; log_debug("event", "trigger sending PDU for port %s", hardware->h_ifname); lldpd_send(hardware); +#ifdef ENABLE_LLDPMED if (hardware->h_tx_fast > 0) hardware->h_tx_fast--; if (hardware->h_tx_fast > 0) tx_interval = hardware->h_cfg->g_config.c_tx_fast_interval; - else - tx_interval = hardware->h_cfg->g_config.c_tx_interval; +#endif + struct timeval tv = { tx_interval, 0 }; if (event_add(hardware->h_timer, &tv) == -1) { log_warnx("event", "unable to re-register timer event for port %s", diff --git a/src/daemon/lldpd.c b/src/daemon/lldpd.c index e1ac868f..49a0e51f 100644 --- a/src/daemon/lldpd.c +++ b/src/daemon/lldpd.c @@ -529,17 +529,19 @@ lldpd_decode(struct lldpd *cfg, char *frame, int s, agent_notify(hardware, i, port); #endif - if (!oport) { +#ifdef ENABLE_LLDPMED + if (!oport && port->p_chassis->c_med_type) { /* New neighbor, fast start */ if (hardware->h_cfg->g_config.c_enable_fast_start && - !hardware->h_tx_fast) { - log_debug("decode", "%s: Entering fast start due to " - "new neighbor\n", hardware->h_ifname); + !hardware->h_tx_fast) { + log_debug("decode", "%s: entering fast start due to " + "new neighbor", hardware->h_ifname); hardware->h_tx_fast = hardware->h_cfg->g_config.c_tx_fast_init; } levent_schedule_pdu(hardware); } +#endif return; } @@ -1195,6 +1197,7 @@ lldpd_main(int argc, char *argv[]) int i, found, advertise_version = 1; #ifdef ENABLE_LLDPMED int lldpmed = 0, noinventory = 0; + int enable_fast_start = 0; #endif char *descr_override = NULL; char *platform_override = NULL; @@ -1203,7 +1206,6 @@ lldpd_main(int argc, char *argv[]) int smart = 15; int receiveonly = 0; int ctl; - int enable_fast_start = 0; /* Non privileged user */ struct passwd *user; @@ -1427,8 +1429,10 @@ lldpd_main(int argc, char *argv[]) cfg->g_config.c_tx_interval = LLDPD_TX_INTERVAL; cfg->g_config.c_max_neighbors = LLDPD_MAX_NEIGHBORS; cfg->g_config.c_enable_fast_start = enable_fast_start; +#ifdef ENABLE_LLDPMED cfg->g_config.c_tx_fast_init = LLDPD_FAST_INIT; cfg->g_config.c_tx_fast_interval = LLDPD_FAST_TX_INTERVAL; +#endif #ifdef USE_SNMP cfg->g_snmp = snmp; cfg->g_snmp_agentx = agentx; diff --git a/src/lldpd-structs.h b/src/lldpd-structs.h index 0c7b8786..1c47919d 100644 --- a/src/lldpd-structs.h +++ b/src/lldpd-structs.h @@ -327,10 +327,10 @@ struct lldpd_config { #ifdef ENABLE_LLDPMED int c_noinventory; /* Don't send inventory with LLDP-MED */ -#endif int c_enable_fast_start; /* enable fast start */ int c_tx_fast_init; /* Num of lldpd lldppdu's for fast start */ int c_tx_fast_interval; /* Time intr between sends during fast start */ +#endif }; MARSHAL_BEGIN(lldpd_config) MARSHAL_STR(lldpd_config, c_mgmt_pattern) @@ -393,7 +393,9 @@ struct lldpd_hardware { struct lldpd_port h_lport; /* Port attached to this hardware port */ TAILQ_HEAD(, lldpd_port) h_rports; /* Remote ports */ +#ifdef ENABLE_LLDPMED int h_tx_fast; /* current tx fast start count */ +#endif }; MARSHAL_BEGIN(lldpd_hardware) MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_next) -- 2.39.2