]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
lldpd: fast start support
authorroopa <roopa@cumulusnetworks.com>
Tue, 7 May 2013 18:43:57 +0000 (11:43 -0700)
committerVincent Bernat <bernat@luffy.cx>
Wed, 8 May 2013 10:14:34 +0000 (12:14 +0200)
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 <roopa@cumulusnetworks.com>
src/daemon/event.c
src/daemon/lldpd.c
src/daemon/lldpd.h
src/lldpd-structs.h

index 1471c1cc460db9046fdfab0013a390227d4d3c5f..91aef84d0fe74eaa5c7763375f999e447199099b 100644 (file)
@@ -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);
index afd18d29b00f899f1b74101451954eb11e0466c1..e1ac868f0bd11911bfd6df61e66886eea7beea20 100644 (file)
@@ -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;
index b8fe940063b23a5edbc90f08b82c3540a194ca83..8e436ed36ca1039f961ae30a30d0dfb8e790f0d6 100644 (file)
@@ -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
 
index 949876fa0cd47f87ad5a5ba6ed0ad983a900f7c1..0c7b8786a40356f3862b8852cdaf86990f72b530 100644 (file)
@@ -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)