From: Vincent Bernat Date: Thu, 15 Mar 2012 21:29:01 +0000 (+0100) Subject: snmp: fix SNMP support for management addresses X-Git-Tag: 0.6.0~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2eec55408cb902d87b83fd9987335c6f5d73526f;p=thirdparty%2Flldpd.git snmp: fix SNMP support for management addresses --- diff --git a/src/agent.c b/src/agent.c index 5cef0c79..7ab96c03 100644 --- a/src/agent.c +++ b/src/agent.c @@ -14,6 +14,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include + #include "lldpd.h" #include "agent.h" #include "frame.h" @@ -223,7 +225,7 @@ header_tprindexed_table(struct variable *vp, oid *name, size_t *length, return header_index_best(); } -static struct lldpd_chassis* +static struct lldpd_mgmt* header_ipindexed_table(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method) { @@ -240,14 +242,14 @@ header_ipindexed_table(struct variable *vp, oid *name, size_t *length, mgmt->m_addr.octets[1], mgmt->m_addr.octets[2], mgmt->m_addr.octets[3] }; - if (header_index_add(index, 6, chassis)) - return chassis; + if (header_index_add(index, 6, mgmt)) + return mgmt; } return header_index_best(); } -static struct lldpd_chassis* +static struct lldpd_mgmt* header_tpripindexed_table(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method) { @@ -271,8 +273,8 @@ header_tpripindexed_table(struct variable *vp, oid *name, size_t *length, mgmt->m_addr.octets[2], mgmt->m_addr.octets[3] }; if (header_index_add(index, 9, - port->p_chassis)) - return port->p_chassis; + mgmt)) + return mgmt; } } } @@ -1326,27 +1328,25 @@ agent_h_local_port(struct variable *vp, oid *name, size_t *length, } static u_char* -agent_v_management(struct variable *vp, size_t *var_len, struct lldpd_chassis *chassis) +agent_v_management(struct variable *vp, size_t *var_len, struct lldpd_mgmt *mgmt) { static unsigned long int long_ret; static oid zeroDotZero[2] = {0, 0}; + assert(mgmt->m_family == LLDPD_AF_IPV4); switch (vp->magic) { case LLDP_SNMP_ADDR_LEN: long_ret = 5; return (u_char*)&long_ret; -/* FIXME */ -/* case LLDP_SNMP_ADDR_IFSUBTYPE: - if (chassis->c_mgmt4.iface != 0) + if (mgmt->m_iface != 0) long_ret = LLDP_MGMT_IFACE_IFINDEX; else long_ret = 1; return (u_char*)&long_ret; case LLDP_SNMP_ADDR_IFID: - long_ret = chassis->c_mgmt4.iface; + long_ret = mgmt->m_iface; return (u_char*)&long_ret; -*/ case LLDP_SNMP_ADDR_OID: *var_len = sizeof(zeroDotZero); return (u_char*)zeroDotZero; @@ -1360,25 +1360,25 @@ agent_h_local_management(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method) { - struct lldpd_chassis *chassis; + struct lldpd_mgmt *mgmt; - if ((chassis = header_ipindexed_table(vp, name, length, + if ((mgmt = header_ipindexed_table(vp, name, length, exact, var_len, write_method)) == NULL) return NULL; - return agent_v_management(vp, var_len, chassis); + return agent_v_management(vp, var_len, mgmt); } static u_char* agent_h_remote_management(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method) { - struct lldpd_chassis *chassis; + struct lldpd_mgmt *mgmt; - if ((chassis = header_tpripindexed_table(vp, name, length, + if ((mgmt = header_tpripindexed_table(vp, name, length, exact, var_len, write_method)) == NULL) return NULL; - return agent_v_management(vp, var_len, chassis); + return agent_v_management(vp, var_len, mgmt); } /* diff --git a/tests/check_snmp.c b/tests/check_snmp.c index b7871b44..28a83b70 100644 --- a/tests/check_snmp.c +++ b/tests/check_snmp.c @@ -21,6 +21,12 @@ struct lldpd test_cfg = { struct timeval test_starttime = { .tv_sec = 100, .tv_usec = 0 }; /* First chassis */ +struct lldpd_mgmt mgmt1 = { + .m_family = LLDPD_AF_IPV4, + .m_addr = { .inet = { 251789504 } }, /* 192.0.2.15 */ + .m_addrsize = sizeof(struct in_addr), + .m_iface = 3 +}; struct lldpd_chassis chassis1 = { .c_index = 1, .c_protocol = LLDPD_MODE_LLDP, @@ -32,12 +38,6 @@ struct lldpd_chassis chassis1 = { .c_cap_available = LLDP_CAP_BRIDGE | LLDP_CAP_WLAN | LLDP_CAP_ROUTER, .c_cap_enabled = LLDP_CAP_ROUTER, .c_ttl = 60, - .c_mgmt4 = { - .family = AF_INET, - .address = { .inet = { 251789504 } }, /* 192.0.2.15 */ - .addrsize = sizeof(struct in_addr), - .iface = 3 - }, #ifdef ENABLE_LLDPMED .c_med_cap_available = LLDPMED_CAP_CAP | LLDPMED_CAP_IV | \ LLDPMED_CAP_LOCATION | LLDPMED_CAP_POLICY | \ @@ -53,6 +53,12 @@ struct lldpd_chassis chassis1 = { #endif }; /* Second chassis */ +struct lldpd_mgmt mgmt2 = { + .m_family = LLDPD_AF_IPV4, + .m_addr = { .inet = { 285343936 } }, /* 192.0.2.17 */ + .m_addrsize = sizeof(struct in_addr), + .m_iface = 5 +}; struct lldpd_chassis chassis2 = { .c_index = 4, .c_protocol = LLDPD_MODE_LLDP, @@ -64,12 +70,6 @@ struct lldpd_chassis chassis2 = { .c_cap_available = LLDP_CAP_ROUTER, .c_cap_enabled = LLDP_CAP_ROUTER, .c_ttl = 60, - .c_mgmt4 = { - .family = AF_INET, - .address = { .inet = { 285343936 } }, /* 192.0.2.17 */ - .addrsize = sizeof(struct in_addr), - .iface = 5 - }, #ifdef ENABLE_LLDPMED .c_med_hw = "Hardware 2", /* We skip c_med_fw */ @@ -267,7 +267,11 @@ snmp_config() starttime = test_starttime; agent_scfg = &test_cfg; TAILQ_INIT(&test_cfg.g_chassis); + TAILQ_INIT(&chassis1.c_mgmt); + TAILQ_INSERT_TAIL(&chassis1.c_mgmt, &mgmt1, m_entries); TAILQ_INSERT_TAIL(&test_cfg.g_chassis, &chassis1, c_entries); + TAILQ_INIT(&chassis2.c_mgmt); + TAILQ_INSERT_TAIL(&chassis2.c_mgmt, &mgmt2, m_entries); TAILQ_INSERT_TAIL(&test_cfg.g_chassis, &chassis2, c_entries); TAILQ_INIT(&test_cfg.g_hardware); TAILQ_INSERT_TAIL(&test_cfg.g_hardware, &hardware1, h_entries);