From 6d08df0e25d0fe76e52187d4053b2a930c7816f4 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Fri, 26 Mar 2010 23:24:35 +0100 Subject: [PATCH] Move LLDP-MED POE stuff into a dedicated structure. This will allow to send this structure without sending the whole port information. --- src/agent.c | 22 +++++++++++----------- src/display.c | 12 ++++++------ src/lldp.c | 34 +++++++++++++++++----------------- src/lldpd.h | 15 ++++++++++----- tests/check_lldp.c | 16 ++++++++-------- 5 files changed, 52 insertions(+), 47 deletions(-) diff --git a/src/agent.c b/src/agent.c index 4e5ac03e..3805dec3 100644 --- a/src/agent.c +++ b/src/agent.c @@ -668,7 +668,7 @@ agent_h_remote_med(struct variable *vp, oid *name, size_t *length, bit = swap_bits(port->p_med_cap_enabled); return (u_char *)&bit; case LLDP_SNMP_MED_REMOTE_POE_DEVICETYPE: - switch (port->p_med_pow_devicetype) { + switch (port->p_med_power.devicetype) { case LLDPMED_POW_TYPE_PSE: long_ret = 2; break; case LLDPMED_POW_TYPE_PD: @@ -682,19 +682,19 @@ agent_h_remote_med(struct variable *vp, oid *name, size_t *length, case LLDP_SNMP_MED_REMOTE_POE_PSE_POWERVAL: case LLDP_SNMP_MED_REMOTE_POE_PD_POWERVAL: if (((vp->magic == LLDP_SNMP_MED_REMOTE_POE_PSE_POWERVAL) && - (port->p_med_pow_devicetype == + (port->p_med_power.devicetype == LLDPMED_POW_TYPE_PSE)) || ((vp->magic == LLDP_SNMP_MED_REMOTE_POE_PD_POWERVAL) && - (port->p_med_pow_devicetype == + (port->p_med_power.devicetype == LLDPMED_POW_TYPE_PD))) { - long_ret = port->p_med_pow_val; + long_ret = port->p_med_power.val; return (u_char *)&long_ret; } break; case LLDP_SNMP_MED_REMOTE_POE_PSE_POWERSOURCE: - if (port->p_med_pow_devicetype == + if (port->p_med_power.devicetype == LLDPMED_POW_TYPE_PSE) { - switch (port->p_med_pow_source) { + switch (port->p_med_power.source) { case LLDPMED_POW_SOURCE_PRIMARY: long_ret = 2; break; case LLDPMED_POW_SOURCE_BACKUP: @@ -706,9 +706,9 @@ agent_h_remote_med(struct variable *vp, oid *name, size_t *length, } break; case LLDP_SNMP_MED_REMOTE_POE_PD_POWERSOURCE: - if (port->p_med_pow_devicetype == + if (port->p_med_power.devicetype == LLDPMED_POW_TYPE_PD) { - switch (port->p_med_pow_source) { + switch (port->p_med_power.source) { case LLDPMED_POW_SOURCE_PSE: long_ret = 2; break; case LLDPMED_POW_SOURCE_LOCAL: @@ -724,12 +724,12 @@ agent_h_remote_med(struct variable *vp, oid *name, size_t *length, case LLDP_SNMP_MED_REMOTE_POE_PSE_POWERPRIORITY: case LLDP_SNMP_MED_REMOTE_POE_PD_POWERPRIORITY: if (((vp->magic == LLDP_SNMP_MED_REMOTE_POE_PSE_POWERPRIORITY) && - (port->p_med_pow_devicetype == + (port->p_med_power.devicetype == LLDPMED_POW_TYPE_PSE)) || ((vp->magic == LLDP_SNMP_MED_REMOTE_POE_PD_POWERPRIORITY) && - (port->p_med_pow_devicetype == + (port->p_med_power.devicetype == LLDPMED_POW_TYPE_PD))) { - switch (port->p_med_pow_priority) { + switch (port->p_med_power.priority) { case LLDPMED_POW_PRIO_CRITICAL: long_ret = 2; break; case LLDPMED_POW_PRIO_HIGH: diff --git a/src/display.c b/src/display.c index 50c55994..8267b0d6 100644 --- a/src/display.c +++ b/src/display.c @@ -671,24 +671,24 @@ display_med(struct writer *w, struct lldpd_chassis *chassis, struct lldpd_port * tag_end(w); } } - if (port->p_med_pow_devicetype) { + if (port->p_med_power.devicetype) { tag_start(w, "poe", "Extended Power-over-Ethernet"); tag_start(w, "device-type", "Power Type & Source"); - tag_data(w, map_lookup(port_med_pow_devicetype_map, port->p_med_pow_devicetype)); + tag_data(w, map_lookup(port_med_pow_devicetype_map, port->p_med_power.devicetype)); tag_end(w); tag_start(w, "source", "Power Source"); - tag_data(w, map_lookup(port_med_pow_source_map, port->p_med_pow_source)); + tag_data(w, map_lookup(port_med_pow_source_map, port->p_med_power.source)); tag_end(w); tag_start(w, "priority", "Power Priority"); - tag_data(w, map_lookup(port_med_pow_priority_map, port->p_med_pow_priority)); + tag_data(w, map_lookup(port_med_pow_priority_map, port->p_med_power.priority)); tag_end(w); - if(port->p_med_pow_val < 1024) { + if(port->p_med_power.val < 1024) { tag_start(w, "power", "Power Value"); - tag_data(w, u2str(port->p_med_pow_val * 100)); + tag_data(w, u2str(port->p_med_power.val * 100)); tag_end(w); } tag_end(w); diff --git a/src/lldp.c b/src/lldp.c index 2bb9e2ee..4d9be3e2 100644 --- a/src/lldp.c +++ b/src/lldp.c @@ -623,75 +623,75 @@ lldp_decode(struct lldpd *cfg, char *frame, int s, power = PEEK_UINT8; switch (power & 0xC0) { case 0x0: - port->p_med_pow_devicetype = LLDPMED_POW_TYPE_PSE; + port->p_med_power.devicetype = LLDPMED_POW_TYPE_PSE; port->p_med_cap_enabled |= LLDPMED_CAP_MDI_PSE; switch (power & 0x30) { case 0x0: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_UNKNOWN; break; case 0x10: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_PRIMARY; break; case 0x20: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_BACKUP; break; default: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_RESERVED; } break; case 0x40: - port->p_med_pow_devicetype = LLDPMED_POW_TYPE_PD; + port->p_med_power.devicetype = LLDPMED_POW_TYPE_PD; port->p_med_cap_enabled |= LLDPMED_CAP_MDI_PD; switch (power & 0x30) { case 0x0: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_UNKNOWN; break; case 0x10: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_PSE; break; case 0x20: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_LOCAL; break; default: - port->p_med_pow_source = + port->p_med_power.source = LLDPMED_POW_SOURCE_BOTH; } break; default: - port->p_med_pow_devicetype = + port->p_med_power.devicetype = LLDPMED_POW_TYPE_RESERVED; } switch (power & 0x0F) { case 0x0: - port->p_med_pow_priority = + port->p_med_power.priority = LLDPMED_POW_PRIO_UNKNOWN; break; case 0x1: - port->p_med_pow_priority = + port->p_med_power.priority = LLDPMED_POW_PRIO_CRITICAL; break; case 0x2: - port->p_med_pow_priority = + port->p_med_power.priority = LLDPMED_POW_PRIO_HIGH; break; case 0x3: - port->p_med_pow_priority = + port->p_med_power.priority = LLDPMED_POW_PRIO_LOW; break; default: - port->p_med_pow_priority = + port->p_med_power.priority = LLDPMED_POW_PRIO_UNKNOWN; } - port->p_med_pow_val = PEEK_UINT16; + port->p_med_power.val = PEEK_UINT16; break; case LLDP_TLV_MED_IV_HW: case LLDP_TLV_MED_IV_SW: diff --git a/src/lldpd.h b/src/lldpd.h index 51305e7c..331691b9 100644 --- a/src/lldpd.h +++ b/src/lldpd.h @@ -92,6 +92,14 @@ struct lldpd_med_loc { char *data; int data_len; }; + +#define STRUCT_LLDPD_MED_POWER "(bbbw)" +struct lldpd_med_power { + u_int8_t devicetype; /* PD or PSE */ + u_int8_t source; + u_int8_t priority; + u_int16_t val; +}; #endif struct lldpd_chassis { @@ -169,14 +177,11 @@ struct lldpd_port { STRUCT_LLDPD_MED_LOC \ STRUCT_LLDPD_MED_LOC \ STRUCT_LLDPD_MED_LOC \ - "bbbw" + STRUCT_LLDPD_MED_POWER u_int16_t p_med_cap_enabled; struct lldpd_med_policy p_med_policy[LLDPMED_APPTYPE_LAST]; struct lldpd_med_loc p_med_location[LLDPMED_LOCFORMAT_LAST]; - u_int8_t p_med_pow_devicetype; /* PD or PSE */ - u_int8_t p_med_pow_source; - u_int8_t p_med_pow_priority; - u_int16_t p_med_pow_val; + struct lldpd_med_power p_med_power; #else #define STRUCT_LLDPD_PORT_MED "" #endif diff --git a/tests/check_lldp.c b/tests/check_lldp.c index bc7e6646..d3495d6d 100644 --- a/tests/check_lldp.c +++ b/tests/check_lldp.c @@ -540,10 +540,10 @@ Link Layer Discovery Protocol 6; hardware.h_lport.p_med_policy[LLDPMED_APPTYPE_SOFTPHONEVOICE-1].dscp = 46; - hardware.h_lport.p_med_pow_devicetype = LLDPMED_POW_TYPE_PSE; - hardware.h_lport.p_med_pow_source = LLDPMED_POW_SOURCE_PRIMARY; - hardware.h_lport.p_med_pow_priority = LLDPMED_POW_PRIO_HIGH; - hardware.h_lport.p_med_pow_val = 65; + hardware.h_lport.p_med_power.devicetype = LLDPMED_POW_TYPE_PSE; + hardware.h_lport.p_med_power.source = LLDPMED_POW_SOURCE_PRIMARY; + hardware.h_lport.p_med_power.priority = LLDPMED_POW_PRIO_HIGH; + hardware.h_lport.p_med_power.val = 65; /* Build packet */ n = lldp_send(NULL, &hardware); @@ -1415,10 +1415,10 @@ Link Layer Discovery Protocol LLDPMED_LOCFORMAT_CIVIC); ck_assert_int_eq(nport->p_med_location[LLDPMED_LOCFORMAT_COORD-1].format, 0); - ck_assert_int_eq(nport->p_med_pow_val, 65); - ck_assert_int_eq(nport->p_med_pow_source, LLDPMED_POW_SOURCE_UNKNOWN); - ck_assert_int_eq(nport->p_med_pow_priority, LLDPMED_POW_PRIO_LOW); - ck_assert_int_eq(nport->p_med_pow_devicetype, LLDPMED_POW_TYPE_PSE); + ck_assert_int_eq(nport->p_med_power.val, 65); + ck_assert_int_eq(nport->p_med_power.source, LLDPMED_POW_SOURCE_UNKNOWN); + ck_assert_int_eq(nport->p_med_power.priority, LLDPMED_POW_PRIO_LOW); + ck_assert_int_eq(nport->p_med_power.devicetype, LLDPMED_POW_TYPE_PSE); } END_TEST #endif -- 2.39.5