summaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorDaniel Willmann <daniel@totalueberwachung.de>2011-05-06 16:38:11 +0200
committerHarald Welte <laforge@gnumonks.org>2014-08-21 15:34:14 +0200
commit35a1b3b493b1b11e4f6ac893b64bb43f673a371d (patch)
treee6e6a7384eec5e7f10f796fd4e94cf30ebd245de /openbsc
parentf2e75d437160b23f852a9144117f4f340a396618 (diff)
libctrl: Add function ctrl_cmd_send_to_all
Sends a command to all ctrl connections except the one it originated from.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/control_cmd.h3
-rw-r--r--openbsc/src/libctrl/control_if.c15
2 files changed, 18 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/control_cmd.h b/openbsc/include/openbsc/control_cmd.h
index f4785690..da598c51 100644
--- a/openbsc/include/openbsc/control_cmd.h
+++ b/openbsc/include/openbsc/control_cmd.h
@@ -10,6 +10,8 @@
#define CTRL_CMD_HANDLED 0
#define CTRL_CMD_REPLY 1
+struct ctrl_handle;
+
enum ctrl_node_type {
CTRL_NODE_ROOT, /* Root elements */
CTRL_NODE_NET, /* Network specific (net.) */
@@ -75,6 +77,7 @@ int ctrl_cmd_exec(vector vline, struct ctrl_cmd *command, vector node, void *dat
int ctrl_cmd_install(enum ctrl_node_type node, struct ctrl_cmd_element *cmd);
int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data);
int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd);
+int ctrl_cmd_send_to_all(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd);
struct ctrl_cmd *ctrl_cmd_parse(void *ctx, struct msgb *msg);
struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd);
struct ctrl_cmd *ctrl_cmd_cpy(void *ctx, struct ctrl_cmd *cmd);
diff --git a/openbsc/src/libctrl/control_if.c b/openbsc/src/libctrl/control_if.c
index f68cb809..350e8e1c 100644
--- a/openbsc/src/libctrl/control_if.c
+++ b/openbsc/src/libctrl/control_if.c
@@ -65,6 +65,21 @@
vector ctrl_node_vec;
+/* Send command to all */
+int ctrl_cmd_send_to_all(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd)
+{
+ struct ctrl_connection *ccon;
+ int ret = 0;
+
+ llist_for_each_entry(ccon, &ctrl->ccon_list, list_entry) {
+ if (ccon == cmd->ccon)
+ continue;
+ if (ctrl_cmd_send(&ccon->write_queue, cmd))
+ ret++;
+ }
+ return ret;
+}
+
int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd)
{
int ret;