Exemplo n.º 1
0
static inline int internal_mi_print_b2bl_entity_id(mi_item_t *item, b2bl_entity_id_t *c)
{
	if (c->scenario_id.s && c->scenario_id.len != 0)
		if (add_mi_string(item, MI_SSTR("scenario_id"),
			c->scenario_id.s, c->scenario_id.len) < 0)
			goto error;

	if (c->key.s && c->key.len != 0)
		if (add_mi_string(item, MI_SSTR("key"),
			c->key.s, c->key.len) < 0)
			goto error;

	if (add_mi_number(item, MI_SSTR("disconnected"),
		c->disconnected) < 0)
		goto error;
	if (add_mi_number(item, MI_SSTR("state"),
		c->state) < 0)
		goto error;
	if (add_mi_number(item, MI_SSTR("no"),
		c->no) < 0)
		goto error;
	if (add_mi_number(item, MI_SSTR("type"),
		c->type) < 0)
		goto error;

	if (c->peer)
	{
		if (c->peer->key.s && c->peer->key.len != 0)
			if (add_mi_string(item, MI_SSTR("peer"),
				c->peer->key.s, c->peer->key.len) < 0)
				goto error;
	}

	if (c->to_uri.s && c->to_uri.len != 0)
		if (add_mi_string(item, MI_SSTR("to_uri"),
			c->to_uri.s, c->to_uri.len) < 0)
			goto error;

	if (c->from_uri.s && c->from_uri.len != 0)
		if (add_mi_string(item, MI_SSTR("from_uri"),
			c->from_uri.s, c->from_uri.len) < 0)
			goto error;

	if (c->from_dname.s && c->from_dname.len != 0)
		if (add_mi_string(item, MI_SSTR("from_dname"),
			c->from_dname.s, c->from_dname.len) < 0)
			goto error;

	return 0;

error:
	LM_ERR("failed to add mi item\n");
	return -1;
}
Exemplo n.º 2
0
static int rl_map_print(void *param, str key, void *value)
{
	rl_pipe_t *pipe = (rl_pipe_t *) value;
	str *alg;
	mi_item_t *pipe_item = (mi_item_t *)param;

	if (!pipe) {
		LM_ERR("invalid pipe value\n");
		return -1;
	}
	if (!pipe_item) {
		LM_ERR("no mi item\n");
		return -1;
	}
	if (!key.len || !key.s) {
		LM_ERR("no key found\n");
		return -1;
	}

	/* skip if no algo */
	if (pipe->algo == PIPE_ALGO_NOP)
		return 0;

	if (add_mi_string(pipe_item, MI_SSTR("id"), key.s, key.len) < 0)
		return -1;

	if (!(alg = get_rl_algo_name(pipe->algo))) {
		LM_ERR("[BUG] unknown algorithm %d\n", pipe->algo);
		return -1;
	}

	if (add_mi_string(pipe_item, MI_SSTR("algorithm"), alg->s, alg->len) < 0)
		return -1;

	if (add_mi_number(pipe_item, MI_SSTR("limit"), pipe->limit) < 0)
		return -1;

	if (add_mi_number(pipe_item, MI_SSTR("counter"), pipe->last_counter) < 0)
		return -1;

	return 0;
}
Exemplo n.º 3
0
/**
 * The dialog mi helper function.
 */
void sst_dialog_mi_context_CB(struct dlg_cell* did, int type, struct dlg_cb_params * params)
{
	sst_info_t* sst_info = (sst_info_t*)*(params->param);
	mi_item_t *context_item = (mi_item_t *)(params->dlg_data);
	mi_item_t *sst_item;

	sst_item = add_mi_object(context_item, MI_SSTR("sst"));
	if (!sst_item)
		return;

	if (add_mi_number(sst_item, MI_SSTR("requester_flags"),
		sst_info->requester) < 0)

	if (add_mi_number(sst_item, MI_SSTR("supported_flags"),
		sst_info->supported) < 0)

	if (add_mi_number(sst_item, MI_SSTR("interval"),
		sst_info->interval) < 0)

	return;
}
Exemplo n.º 4
0
mi_response_t *mi_get_prob(const mi_params_t *params,
								struct mi_handler *async_hdl)
{
	mi_response_t *resp;
	mi_item_t *resp_obj;

