]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
Compute and handle correctly LLDP-MED capabilities (available and
authorVincent Bernat <bernat@luffy.cx>
Sun, 7 Dec 2008 15:20:32 +0000 (16:20 +0100)
committerVincent Bernat <bernat@luffy.cx>
Sun, 7 Dec 2008 15:27:46 +0000 (16:27 +0100)
enabled)

src/agent.c
src/lldp.c
src/lldpctl.c
src/lldpd.c
src/lldpd.h
src/priv.c

index 512410cb69cda6ba736cf1c3133f1886d18286d5..228172b966ce861503e3dcae2ea7a24fb3f9fb82 100644 (file)
@@ -329,15 +329,16 @@ header_tprvindexed_table(struct variable *vp, oid *name, size_t *length,
 #define LLDP_SNMP_MED_LOCAL_MODEL 7
 #define LLDP_SNMP_MED_LOCAL_ASSET 8
 /* LLDP-MED remote */
-#define LLDP_SNMP_MED_REMOTE_CAP 1
-#define LLDP_SNMP_MED_REMOTE_CLASS 2
-#define LLDP_SNMP_MED_REMOTE_HW 3
-#define LLDP_SNMP_MED_REMOTE_FW 4
-#define LLDP_SNMP_MED_REMOTE_SW 5
-#define LLDP_SNMP_MED_REMOTE_SN 6
-#define LLDP_SNMP_MED_REMOTE_MANUF 7
-#define LLDP_SNMP_MED_REMOTE_MODEL 8
-#define LLDP_SNMP_MED_REMOTE_ASSET 9
+#define LLDP_SNMP_MED_REMOTE_CAP_AVAILABLE 1
+#define LLDP_SNMP_MED_REMOTE_CAP_ENABLED 2
+#define LLDP_SNMP_MED_REMOTE_CLASS 3
+#define LLDP_SNMP_MED_REMOTE_HW 4
+#define LLDP_SNMP_MED_REMOTE_FW 5
+#define LLDP_SNMP_MED_REMOTE_SW 6
+#define LLDP_SNMP_MED_REMOTE_SN 7
+#define LLDP_SNMP_MED_REMOTE_MANUF 8
+#define LLDP_SNMP_MED_REMOTE_MODEL 9
+#define LLDP_SNMP_MED_REMOTE_ASSET 10
 
 static u_char*
 agent_h_scalars(struct variable *vp, oid *name, size_t *length,
@@ -410,7 +411,7 @@ agent_h_local_med(struct variable *vp, oid *name, size_t *length,
        if (header_generic(vp, name, length, exact, var_len, write_method))
                return NULL;
 
-       if (!scfg->g_lchassis.c_med_cap)
+       if (!scfg->g_lchassis.c_med_cap_available)
                return NULL;
 
        switch (vp->magic) {
@@ -458,14 +459,14 @@ agent_h_remote_med(struct variable *vp, oid *name, size_t *length,
        static uint8_t bit;
         static unsigned long long_ret;
 
-       if (!scfg->g_lchassis.c_med_cap)
+       if (!scfg->g_lchassis.c_med_cap_available)
                return NULL;
 
        if ((hardware = header_tprindexed_table(vp, name, length,
                    exact, var_len, write_method, 0)) == NULL)
                return NULL;
 
-       if (!hardware->h_rchassis->c_med_cap)
+       if (!hardware->h_rchassis->c_med_cap_available)
                return NULL;
 
        switch (vp->magic) {
@@ -474,9 +475,13 @@ agent_h_remote_med(struct variable *vp, oid *name, size_t *length,
                if (long_ret > 0)
                        return (u_char *)&long_ret;
                break;
-       case LLDP_SNMP_MED_REMOTE_CAP:
+       case LLDP_SNMP_MED_REMOTE_CAP_AVAILABLE:
                *var_len = 1;
-               bit = swap_bits(hardware->h_rchassis->c_med_cap);
+               bit = swap_bits(hardware->h_rchassis->c_med_cap_available);
+               return (u_char *)&bit;
+       case LLDP_SNMP_MED_REMOTE_CAP_ENABLED:
+               *var_len = 1;
+               bit = swap_bits(hardware->h_rchassis->c_med_cap_enabled);
                return (u_char *)&bit;
 #define LLDP_H_REMOTE_MED(magic, variable)                             \
                case magic:                                             \
@@ -944,9 +949,9 @@ static struct variable8 lldp_vars[] = {
        {LLDP_SNMP_MED_LOCAL_ASSET, ASN_OCTET_STR, RONLY, agent_h_local_med, 6,
         {1, 5, 4795, 1, 2, 8}},
        /* LLDP-MED remote */
-       {LLDP_SNMP_MED_REMOTE_CAP, ASN_OCTET_STR, RONLY, agent_h_remote_med, 8,
+       {LLDP_SNMP_MED_REMOTE_CAP_AVAILABLE, ASN_OCTET_STR, RONLY, agent_h_remote_med, 8,
         {1, 5, 4795, 1, 3, 1, 1, 1}},
-       {LLDP_SNMP_MED_REMOTE_CAP, ASN_OCTET_STR, RONLY, agent_h_remote_med, 8,
+       {LLDP_SNMP_MED_REMOTE_CAP_ENABLED, ASN_OCTET_STR, RONLY, agent_h_remote_med, 8,
         {1, 5, 4795, 1, 3, 1, 1, 2}},
        {LLDP_SNMP_MED_REMOTE_CLASS, ASN_INTEGER, RONLY, agent_h_remote_med, 8,
         {1, 5, 4795, 1, 3, 1, 1, 3}},
index 25186c79455c888d40dba5a2c8737a80b3e53e85..919445ca91b728d8f5cf3a2274a4d14e248e262b 100644 (file)
@@ -250,7 +250,7 @@ lldp_send(struct lldpd *global, struct lldpd_chassis *chassis,
 #endif
 
 #ifdef ENABLE_LLDPMED
-       if (global->g_lchassis.c_med_cap) {
+       if (global->g_lchassis.c_med_cap_enabled) {
                /* LLDP-MED cap */
                memset(&medcap, 0, sizeof(medcap));
                medcap.tlv_head.type_len = LLDP_TLV_HEAD(LLDP_TLV_ORG,
@@ -259,7 +259,7 @@ lldp_send(struct lldpd *global, struct lldpd_chassis *chassis,
                    sizeof(medcap.tlv_cap) + sizeof(medcap.tlv_type));
                memcpy(medcap.tlv_org_id, med, sizeof(medcap.tlv_org_id));
                medcap.tlv_org_subtype = LLDP_TLV_MED_CAP;
-               medcap.tlv_cap = htons(global->g_lchassis.c_med_cap);
+               medcap.tlv_cap = htons(global->g_lchassis.c_med_cap_available);
                medcap.tlv_type = global->g_lchassis.c_med_type;
                IOV_NEW;
                iov[c].iov_base = &medcap;
@@ -286,7 +286,7 @@ lldp_send(struct lldpd *global, struct lldpd_chassis *chassis,
                    iov[c].iov_len = len;                               \
                }
 
-               if (!global->g_med_noinventory) {
+               if (global->g_lchassis.c_med_cap_enabled & LLDPMED_CAP_IV) {
                        LLDP_INVENTORY(global->g_lchassis.c_med_hw,
                            medhw, LLDP_TLV_MED_IV_HW);
                        LLDP_INVENTORY(global->g_lchassis.c_med_fw,
@@ -634,12 +634,14 @@ lldp_decode(struct lldpd *cfg, char *frame, int s,
                                                    hardware->h_ifname);
                                                goto malformed;
                                        }
-                                       chassis->c_med_cap =
+                                       chassis->c_med_cap_available =
                                            ntohs(*(u_int16_t*)(frame + f));
                                        f += 2;
                                        chassis->c_med_type =
                                            *(u_int8_t*)(frame + f);
                                        f += 1;
+                                       chassis->c_med_cap_enabled |=
+                                           LLDPMED_CAP_CAP;
                                        break;
                                case LLDP_TLV_MED_POLICY:
                                        f += 4;
@@ -652,6 +654,8 @@ lldp_decode(struct lldpd *cfg, char *frame, int s,
                                        chassis->c_med_policy =
                                            ntohl(*(u_int32_t*)(frame + f));
                                        f += 4;
+                                       chassis->c_med_cap_enabled |=
+                                           LLDPMED_CAP_POLICY;
                                        break;
                                case LLDP_TLV_MED_LOCATION:
                                        f += 4;
@@ -677,6 +681,8 @@ lldp_decode(struct lldpd *cfg, char *frame, int s,
                                            size - 5);
                                        chassis->c_med_locdata = b;
                                        f += size - 5;
+                                       chassis->c_med_cap_enabled |=
+                                           LLDPMED_CAP_LOCATION;
                                        break;
                                case LLDP_TLV_MED_MDI:
                                        f += 4;
@@ -692,6 +698,8 @@ lldp_decode(struct lldpd *cfg, char *frame, int s,
                                        chassis->c_med_powval =
                                            ntohs(*(u_int16_t*)(frame + f));
                                        f += 2;
+                                       chassis->c_med_cap_enabled |=
+                                           LLDPMED_CAP_MDI1 | LLDPMED_CAP_MDI2;
                                        break;
                                case LLDP_TLV_MED_IV_HW:
                                case LLDP_TLV_MED_IV_SW:
@@ -745,6 +753,8 @@ lldp_decode(struct lldpd *cfg, char *frame, int s,
                                                break;
                                        }
                                        f += size - 4;
+                                       chassis->c_med_cap_enabled |=
+                                           LLDPMED_CAP_IV;
                                        break;
                                default:
                                        /* Unknown LLDP MED, ignore it */
index ea78ee09c07ab1a3cd231cc7b4d00315fed157fc..6487a5826ac2866e3e48463561f55af9b61a5064 100644 (file)
@@ -270,15 +270,15 @@ display_med(struct lldpd_chassis *chassis)
                break;
        }
        printf("\n LLDP-MED Capabilities:");
-       if (chassis->c_med_cap & LLDPMED_CAP_CAP)
+       if (chassis->c_med_cap_enabled & LLDPMED_CAP_CAP)
                printf(" Capabilities");
-       if (chassis->c_med_cap & LLDPMED_CAP_POLICY)
+       if (chassis->c_med_cap_enabled & LLDPMED_CAP_POLICY)
                printf(" Policy");
-       if (chassis->c_med_cap & LLDPMED_CAP_LOCATION)
+       if (chassis->c_med_cap_enabled & LLDPMED_CAP_LOCATION)
                printf(" Location");
-       if (chassis->c_med_cap & (LLDPMED_CAP_MDI1 | LLDPMED_CAP_MDI2))
+       if (chassis->c_med_cap_enabled & (LLDPMED_CAP_MDI1 | LLDPMED_CAP_MDI2))
                printf(" MDI");
-       if (chassis->c_med_cap & LLDPMED_CAP_IV)
+       if (chassis->c_med_cap_enabled & LLDPMED_CAP_IV)
                printf(" Inventory");
        printf("\n");
        if (chassis->c_med_policy) {
@@ -366,8 +366,6 @@ display_med(struct lldpd_chassis *chassis)
                                printf(", Primary Power Source");
                        } else if((chassis->c_med_powtype & 0x30) == 0x20) {
                                printf(", Backup Power Source / Power Conservation Mode");
-                       } else {
-                               printf("");
                        }
                } else if((chassis->c_med_powtype & 0xC0) == 0x40) {
                        printf("PD Device");
@@ -651,7 +649,7 @@ main(int argc, char *argv[])
                        }
 #endif
 #ifdef ENABLE_LLDPMED
-                       if (chassis.c_med_cap) {
+                       if (chassis.c_med_cap_enabled) {
                                printf("\n");
                                display_med(&chassis);
                        }
index d5cf46df005f9203567570ba5ad3ea9f1b5a49ad..34ae32a0fcfe9ff33cfef7862257f17c6f8e5046 100644 (file)
@@ -1494,10 +1494,11 @@ main(int argc, char *argv[])
                if (lldpmed == LLDPMED_CLASS_III)
                        cfg->g_lchassis.c_cap_available |= LLDP_CAP_TELEPHONE;
                cfg->g_lchassis.c_med_type = lldpmed;
-               cfg->g_lchassis.c_med_cap = LLDPMED_CAP_CAP;
+               cfg->g_lchassis.c_med_cap_available = LLDPMED_CAP_CAP |
+                   LLDPMED_CAP_IV;
+               cfg->g_lchassis.c_med_cap_enabled = LLDPMED_CAP_CAP;
                if (!noinventory)
-                       cfg->g_lchassis.c_med_cap |= LLDPMED_CAP_IV;
-               cfg->g_med_noinventory = noinventory;
+                       cfg->g_lchassis.c_med_cap_enabled |= LLDPMED_CAP_IV;
        }
 #endif
 
index bb5377b463a8c25daacb26856559900efa3ccff4..34a61366e72db44fb2050b74579b979004a9ce6d 100644 (file)
@@ -84,8 +84,9 @@ struct lldpd_chassis {
        u_int32_t                c_mgmt_if;
 
 #ifdef ENABLE_LLDPMED
-#define STRUCT_LLDPD_CHASSIS_MED "wblwbsbwsssssss"
-       u_int16_t                c_med_cap;
+#define STRUCT_LLDPD_CHASSIS_MED "wwblwbsbwsssssss"
+       u_int16_t                c_med_cap_available;
+       u_int16_t                c_med_cap_enabled;
        u_int8_t                 c_med_type;
        u_int32_t                c_med_policy;
        u_int16_t                c_med_locsize;
@@ -236,9 +237,6 @@ struct lldpd {
        int                      g_multi; /* Set to 1 if multiple protocols */
        int                      g_probe_time;
        int                      g_listen_vlans;
-#ifdef ENABLE_LLDPMED
-        int                     g_med_noinventory;
-#endif
 
        time_t                   g_lastsent;
        int                      g_lastrid;
index deeb2e190f455c6d9d71043aed7b42417daa2ce4..50eabaa48110678e1a16eeb07a188352516b6563 100644 (file)
@@ -316,7 +316,7 @@ asroot_ethtool()
        ifr.ifr_data = (caddr_t)&ethc;
        ethc.cmd = ETHTOOL_GSET;
        if ((rc = ioctl(sock, SIOCETHTOOL, &ifr)) != 0) {
-               LLOG_DEBUG("[priv]: unable to ioctl ETHTOOL for %s",
+               LLOG_DEBUG("[priv]: unable to ioctl ETHTOOL for %s: %m",
                    ifr.ifr_name);
                must_write(remote, &rc, sizeof(int));
                close(sock);