blob: 9026f6cf56bc30893bfbe04105da22dd489dd995 [file] [log] [blame]
Harald Welte338e3b32012-11-20 22:22:04 +01001/* SMPP vty interface */
2
3/* (C) 2012 by Harald Welte <laforge@gnumonks.org>
4 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
15 *
16 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
Harald Weltee07b6a72012-11-23 19:02:37 +010021#include <ctype.h>
Harald Welte338e3b32012-11-20 22:22:04 +010022#include <string.h>
Harald Weltee07b6a72012-11-23 19:02:37 +010023#include <errno.h>
Harald Welte338e3b32012-11-20 22:22:04 +010024#include <netdb.h>
25#include <sys/socket.h>
26
27#include <osmocom/vty/command.h>
28#include <osmocom/vty/buffer.h>
29#include <osmocom/vty/vty.h>
30
31#include <osmocom/core/linuxlist.h>
32#include <osmocom/core/utils.h>
33#include <osmocom/core/talloc.h>
34
Neels Hofmeyr90843962017-09-04 15:04:35 +020035#include <osmocom/msc/vty.h>
Harald Welte338e3b32012-11-20 22:22:04 +010036
37#include "smpp_smsc.h"
38
39struct smsc *smsc_from_vty(struct vty *v);
40
41static struct cmd_node smpp_node = {
42 SMPP_NODE,
43 "%s(config-smpp)# ",
44 1,
45};
46
47static struct cmd_node esme_node = {
48 SMPP_ESME_NODE,
49 "%s(config-smpp-esme)# ",
50 1,
51};
52
53DEFUN(cfg_smpp, cfg_smpp_cmd,
54 "smpp", "Configure SMPP SMS Interface")
55{
56 vty->node = SMPP_NODE;
57
58 return CMD_SUCCESS;
59}
60
Holger Hans Peter Freyther42cf2e02015-07-06 16:41:30 +020061DEFUN(cfg_smpp_first, cfg_smpp_first_cmd,
62 "smpp-first",
63 "Try SMPP routes before the subscriber DB\n")
64{
65 struct smsc *smsc = smsc_from_vty(vty);
66 smsc->smpp_first = 1;
67 return CMD_SUCCESS;
68}
69
70DEFUN(cfg_no_smpp_first, cfg_no_smpp_first_cmd,
71 "no smpp-first",
72 NO_STR "Try SMPP before routes before the subscriber DB\n")
73{
74 struct smsc *smsc = smsc_from_vty(vty);
75 smsc->smpp_first = 0;
76 return CMD_SUCCESS;
77}
78
Neels Hofmeyr1b0e5542016-02-24 19:15:39 +010079static int smpp_local_tcp(struct vty *vty,
80 const char *bind_addr, uint16_t port)
81{
82 struct smsc *smsc = smsc_from_vty(vty);
83 int is_running = smsc->listen_ofd.fd > 0;
84 int same_bind_addr;
85 int rc;
86
87 /* If it is not up yet, don't rebind, just set values. */
88 if (!is_running) {
89 rc = smpp_smsc_conf(smsc, bind_addr, port);
90 if (rc < 0) {
91 vty_out(vty, "%% Cannot configure new address:port%s",
92 VTY_NEWLINE);
93 return CMD_WARNING;
94 }
95 return CMD_SUCCESS;
96 }
97
98 rc = smpp_smsc_restart(smsc, bind_addr, port);
99 if (rc < 0) {
100 vty_out(vty, "%% Cannot bind to new port %s:%u nor to"
101 " old port %s:%u%s",
102 bind_addr? bind_addr : "0.0.0.0",
103 port,
104 smsc->bind_addr? smsc->bind_addr : "0.0.0.0",
105 smsc->listen_port,
106 VTY_NEWLINE);
107 return CMD_WARNING;
108 }
109
110 same_bind_addr = (bind_addr == smsc->bind_addr)
111 || (bind_addr && smsc->bind_addr
112 && (strcmp(bind_addr, smsc->bind_addr) == 0));
113
114 if (!same_bind_addr || port != smsc->listen_port) {
115 vty_out(vty, "%% Cannot bind to new port %s:%u, staying on"
116 " old port %s:%u%s",
117 bind_addr? bind_addr : "0.0.0.0",
118 port,
119 smsc->bind_addr? smsc->bind_addr : "0.0.0.0",
120 smsc->listen_port,
121 VTY_NEWLINE);
122 return CMD_WARNING;
123 }
124
125 return CMD_SUCCESS;
126}
127
Harald Welte338e3b32012-11-20 22:22:04 +0100128DEFUN(cfg_smpp_port, cfg_smpp_port_cmd,
129 "local-tcp-port <1-65535>",
130 "Set the local TCP port on which we listen for SMPP\n"
131 "TCP port number")
132{
133 struct smsc *smsc = smsc_from_vty(vty);
134 uint16_t port = atoi(argv[0]);
Neels Hofmeyr1b0e5542016-02-24 19:15:39 +0100135 return smpp_local_tcp(vty, smsc->bind_addr, port);
136}
Harald Welte338e3b32012-11-20 22:22:04 +0100137
Neels Hofmeyr1b0e5542016-02-24 19:15:39 +0100138DEFUN(cfg_smpp_addr_port, cfg_smpp_addr_port_cmd,
139 "local-tcp-ip A.B.C.D <1-65535>",
140 "Set the local IP address and TCP port on which we listen for SMPP\n"
141 "Local IP address\n"
142 "TCP port number")
143{
144 const char *bind_addr = argv[0];
145 uint16_t port = atoi(argv[1]);
146 return smpp_local_tcp(vty, bind_addr, port);
Harald Welte338e3b32012-11-20 22:22:04 +0100147}
148
149DEFUN(cfg_smpp_sys_id, cfg_smpp_sys_id_cmd,
Harald Welteb4b21f52013-07-21 16:00:28 +0800150 "system-id ID",
151 "Set the System ID of this SMSC\n"
152 "Alphanumeric SMSC System ID\n")
Harald Welte338e3b32012-11-20 22:22:04 +0100153{
154 struct smsc *smsc = smsc_from_vty(vty);
155
156 if (strlen(argv[0])+1 > sizeof(smsc->system_id))
157 return CMD_WARNING;
158
159 strcpy(smsc->system_id, argv[0]);
160
161 return CMD_SUCCESS;
162}
163
164DEFUN(cfg_smpp_policy, cfg_smpp_policy_cmd,
165 "policy (accept-all|closed)",
166 "Set the authentication policy of this SMSC\n"
Keith72520f82019-01-17 01:08:33 +0100167 "Accept all SMPP connections independent of system ID / password\n"
Harald Welte338e3b32012-11-20 22:22:04 +0100168 "Accept only SMPP connections from ESMEs explicitly configured")
169{
170 struct smsc *smsc = smsc_from_vty(vty);
171
172 if (!strcmp(argv[0], "accept-all"))
173 smsc->accept_all = 1;
174 else
175 smsc->accept_all = 0;
176
177 return CMD_SUCCESS;
178}
179
180
181static int config_write_smpp(struct vty *vty)
182{
183 struct smsc *smsc = smsc_from_vty(vty);
184
185 vty_out(vty, "smpp%s", VTY_NEWLINE);
Neels Hofmeyr1b0e5542016-02-24 19:15:39 +0100186 if (smsc->bind_addr)
187 vty_out(vty, " local-tcp-ip %s %u%s", smsc->bind_addr,
188 smsc->listen_port, VTY_NEWLINE);
189 else
190 vty_out(vty, " local-tcp-port %u%s", smsc->listen_port,
191 VTY_NEWLINE);
Holger Hans Peter Freytherae9d8d32013-07-14 08:50:57 +0200192 if (strlen(smsc->system_id) > 0)
Harald Welteb862cef2013-01-24 09:54:04 +0100193 vty_out(vty, " system-id %s%s", smsc->system_id, VTY_NEWLINE);
Harald Welte338e3b32012-11-20 22:22:04 +0100194 vty_out(vty, " policy %s%s",
195 smsc->accept_all ? "accept-all" : "closed", VTY_NEWLINE);
Holger Hans Peter Freyther42cf2e02015-07-06 16:41:30 +0200196 vty_out(vty, " %ssmpp-first%s",
197 smsc->smpp_first ? "" : "no ", VTY_NEWLINE);
Harald Welte338e3b32012-11-20 22:22:04 +0100198
199 return CMD_SUCCESS;
200}
201
202DEFUN(cfg_esme, cfg_esme_cmd,
Harald Welteb4b21f52013-07-21 16:00:28 +0800203 "esme NAME",
204 "Configure a particular ESME\n"
205 "Alphanumeric System ID of the ESME to be configured\n")
Harald Welte338e3b32012-11-20 22:22:04 +0100206{
207 struct smsc *smsc = smsc_from_vty(vty);
208 struct osmo_smpp_acl *acl;
209 const char *id = argv[0];
210
211 if (strlen(id) > 16) {
212 vty_out(vty, "%% System ID cannot be more than 16 "
213 "characters long%s", VTY_NEWLINE);
214 return CMD_WARNING;
215 }
216 acl = smpp_acl_by_system_id(smsc, id);
217 if (!acl) {
218 acl = smpp_acl_alloc(smsc, id);
219 if (!acl)
220 return CMD_WARNING;
221 }
222
223 vty->index = acl;
224 vty->index_sub = &acl->description;
225 vty->node = SMPP_ESME_NODE;
226
227 return CMD_SUCCESS;
228}
229
230DEFUN(cfg_no_esme, cfg_no_esme_cmd,
Harald Welteb4b21f52013-07-21 16:00:28 +0800231 "no esme NAME",
232 NO_STR "Remove ESME configuration\n"
233 "Alphanumeric System ID of the ESME to be removed\n")
Harald Welte338e3b32012-11-20 22:22:04 +0100234{
235 struct smsc *smsc = smsc_from_vty(vty);
236 struct osmo_smpp_acl *acl;
237 const char *id = argv[0];
238
239 acl = smpp_acl_by_system_id(smsc, id);
240 if (!acl) {
241 vty_out(vty, "%% ESME with system id '%s' unknown%s",
242 id, VTY_NEWLINE);
243 return CMD_WARNING;
244 }
245
246 /* FIXME: close the connection, free data structure, etc. */
247
248 smpp_acl_delete(acl);
249
250 return CMD_SUCCESS;
251}
252
253
254DEFUN(cfg_esme_passwd, cfg_esme_passwd_cmd,
Harald Welteb4b21f52013-07-21 16:00:28 +0800255 "password PASSWORD",
256 "Set the password for this ESME\n"
257 "Alphanumeric password string\n")
Harald Welte338e3b32012-11-20 22:22:04 +0100258{
259 struct osmo_smpp_acl *acl = vty->index;
260
261 if (strlen(argv[0])+1 > sizeof(acl->passwd))
262 return CMD_WARNING;
263
264 strcpy(acl->passwd, argv[0]);
265
266 return CMD_SUCCESS;
267}
268
269DEFUN(cfg_esme_no_passwd, cfg_esme_no_passwd_cmd,
Harald Welteb4b21f52013-07-21 16:00:28 +0800270 "no password",
271 NO_STR "Remove the password for this ESME\n")
Harald Welte338e3b32012-11-20 22:22:04 +0100272{
273 struct osmo_smpp_acl *acl = vty->index;
274
275 memset(acl->passwd, 0, sizeof(acl->passwd));
276
277 return CMD_SUCCESS;
278}
279
Harald Weltee07b6a72012-11-23 19:02:37 +0100280static int osmo_is_digits(const char *str)
281{
282 int i;
283 for (i = 0; i < strlen(str); i++) {
284 if (!isdigit(str[i]))
285 return 0;
286 }
287 return 1;
288}
289
290static const struct value_string route_errstr[] = {
291 { -EEXIST, "Route already exists" },
292 { -ENODEV, "Route does not exist" },
293 { -ENOMEM, "No memory" },
294 { -EINVAL, "Invalid" },
295 { 0, NULL }
296};
297
298static const struct value_string smpp_ton_str_short[] = {
299 { TON_Unknown, "unknown" },
300 { TON_International, "international" },
301 { TON_National, "national" },
302 { TON_Network_Specific, "network" },
303 { TON_Subscriber_Number,"subscriber" },
304 { TON_Alphanumeric, "alpha" },
305 { TON_Abbreviated, "abbrev" },
306 { 0, NULL }
307};
308
309static const struct value_string smpp_npi_str_short[] = {
310 { NPI_Unknown, "unknown" },
311 { NPI_ISDN_E163_E164, "isdn" },
312 { NPI_Data_X121, "x121" },
313 { NPI_Telex_F69, "f69" },
314 { NPI_Land_Mobile_E212, "e212" },
315 { NPI_National, "national" },
316 { NPI_Private, "private" },
317 { NPI_ERMES, "ermes" },
318 { NPI_Internet_IP, "ip" },
319 { NPI_WAP_Client_Id, "wap" },
320 { 0, NULL }
321};
322
323
324#define SMPP_ROUTE_STR "Configure a route for MO-SMS to be sent to this ESME\n"
Harald Welteb4b21f52013-07-21 16:00:28 +0800325#define SMPP_ROUTE_P_STR SMPP_ROUTE_STR "Prefix-match route\n"
Harald Weltee07b6a72012-11-23 19:02:37 +0100326#define SMPP_PREFIX_STR "Destination number prefix\n"
327
328#define TON_CMD "(unknown|international|national|network|subscriber|alpha|abbrev)"
329#define NPI_CMD "(unknown|isdn|x121|f69|e212|national|private|ermes|ip|wap)"
Harald Welteb4b21f52013-07-21 16:00:28 +0800330#define TON_STR "Unknown type-of-number\n" \
331 "International type-of-number\n" \
332 "National type-of-number\n" \
333 "Network specific type-of-number\n" \
334 "Subscriber type-of-number\n" \
335 "Alphanumeric type-of-number\n" \
336 "Abbreviated type-of-number\n"
337#define NPI_STR "Unknown numbering plan\n" \
338 "ISDN (E.164) numbering plan\n" \
339 "X.121 numbering plan\n" \
340 "F.69 numbering plan\n" \
341 "E.212 numbering plan\n" \
342 "National numbering plan\n" \
343 "Private numbering plan\n" \
344 "ERMES numbering plan\n" \
345 "IP numbering plan\n" \
346 "WAP numbeing plan\n"
Harald Weltee07b6a72012-11-23 19:02:37 +0100347
348DEFUN(cfg_esme_route_pfx, cfg_esme_route_pfx_cmd,
349 "route prefix " TON_CMD " " NPI_CMD " PREFIX",
350 SMPP_ROUTE_P_STR TON_STR NPI_STR SMPP_PREFIX_STR)
Harald Welte338e3b32012-11-20 22:22:04 +0100351{
352 struct osmo_smpp_acl *acl = vty->index;
Harald Weltee07b6a72012-11-23 19:02:37 +0100353 struct osmo_smpp_addr pfx;
354 int rc;
Harald Welte338e3b32012-11-20 22:22:04 +0100355
Harald Weltee07b6a72012-11-23 19:02:37 +0100356 /* check if DESTINATION is all-digits */
357 if (!osmo_is_digits(argv[2])) {
358 vty_out(vty, "%% PREFIX has to be numeric%s", VTY_NEWLINE);
359 return CMD_WARNING;
360 }
361
362 pfx.ton = get_string_value(smpp_ton_str_short, argv[0]);
363 pfx.npi = get_string_value(smpp_npi_str_short, argv[1]);
364 snprintf(pfx.addr, sizeof(pfx.addr), "%s", argv[2]);
365
366 rc = smpp_route_pfx_add(acl, &pfx);
367 if (rc < 0) {
368 vty_out(vty, "%% error adding prefix route: %s%s",
369 get_value_string(route_errstr, rc), VTY_NEWLINE);
370 return CMD_WARNING;
371 }
Harald Welte338e3b32012-11-20 22:22:04 +0100372
373 return CMD_SUCCESS;
374}
375
Harald Weltee07b6a72012-11-23 19:02:37 +0100376DEFUN(cfg_esme_no_route_pfx, cfg_esme_no_route_pfx_cmd,
377 "no route prefix " TON_CMD " " NPI_CMD " PREFIX",
378 NO_STR SMPP_ROUTE_P_STR TON_STR NPI_STR SMPP_PREFIX_STR)
379{
380 struct osmo_smpp_acl *acl = vty->index;
381 struct osmo_smpp_addr pfx;
382 int rc;
383
384 /* check if DESTINATION is all-digits */
385 if (!osmo_is_digits(argv[2])) {
386 vty_out(vty, "%% PREFIX has to be numeric%s", VTY_NEWLINE);
387 return CMD_WARNING;
388 }
389
390 pfx.ton = get_string_value(smpp_ton_str_short, argv[0]);
391 pfx.npi = get_string_value(smpp_npi_str_short, argv[1]);
392 snprintf(pfx.addr, sizeof(pfx.addr), "%s", argv[2]);
393
394 rc = smpp_route_pfx_del(acl, &pfx);
395 if (rc < 0) {
396 vty_out(vty, "%% error removing prefix route: %s%s",
397 get_value_string(route_errstr, rc), VTY_NEWLINE);
398 return CMD_WARNING;
399 }
400
401 return CMD_SUCCESS;
402
403}
404
405
Harald Welte338e3b32012-11-20 22:22:04 +0100406DEFUN(cfg_esme_defaultroute, cfg_esme_defaultroute_cmd,
407 "default-route",
408 "Set this ESME as default-route for all SMS to unknown destinations")
409{
410 struct osmo_smpp_acl *acl = vty->index;
411
412 acl->default_route = 1;
413
Harald Weltee07b6a72012-11-23 19:02:37 +0100414 if (!acl->smsc->def_route)
415 acl->smsc->def_route = acl;
416
Harald Welte338e3b32012-11-20 22:22:04 +0100417 return CMD_SUCCESS;
418}
419
420DEFUN(cfg_no_esme_defaultroute, cfg_esme_no_defaultroute_cmd,
421 "no default-route", NO_STR
Harald Welteb4b21f52013-07-21 16:00:28 +0800422 "Remove this ESME as default-route for all SMS to unknown destinations")
Harald Welte338e3b32012-11-20 22:22:04 +0100423{
424 struct osmo_smpp_acl *acl = vty->index;
425
426 acl->default_route = 0;
427
428 /* remove currently active default route, if it was created by
429 * this ACL */
Harald Weltee07b6a72012-11-23 19:02:37 +0100430 if (acl->smsc->def_route && acl->smsc->def_route == acl)
Harald Welte338e3b32012-11-20 22:22:04 +0100431 acl->smsc->def_route = NULL;
432
433 return CMD_SUCCESS;
434}
435
Harald Welte6a399ef2013-09-02 16:41:00 +0200436DEFUN(cfg_esme_del_src_imsi, cfg_esme_del_src_imsi_cmd,
437 "deliver-src-imsi",
Ruben Undheim59d57da2016-12-20 17:38:31 +0100438 "Enable the use of IMSI as source address in DELIVER")
Harald Welte6a399ef2013-09-02 16:41:00 +0200439{
440 struct osmo_smpp_acl *acl = vty->index;
441
442 acl->deliver_src_imsi = 1;
443
444 return CMD_SUCCESS;
445}
446
447DEFUN(cfg_esme_no_del_src_imsi, cfg_esme_no_del_src_imsi_cmd,
448 "no deliver-src-imsi", NO_STR
Ruben Undheim59d57da2016-12-20 17:38:31 +0100449 "Disable the use of IMSI as source address in DELIVER")
Harald Welte6a399ef2013-09-02 16:41:00 +0200450{
451 struct osmo_smpp_acl *acl = vty->index;
452
453 acl->deliver_src_imsi = 0;
454
455 return CMD_SUCCESS;
456}
457
Harald Welte3f786002013-03-13 15:29:27 +0100458DEFUN(cfg_esme_osmo_ext, cfg_esme_osmo_ext_cmd,
459 "osmocom-extensions",
460 "Enable the use of Osmocom SMPP Extensions for this ESME")
461{
462 struct osmo_smpp_acl *acl = vty->index;
463
464 acl->osmocom_ext = 1;
465
466 return CMD_SUCCESS;
467}
468
469DEFUN(cfg_esme_no_osmo_ext, cfg_esme_no_osmo_ext_cmd,
470 "no osmocom-extensions", NO_STR
471 "Disable the use of Osmocom SMPP Extensions for this ESME")
472{
473 struct osmo_smpp_acl *acl = vty->index;
474
475 acl->osmocom_ext = 0;
476
477 return CMD_SUCCESS;
478}
479
Harald Weltec75ed6d2013-05-28 20:58:02 +0200480DEFUN(cfg_esme_dcs_transp, cfg_esme_dcs_transp_cmd,
481 "dcs-transparent",
482 "Enable the transparent pass-through of TP-DCS to SMPP DataCoding")
483{
484 struct osmo_smpp_acl *acl = vty->index;
485
486 acl->dcs_transparent = 1;
487
488 return CMD_SUCCESS;
489}
490
491DEFUN(cfg_esme_no_dcs_transp, cfg_esme_no_dcs_transp_cmd,
492 "no dcs-transparent", NO_STR
493 "Disable the transparent pass-through of TP-DCS to SMPP DataCoding")
494{
495 struct osmo_smpp_acl *acl = vty->index;
496
497 acl->dcs_transparent = 0;
498
499 return CMD_SUCCESS;
500}
501
Keithc6d219c2019-01-17 01:01:59 +0100502DEFUN(cfg_esme_alert_notif, cfg_esme_alert_notif_cmd,
503 "alert-notifications",
504 "Disable sending of SMPP Alert Notifications for this ESME")
505{
506 struct osmo_smpp_acl *acl = vty->index;
507
508 acl->alert_notifications = 1;
509
510 return CMD_SUCCESS;
511}
512
513DEFUN(cfg_esme_no_alert_notif, cfg_esme_no_alert_notif_cmd,
514 "no alert-notifications", NO_STR
515 "Disable sending of SMPP Alert Notifications for this ESME")
516{
517 struct osmo_smpp_acl *acl = vty->index;
518
519 acl->alert_notifications = 0;
520
521 return CMD_SUCCESS;
522}
523
Harald Weltec75ed6d2013-05-28 20:58:02 +0200524
Harald Welte338e3b32012-11-20 22:22:04 +0100525static void dump_one_esme(struct vty *vty, struct osmo_esme *esme)
526{
527 char host[128], serv[128];
528
529 host[0] = 0;
530 serv[0] = 0;
531 getnameinfo((const struct sockaddr *) &esme->sa, esme->sa_len,
532 host, sizeof(host), serv, sizeof(serv), NI_NUMERICSERV);
533
534 vty_out(vty, "ESME System ID: %s, Password: %s, SMPP Version %02x%s",
Harald Weltee07b6a72012-11-23 19:02:37 +0100535 esme->system_id, esme->acl ? esme->acl->passwd : "",
536 esme->smpp_version, VTY_NEWLINE);
Harald Welte338e3b32012-11-20 22:22:04 +0100537 vty_out(vty, " Connected from: %s:%s%s", host, serv, VTY_NEWLINE);
Harald Weltee07b6a72012-11-23 19:02:37 +0100538 if (esme->smsc->def_route == esme->acl)
539 vty_out(vty, " Is current default route%s", VTY_NEWLINE);
Harald Welte338e3b32012-11-20 22:22:04 +0100540}
541
542DEFUN(show_esme, show_esme_cmd,
543 "show smpp esme",
Keith72520f82019-01-17 01:08:33 +0100544 SHOW_STR "SMPP Interface\n" "SMPP External SMS Entity\n")
Harald Welte338e3b32012-11-20 22:22:04 +0100545{
546 struct smsc *smsc = smsc_from_vty(vty);
547 struct osmo_esme *esme;
548
549 llist_for_each_entry(esme, &smsc->esme_list, list)
550 dump_one_esme(vty, esme);
551
552 return CMD_SUCCESS;
553}
554
Harald Weltee07b6a72012-11-23 19:02:37 +0100555static void write_esme_route_single(struct vty *vty, struct osmo_smpp_route *r)
556{
557 switch (r->type) {
558 case SMPP_ROUTE_PREFIX:
559 vty_out(vty, " route prefix %s ",
560 get_value_string(smpp_ton_str_short, r->u.prefix.ton));
561 vty_out(vty, "%s %s%s",
562 get_value_string(smpp_npi_str_short, r->u.prefix.npi),
563 r->u.prefix.addr, VTY_NEWLINE);
564 break;
565 case SMPP_ROUTE_NONE:
566 break;
567 }
568}
569
Harald Welte338e3b32012-11-20 22:22:04 +0100570static void config_write_esme_single(struct vty *vty, struct osmo_smpp_acl *acl)
571{
Harald Weltee07b6a72012-11-23 19:02:37 +0100572 struct osmo_smpp_route *r;
573
Harald Welte338e3b32012-11-20 22:22:04 +0100574 vty_out(vty, " esme %s%s", acl->system_id, VTY_NEWLINE);
575 if (strlen(acl->passwd))
576 vty_out(vty, " password %s%s", acl->passwd, VTY_NEWLINE);
577 if (acl->default_route)
578 vty_out(vty, " default-route%s", VTY_NEWLINE);
Harald Weltee07b6a72012-11-23 19:02:37 +0100579 if (acl->deliver_src_imsi)
580 vty_out(vty, " deliver-src-imsi%s", VTY_NEWLINE);
Harald Welte3f786002013-03-13 15:29:27 +0100581 if (acl->osmocom_ext)
582 vty_out(vty, " osmocom-extensions%s", VTY_NEWLINE);
Harald Weltec75ed6d2013-05-28 20:58:02 +0200583 if (acl->dcs_transparent)
584 vty_out(vty, " dcs-transparent%s", VTY_NEWLINE);
Keith18f11382019-03-19 15:14:19 +0100585 if (!acl->alert_notifications)
586 vty_out(vty, " no alert-notifications%s", VTY_NEWLINE);
Harald Weltee07b6a72012-11-23 19:02:37 +0100587
588 llist_for_each_entry(r, &acl->route_list, list)
589 write_esme_route_single(vty, r);
Harald Welte338e3b32012-11-20 22:22:04 +0100590}
591
592static int config_write_esme(struct vty *v)
593{
594 struct smsc *smsc = smsc_from_vty(v);
595 struct osmo_smpp_acl *acl;
596
597 llist_for_each_entry(acl, &smsc->acl_list, list)
598 config_write_esme_single(v, acl);
599
600 return CMD_SUCCESS;
601}
602
603int smpp_vty_init(void)
604{
605 install_node(&smpp_node, config_write_smpp);
Harald Welte338e3b32012-11-20 22:22:04 +0100606 install_element(CONFIG_NODE, &cfg_smpp_cmd);
607
Holger Hans Peter Freyther42cf2e02015-07-06 16:41:30 +0200608 install_element(SMPP_NODE, &cfg_smpp_first_cmd);
609 install_element(SMPP_NODE, &cfg_no_smpp_first_cmd);
Harald Welte338e3b32012-11-20 22:22:04 +0100610 install_element(SMPP_NODE, &cfg_smpp_port_cmd);
Neels Hofmeyr1b0e5542016-02-24 19:15:39 +0100611 install_element(SMPP_NODE, &cfg_smpp_addr_port_cmd);
Harald Welte338e3b32012-11-20 22:22:04 +0100612 install_element(SMPP_NODE, &cfg_smpp_sys_id_cmd);
613 install_element(SMPP_NODE, &cfg_smpp_policy_cmd);
614 install_element(SMPP_NODE, &cfg_esme_cmd);
615 install_element(SMPP_NODE, &cfg_no_esme_cmd);
616
617 install_node(&esme_node, config_write_esme);
Harald Welte338e3b32012-11-20 22:22:04 +0100618 install_element(SMPP_ESME_NODE, &cfg_esme_passwd_cmd);
619 install_element(SMPP_ESME_NODE, &cfg_esme_no_passwd_cmd);
Harald Weltee07b6a72012-11-23 19:02:37 +0100620 install_element(SMPP_ESME_NODE, &cfg_esme_route_pfx_cmd);
621 install_element(SMPP_ESME_NODE, &cfg_esme_no_route_pfx_cmd);
Harald Welte338e3b32012-11-20 22:22:04 +0100622 install_element(SMPP_ESME_NODE, &cfg_esme_defaultroute_cmd);
623 install_element(SMPP_ESME_NODE, &cfg_esme_no_defaultroute_cmd);
Harald Welte6a399ef2013-09-02 16:41:00 +0200624 install_element(SMPP_ESME_NODE, &cfg_esme_del_src_imsi_cmd);
625 install_element(SMPP_ESME_NODE, &cfg_esme_no_del_src_imsi_cmd);
Harald Welte3f786002013-03-13 15:29:27 +0100626 install_element(SMPP_ESME_NODE, &cfg_esme_osmo_ext_cmd);
627 install_element(SMPP_ESME_NODE, &cfg_esme_no_osmo_ext_cmd);
Harald Weltec75ed6d2013-05-28 20:58:02 +0200628 install_element(SMPP_ESME_NODE, &cfg_esme_dcs_transp_cmd);
629 install_element(SMPP_ESME_NODE, &cfg_esme_no_dcs_transp_cmd);
Keithc6d219c2019-01-17 01:01:59 +0100630 install_element(SMPP_ESME_NODE, &cfg_esme_alert_notif_cmd);
631 install_element(SMPP_ESME_NODE, &cfg_esme_no_alert_notif_cmd);
Harald Welte338e3b32012-11-20 22:22:04 +0100632
633 install_element_ve(&show_esme_cmd);
634
635 return 0;
636}