From: Vincent Bernat Date: Thu, 15 Mar 2012 21:51:48 +0000 (+0100) Subject: snmp: add support for IPv6 management addresses X-Git-Tag: 0.6.0~32 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=af3caa3bab79f0f66c44ff51157709e2ac699024;p=thirdparty%2Flldpd.git snmp: add support for IPv6 management addresses --- diff --git a/src/agent.c b/src/agent.c index 7ab96c03..ef66150e 100644 --- a/src/agent.c +++ b/src/agent.c @@ -231,18 +231,22 @@ header_ipindexed_table(struct variable *vp, oid *name, size_t *length, { struct lldpd_chassis *chassis = LOCAL_CHASSIS(scfg); struct lldpd_mgmt *mgmt; + oid index[2 + 16]; if (!header_index_init(vp, name, length, exact, var_len, write_method)) return NULL; TAILQ_FOREACH(mgmt, &chassis->c_mgmt, m_entries) { - if (mgmt->m_family != LLDPD_AF_IPV4) - continue; - oid index[6] = { - 1, 4, - mgmt->m_addr.octets[0], - mgmt->m_addr.octets[1], - mgmt->m_addr.octets[2], - mgmt->m_addr.octets[3] }; - if (header_index_add(index, 6, mgmt)) + int i; + switch (mgmt->m_family) { + case LLDPD_AF_IPV4: index[0] = 1; break; + case LLDPD_AF_IPV6: index[0] = 2; break; + default: assert(0); + } + index[1] = mgmt->m_addrsize; + if (index[1] > sizeof(index) - 2) + continue; /* Odd... */ + for (i = 0; i < index[1]; i++) + index[i + 2] = mgmt->m_addr.octets[i]; + if (header_index_add(index, 2 + index[1], mgmt)) return mgmt; } @@ -256,24 +260,28 @@ header_tpripindexed_table(struct variable *vp, oid *name, size_t *length, struct lldpd_hardware *hardware; struct lldpd_port *port; struct lldpd_mgmt *mgmt; + oid index[5 + 16]; if (!header_index_init(vp, name, length, exact, var_len, write_method)) return NULL; TAILQ_FOREACH(hardware, &scfg->g_hardware, h_entries) { TAILQ_FOREACH(port, &hardware->h_rports, p_entries) { if (SMART_HIDDEN(port)) continue; TAILQ_FOREACH(mgmt, &port->p_chassis->c_mgmt, m_entries) { - if (mgmt->m_family != LLDPD_AF_IPV4) - continue; - oid index[9] = { lastchange(port), - hardware->h_ifindex, - port->p_chassis->c_index, - 1, 4, - mgmt->m_addr.octets[0], - mgmt->m_addr.octets[1], - mgmt->m_addr.octets[2], - mgmt->m_addr.octets[3] }; - if (header_index_add(index, 9, - mgmt)) + int i; + index[0] = lastchange(port); + index[1] = hardware->h_ifindex; + index[2] = port->p_chassis->c_index; + switch (mgmt->m_family) { + case LLDPD_AF_IPV4: index[3] = 1; break; + case LLDPD_AF_IPV6: index[3] = 2; break; + default: assert(0); + } + index[4] = mgmt->m_addrsize; + if (index[4] > sizeof(index) - 5) + continue; /* Odd... */ + for (i = 0; i < index[4]; i++) + index[i + 5] = mgmt->m_addr.octets[i]; + if (header_index_add(index, 5 + index[4], mgmt)) return mgmt; } } @@ -1333,10 +1341,9 @@ 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; + long_ret = mgmt->m_addrsize + 1; return (u_char*)&long_ret; case LLDP_SNMP_ADDR_IFSUBTYPE: if (mgmt->m_iface != 0) diff --git a/tests/check_snmp.c b/tests/check_snmp.c index 28a83b70..c986f29a 100644 --- a/tests/check_snmp.c +++ b/tests/check_snmp.c @@ -59,6 +59,15 @@ struct lldpd_mgmt mgmt2 = { .m_addrsize = sizeof(struct in_addr), .m_iface = 5 }; +struct lldpd_mgmt mgmt3 = { + .m_family = LLDPD_AF_IPV6, + .m_addr = { .octets = { 0x20, 0x01, 0x0d, 0xb8, + 0xca, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x17 } }, /* 2001:db8:cafe::17 */ + .m_addrsize = sizeof(struct in6_addr), + .m_iface = 5 +}; struct lldpd_chassis chassis2 = { .c_index = 4, .c_protocol = LLDPD_MODE_LLDP, @@ -272,6 +281,7 @@ snmp_config() 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(&chassis2.c_mgmt, &mgmt3, 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); @@ -461,10 +471,16 @@ struct tree_node snmp_tree[] = { /* lldpRemManAddrIfSubtype */ { {1, 4, 2, 1, 3, 0, 3, 1, 1, 4, 192, 0, 2, 15 }, 14, ASN_INTEGER, { .integer = 2 } }, { {1, 4, 2, 1, 3, 8000, 3, 4, 1, 4, 192, 0, 2, 17 }, 14, ASN_INTEGER, { .integer = 2 } }, + { {1, 4, 2, 1, 3, 8000, 3, 4, 2, 16, + 0x20, 0x01, 0x0d, 0xb8, 0xca, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17 }, 26, ASN_INTEGER, { .integer = 2 } }, { {1, 4, 2, 1, 3, 10000, 4, 1, 1, 4, 192, 0, 2, 15 }, 14, ASN_INTEGER, { .integer = 2 } }, /* lldpRemManAddrIfId */ { {1, 4, 2, 1, 4, 0, 3, 1, 1, 4, 192, 0, 2, 15 }, 14, ASN_INTEGER, { .integer = 3 } }, { {1, 4, 2, 1, 4, 8000, 3, 4, 1, 4, 192, 0, 2, 17 }, 14, ASN_INTEGER, { .integer = 5 } }, + { {1, 4, 2, 1, 4, 8000, 3, 4, 2, 16, + 0x20, 0x01, 0x0d, 0xb8, 0xca, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17 }, 26, ASN_INTEGER, { .integer = 5 } }, { {1, 4, 2, 1, 4, 10000, 4, 1, 1, 4, 192, 0, 2, 15 }, 14, ASN_INTEGER, { .integer = 3 } }, /* lldpRemManAddrOID */ { {1, 4, 2, 1, 5, 0, 3, 1, 1, 4, 192, 0, 2, 15 }, 14, ASN_OBJECT_ID, @@ -473,6 +489,11 @@ struct tree_node snmp_tree[] = { { {1, 4, 2, 1, 5, 8000, 3, 4, 1, 4, 192, 0, 2, 17 }, 14, ASN_OBJECT_ID, { .string = { .octet = (char *)zeroDotZero, .len = sizeof(zeroDotZero) }} }, + { {1, 4, 2, 1, 5, 8000, 3, 4, 2, 16, + 0x20, 0x01, 0x0d, 0xb8, 0xca, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17 }, 26, ASN_OBJECT_ID, + { .string = { .octet = (char *)zeroDotZero, + .len = sizeof(zeroDotZero) }} }, { {1, 4, 2, 1, 5, 10000, 4, 1, 1, 4, 192, 0, 2, 15 }, 14, ASN_OBJECT_ID, { .string = { .octet = (char *)zeroDotZero, .len = sizeof(zeroDotZero) }} },