	resp = init_mi_result_object(&resp_obj);
	if (!resp)
		return 0;
	if (add_mi_number(resp_obj, MI_SSTR("actual probability percent"),
		*probability) < 0) {
		free_mi_response(resp);
		return 0;
	}

	return resp;
}
Exemplo n.º 5
0
/* lists the clusters' topology as viewed by the current node*/
static mi_response_t *clusterer_list_topology(const mi_params_t *params,
								struct mi_handler *async_hdl)
{
	mi_response_t *resp = NULL;
	mi_item_t *resp_obj;
	mi_item_t *clusters_arr, *cluster_item, *nodes_arr, *node_item;
	mi_item_t *neigh_arr;
	cluster_info_t *cl;
	node_info_t *n_info;
	struct neighbour *neigh;

	resp = init_mi_result_object(&resp_obj);
	if (!resp)
		return 0;

	clusters_arr = add_mi_array(resp_obj, MI_SSTR("Clusters"));
	if (!clusters_arr) {
		free_mi_response(resp);
		return 0;
	}

	lock_start_read(cl_list_lock);

	/* iterate through clusters */
	for (cl = *cluster_list; cl; cl = cl->next) {
		cluster_item = add_mi_object(clusters_arr, NULL, 0);
		if (!cluster_item)
			goto error;

		if (add_mi_number(cluster_item, MI_SSTR("cluster_id"), cl->cluster_id) < 0)
			goto error;

		nodes_arr = add_mi_array(cluster_item, MI_SSTR("Nodes"));
		if (!nodes_arr)
			goto error;

		node_item = add_mi_object(nodes_arr, 0, 0);
		if (!node_item)
			goto error;

		if (add_mi_number(node_item, MI_SSTR("node_id"), current_id) < 0)
			goto error;

		neigh_arr = add_mi_array(node_item, MI_SSTR("Neighbours"));
		if (!neigh_arr)
			goto error;

		for (neigh = cl->current_node->neighbour_list; neigh; neigh = neigh->next)
			if (add_mi_number(neigh_arr, 0,0, neigh->node->node_id) < 0)
				goto error;

		for (n_info = cl->node_list; n_info; n_info = n_info->next) {
			node_item = add_mi_object(nodes_arr, NULL, 0);
			if (!node_item)
				goto error;

			if (add_mi_number(node_item, MI_SSTR("node_id"), n_info->node_id) < 0)
				goto error;

			neigh_arr = add_mi_array(node_item, MI_SSTR("Neighbours"));
			if (!neigh_arr)
				goto error;

			lock_get(n_info->lock);

			for (neigh = n_info->neighbour_list; neigh; neigh = neigh->next)
				if (add_mi_number(neigh_arr, 0,0, neigh->node->node_id) < 0) {
					lock_release(n_info->lock);
					goto error;
				}

			if (n_info->link_state == LS_UP)
				if (add_mi_number(neigh_arr, 0,0, current_id) < 0) {
					lock_release(n_info->lock);
					goto error;
				}

			lock_release(n_info->lock);
		}
	}

	lock_stop_read(cl_list_lock);
	return resp;
error:
	lock_stop_read(cl_list_lock);
	if (resp) free_mi_response(resp);
	return NULL;
}
Exemplo n.º 6
0
static mi_response_t *clusterer_list_cap(const mi_params_t *params,
								struct mi_handler *async_hdl)
{
	mi_response_t *resp = NULL;
	mi_item_t *resp_obj;
	mi_item_t *clusters_arr, *cluster_item;
	mi_item_t *cap_arr, *cap_item;
	cluster_info_t *cl;
	struct local_cap *cap;
	static str str_ok = str_init("Ok");
	static str str_not_synced = str_init("not synced");

