From: roopa Date: Tue, 7 May 2013 18:43:57 +0000 (-0700) Subject: lldpd: fast start support X-Git-Tag: 0.7.3~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b9de0ca613f3b7f6acbfda33344956b1efe8c5f9;p=thirdparty%2Flldpd.git lldpd: fast start support This patch adds support for lldpd fast start. The feature is currently disabled by default. A cli command to enable the feature is in the works. Signed-off-by: Roopa Prabhu --- diff --git a/src/daemon/event.c b/src/daemon/event.c index 1471c1cc..91aef84d 100644 --- a/src/daemon/event.c +++ b/src/daemon/event.c @@ -709,11 +709,20 @@ static void levent_send_pdu(evutil_socket_t fd, short what, void *arg) { struct lldpd_hardware *hardware = arg; + int tx_interval; + log_debug("event", "trigger sending PDU for port %s", hardware->h_ifname); lldpd_send(hardware); - struct timeval tv = { hardware->h_cfg->g_config.c_tx_interval, 0 }; + 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; + 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", hardware->h_ifname); diff --git a/src/daemon/lldpd.c b/src/daemon/lldpd.c index afd18d29..e1ac868f 100644 --- a/src/daemon/lldpd.c +++ b/src/daemon/lldpd.c @@ -529,6 +529,18 @@ lldpd_decode(struct lldpd *cfg, char *frame, int s, agent_notify(hardware, i, port); #endif + if (!oport) { + /* 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 = hardware->h_cfg->g_config.c_tx_fast_init; + } + + levent_schedule_pdu(hardware); + } + return; } @@ -1191,6 +1203,7 @@ 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; @@ -1413,6 +1426,9 @@ lldpd_main(int argc, char *argv[]) cfg->g_config.c_receiveonly = receiveonly; 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; + cfg->g_config.c_tx_fast_init = LLDPD_FAST_INIT; + cfg->g_config.c_tx_fast_interval = LLDPD_FAST_TX_INTERVAL; #ifdef USE_SNMP cfg->g_snmp = snmp; cfg->g_snmp_agentx = agentx; diff --git a/src/daemon/lldpd.h b/src/daemon/lldpd.h index b8fe9400..8e436ed3 100644 --- a/src/daemon/lldpd.h +++ b/src/daemon/lldpd.h @@ -67,6 +67,8 @@ struct event_base; #define LLDPD_TX_MSGDELAY 1 #define LLDPD_MAX_NEIGHBORS 4 #define LLDPD_PID_FILE "/var/run/lldpd.pid" +#define LLDPD_FAST_TX_INTERVAL 1 +#define LLDPD_FAST_INIT 4 #define USING_AGENTX_SUBAGENT_MODULE 1 diff --git a/src/lldpd-structs.h b/src/lldpd-structs.h index 949876fa..0c7b8786 100644 --- a/src/lldpd-structs.h +++ b/src/lldpd-structs.h @@ -328,6 +328,9 @@ 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 */ }; MARSHAL_BEGIN(lldpd_config) MARSHAL_STR(lldpd_config, c_mgmt_pattern) @@ -389,6 +392,8 @@ struct lldpd_hardware { u_int16_t h_lport_cksum; /* Checksum on local port to see if there is a change */ struct lldpd_port h_lport; /* Port attached to this hardware port */ TAILQ_HEAD(, lldpd_port) h_rports; /* Remote ports */ + + int h_tx_fast; /* current tx fast start count */ }; MARSHAL_BEGIN(lldpd_hardware) MARSHAL_IGNORE(lldpd_hardware, h_entries.tqe_next)