blob: 6d76475899881af7f571fe0350fd0d7c7dc50216 [file] [log] [blame]
Max5346f692022-07-28 14:19:22 +07001#pragma once
Harald Weltef1033cc2012-11-08 16:14:37 +01002
3#include <sys/socket.h>
4#include <netinet/in.h>
5
6#include <osmocom/core/utils.h>
7#include <osmocom/core/msgb.h>
8#include <osmocom/core/write_queue.h>
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +02009#include <osmocom/core/timer.h>
Max5346f692022-07-28 14:19:22 +070010#include <osmocom/smpp/smpp.h>
Harald Weltef1033cc2012-11-08 16:14:37 +010011
12#include <smpp34.h>
13#include <smpp34_structs.h>
14#include <smpp34_params.h>
15
Holger Hans Peter Freythera7328a52013-07-13 17:09:56 +020016#define MODE_7BIT 7
17#define MODE_8BIT 8
18
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010019struct msc_a;
20
Harald Welte338e3b32012-11-20 22:22:04 +010021struct osmo_smpp_acl;
22
Harald Weltee07b6a72012-11-23 19:02:37 +010023struct osmo_smpp_addr {
24 uint8_t ton;
25 uint8_t npi;
26 char addr[21+1];
27};
28
Max366a3402022-08-01 23:01:24 +070029/* struct wrapping ESME struct with additional SMSC-specific things like ACL, command list etc */
30struct smpp_esme {
Harald Weltef1033cc2012-11-08 16:14:37 +010031 struct llist_head list;
32 struct smsc *smsc;
Max366a3402022-08-01 23:01:24 +070033 struct esme *esme;
Harald Welte338e3b32012-11-20 22:22:04 +010034 struct osmo_smpp_acl *acl;
Harald Weltee94db492012-11-08 20:11:05 +010035 int use;
36
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020037 struct llist_head smpp_cmd_list;
38
Harald Weltef1033cc2012-11-08 16:14:37 +010039 uint8_t smpp_version;
Harald Weltef1033cc2012-11-08 16:14:37 +010040 uint8_t bind_flags;
41};
42
Harald Welte338e3b32012-11-20 22:22:04 +010043struct osmo_smpp_acl {
44 struct llist_head list;
45 struct smsc *smsc;
Max366a3402022-08-01 23:01:24 +070046 struct smpp_esme *esme;
Harald Welte338e3b32012-11-20 22:22:04 +010047 char *description;
48 char system_id[SMPP_SYS_ID_LEN+1];
49 char passwd[SMPP_PASSWD_LEN+1];
50 int default_route;
Harald Weltee07b6a72012-11-23 19:02:37 +010051 int deliver_src_imsi;
Harald Welte3f786002013-03-13 15:29:27 +010052 int osmocom_ext;
Harald Weltec75ed6d2013-05-28 20:58:02 +020053 int dcs_transparent;
Keithc6d219c2019-01-17 01:01:59 +010054 int alert_notifications;
Harald Weltee07b6a72012-11-23 19:02:37 +010055 struct llist_head route_list;
Harald Welte338e3b32012-11-20 22:22:04 +010056};
57
Harald Weltee07b6a72012-11-23 19:02:37 +010058enum osmo_smpp_rtype {
59 SMPP_ROUTE_NONE,
60 SMPP_ROUTE_PREFIX,
61};
62
63struct osmo_smpp_route {
64 struct llist_head list; /*!< in acl.route_list */
65 struct llist_head global_list; /*!< in smsc->route_list */
66 struct osmo_smpp_acl *acl;
67 enum osmo_smpp_rtype type;
68 union {
69 struct osmo_smpp_addr prefix;
70 } u;
71};
72
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020073struct osmo_smpp_cmd {
74 struct llist_head list;
Harald Welte2483f1b2016-06-19 18:06:02 +020075 struct vlr_subscr *vsub;
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020076 uint32_t sequence_nr;
Pablo Neira Ayusofdc99662017-08-07 14:01:10 +010077 uint32_t gsm411_msg_ref;
78 uint8_t gsm411_trans_id;
Pablo Neira Ayusoadae8592017-08-07 14:01:30 +010079 bool is_report;
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020080 struct osmo_timer_list response_timer;
81};
82
Max366a3402022-08-01 23:01:24 +070083struct osmo_smpp_cmd *smpp_cmd_find_by_seqnum(struct smpp_esme *esme,
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020084 uint32_t sequence_number);
85void smpp_cmd_ack(struct osmo_smpp_cmd *cmd);
Keith320960c2017-05-13 23:38:52 +020086void smpp_cmd_err(struct osmo_smpp_cmd *cmd, uint32_t status);
Max366a3402022-08-01 23:01:24 +070087void smpp_cmd_flush_pending(struct smpp_esme *esme);
Harald Weltee07b6a72012-11-23 19:02:37 +010088
Harald Weltef1033cc2012-11-08 16:14:37 +010089struct smsc {
90 struct osmo_fd listen_ofd;
91 struct llist_head esme_list;
Harald Welte338e3b32012-11-20 22:22:04 +010092 struct llist_head acl_list;
Harald Weltee07b6a72012-11-23 19:02:37 +010093 struct llist_head route_list;
Vadim Yanitskiy97b8e762021-10-26 00:39:11 +030094 char *bind_addr;
Harald Welte338e3b32012-11-20 22:22:04 +010095 uint16_t listen_port;
96 char system_id[SMPP_SYS_ID_LEN+1];
97 int accept_all;
Holger Hans Peter Freyther42cf2e02015-07-06 16:41:30 +020098 int smpp_first;
Harald Weltee07b6a72012-11-23 19:02:37 +010099 struct osmo_smpp_acl *def_route;
Harald Weltef1033cc2012-11-08 16:14:37 +0100100 void *priv;
101};
102
Harald Weltee07b6a72012-11-23 19:02:37 +0100103int smpp_addr_eq(const struct osmo_smpp_addr *a,
104 const struct osmo_smpp_addr *b);
Harald Weltef1033cc2012-11-08 16:14:37 +0100105
Neels Hofmeyr1b0e5542016-02-24 19:15:39 +0100106struct smsc *smpp_smsc_alloc_init(void *ctx);
107int smpp_smsc_conf(struct smsc *smsc, const char *bind_addr, uint16_t port);
108int smpp_smsc_start(struct smsc *smsc, const char *bind_addr, uint16_t port);
109int smpp_smsc_restart(struct smsc *smsc, const char *bind_addr, uint16_t port);
Harald Weltef1033cc2012-11-08 16:14:37 +0100110
Max366a3402022-08-01 23:01:24 +0700111void smpp_esme_get(struct smpp_esme *esme);
112void smpp_esme_put(struct smpp_esme *esme);
Harald Weltee94db492012-11-08 20:11:05 +0100113
Max366a3402022-08-01 23:01:24 +0700114int smpp_route(const struct smsc *smsc, const struct osmo_smpp_addr *dest, struct smpp_esme **emse);
Harald Weltee07b6a72012-11-23 19:02:37 +0100115
Harald Welte338e3b32012-11-20 22:22:04 +0100116struct osmo_smpp_acl *smpp_acl_alloc(struct smsc *smsc, const char *sys_id);
117struct osmo_smpp_acl *smpp_acl_by_system_id(struct smsc *smsc,
118 const char *sys_id);
119void smpp_acl_delete(struct osmo_smpp_acl *acl);
120
Max366a3402022-08-01 23:01:24 +0700121int smpp_tx_submit_r(struct smpp_esme *esme, uint32_t sequence_nr,
Harald Welted4bdee72012-11-08 19:44:08 +0100122 uint32_t command_status, char *msg_id);
123
Max366a3402022-08-01 23:01:24 +0700124int smpp_tx_alert(struct smpp_esme *esme, uint8_t ton, uint8_t npi,
Harald Welte8a1b0562012-11-09 12:51:44 +0100125 const char *addr, uint8_t avail_status);
126
Max366a3402022-08-01 23:01:24 +0700127int smpp_tx_deliver(struct smpp_esme *esme, struct deliver_sm_t *deliver);
Harald Weltee07b6a72012-11-23 19:02:37 +0100128
Max366a3402022-08-01 23:01:24 +0700129int handle_smpp_submit(struct smpp_esme *esme, struct submit_sm_t *submit,
Harald Weltef1033cc2012-11-08 16:14:37 +0100130 struct submit_sm_resp_t *submit_r);
131
Harald Weltee07b6a72012-11-23 19:02:37 +0100132int smpp_route_pfx_add(struct osmo_smpp_acl *acl,
133 const struct osmo_smpp_addr *pfx);
134int smpp_route_pfx_del(struct osmo_smpp_acl *acl,
135 const struct osmo_smpp_addr *pfx);
Holger Hans Peter Freyther5ecbc932013-07-27 18:39:30 +0200136
137int smpp_vty_init(void);
Holger Hans Peter Freythera7328a52013-07-13 17:09:56 +0200138
139int smpp_determine_scheme(uint8_t dcs, uint8_t *data_coding, int *mode);
Holger Hans Peter Freythere3c391e2015-07-06 16:40:01 +0200140
Harald Weltee6f11602022-05-17 18:25:14 +0200141time_t smpp_parse_time_format(const char *vp, time_t *t_now);
Holger Hans Peter Freythere3c391e2015-07-06 16:40:01 +0200142
143
144struct gsm_sms;
Neels Hofmeyrc036b792018-11-29 22:37:51 +0100145struct ran_conn;
Holger Hans Peter Freythere3c391e2015-07-06 16:40:01 +0200146
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100147bool smpp_route_smpp_first();
148int smpp_try_deliver(struct gsm_sms *sms, struct msc_a *msc_a);