blob: 2a5391f5f8b3d96ca9203386b11071785d067872 [file] [log] [blame]
Daniel Willmann1264cb42010-10-21 15:00:36 +02001#ifndef _CONTROL_CMD_H
2#define _CONTROL_CMD_H
3
4#include <osmocom/core/msgb.h>
5#include <osmocom/core/write_queue.h>
6
7#include <osmocom/vty/vector.h>
8
9#define CTRL_CMD_ERROR -1
10#define CTRL_CMD_HANDLED 0
11#define CTRL_CMD_REPLY 1
12
13enum ctrl_node_type {
14 CTRL_NODE_ROOT, /* Root elements */
15 CTRL_NODE_NET, /* Network specific (net.) */
16 CTRL_NODE_BTS, /* BTS specific (net.btsN.) */
17 CTRL_NODE_TRX, /* TRX specific (net.btsN.trxM.) */
18 CTRL_NODE_TS, /* TS specific (net.btsN.trxM.tsI.) */
19 _LAST_CTRL_NODE
20};
21
22enum ctrl_type {
23 CTRL_TYPE_UNKNOWN,
24 CTRL_TYPE_GET,
25 CTRL_TYPE_SET,
26 CTRL_TYPE_GET_REPLY,
27 CTRL_TYPE_SET_REPLY,
28 CTRL_TYPE_TRAP,
29 CTRL_TYPE_ERROR
30};
31
32struct ctrl_connection {
33 struct llist_head list_entry;
34
35 /* The queue for sending data back */
36 struct osmo_wqueue write_queue;
37
38 /* Callback if the connection was closed */
39 void (*closed_cb)(struct ctrl_connection *conn);
40
41 /* Pending commands for this connection */
42 struct llist_head cmds;
43};
44
45struct ctrl_cmd {
46 struct ctrl_connection *ccon;
47 enum ctrl_type type;
48 char *id;
49 void *node;
50 char *variable;
51 char *value;
52 char *reply;
53};
54
55struct ctrl_cmd_struct {
56 int nr_commands;
57 char **command;
58};
59
60struct ctrl_cmd_element {
61 const char *name;
62 const char *param;
63 struct ctrl_cmd_struct strcmd;
64 int (*set)(struct ctrl_cmd *cmd, void *data);
65 int (*get)(struct ctrl_cmd *cmd, void *data);
66 int (*verify)(struct ctrl_cmd *cmd, const char *value, void *data);
67};
68
69struct ctrl_cmd_map {
70 char *cmd;
71 enum ctrl_type type;
72};
73
74int ctrl_cmd_exec(vector vline, struct ctrl_cmd *command, vector node, void *data);
75int ctrl_cmd_install(enum ctrl_node_type node, struct ctrl_cmd_element *cmd);
76int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data);
77int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd);
78struct ctrl_cmd *ctrl_cmd_parse(void *ctx, struct msgb *msg);
79struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd);
Daniel Willmann8b7a9622011-03-17 15:37:54 +010080struct ctrl_cmd *ctrl_cmd_cpy(void *ctx, struct ctrl_cmd *cmd);
Holger Hans Peter Freythera6b34012011-08-22 23:44:32 +020081struct ctrl_cmd *ctrl_cmd_create(void *ctx, enum ctrl_type);
Daniel Willmann1264cb42010-10-21 15:00:36 +020082
Daniel Willmannfcf010f2011-05-05 17:01:09 +020083#define CTRL_CMD_DEFINE_RANGE(cmdname, cmdstr, dtype, element, min, max) \
Daniel Willmannf7c74e52011-08-05 11:48:18 +020084static int get_##cmdname(struct ctrl_cmd *cmd, void *data) \
Daniel Willmannfcf010f2011-05-05 17:01:09 +020085{ \
86 dtype *node = data; \
87 cmd->reply = talloc_asprintf(cmd, "%i", node->element); \
88 if (!cmd->reply) { \
89 cmd->reply = "OOM"; \
90 return CTRL_CMD_ERROR; \
91 } \
92 return CTRL_CMD_REPLY; \
93} \
Daniel Willmannf7c74e52011-08-05 11:48:18 +020094static int set_##cmdname(struct ctrl_cmd *cmd, void *data) \
Daniel Willmannfcf010f2011-05-05 17:01:09 +020095{ \
96 dtype *node = data; \
97 int tmp = atoi(cmd->value); \
98 node->element = tmp; \
99 return get_##cmdname(cmd, data); \
100} \
Daniel Willmannf7c74e52011-08-05 11:48:18 +0200101static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data) \
Daniel Willmannfcf010f2011-05-05 17:01:09 +0200102{ \
103 int tmp = atoi(value); \
104 if ((tmp >= min)&&(tmp <= max)) { \
105 return 0; \
106 } \
107 return -1; \
108} \
109struct ctrl_cmd_element cmd_##cmdname = { \
110 .name = cmdstr, \
111 .param = NULL, \
112 .get = &get_##cmdname, \
113 .set = &set_##cmdname, \
114 .verify = &verify_##cmdname, \
115}
116
117#define CTRL_CMD_DEFINE_STRING(cmdname, cmdstr, dtype, element) \
Daniel Willmannf7c74e52011-08-05 11:48:18 +0200118static int get_##cmdname(struct ctrl_cmd *cmd, dtype *data) \
Daniel Willmannfcf010f2011-05-05 17:01:09 +0200119{ \
120 cmd->reply = talloc_asprintf(cmd, "%s", data->element); \
121 if (!cmd->reply) { \
122 cmd->reply = "OOM"; \
123 return CTRL_CMD_ERROR; \
124 } \
125 return CTRL_CMD_REPLY; \
126} \
Daniel Willmannf7c74e52011-08-05 11:48:18 +0200127static int set_##cmdname(struct ctrl_cmd *cmd, dtype *data) \
Daniel Willmannfcf010f2011-05-05 17:01:09 +0200128{ \
129 bsc_replace_string(cmd->node, &data->element, cmd->value); \
130 return get_##cmdname(cmd, data); \
131} \
132struct ctrl_cmd_element cmd_##cmdname = { \
133 .name = cmdstr, \
134 .param = NULL, \
135 .get = &get_##cmdname, \
136 .set = &set_##cmdname, \
137 .verify = NULL, \
138}
139
140#define CTRL_CMD_DEFINE(cmdname, cmdstr) \
Daniel Willmannf7c74e52011-08-05 11:48:18 +0200141static int get_##cmdname(struct ctrl_cmd *cmd, void *data); \
142static int set_##cmdname(struct ctrl_cmd *cmd, void *data); \
143static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data); \
Daniel Willmannfcf010f2011-05-05 17:01:09 +0200144struct ctrl_cmd_element cmd_##cmdname = { \
145 .name = cmdstr, \
146 .param = NULL, \
147 .get = &get_##cmdname, \
148 .set = &set_##cmdname, \
149 .verify = &verify_##cmdname, \
150}
151
Harald Welte18b70b52011-07-13 14:14:03 +0200152struct gsm_network;
153int controlif_setup(struct gsm_network *gsmnet, uint16_t port);
154
Daniel Willmann1264cb42010-10-21 15:00:36 +0200155#endif /* _CONTROL_CMD_H */