return 1;
}
+static int
+cmd_txhold(struct lldpctl_conn_t *conn, struct writer *w,
+ struct cmd_env *env, void *arg)
+{
+ log_debug("lldpctl", "set transmit hold");
+
+ lldpctl_atom_t *config = lldpctl_get_configuration(conn);
+ if (config == NULL) {
+ log_warnx("lldpctl", "unable to get configuration from lldpd. %s",
+ lldpctl_last_strerror(conn));
+ return 0;
+ }
+ if (lldpctl_atom_set_str(config,
+ lldpctl_k_config_tx_hold, cmdenv_get(env, "tx-hold")) == NULL) {
+ log_warnx("lldpctl", "unable to set transmit hold. %s",
+ lldpctl_last_strerror(conn));
+ lldpctl_atom_dec_ref(config);
+ return 0;
+ }
+ log_info("lldpctl", "transmit hold set to new value %s", cmdenv_get(env, "tx-hold"));
+ lldpctl_atom_dec_ref(config);
+ return 1;
+}
+
/**
* Register `configure lldp` commands.
*/
NULL, cmd_store_env_value, "tx-interval"),
NEWLINE, "Set LLDP transmit delay",
NULL, cmd_txdelay, NULL);
+
+ commands_new(
+ commands_new(
+ commands_new(configure_lldp,
+ "tx-hold", "Set LLDP transmit hold",
+ cmd_check_no_env, NULL, "ports"),
+ NULL, "LLDP transmit hold in seconds",
+ NULL, cmd_store_env_value, "tx-hold"),
+ NEWLINE, "Set LLDP transmit hold",
+ NULL, cmd_txhold, NULL);
}
/**
tag_datatag(w, "tx-delay", "Transmit delay",
lldpctl_atom_get_str(configuration, lldpctl_k_config_tx_interval));
+ tag_datatag(w, "tx-hold", "Transmit hold",
+ lldpctl_atom_get_str(configuration, lldpctl_k_config_tx_hold));
tag_datatag(w, "rx-only", "Receive mode",
lldpctl_atom_get_int(configuration, lldpctl_k_config_receiveonly)?
"yes":"no");
log_debug("rpc", "client change transmit interval to %d",
config->c_tx_interval);
cfg->g_config.c_tx_interval = config->c_tx_interval;
+ LOCAL_CHASSIS(cfg)->c_ttl = cfg->g_config.c_tx_interval *
+ cfg->g_config.c_tx_hold;
+ }
+ if (config->c_tx_hold > 0) {
+ log_debug("rpc", "client change transmit hold to %d",
+ config->c_tx_hold);
+ cfg->g_config.c_tx_hold = config->c_tx_hold;
+ LOCAL_CHASSIS(cfg)->c_ttl = cfg->g_config.c_tx_interval *
+ cfg->g_config.c_tx_hold;
}
if (config->c_tx_interval < 0) {
log_debug("rpc", "client asked for immediate retransmission");
hardware->h_ifname);
goto malformed;
}
- chassis->c_ttl = LLDPD_TTL;
+ chassis->c_ttl = cfg->g_config.c_tx_interval * cfg->g_config.c_tx_hold;
chassis->c_id_subtype = LLDP_CHASSISID_SUBTYPE_LLADDR;
chassis->c_id_len = ETHER_ADDR_LEN;
if ((chassis->c_id = (char *)malloc(ETHER_ADDR_LEN)) == NULL) {
cfg->g_config.c_paused = 1;
cfg->g_config.c_receiveonly = receiveonly;
cfg->g_config.c_tx_interval = LLDPD_TX_INTERVAL;
+ cfg->g_config.c_tx_hold = LLDPD_TX_HOLD;
cfg->g_config.c_max_neighbors = LLDPD_MAX_NEIGHBORS;
#ifdef ENABLE_LLDPMED
cfg->g_config.c_enable_fast_start = enable_fast_start;
#endif
/* Set TTL */
- lchassis->c_ttl = LLDPD_TTL;
+ lchassis->c_ttl = cfg->g_config.c_tx_interval * cfg->g_config.c_tx_hold;
log_debug("main", "initialize protocols");
cfg->g_protocols = protos;
#define SYSFS_CLASS_NET "/sys/class/net/"
#define SYSFS_CLASS_DMI "/sys/class/dmi/id/"
-#define LLDPD_TTL 120
#define LLDPD_TX_INTERVAL 30
+#define LLDPD_TX_HOLD 4
+#define LLDPD_TTL LLDPD_TX_INTERVAL * LLDPD_TX_HOLD
#define LLDPD_TX_MSGDELAY 1
#define LLDPD_MAX_NEIGHBORS 4
#define LLDPD_PID_FILE "/var/run/lldpd.pid"
goto malformed;
}
TAILQ_INSERT_TAIL(&chassis->c_mgmt, mgmt, m_entries);
- chassis->c_ttl = LLDPD_TTL;
+ chassis->c_ttl = cfg->g_config.c_tx_interval * cfg->g_config.c_tx_hold;
port->p_id_subtype = LLDP_PORTID_SUBTYPE_LOCAL;
if (asprintf(&port->p_id, "%02x-%02x-%02x",
case lldpctl_k_config_fast_start_interval:
return c->config->c_tx_fast_interval;
#endif
+ case lldpctl_k_config_tx_hold:
+ return c->config->c_tx_hold;
default:
return SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST);
}
config.c_tx_fast_interval = c->config->c_tx_fast_interval = value;
break;
#endif
+ case lldpctl_k_config_tx_hold:
+ config.c_tx_hold = value;
+ if (value > 0) c->config->c_tx_hold = value;
+ break;
default:
SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST);
return NULL;
lldpctl_k_ageout_cnt, /**< `(I)` ageout cnt. Only works for a local port. */
lldpctl_k_insert_cnt, /**< `(I)` insert cnt. Only works for a local port. */
lldpctl_k_delete_cnt, /**< `(I)` delete cnt. Only works for a local port. */
+ lldpctl_k_config_tx_hold, /**< `(I,WO)` Transmit hold interval. */
} lldpctl_key_t;
/**
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
+ int c_tx_hold; /* Transmit hold */
};
MARSHAL_BEGIN(lldpd_config)
MARSHAL_STR(lldpd_config, c_mgmt_pattern)