static void display_cap(struct writer * w, lldpctl_atom_t *chassis, u_int8_t bit, char *symbol) { if (lldpctl_atom_get_int(chassis, lldpctl_k_chassis_cap_available) & bit) { tag_start(w, "capability", "Capability"); tag_attr (w, "type", "", symbol ); tag_attr (w, "enabled", "", (lldpctl_atom_get_int(chassis, lldpctl_k_chassis_cap_enabled) & bit)? "on":"off"); tag_end (w); } }
/** * Pause or resume execution of lldpd. * * @param conn The connection to lldpd. * @param pause 1 if we want to pause lldpd, 0 otherwise * @return 1 on success, 0 on error */ static int cmd_pause_resume(lldpctl_conn_t *conn, int pause) { lldpctl_atom_t *config = lldpctl_get_configuration(conn); if (config == NULL) { log_warnx("lldpctl", "unable to get configuration from lldpd. %s", lldpctl_last_strerror(conn)); return 0; } if (lldpctl_atom_get_int(config, lldpctl_k_config_paused) == pause) { log_debug("lldpctl", "lldpd is already %s", pause?"paused":"resumed"); lldpctl_atom_dec_ref(config); return 1; } if (lldpctl_atom_set_int(config, lldpctl_k_config_paused, pause) == NULL) { log_warnx("lldpctl", "unable to ask lldpd to %s operations. %s", pause?"pause":"resume", lldpctl_last_strerror(conn)); lldpctl_atom_dec_ref(config); return 0; } log_info("lldpctl", "lldpd should %s operations", pause?"pause":"resume"); lldpctl_atom_dec_ref(config); return 1; }
static struct json_object * respondd_provider_neighbours(void) { lldpctl_conn_t *conn; lldpctl_atom_t *ifaces, *iface, *port, *neighbors, *neighbor; const char *ctlname, *neighmac, *portmac; struct json_object *ret, *ret_lldp, *neighbors_obj; ret_lldp = json_object_new_object(); ctlname = lldpctl_get_default_transport(); conn = lldpctl_new_name(ctlname, NULL, NULL, NULL); ifaces = lldpctl_get_interfaces(conn); lldpctl_atom_foreach(ifaces, iface) { port = lldpctl_get_port(iface); // check if Port ID Subtype is MAC address if (lldpctl_atom_get_int(port, lldpctl_k_port_id_subtype) != LLDP_PORTID_SUBTYPE_LLADDR) continue; portmac = lldpctl_atom_get_str(port, lldpctl_k_port_id); if (!portmac) continue; neighbors_obj = json_object_new_object(); neighbors = lldpctl_atom_get(port, lldpctl_k_port_neighbors); lldpctl_atom_foreach(neighbors, neighbor) { // check if Chassis ID Subtype is MAC address if (lldpctl_atom_get_int(neighbor, lldpctl_k_chassis_id_subtype) != LLDP_CHASSISID_SUBTYPE_LLADDR) continue; neighmac = lldpctl_atom_get_str(neighbor, lldpctl_k_chassis_id); if (!neighmac) continue; json_object_object_add(neighbors_obj, neighmac, json_object_new_object()); } json_object_object_add(ret_lldp, portmac, neighbors_obj); }
static long int _lldpctl_atom_get_int_port(lldpctl_atom_t *atom, lldpctl_key_t key) { struct _lldpctl_atom_port_t *p = (struct _lldpctl_atom_port_t *)atom; struct lldpd_port *port = p->port; struct lldpd_hardware *hardware = p->hardware; /* Local port only */ if (hardware != NULL) { switch (key) { case lldpctl_k_port_index: return hardware->h_ifindex; case lldpctl_k_tx_cnt: return hardware->h_tx_cnt; case lldpctl_k_rx_cnt: return hardware->h_rx_cnt; case lldpctl_k_rx_discarded_cnt: return hardware->h_rx_discarded_cnt; case lldpctl_k_rx_unrecognized_cnt: return hardware->h_rx_unrecognized_cnt; case lldpctl_k_ageout_cnt: return hardware->h_ageout_cnt; case lldpctl_k_insert_cnt: return hardware->h_insert_cnt; case lldpctl_k_delete_cnt: return hardware->h_delete_cnt; default: break; } } if (p->local) { switch (key) { case lldpctl_k_port_status: return LLDPD_RXTX_FROM_PORT(port); default: break; } } if (!port) return SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST); /* Local and remote port */ switch (key) { case lldpctl_k_port_protocol: return port->p_protocol; case lldpctl_k_port_age: return port->p_lastchange; case lldpctl_k_port_id_subtype: return port->p_id_subtype; case lldpctl_k_port_hidden: return port->p_hidden_in; #ifdef ENABLE_DOT3 case lldpctl_k_port_dot3_mfs: if (port->p_mfs > 0) return port->p_mfs; break; case lldpctl_k_port_dot3_aggregid: if (port->p_aggregid > 0) return port->p_aggregid; break; case lldpctl_k_port_dot3_autoneg_support: return port->p_macphy.autoneg_support; case lldpctl_k_port_dot3_autoneg_enabled: return port->p_macphy.autoneg_enabled; case lldpctl_k_port_dot3_autoneg_advertised: return port->p_macphy.autoneg_advertised; case lldpctl_k_port_dot3_mautype: return port->p_macphy.mau_type; #endif #ifdef ENABLE_DOT1 case lldpctl_k_port_vlan_pvid: return port->p_pvid; #endif default: /* Compatibility: query the associated chassis too */ return lldpctl_atom_get_int(p->chassis, key); } return SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST); }
static void display_med(struct writer *w, lldpctl_atom_t *port) { lldpctl_atom_t *medpolicies, *medpolicy; lldpctl_atom_t *medlocations, *medlocation; lldpctl_atom_t *caelements, *caelement; long int cap = lldpctl_atom_get_int(port, lldpctl_k_chassis_med_cap); const char *type; if (lldpctl_atom_get_int(port, lldpctl_k_chassis_med_type) <= 0) return; tag_start(w, "lldp-med", "LLDP-MED"); tag_datatag(w, "device-type", "Device Type", lldpctl_atom_get_str(port, lldpctl_k_chassis_med_type)); display_med_capability(w, cap, LLDP_MED_CAP_CAP, "Capabilities"); display_med_capability(w, cap, LLDP_MED_CAP_POLICY, "Policy"); display_med_capability(w, cap, LLDP_MED_CAP_LOCATION, "Location"); display_med_capability(w, cap, LLDP_MED_CAP_MDI_PSE, "MDI/PSE"); display_med_capability(w, cap, LLDP_MED_CAP_MDI_PD, "MDI/PD"); display_med_capability(w, cap, LLDP_MED_CAP_IV, "Inventory"); /* LLDP MED policies */ medpolicies = lldpctl_atom_get(port, lldpctl_k_port_med_policies); lldpctl_atom_foreach(medpolicies, medpolicy) { if (lldpctl_atom_get_int(medpolicy, lldpctl_k_med_policy_type) <= 0) continue; tag_start(w, "policy", "LLDP-MED Network Policy for"); tag_attr(w, "apptype", "", lldpctl_atom_get_str(medpolicy, lldpctl_k_med_policy_type)); tag_attr(w, "defined", "Defined", (lldpctl_atom_get_int(medpolicy, lldpctl_k_med_policy_unknown) > 0)?"no":"yes"); if (lldpctl_atom_get_int(medpolicy, lldpctl_k_med_policy_tagged) > 0) { int vid = lldpctl_atom_get_int(medpolicy, lldpctl_k_med_policy_vid); tag_start(w, "vlan", "VLAN"); if (vid == 0) { tag_attr(w, "vid", "", "priority"); } else if (vid == 4095) { tag_attr(w, "vid", "", "reserved"); } else { tag_attr(w, "vid", "", lldpctl_atom_get_str(medpolicy, lldpctl_k_med_policy_vid)); } tag_end(w); } tag_datatag(w, "priority", "Priority", lldpctl_atom_get_str(medpolicy, lldpctl_k_med_policy_priority)); tag_datatag(w, "dscp", "DSCP Value", lldpctl_atom_get_str(medpolicy, lldpctl_k_med_policy_dscp)); tag_end(w); } lldpctl_atom_dec_ref(medpolicies); /* LLDP MED locations */ medlocations = lldpctl_atom_get(port, lldpctl_k_port_med_locations); lldpctl_atom_foreach(medlocations, medlocation) { int format = lldpctl_atom_get_int(medlocation, lldpctl_k_med_location_format); if (format <= 0) continue; tag_start(w, "location", "LLDP-MED Location Identification"); tag_attr(w, "type", "Type", lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_format)); switch (format) { case LLDP_MED_LOCFORMAT_COORD: tag_attr(w, "geoid", "Geoid", lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_geoid)); tag_datatag(w, "lat", "Latitude", lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_latitude)); tag_datatag(w, "lon", "Longitude", lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_longitude)); tag_start(w, "altitude", "Altitude"); tag_attr(w, "unit", "", lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_altitude_unit)); tag_data(w, lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_altitude)); tag_end(w); break; case LLDP_MED_LOCFORMAT_CIVIC: tag_datatag(w, "country", "Country", lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_country)); caelements = lldpctl_atom_get(medlocation, lldpctl_k_med_location_ca_elements); lldpctl_atom_foreach(caelements, caelement) { type = lldpctl_atom_get_str(caelement, lldpctl_k_med_civicaddress_type); tag_datatag(w, totag(type), type, lldpctl_atom_get_str(caelement, lldpctl_k_med_civicaddress_value)); } lldpctl_atom_dec_ref(caelements); break; case LLDP_MED_LOCFORMAT_ELIN: tag_datatag(w, "ecs", "ECS ELIN", lldpctl_atom_get_str(medlocation, lldpctl_k_med_location_elin)); break; }