X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-network%2Flldp-internal.c;h=f843fd256dd9e6ef37b9f749bf82adeb72967983;hb=fe21f16764147d51819a904d57ac36967f9913e3;hp=7085a02491c08372fe13411815e6999e83cf89a8;hpb=ad1ad5c8e36ea795034fcdac660b15d7c141d55b;p=elogind.git diff --git a/src/libsystemd-network/lldp-internal.c b/src/libsystemd-network/lldp-internal.c index 7085a0249..f843fd256 100644 --- a/src/libsystemd-network/lldp-internal.c +++ b/src/libsystemd-network/lldp-internal.c @@ -86,6 +86,8 @@ int lldp_read_port_id(tlv_packet *tlv, goto out1; switch (subtype) { + case LLDP_PORT_SUBTYPE_PORT_COMPONENT: + case LLDP_PORT_SUBTYPE_INTERFACE_ALIAS: case LLDP_PORT_SUBTYPE_INTERFACE_NAME: r = tlv_packet_read_string(tlv, &s, length); @@ -127,9 +129,102 @@ int lldp_read_ttl(tlv_packet *tlv, uint16_t *ttl) { r = tlv_packet_read_u16(tlv, ttl); - (void) lldp_tlv_packet_exit_container(tlv); + (void)lldp_tlv_packet_exit_container(tlv); + + out: + return r; +} + +int lldp_read_system_name(tlv_packet *tlv, + uint16_t *length, + char **data) { + char *s; + int r; + + assert_return(tlv, -EINVAL); + + r = lldp_tlv_packet_enter_container(tlv, LLDP_TYPE_SYSTEM_NAME); + if (r < 0) + return r; + + r = tlv_packet_read_string(tlv, &s, length); + if (r < 0) + goto out; + + *data = (char *) s; + + out: + (void)lldp_tlv_packet_exit_container(tlv); + + return r; +} + +int lldp_read_system_description(tlv_packet *tlv, + uint16_t *length, + char **data) { + char *s; + int r; + + assert_return(tlv, -EINVAL); + + r = lldp_tlv_packet_enter_container(tlv, LLDP_TYPE_SYSTEM_DESCRIPTION); + if (r < 0) + return r; + + r = tlv_packet_read_string(tlv, &s, length); + if (r < 0) + goto out; + + *data = (char *) s; out: + (void)lldp_tlv_packet_exit_container(tlv); + + return r; +} + +int lldp_read_port_description(tlv_packet *tlv, + uint16_t *length, + char **data) { + char *s; + int r; + + assert_return(tlv, -EINVAL); + + r = lldp_tlv_packet_enter_container(tlv, LLDP_TYPE_PORT_DESCRIPTION); + if (r < 0) + return r; + + r = tlv_packet_read_string(tlv, &s, length); + if (r < 0) + goto out; + + *data = (char *) s; + + out: + (void)lldp_tlv_packet_exit_container(tlv); + + return r; +} + +int lldp_read_system_capability(tlv_packet *tlv, uint16_t *data) { + int r; + + assert_return(tlv, -EINVAL); + + r = lldp_tlv_packet_enter_container(tlv, LLDP_TYPE_SYSTEM_CAPABILITIES); + if (r < 0) + return r; + + r = tlv_packet_read_u16(tlv, data); + if (r < 0) + goto out; + + return 0; + out: + + (void)lldp_tlv_packet_exit_container(tlv); + return r; } @@ -348,7 +443,7 @@ void lldp_neighbour_port_free(lldp_neighbour_port *p) { int lldp_neighbour_port_new(lldp_chassis *c, tlv_packet *tlv, lldp_neighbour_port **ret) { - _cleanup_lldp_neighbour_port_free_ lldp_neighbour_port *p; + _cleanup_lldp_neighbour_port_free_ lldp_neighbour_port *p = NULL; uint16_t length, ttl; uint8_t *data; uint8_t type; @@ -401,7 +496,7 @@ int lldp_chassis_new(tlv_packet *tlv, Prioq *by_expiry, Hashmap *neighbour_mib, lldp_chassis **ret) { - _cleanup_lldp_chassis_free_ lldp_chassis *c; + _cleanup_lldp_chassis_free_ lldp_chassis *c = NULL; uint16_t length; uint8_t *data; uint8_t type;