diff options
authorPau Espin Pedrol <>2021-01-05 18:36:17 +0100
committerlaforge <laforge@osmocom.org>2021-01-06 12:32:36 +0000
commit9584cd718a033f31bf7d8ee1b58c57dfbd5fd28e (patch)
parente4cd267ab18f2d9d66351cce5b5a1aa8cc893c51 (diff)
ctrl: Allow handling CTRL get/set replies in user defined code
Prior to this patch, it was not possible to gather SET/GET reply information when implementing a CTRL client using libosmocontrol. This is specially important when using the GET command, since one wants to receive the queried value. CTRL traps can also be handled this way by extending this patch in the future if needed. Change-Id: Id3c4631cd32c13e78e11b6e8194b8c16307ec4f1
3 files changed, 12 insertions, 0 deletions
index e8fb32be..501f25b6 100644
@@ -12,3 +12,4 @@ libosmogsm ABI change struct osmo_gprs_cell_options size changed (new field at
libosmogsm API change struct ipac_preproc_ave_cfg: new zero-sized flexible array member at end
libosmovty ABI change struct cmd_element: add a field for program specific attributes
libosmovty ABI change struct vty_app_info: optional program specific attributes description
+libosmoctrl ABI change struct ctrl_handle changed size (new field "reply_cb" at the end)
diff --git a/include/osmocom/ctrl/control_if.h b/include/osmocom/ctrl/control_if.h
index 5fa9588d..b73296f6 100644
--- a/include/osmocom/ctrl/control_if.h
+++ b/include/osmocom/ctrl/control_if.h
@@ -9,6 +9,7 @@ int ctrl_parse_get_num(vector vline, int i, long *num);
typedef int (*ctrl_cmd_lookup)(void *data, vector vline, int *node_type,
void **node_data, int *i);
+typedef void (*ctrl_cmd_reply_cb)(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd, void *data);
struct ctrl_handle {
struct osmo_fd listen_fd;
@@ -18,6 +19,12 @@ struct ctrl_handle {
/* List of control connections */
struct llist_head ccon_list;
+ /* User defined GET/SET REPLY handler. User can set cmd->defer to 1 in
+ order to own and keep the cmd pointer and free it after the function
+ returns. "data" param is the user data pointer supplied during
+ ctrl_handle allocation */
+ ctrl_cmd_reply_cb reply_cb;
diff --git a/src/ctrl/control_if.c b/src/ctrl/control_if.c
index ce2e3676..9e3e3a9e 100644
--- a/src/ctrl/control_if.c
+++ b/src/ctrl/control_if.c
@@ -221,6 +221,10 @@ int ctrl_cmd_handle(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd,
if (cmd->type == CTRL_TYPE_SET_REPLY ||
cmd->type == CTRL_TYPE_GET_REPLY) {
+ if (ctrl->reply_cb) {
+ ctrl->reply_cb(ctrl, cmd, data);
+ }
if (strncmp(cmd->reply, "OK", 2) == 0) {
LOGP(DLCTRL, LOGL_DEBUG, "%s <%s> for %s is OK\n",
get_value_string(ctrl_type_vals, cmd->type),