5 #include <osmocom/core/msgb.h> 6 #include <osmocom/core/talloc.h> 7 #include <osmocom/core/write_queue.h> 8 #include <osmocom/core/logging.h> 9 #include <osmocom/core/utils.h> 10 #include <osmocom/vty/vector.h> 12 #define CTRL_CMD_ERROR -1 13 #define CTRL_CMD_HANDLED 0 14 #define CTRL_CMD_REPLY 1 84 #define ctrl_cmd_reply_printf(cmd, fmt, args ...) \ 85 osmo_talloc_asprintf(cmd, cmd->reply, fmt, ## args) 113 struct llist_head list;
139 #define CTRL_CMD_DEFINE_STRUCT(cmdname, cmdstr, verify_name) \ 140 static struct ctrl_cmd_element cmd_##cmdname = { \ 142 .get = &get_##cmdname, \ 143 .set = &set_##cmdname, \ 144 .verify = verify_name, \ 151 #define CTRL_HELPER_GET_INT(cmdname, dtype, element) \ 152 static int get_##cmdname(struct ctrl_cmd *cmd, void *_data) \ 154 dtype *node = cmd->node; \ 155 cmd->reply = talloc_asprintf(cmd, "%i", node->element); \ 157 cmd->reply = "OOM"; \ 158 return CTRL_CMD_ERROR; \ 160 return CTRL_CMD_REPLY; \ 167 #define CTRL_HELPER_SET_INT(cmdname, dtype, element) \ 168 static int set_##cmdname(struct ctrl_cmd *cmd, void *_data) \ 170 dtype *node = cmd->node; \ 171 int tmp = atoi(cmd->value); \ 172 node->element = tmp; \ 173 return get_##cmdname(cmd, _data); \ 180 #define CTRL_HELPER_VERIFY_RANGE(cmdname, min, max) \ 181 static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *_data) \ 183 int tmp = atoi(value); \ 184 if ((tmp >= min)&&(tmp <= max)) { \ 187 cmd->reply = "Input not within the range"; \ 198 #define CTRL_CMD_DEFINE_RANGE(cmdname, cmdstr, dtype, element, min, max) \ 199 CTRL_HELPER_GET_INT(cmdname, dtype, element) \ 200 CTRL_HELPER_SET_INT(cmdname, dtype, element) \ 201 CTRL_HELPER_VERIFY_RANGE(cmdname, min, max) \ 202 CTRL_CMD_DEFINE_STRUCT(cmdname, cmdstr, verify_##cmdname) 208 #define CTRL_HELPER_GET_STRING(cmdname, dtype, element) \ 209 static int get_##cmdname(struct ctrl_cmd *cmd, void *_data) \ 211 dtype *data = cmd->node; \ 212 cmd->reply = talloc_asprintf(cmd, "%s", data->element); \ 214 cmd->reply = "OOM"; \ 215 return CTRL_CMD_ERROR; \ 217 return CTRL_CMD_REPLY; \ 224 #define CTRL_HELPER_SET_STRING(cmdname, dtype, element) \ 225 static int set_##cmdname(struct ctrl_cmd *cmd, void *_data) \ 227 dtype *data = cmd->node; \ 228 osmo_talloc_replace_string(cmd->node, &data->element, cmd->value); \ 229 return get_##cmdname(cmd, _data); \ 239 #define CTRL_CMD_DEFINE_STRING(cmdname, cmdstr, dtype, element) \ 240 CTRL_HELPER_GET_STRING(cmdname, dtype, element) \ 241 CTRL_HELPER_SET_STRING(cmdname, dtype, element) \ 242 CTRL_CMD_DEFINE_STRUCT(cmdname, cmdstr, NULL) 247 #define CTRL_CMD_DEFINE(cmdname, cmdstr) \ 248 static int get_##cmdname(struct ctrl_cmd *cmd, void *data); \ 249 static int set_##cmdname(struct ctrl_cmd *cmd, void *data); \ 250 static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data); \ 251 CTRL_CMD_DEFINE_STRUCT(cmdname, cmdstr, verify_##cmdname) 256 #define CTRL_CMD_DEFINE_RO(cmdname, cmdstr) \ 257 static int get_##cmdname(struct ctrl_cmd *cmd, void *data); \ 258 static int set_##cmdname(struct ctrl_cmd *cmd, void *data) \ 260 cmd->reply = "Read Only attribute"; \ 261 return CTRL_CMD_ERROR; \ 263 static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data) \ 265 cmd->reply = "Read Only attribute"; \ 268 CTRL_CMD_DEFINE_STRUCT(cmdname, cmdstr, verify_##cmdname) 273 #define CTRL_CMD_DEFINE_WO(cmdname, cmdstr) \ 274 static int set_##cmdname(struct ctrl_cmd *cmd, void *data); \ 275 static int get_##cmdname(struct ctrl_cmd *cmd, void *data) \ 277 cmd->reply = "Write Only attribute"; \ 278 return CTRL_CMD_ERROR; \ 280 static int verify_##cmdname(struct ctrl_cmd *cmd, const char *val, void *data); \ 281 CTRL_CMD_DEFINE_STRUCT(cmdname, cmdstr, verify_##cmdname) 286 #define CTRL_CMD_DEFINE_WO_NOVRF(cmdname, cmdstr) \ 287 static int set_##cmdname(struct ctrl_cmd *cmd, void *data); \ 288 static int get_##cmdname(struct ctrl_cmd *cmd, void *data) \ 290 cmd->reply = "Write Only attribute"; \ 291 return CTRL_CMD_ERROR; \ 293 static int verify_##cmdname(struct ctrl_cmd *cmd, const char *val, void *data) \ 297 CTRL_CMD_DEFINE_STRUCT(cmdname, cmdstr, verify_##cmdname) Represents a single ctrl connection.
Definition: control_cmd.h:44
Definition: control_cmd.h:26
Definition: control_cmd.h:34
ctrl_node_type
The class of node at which a ctrl command is registered to.
Definition: control_cmd.h:19
Definition: control_cmd.h:22
char * variable
name of the variable
Definition: control_cmd.h:75
Definition: control_cmd.h:24
void(* closed_cb)(struct ctrl_connection *conn)
Callback if the connection was closed.
Definition: control_cmd.h:54
struct llist_head list_entry
Definition: control_cmd.h:45
ctrl_type
Ctrl command types (GET, SET, ...)
Definition: control_cmd.h:30
struct ctrl_connection * ccon
connection through which the command was received
Definition: control_cmd.h:68
Definition: control_cmd.h:20
Definition: control_cmd.h:112
Definition: control_cmd.h:31
struct ctrl_cmd * ctrl_cmd_create(void *ctx, enum ctrl_type)
Allocate a control command of given type.
Definition: control_cmd.c:238
Definition: control_cmd.h:106
struct ctrl_cmd * ctrl_cmd_cpy(void *ctx, struct ctrl_cmd *cmd)
Perform a deepl copy of the given cmd, allocating memory from ctx.
Definition: control_cmd.c:254
struct ctrl_cmd_def * ctrl_cmd_def_make(const void *ctx, struct ctrl_cmd *cmd, void *data, unsigned int secs)
Build a deferred control command state and keep it the per-connection list of deferred commands...
Definition: control_cmd.c:617
void * data
Definition: control_cmd.h:115
char * value
value of the specified CTRL variable
Definition: control_cmd.h:77
struct msgb * ctrl_cmd_make(struct ctrl_cmd *cmd)
Encode a given CTRL command from its parsed form into a message buffer.
Definition: control_cmd.c:517
int ctrl_cmd_install(enum ctrl_node_type node, struct ctrl_cmd_element *cmd)
Install a given command definition at a given CTRL node.
Definition: control_cmd.c:213
void * node
node of the specified variable
Definition: control_cmd.h:73
struct ctrl_cmd * ctrl_cmd_parse2(void *ctx, struct msgb *msg)
Parse/Decode CTRL from msgb into command struct.
Definition: control_cmd.c:322
char * reply
respnse message string
Definition: control_cmd.h:79
struct msgb * pending_msg
Buffer for partial input data.
Definition: control_cmd.h:51
int ctrl_cmd_send_to_all(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd)
Send a CTRL command to all connections.
Definition: control_if.c:106
Definition: control_cmd.h:33
char * cmd
Definition: control_cmd.h:107
struct ctrl_cmd * ctrl_cmd_parse(void *ctx, struct msgb *msg)
Parse/Decode CTRL from msgb into command struct.
Definition: control_cmd.c:295
char * id
Definition: control_cmd.h:71
int ctrl_cmd_def_send(struct ctrl_cmd_def *cd)
Send the response to a deferred ctrl command.
Definition: control_cmd.c:656
struct ctrl_cmd * ctrl_cmd_parse3(void *ctx, struct msgb *msg, bool *parse_failed)
Parse/Decode CTRL from msgb into command struct.
Definition: control_cmd.c:336
Definition: control_cmd.h:37
int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd)
Encode a CTRL command and append it to the given write queue.
Definition: control_if.c:124
int nr_commands
Definition: control_cmd.h:88
Definition: control_cmd.h:21
Definition: control_cmd.h:32
int ctrl_cmd_def_is_zombie(struct ctrl_cmd_def *cd)
Determine if the given deferred control command is still alive or a zombie.
Definition: control_cmd.c:639
const char * name
textual name/id of the CTRL command
Definition: control_cmd.h:96
char ** command
Definition: control_cmd.h:89
Definition: control_cmd.h:23
Definition: control_if.h:13
struct llist_head def_cmds
Pending deferred command responses for this connection.
Definition: control_cmd.h:60
int ctrl_cmd_exec(vector vline, struct ctrl_cmd *command, vector node, void *data)
Execute a given received command.
Definition: control_cmd.c:98
Definition: control_cmd.h:25
struct llist_head cmds
Pending commands for this connection.
Definition: control_cmd.h:57
Represents a single ctrl command after parsing.
Definition: control_cmd.h:66
const struct value_string ctrl_type_vals[]
human-readable string names for ctrl_type
Definition: control_cmd.c:47
Definition: control_cmd.h:35
Definition: control_cmd.h:87
struct ctrl_cmd * cmd
Definition: control_cmd.h:114
struct ctrl_cmd * ctrl_cmd_trap(struct ctrl_cmd *cmd)
Copy given cmd and convert copy to CTRL_TYPE_TRAP.
Definition: control_if.c:170
struct ctrl_cmd_def * defer
state representing deferred (async) response, if any
Definition: control_cmd.h:81
Definition: control_cmd.h:36
struct osmo_wqueue write_queue
The queue for sending data back.
Definition: control_cmd.h:48
Implementation of a given CTRL command.
Definition: control_cmd.h:94