static lldpctl_atom_t* _lldpctl_atom_set_int_config(lldpctl_atom_t *atom, lldpctl_key_t key, long int value) { int rc; char *canary = NULL; struct _lldpctl_atom_config_t *c = (struct _lldpctl_atom_config_t *)atom; struct lldpd_config config; memcpy(&config, c->config, sizeof(struct lldpd_config)); switch (key) { case lldpctl_k_config_paused: config.c_paused = c->config->c_paused = value; break; case lldpctl_k_config_tx_interval: config.c_tx_interval = value; if (value > 0) c->config->c_tx_interval = value; break; case lldpctl_k_config_ifdescr_update: config.c_set_ifdescr = c->config->c_set_ifdescr = value; break; case lldpctl_k_config_iface_promisc: config.c_promisc = c->config->c_promisc = value; break; case lldpctl_k_config_chassis_cap_advertise: config.c_cap_advertise = c->config->c_cap_advertise = value; break; case lldpctl_k_config_chassis_mgmt_advertise: config.c_mgmt_advertise = c->config->c_mgmt_advertise = value; break; #ifdef ENABLE_LLDPMED case lldpctl_k_config_fast_start_enabled: config.c_enable_fast_start = c->config->c_enable_fast_start = value; break; case lldpctl_k_config_fast_start_interval: config.c_tx_fast_interval = c->config->c_tx_fast_interval = value; break; #endif case lldpctl_k_config_tx_hold: config.c_tx_hold = value; if ((value&LLDPD_EVERTZ_BITMASK) > 0) c->config->c_tx_hold = value; break; case lldpctl_k_config_bond_slave_src_mac_type: config.c_bond_slave_src_mac_type = value; c->config->c_bond_slave_src_mac_type = value; break; case lldpctl_k_config_lldp_portid_type: config.c_lldp_portid_type = value; c->config->c_lldp_portid_type = value; break; default: SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST); return NULL; } if (asprintf(&canary, "%d%ld", key, value) == -1) { SET_ERROR(atom->conn, LLDPCTL_ERR_NOMEM); return NULL; } rc = _lldpctl_do_something(atom->conn, CONN_STATE_SET_CONFIG_SEND, CONN_STATE_SET_CONFIG_RECV, canary, SET_CONFIG, &config, &MARSHAL_INFO(lldpd_config), NULL, NULL); free(canary); if (rc == 0) return atom; return NULL; }
static lldpctl_atom_t* _lldpctl_atom_set_atom_port(lldpctl_atom_t *atom, lldpctl_key_t key, lldpctl_atom_t *value) { struct _lldpctl_atom_port_t *p = (struct _lldpctl_atom_port_t *)atom; struct lldpd_hardware *hardware = p->hardware; struct lldpd_port_set set = {}; int rc; char *canary; #ifdef ENABLE_DOT3 struct _lldpctl_atom_dot3_power_t *dpow; #endif #ifdef ENABLE_LLDPMED struct _lldpctl_atom_med_power_t *mpow; struct _lldpctl_atom_med_policy_t *mpol; struct _lldpctl_atom_med_location_t *mloc; #endif #ifdef ENABLE_CUSTOM struct _lldpctl_atom_custom_t *custom; #endif /* Local and default port only */ if (!p->local) { SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST); return NULL; } switch (key) { case lldpctl_k_port_id: set.local_id = p->port->p_id; break; case lldpctl_k_port_descr: set.local_descr = p->port->p_descr; break; case lldpctl_k_port_status: set.rxtx = LLDPD_RXTX_FROM_PORT(p->port); break; #ifdef ENABLE_DOT3 case lldpctl_k_port_dot3_power: if (value->type != atom_dot3_power) { SET_ERROR(atom->conn, LLDPCTL_ERR_INCORRECT_ATOM_TYPE); return NULL; } dpow = (struct _lldpctl_atom_dot3_power_t *)value; set.dot3_power = &dpow->parent->port->p_power; break; #endif #ifdef ENABLE_LLDPMED case lldpctl_k_port_med_power: if (value->type != atom_med_power) { SET_ERROR(atom->conn, LLDPCTL_ERR_INCORRECT_ATOM_TYPE); return NULL; } mpow = (struct _lldpctl_atom_med_power_t *)value; set.med_power = &mpow->parent->port->p_med_power; break; case lldpctl_k_port_med_policies: if (value->type != atom_med_policy) { SET_ERROR(atom->conn, LLDPCTL_ERR_INCORRECT_ATOM_TYPE); return NULL; } mpol = (struct _lldpctl_atom_med_policy_t *)value; set.med_policy = mpol->policy; break; case lldpctl_k_port_med_locations: if (value->type != atom_med_location) { SET_ERROR(atom->conn, LLDPCTL_ERR_INCORRECT_ATOM_TYPE); return NULL; } mloc = (struct _lldpctl_atom_med_location_t *)value; set.med_location = mloc->location; break; #endif #ifdef ENABLE_CUSTOM case lldpctl_k_custom_tlvs_clear: set.custom_list_clear = 1; break; case lldpctl_k_custom_tlv: if (value->type != atom_custom) { SET_ERROR(atom->conn, LLDPCTL_ERR_INCORRECT_ATOM_TYPE); return NULL; } custom = (struct _lldpctl_atom_custom_t *)value; set.custom = custom->tlv; set.custom_tlv_op = custom->op; break; #endif default: SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST); return NULL; } set.ifname = hardware ? hardware->h_ifname : ""; if (asprintf(&canary, "%d%p%s", key, value, set.ifname) == -1) { SET_ERROR(atom->conn, LLDPCTL_ERR_NOMEM); return NULL; } rc = _lldpctl_do_something(atom->conn, CONN_STATE_SET_PORT_SEND, CONN_STATE_SET_PORT_RECV, canary, SET_PORT, &set, &MARSHAL_INFO(lldpd_port_set), NULL, NULL); free(canary); if (rc == 0) return atom; return NULL; }
static lldpctl_atom_t* _lldpctl_atom_set_str_config(lldpctl_atom_t *atom, lldpctl_key_t key, const char *value) { struct _lldpctl_atom_config_t *c = (struct _lldpctl_atom_config_t *)atom; struct lldpd_config config; memcpy(&config, c->config, sizeof(struct lldpd_config)); char *canary = NULL; int rc; switch (key) { case lldpctl_k_config_iface_pattern: if (!__lldpctl_atom_set_str_config(c, &config.c_iface_pattern, &c->config->c_iface_pattern, value)) return NULL; break; case lldpctl_k_config_mgmt_pattern: if (!__lldpctl_atom_set_str_config(c, &config.c_mgmt_pattern, &c->config->c_mgmt_pattern, value)) return NULL; break; case lldpctl_k_config_description: if (!__lldpctl_atom_set_str_config(c, &config.c_description, &c->config->c_description, value)) return NULL; break; case lldpctl_k_config_platform: if (!__lldpctl_atom_set_str_config(c, &config.c_platform, &c->config->c_platform, value)) return NULL; break; case lldpctl_k_config_hostname: #ifndef EVERTZ_TLV if (!__lldpctl_atom_set_str_config(c, &config.c_hostname, &c->config->c_hostname, value)) #endif return NULL; break; default: SET_ERROR(atom->conn, LLDPCTL_ERR_NOT_EXIST); return NULL; } if (asprintf(&canary, "%d%s", key, value?value:"(NULL)") == -1) { SET_ERROR(atom->conn, LLDPCTL_ERR_NOMEM); return NULL; } rc = _lldpctl_do_something(atom->conn, CONN_STATE_SET_CONFIG_SEND, CONN_STATE_SET_CONFIG_RECV, canary, SET_CONFIG, &config, &MARSHAL_INFO(lldpd_config), NULL, NULL); free(canary); if (rc == 0) return atom; #undef SET_STR return NULL; }