chiark / gitweb /
bus-proxy: make sure sure eavesdrop= XML attributes are properly handled
[elogind.git] / src / libsystemd-network / lldp-internal.c
index 7085a02491c08372fe13411815e6999e83cf89a8..f843fd256dd9e6ef37b9f749bf82adeb72967983 100644 (file)
@@ -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;