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

index 5cef0c79efc77075326ddf12fc2f988efda52c00..7ab96c035123a33f7566f79a2072d8d065f42044 100644 (file)
@@ -14,6 +14,8 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <assert.h>
+
 #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);
 }
 
 /*
index b7871b4436ea5bc9bea781af63d1997c24c74e7b..28a83b702a60a00d2396a11d3a8b794108c8e832 100644 (file)
@@ -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);