	resp = init_mi_result_object(&resp_obj);
	if (!resp)
		return 0;

	clusters_arr = add_mi_array(resp_obj, MI_SSTR("Clusters"));
	if (!clusters_arr) {
		free_mi_response(resp);
		return 0;
	}

	lock_start_read(cl_list_lock);

	for (cl = *cluster_list; cl; cl = cl->next) {
		cluster_item = add_mi_object(clusters_arr, NULL, 0);
		if (!cluster_item)
			goto error;

		if (add_mi_number(cluster_item, MI_SSTR("cluster_id"), cl->cluster_id) < 0)
			goto error;

		cap_arr = add_mi_array(cluster_item, MI_SSTR("Capabilities"));
		if (!cap_arr)
			goto error;

		for (cap = cl->capabilities; cap; cap = cap->next) {
			cap_item = add_mi_object(cap_arr, NULL, 0);
			if (!cap_item)
				goto error;

			if (add_mi_string(cap_item, MI_SSTR("name"),
				cap->reg.name.s, cap->reg.name.len) < 0)
				goto error;

			lock_get(cl->lock);

			if (add_mi_string(cap_item, MI_SSTR("state"),
				(cap->flags & CAP_STATE_OK) ? str_ok.s : str_not_synced.s,
				(cap->flags & CAP_STATE_OK) ? str_ok.len : str_not_synced.len) < 0) {
				lock_release(cl->lock);
				goto error;
			}

			lock_release(cl->lock);
	   }
	}

	lock_stop_read(cl_list_lock);
	return resp;

error:
	lock_stop_read(cl_list_lock);
	if (resp) free_mi_response(resp);
	return NULL;
}
Exemplo n.º 7
0
static mi_response_t *clusterer_list(const mi_params_t *params,
								struct mi_handler *async_hdl)
{
	cluster_info_t *cl;
	node_info_t *n_info;
	str val;
	mi_response_t *resp = NULL;
	mi_item_t *resp_obj;
	mi_item_t *clusters_arr, *cluster_item, *nodes_arr, *node_item;
	static str str_up   = 	str_init("Up");
	static str str_prob = 	str_init("Probe");
	static str str_down = 	str_init("Down");
	static str str_none = 	str_init("none");
	int n_hop;

	resp = init_mi_result_object(&resp_obj);
	if (!resp)
		return 0;

	clusters_arr = add_mi_array(resp_obj, MI_SSTR("Clusters"));
	if (!clusters_arr) {
		free_mi_response(resp);
		return 0;
	}

	lock_start_read(cl_list_lock);

	/* iterate through clusters */
	for (cl = *cluster_list; cl; cl = cl->next) {
		cluster_item = add_mi_object(clusters_arr, NULL, 0);
		if (!cluster_item)
			goto error;

		if (add_mi_number(cluster_item, MI_SSTR("cluster_id"), cl->cluster_id) < 0)
			goto error;

		nodes_arr = add_mi_array(cluster_item, MI_SSTR("Nodes"));
		if (!nodes_arr)
			goto error;

		/* iterate through nodes */
		for (n_info = cl->node_list; n_info; n_info = n_info->next) {
			node_item = add_mi_object(nodes_arr, NULL, 0);
			if (!node_item)
				goto error;

			if (add_mi_number(node_item, MI_SSTR("node_id"), n_info->node_id) < 0)
				goto error;

			if (add_mi_number(node_item, MI_SSTR("db_id"), n_info->id) < 0)
				goto error;

			if (add_mi_string(node_item, MI_SSTR("url"),
				n_info->url.s, n_info->url.len) < 0)
				goto error;

			lock_get(n_info->lock);

			if (n_info->link_state == LS_UP)
				val = str_up;
			else if (n_info->link_state == LS_DOWN)
				val = str_down;
			else
				val = str_prob;

			if (add_mi_string(node_item, MI_SSTR("link_state"),
				val.s, val.len) < 0) {
				lock_release(n_info->lock);
				goto error;
			}

			lock_release(n_info->lock);

			n_hop = get_next_hop(n_info); 
			if (n_hop <= 0)
				val = str_none;
			else
				val.s = int2str(n_hop, &val.len);

			if (add_mi_string(node_item, MI_SSTR("next_hop"), val.s, val.len) < 0)
				goto error;

			if (n_info->description.s) {
				if (add_mi_string(node_item, MI_SSTR("description"),
					n_info->description.s, n_info->description.len) < 0)
					goto error;
			} else
				if (add_mi_string(node_item, MI_SSTR("description"),
					MI_SSTR("none")) < 0)
					goto error;
		}
	}

