]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
snmp: add support for IPv6 management addresses
authorVincent Bernat <bernat@luffy.cx>
Thu, 15 Mar 2012 21:51:48 +0000 (22:51 +0100)
committerVincent Bernat <bernat@luffy.cx>
Thu, 15 Mar 2012 21:51:48 +0000 (22:51 +0100)
src/agent.c
tests/check_snmp.c

index 7ab96c035123a33f7566f79a2072d8d065f42044..ef66150e0f1d1891d325a334e2b9512e77e902c0 100644 (file)
@@ -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)
index 28a83b702a60a00d2396a11d3a8b794108c8e832..c986f29abdd3062535a899c3d0677175abf8ece9 100644 (file)
@@ -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) }} },