static void rpc_set_pipe(rpc_t *rpc, void *c) { int pipe_no = MAX_PIPES, algo_id, limit = 0; str algo_str; if (rpc->scan(c, "dSd", &pipe_no, &algo_str, &limit) < 3) return; if (str_map_str(algo_names, &algo_str, &algo_id)) { LM_ERR("unknown algorithm: '%.*s'\n", algo_str.len, algo_str.s); rpc->fault(c, 400, "Unknown algorithm"); return; } LM_DBG("set_pipe: %d:%d:%d\n", pipe_no, algo_id, limit); if (pipe_no >= MAX_PIPES || pipe_no < 0) { LM_ERR("wrong pipe_no: %d\n", pipe_no); rpc->fault(c, 400, "Unknown pipe"); return; } LOCK_GET(rl_lock); *pipes[pipe_no].algo = algo_id; *pipes[pipe_no].limit = limit; if (check_feedback_setpoints(0)) { LM_ERR("feedback limits don't match\n"); rpc->fault(c, 400, "Feedback limits don't match"); } else { *pid_setpoint = 0.01 * (double)cfg_setpoint; } LOCK_RELEASE(rl_lock); }
void rpc_pl_set_pipe(rpc_t *rpc, void *c) { unsigned int algo_id, limit = 0; pl_pipe_t *it; str pipeid, algo_str; if (rpc->scan(c, "SSd", &pipeid, &algo_str, &limit) < 3) return; if (str_map_str(algo_names, &algo_str, (int*)&algo_id)) { LM_ERR("unknown algorithm: '%.*s'\n", algo_str.len, algo_str.s); rpc->fault(c, 400, "Unknown algorithm"); return; } LM_DBG("set_pipe: %.*s:%d:%d\n", pipeid.len, pipeid.s, algo_id, limit); it = pl_pipe_get(&pipeid, 1); if (it==NULL) { LM_ERR("no pipe: %.*s\n", pipeid.len, pipeid.s); rpc->fault(c, 400, "Unknown pipe id %.*s", pipeid.len, pipeid.s); return; } it->algo = algo_id; it->limit = limit; pl_pipe_release(&pipeid); if (check_feedback_setpoints(0)) { LM_ERR("feedback limits don't match\n"); rpc->fault(c, 400, "Feedback limits don't match"); return; } else { *_pl_pid_setpoint = 0.01 * (double)_pl_cfg_setpoint; } }
struct mi_root* mi_set_pipe(struct mi_root* cmd_tree, void* param) { struct mi_node *node; unsigned int algo_id, limit = 0; pl_pipe_t *it; str pipeid; node = cmd_tree->node.kids; if (node == NULL) return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); if ( !node->value.s || !node->value.len) goto error; pipeid = node->value; node = node->next; if ( !node->value.s || !node->value.len) goto error; if (str_map_str(algo_names, &(node->value), (int*)&algo_id)) { LM_ERR("unknown algorithm: '%.*s'\n", node->value.len, node->value.s); goto error; } node = node->next; if ( !node->value.s || !node->value.len || strno2int(&node->value,&limit)<0) goto error; LM_DBG("set_pipe: %.*s:%d:%d\n", pipeid.len, pipeid.s, algo_id, limit); it = pl_pipe_get(&pipeid, 1); if (it==NULL) { LM_ERR("no pipe: %.*s\n", pipeid.len, pipeid.s); goto error; } it->algo = algo_id; it->limit = limit; if (check_feedback_setpoints(0)) { pl_pipe_release(&pipeid); LM_ERR("feedback limits don't match\n"); goto error; } else { *_pl_pid_setpoint = 0.01 * (double)_pl_cfg_setpoint; } pl_pipe_release(&pipeid); return init_mi_tree( 200, MI_OK_S, MI_OK_LEN); error: return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN); }
struct mi_root* mi_set_pipe(struct mi_root* cmd_tree, void* param) { struct mi_node *node; unsigned int pipe_no = MAX_PIPES, algo_id, limit = 0; //str algo; node = cmd_tree->node.kids; if (node == NULL) return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); if ( !node->value.s || !node->value.len || strno2int(&node->value,&pipe_no)<0) goto bad_syntax; node = node->next; if ( !node->value.s || !node->value.len) goto bad_syntax; if (str_map_str(algo_names, &(node->value), (int*)&algo_id)) { LM_ERR("unknown algorithm: '%.*s'\n", node->value.len, node->value.s); goto bad_syntax; } node = node->next; if ( !node->value.s || !node->value.len || strno2int(&node->value,&limit)<0) goto bad_syntax; LM_DBG("set pipe: %d:%d:%d\n", pipe_no, algo_id, limit); if (pipe_no >= MAX_PIPES) { LM_ERR("wrong pipe_no: %d\n", pipe_no); goto bad_syntax; } LOCK_GET(rl_lock); *pipes[pipe_no].algo = algo_id; *pipes[pipe_no].limit = limit; if (check_feedback_setpoints(0)) { LM_ERR("feedback limits don't match\n"); goto error; } else { *pid_setpoint = 0.01 * (double)cfg_setpoint; } set_check_network_load(); LOCK_RELEASE(rl_lock); return init_mi_tree( 200, MI_OK_S, MI_OK_LEN); error: LOCK_RELEASE(rl_lock); bad_syntax: return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN); }
static int add_pipe_params(modparam_t type, void * val) { char * param_line = val; pipe_params_t params; if (parse_pipe_params(param_line, ¶ms)) return -1; if (params.no < 0 || params.no >= MAX_PIPES) { LM_ERR("pipe number %d not allowed (MAX_PIPES=%d, 0-based)\n", params.no, MAX_PIPES); return -1; } pipes[params.no].algo_mp = params.algo; pipes[params.no].limit_mp = params.limit; return check_feedback_setpoints(1); }