	lock_stop_read(cl_list_lock);
	return resp;
error:
	lock_stop_read(cl_list_lock);
	if (resp) free_mi_response(resp);
	return NULL;
}
Exemplo n.º 8
0
static mi_response_t *mi_b2b_list(const mi_params_t *params,
								struct mi_handler *async_hdl)
{
	int i, index;
	b2bl_tuple_t* tuple;

	mi_response_t *resp;
	mi_item_t *resp_obj;
	mi_item_t *tuples_arr, *tuple_item;
	mi_item_t *servers_arr, *server_item;
	mi_item_t *clients_arr, *clients_item;
	mi_item_t *b_entities_arr, *b_entities_item;

	resp = init_mi_result_object(&resp_obj);
	if (!resp)
		return 0;

	tuples_arr = add_mi_array(resp_obj, MI_SSTR("Tuples"));
	if (!tuples_arr) {
		free_mi_response(resp);
		return 0;
	}

	for(i = 0; i< b2bl_hsize; i++)
	{
		lock_get(&b2bl_htable[i].lock);
		tuple = b2bl_htable[i].first;
		while(tuple)
		{
			tuple_item = add_mi_object(tuples_arr, NULL, 0);
			if (!tuple_item)
				goto error;

			if (add_mi_number(tuple_item, MI_SSTR("id"), tuple->id) < 0)
				goto error;
			if (add_mi_string(tuple_item, MI_SSTR("key"),
				tuple->key->s, tuple->key->len) < 0)
				goto error;
			if (add_mi_number(tuple_item, MI_SSTR("scenario_state"),
				tuple->scenario_state) < 0)
				goto error;
			if (add_mi_number(tuple_item, MI_SSTR("lifetime"),
				tuple->lifetime) < 0)
				goto error;
			if (add_mi_number(tuple_item, MI_SSTR("db_flag"),
				tuple->db_flag) < 0)
				goto error;

			if (tuple->scenario) {
				if (add_mi_string(tuple_item, MI_SSTR("scenario"),
					tuple->scenario->id.s, tuple->scenario->id.len) < 0)
					goto error;
				if (add_mi_number(tuple_item, MI_SSTR("next_scenario_state"),
					tuple->next_scenario_state) < 0)
					goto error;
			}

			servers_arr = add_mi_array(tuple_item, MI_SSTR("SERVERS"));
			if (!servers_arr)
				goto error;
			for (index=0; index < MAX_B2BL_ENT; index++)
			{
				if (tuple->servers[index] != NULL)
				{
					server_item = add_mi_object(servers_arr, NULL, 0);
					if (!server_item)
						goto error;

					if (add_mi_number(server_item, MI_SSTR("index"), index) < 0)
						goto error;
					if (internal_mi_print_b2bl_entity_id(server_item,
							tuple->servers[index])!=0)
						goto error;
				}
			}

			clients_arr = add_mi_array(tuple_item, MI_SSTR("CLIENTS"));
			if (!clients_arr)
				goto error;
			for (index=0; index < MAX_B2BL_ENT; index++)
			{
				if (tuple->clients[index] != NULL)
				{
					clients_item = add_mi_object(clients_arr, NULL, 0);
					if (!clients_item)
						goto error;

					if (add_mi_number(clients_item, MI_SSTR("index"), index) < 0)
						goto error;
					if (internal_mi_print_b2bl_entity_id(clients_item,
							tuple->clients[index])!=0)
						goto error;
				}
			}

			b_entities_arr = add_mi_array(tuple_item, MI_SSTR("BRIDGE_ENTITIES"));
			if (!b_entities_arr)
				goto error;
			for (index=0; index < MAX_BRIDGE_ENT; index++)
			{
				if (tuple->bridge_entities[index] != NULL)
				{
					b_entities_item = add_mi_object(b_entities_arr, NULL, 0);
					if (!b_entities_item)
						goto error;

					if (add_mi_number(b_entities_item, MI_SSTR("index"), index) < 0)
						goto error;
					if (internal_mi_print_b2bl_entity_id(b_entities_item,
							tuple->bridge_entities[index])!=0)
						goto error;
				}
			}
			tuple = tuple->next;
		}
		lock_release(&b2bl_htable[i].lock);
	}

