From: Alexandru Ardelean Date: Thu, 2 Apr 2015 10:03:02 +0000 (+0300) Subject: lldpd: make management addresses advertisement optional X-Git-Tag: 0.7.15~45^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c2217aa0df98900fd30990f56bd97e0a47c6bd9;p=thirdparty%2Flldpd.git lldpd: make management addresses advertisement optional Signed-off-by: Alexandru Ardelean --- diff --git a/src/client/conf-lldp.c b/src/client/conf-lldp.c index b23313af..dae43817 100644 --- a/src/client/conf-lldp.c +++ b/src/client/conf-lldp.c @@ -170,6 +170,32 @@ cmd_chassis_cap_advertise(struct lldpctl_conn_t *conn, struct writer *w, return 1; } +/* FIXME: see about compressing this with other functions */ +static int +cmd_chassis_mgmt_advertise(struct lldpctl_conn_t *conn, struct writer *w, + struct cmd_env *env, void *arg) +{ + 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_int(config, + lldpctl_k_config_chassis_mgmt_advertise, + arg?1:0) == NULL) { + log_warnx("lldpctl", "unable to %s management addresses advertisement: %s", + arg?"enable":"disable", + lldpctl_last_strerror(conn)); + lldpctl_atom_dec_ref(config); + return 0; + } + log_info("lldpctl", "management addresses advertisement %s", + arg?"enabled":"disabled"); + lldpctl_atom_dec_ref(config); + return 1; +} + /** * Register `configure lldp` commands. * @@ -272,4 +298,19 @@ register_commands_configure_lldp(struct cmd_node *configure, NULL, NULL, NULL), NEWLINE, "Don't enable chassis capabilities advertisement", NULL, cmd_chassis_cap_advertise, NULL); + + commands_new( + commands_new(configure_lldp, + "management-addresses-advertisements", + "Enable management addresses advertisement", + NULL, NULL, NULL), + NEWLINE, "Enable management addresses advertisement", + NULL, cmd_chassis_mgmt_advertise, "enable"); + commands_new( + commands_new(unconfigure_lldp, + "management-addresses-advertisements", + "Don't enable management addresses advertisement", + NULL, NULL, NULL), + NEWLINE, "Don't enable management addresses advertisement", + NULL, cmd_chassis_mgmt_advertise, NULL); } diff --git a/src/daemon/client.c b/src/daemon/client.c index a6cc4d2b..e4485e12 100644 --- a/src/daemon/client.c +++ b/src/daemon/client.c @@ -168,6 +168,12 @@ client_handle_set_configuration(struct lldpd *cfg, enum hmsg_type *type, cfg->g_config.c_cap_advertise = config->c_cap_advertise; levent_update_now(cfg); } + if (CHANGED(c_mgmt_advertise)) { + log_debug("rpc", "%s management addresses advertisement", + config->c_promisc?"enable":"disable"); + cfg->g_config.c_mgmt_advertise = config->c_mgmt_advertise; + levent_update_now(cfg); + } if (CHANGED(c_bond_slave_src_mac_type)) { if (config->c_bond_slave_src_mac_type > LLDP_BOND_SLAVE_SRC_MAC_TYPE_UNKNOWN && diff --git a/src/daemon/interfaces.c b/src/daemon/interfaces.c index c16f218c..73f949a5 100644 --- a/src/daemon/interfaces.c +++ b/src/daemon/interfaces.c @@ -439,6 +439,8 @@ interfaces_helper_mgmt(struct lldpd *cfg, const char *pattern = cfg->g_config.c_mgmt_pattern; lldpd_chassis_mgmt_cleanup(LOCAL_CHASSIS(cfg)); + if (!cfg->g_config.c_mgmt_advertise) + return; /* Is the pattern provided an actual IP address? */ if (pattern && strpbrk(pattern, "!,*?") == NULL) { diff --git a/src/daemon/lldpd.c b/src/daemon/lldpd.c index 21743502..8ba20710 100644 --- a/src/daemon/lldpd.c +++ b/src/daemon/lldpd.c @@ -1641,6 +1641,7 @@ lldpd_main(int argc, char *argv[], char *envp[]) cfg->g_config.c_cap_advertise = 1; lchassis->c_cap_available = LLDP_CAP_BRIDGE | LLDP_CAP_WLAN | LLDP_CAP_ROUTER | LLDP_CAP_STATION; + cfg->g_config.c_mgmt_advertise = 1; TAILQ_INIT(&lchassis->c_mgmt); #ifdef ENABLE_LLDPMED if (lldpmed > 0) { diff --git a/src/lib/atoms/config.c b/src/lib/atoms/config.c index 48af9d3c..023b5d5b 100644 --- a/src/lib/atoms/config.c +++ b/src/lib/atoms/config.c @@ -203,6 +203,8 @@ _lldpctl_atom_get_int_config(lldpctl_atom_t *atom, lldpctl_key_t key) return c->config->c_promisc; case lldpctl_k_config_chassis_cap_advertise: return c->config->c_cap_advertise; + case lldpctl_k_config_chassis_mgmt_advertise: + return c->config->c_mgmt_advertise; #ifdef ENABLE_LLDPMED case lldpctl_k_config_lldpmed_noinventory: return c->config->c_noinventory; @@ -246,6 +248,9 @@ _lldpctl_atom_set_int_config(lldpctl_atom_t *atom, lldpctl_key_t key, case lldpctl_k_config_chassis_cap_advertise: config.c_cap_advertise = c->config->c_cap_advertise = value; break; + case lldpctl_k_config_chassis_mgmt_advertise: + config.c_mgmt_advertise = c->config->c_mgmt_advertise = value; + break; #ifdef ENABLE_LLDPMED case lldpctl_k_config_fast_start_enabled: config.c_enable_fast_start = c->config->c_enable_fast_start = value; diff --git a/src/lib/lldpctl.h b/src/lib/lldpctl.h index f74463ba..9f154233 100644 --- a/src/lib/lldpctl.h +++ b/src/lib/lldpctl.h @@ -613,6 +613,7 @@ typedef enum { lldpctl_k_config_ifdescr_update, /**< `(I,WO)` Enable or disable setting interface description */ lldpctl_k_config_iface_promisc, /**< `(I,WO)` Enable or disable promiscuous mode on interfaces */ lldpctl_k_config_chassis_cap_advertise, /**< `(I,WO)` Enable or disable chassis capabilities advertisement */ + lldpctl_k_config_chassis_mgmt_advertise, /**< `(I,WO)` Enable or disable management addresses advertisement */ lldpctl_k_interface_name = 1000, /**< `(S)` The interface name. */ diff --git a/src/lldpd-structs.h b/src/lldpd-structs.h index d4b511f8..93b435e4 100644 --- a/src/lldpd-structs.h +++ b/src/lldpd-structs.h @@ -332,6 +332,7 @@ struct lldpd_config { int c_set_ifdescr; /* Set interface description */ int c_promisc; /* Interfaces should be in promiscuous mode */ int c_cap_advertise; /* Chassis capabilities advertisement */ + int c_mgmt_advertise; /* Management addresses advertisement */ #ifdef ENABLE_LLDPMED int c_noinventory; /* Don't send inventory with LLDP-MED */