From: Vincent Bernat Date: Sun, 7 Dec 2008 15:20:32 +0000 (+0100) Subject: Compute and handle correctly LLDP-MED capabilities (available and X-Git-Tag: 0.3~26 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=40ecae87747e5c1f3857d3dd7e240571b4ce389d;p=thirdparty%2Flldpd.git Compute and handle correctly LLDP-MED capabilities (available and enabled) --- diff --git a/src/agent.c b/src/agent.c index 512410cb..228172b9 100644 --- a/src/agent.c +++ b/src/agent.c @@ -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}}, diff --git a/src/lldp.c b/src/lldp.c index 25186c79..919445ca 100644 --- a/src/lldp.c +++ b/src/lldp.c @@ -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 */ diff --git a/src/lldpctl.c b/src/lldpctl.c index ea78ee09..6487a582 100644 --- a/src/lldpctl.c +++ b/src/lldpctl.c @@ -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); } diff --git a/src/lldpd.c b/src/lldpd.c index d5cf46df..34ae32a0 100644 --- a/src/lldpd.c +++ b/src/lldpd.c @@ -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 diff --git a/src/lldpd.h b/src/lldpd.h index bb5377b4..34a61366 100644 --- a/src/lldpd.h +++ b/src/lldpd.h @@ -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; diff --git a/src/priv.c b/src/priv.c index deeb2e19..50eabaa4 100644 --- a/src/priv.c +++ b/src/priv.c @@ -316,7 +316,7 @@ asroot_ethtool() ifr.ifr_data = (caddr_t)ðc; 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);