	return resp;
error:
	lock_release(&b2bl_htable[i].lock);
	LM_ERR("Unable to create reply\n");
	free_mi_response(resp);
	return NULL;
}
Exemplo n.º 9
0
static inline int mi_print_b2be_dlg(mi_item_t *resp_arr, b2b_table htable, unsigned int hsize)
{
	int i;
	b2b_dlg_t* dlg;
	dlg_leg_t* leg;
	mi_item_t *arr_item, *cseq_item, *rs_item, *ct_item, *legs_arr, *leg_item;

	for(i = 0; i< hsize; i++)
	{
		lock_get(&htable[i].lock);
		dlg = htable[i].first;
		while(dlg)
		{
			arr_item = add_mi_object(resp_arr, NULL, 0);
			if (!arr_item)
				goto error;

			if (add_mi_number(arr_item, MI_SSTR("dlg"), dlg->id) < 0)
				goto error;
			if (add_mi_string(arr_item, MI_SSTR("param"),
				dlg->param.s, dlg->param.len) < 0)
				goto error;
			if (add_mi_number(arr_item, MI_SSTR("state"), dlg->state) < 0)
				goto error;
			if (add_mi_number(arr_item, MI_SSTR("last_invite_cseq"),
				dlg->last_invite_cseq) < 0)
				goto error;
			if (add_mi_number(arr_item, MI_SSTR("last_method"),
				dlg->last_method) < 0)
				goto error;

			if (dlg->last_reply_code)
				if (add_mi_number(arr_item, MI_SSTR("last_reply_code"),
					dlg->last_reply_code) < 0)
					goto error;

			if (add_mi_number(arr_item, MI_SSTR("db_flag"), dlg->db_flag) < 0)
				goto error;

			if (dlg->ruri.len)
				if (add_mi_string(arr_item, MI_SSTR("ruri"),
					dlg->ruri.s, dlg->ruri.len) < 0)
					goto error;
			if (add_mi_string(arr_item, MI_SSTR("callid"),
				dlg->callid.s, dlg->callid.len) < 0)
				goto error;
			if (add_mi_string(arr_item, MI_SSTR("from"),
				dlg->from_dname.s, dlg->from_dname.len) < 0)
				goto error;
			if (add_mi_string(arr_item, MI_SSTR("from_uri"),
				dlg->from_uri.s, dlg->from_uri.len) < 0)
				goto error;
			if (add_mi_string(arr_item, MI_SSTR("from_tag"),
				dlg->tag[0].s, dlg->tag[0].len) < 0)
				goto error;

			if (add_mi_string(arr_item, MI_SSTR("to"),
				dlg->to_dname.s, dlg->to_dname.len) < 0)
				goto error;
			if (add_mi_string(arr_item, MI_SSTR("to_uri"),
				dlg->to_uri.s, dlg->to_uri.len) < 0)
				goto error;
			if (add_mi_string(arr_item, MI_SSTR("to_tag"),
				dlg->tag[1].s, dlg->tag[1].len) < 0)
				goto error;

			cseq_item = add_mi_object(arr_item, MI_SSTR("cseq") < 0);
			if (!cseq_item)
				goto error;
			if (add_mi_number(cseq_item, MI_SSTR("caller"), dlg->cseq[0]) < 0)
				goto error;
			if (add_mi_number(cseq_item, MI_SSTR("callee"), dlg->cseq[1]) < 0)
				goto error;

			if (dlg->route_set[0].len||dlg->route_set[1].len)
			{
				rs_item = add_mi_object(arr_item, MI_SSTR("route_set") < 0);
				if (!rs_item)
					goto error;

				if (dlg->route_set[0].len)
					if (add_mi_string(rs_item, MI_SSTR("caller"),
						dlg->route_set[0].s, dlg->route_set[0].len) < 0)
						goto error;

				if (dlg->route_set[1].len)
					if (add_mi_string(rs_item, MI_SSTR("callee"),
						dlg->route_set[1].s, dlg->route_set[1].len) < 0)
						goto error;
			}

			ct_item = add_mi_object(arr_item, MI_SSTR("contact") < 0);
			if (!ct_item)
				goto error;
			if (add_mi_string(ct_item, MI_SSTR("caller"),
				dlg->contact[0].s, dlg->contact[0].len) < 0)
				goto error;
			if (add_mi_string(ct_item, MI_SSTR("callee"),
				dlg->contact[1].s, dlg->contact[1].len) < 0)
				goto error;

			if (dlg->send_sock)
				if (add_mi_string(arr_item, MI_SSTR("send_sock"),
					dlg->send_sock->name.s, dlg->send_sock->name.len) < 0)
					goto error;

			if(dlg->uac_tran||dlg->uas_tran||dlg->update_tran||dlg->cancel_tm_tran)
			{
				if(dlg->uac_tran)
					if (add_mi_string(arr_item, MI_SSTR("tm_tran"),
						MI_SSTR("uac")) < 0)
						goto error;
				if(dlg->uas_tran)
					if (add_mi_string(arr_item, MI_SSTR("tm_tran"),
						MI_SSTR("uas")) < 0)
						goto error;
				if(dlg->update_tran)
					if (add_mi_string(arr_item, MI_SSTR("tm_tran"),
						MI_SSTR("update")) < 0)
						goto error;
				if(dlg->cancel_tm_tran)
					if (add_mi_string(arr_item, MI_SSTR("tm_tran"),
						MI_SSTR("cancel_tm")) < 0)
						goto error;
			}

			if ( (leg=dlg->legs)!=NULL ) {
				legs_arr = add_mi_array(arr_item, MI_SSTR("LEGS"));
				if (!legs_arr)
					goto error;

				while(leg)
				{
					leg_item = add_mi_object(legs_arr, NULL, 0);
					if (!leg_item)
						goto error;

					if (add_mi_number(leg_item, MI_SSTR("id"), leg->id) < 0)
						goto error;
					if (add_mi_string(leg_item, MI_SSTR("tag"),
						leg->tag.s, leg->tag.len) < 0)
						goto error;
					if (add_mi_number(leg_item, MI_SSTR("cseq"), leg->cseq) < 0)
						goto error;
					if (add_mi_string(leg_item, MI_SSTR("contact"),
						leg->contact.s, leg->contact.len) < 0)
						goto error;
					if(leg->route_set.len)
						if (add_mi_string(leg_item, MI_SSTR("route_set"),
							leg->route_set.s, leg->route_set.len) < 0)
							goto error;

					leg=leg->next;
				}
			}

			dlg = dlg->next;
		}
		lock_release(&htable[i].lock);
	}
	return 0;
error:
	lock_release(&htable[i].lock);
	LM_ERR("failed to add node\n");
	return -1;
}