blob: 4c0d701543edf5183d902880f296505ef2a6dd82 [file] [log] [blame]
Harald Weltef1033cc2012-11-08 16:14:37 +01001#ifndef _SMPP_SMSC_H
2#define _SMPP_SMSC_H
3
4#include <sys/socket.h>
5#include <netinet/in.h>
6
7#include <osmocom/core/utils.h>
8#include <osmocom/core/msgb.h>
9#include <osmocom/core/write_queue.h>
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020010#include <osmocom/core/timer.h>
Harald Weltef1033cc2012-11-08 16:14:37 +010011
12#include <smpp34.h>
13#include <smpp34_structs.h>
14#include <smpp34_params.h>
15
Harald Weltec0847d62019-05-08 23:55:58 +020016#define SMPP_SYS_ID_LEN 15
17#define SMPP_PASSWD_LEN 8
Harald Welte338e3b32012-11-20 22:22:04 +010018
Holger Hans Peter Freythera7328a52013-07-13 17:09:56 +020019#define MODE_7BIT 7
20#define MODE_8BIT 8
21
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010022struct msc_a;
23
Harald Weltef1033cc2012-11-08 16:14:37 +010024enum esme_read_state {
25 READ_ST_IN_LEN = 0,
26 READ_ST_IN_MSG = 1,
27};
28
Harald Welte338e3b32012-11-20 22:22:04 +010029struct osmo_smpp_acl;
30
Harald Weltee07b6a72012-11-23 19:02:37 +010031struct osmo_smpp_addr {
32 uint8_t ton;
33 uint8_t npi;
34 char addr[21+1];
35};
36
Harald Weltef1033cc2012-11-08 16:14:37 +010037struct osmo_esme {
38 struct llist_head list;
39 struct smsc *smsc;
Harald Welte338e3b32012-11-20 22:22:04 +010040 struct osmo_smpp_acl *acl;
Harald Weltee94db492012-11-08 20:11:05 +010041 int use;
42
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020043 struct llist_head smpp_cmd_list;
44
Harald Welte8a1b0562012-11-09 12:51:44 +010045 uint32_t own_seq_nr;
46
Harald Weltef1033cc2012-11-08 16:14:37 +010047 struct osmo_wqueue wqueue;
48 struct sockaddr_storage sa;
49 socklen_t sa_len;
50
51 enum esme_read_state read_state;
52 uint32_t read_len;
53 uint32_t read_idx;
54 struct msgb *read_msg;
55
56 uint8_t smpp_version;
Harald Welte338e3b32012-11-20 22:22:04 +010057 char system_id[SMPP_SYS_ID_LEN+1];
Harald Weltef1033cc2012-11-08 16:14:37 +010058
59 uint8_t bind_flags;
60};
61
Harald Welte338e3b32012-11-20 22:22:04 +010062struct osmo_smpp_acl {
63 struct llist_head list;
64 struct smsc *smsc;
Harald Weltee07b6a72012-11-23 19:02:37 +010065 struct osmo_esme *esme;
Harald Welte338e3b32012-11-20 22:22:04 +010066 char *description;
67 char system_id[SMPP_SYS_ID_LEN+1];
68 char passwd[SMPP_PASSWD_LEN+1];
69 int default_route;
Harald Weltee07b6a72012-11-23 19:02:37 +010070 int deliver_src_imsi;
Harald Welte3f786002013-03-13 15:29:27 +010071 int osmocom_ext;
Harald Weltec75ed6d2013-05-28 20:58:02 +020072 int dcs_transparent;
Keithc6d219c2019-01-17 01:01:59 +010073 int alert_notifications;
Harald Weltee07b6a72012-11-23 19:02:37 +010074 struct llist_head route_list;
Harald Welte338e3b32012-11-20 22:22:04 +010075};
76
Harald Weltee07b6a72012-11-23 19:02:37 +010077enum osmo_smpp_rtype {
78 SMPP_ROUTE_NONE,
79 SMPP_ROUTE_PREFIX,
80};
81
82struct osmo_smpp_route {
83 struct llist_head list; /*!< in acl.route_list */
84 struct llist_head global_list; /*!< in smsc->route_list */
85 struct osmo_smpp_acl *acl;
86 enum osmo_smpp_rtype type;
87 union {
88 struct osmo_smpp_addr prefix;
89 } u;
90};
91
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020092struct osmo_smpp_cmd {
93 struct llist_head list;
Harald Welte2483f1b2016-06-19 18:06:02 +020094 struct vlr_subscr *vsub;
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020095 uint32_t sequence_nr;
Pablo Neira Ayusofdc99662017-08-07 14:01:10 +010096 uint32_t gsm411_msg_ref;
97 uint8_t gsm411_trans_id;
Pablo Neira Ayusoadae8592017-08-07 14:01:30 +010098 bool is_report;
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +020099 struct osmo_timer_list response_timer;
100};
101
102struct osmo_smpp_cmd *smpp_cmd_find_by_seqnum(struct osmo_esme *esme,
103 uint32_t sequence_number);
104void smpp_cmd_ack(struct osmo_smpp_cmd *cmd);
Keith320960c2017-05-13 23:38:52 +0200105void smpp_cmd_err(struct osmo_smpp_cmd *cmd, uint32_t status);
Pablo Neira Ayuso93ffbd02017-05-04 18:44:22 +0200106void smpp_cmd_flush_pending(struct osmo_esme *esme);
Harald Weltee07b6a72012-11-23 19:02:37 +0100107
Harald Weltef1033cc2012-11-08 16:14:37 +0100108struct smsc {
109 struct osmo_fd listen_ofd;
110 struct llist_head esme_list;
Harald Welte338e3b32012-11-20 22:22:04 +0100111 struct llist_head acl_list;
Harald Weltee07b6a72012-11-23 19:02:37 +0100112 struct llist_head route_list;
Vadim Yanitskiy97b8e762021-10-26 00:39:11 +0300113 char *bind_addr;
Harald Welte338e3b32012-11-20 22:22:04 +0100114 uint16_t listen_port;
115 char system_id[SMPP_SYS_ID_LEN+1];
116 int accept_all;
Holger Hans Peter Freyther42cf2e02015-07-06 16:41:30 +0200117 int smpp_first;
Harald Weltee07b6a72012-11-23 19:02:37 +0100118 struct osmo_smpp_acl *def_route;
Harald Weltef1033cc2012-11-08 16:14:37 +0100119 void *priv;
120};
121
Harald Weltee07b6a72012-11-23 19:02:37 +0100122int smpp_addr_eq(const struct osmo_smpp_addr *a,
123 const struct osmo_smpp_addr *b);
Harald Weltef1033cc2012-11-08 16:14:37 +0100124
Neels Hofmeyr1b0e5542016-02-24 19:15:39 +0100125struct smsc *smpp_smsc_alloc_init(void *ctx);
126int smpp_smsc_conf(struct smsc *smsc, const char *bind_addr, uint16_t port);
127int smpp_smsc_start(struct smsc *smsc, const char *bind_addr, uint16_t port);
128int smpp_smsc_restart(struct smsc *smsc, const char *bind_addr, uint16_t port);
129void smpp_smsc_stop(struct smsc *smsc);
Harald Weltef1033cc2012-11-08 16:14:37 +0100130
Harald Weltee94db492012-11-08 20:11:05 +0100131void smpp_esme_get(struct osmo_esme *esme);
132void smpp_esme_put(struct osmo_esme *esme);
133
Benoit Bolseed34ed572017-07-05 11:46:55 +0200134int smpp_route(const struct smsc *smsc, const struct osmo_smpp_addr *dest, struct osmo_esme **emse);
Harald Weltee07b6a72012-11-23 19:02:37 +0100135
Harald Welte338e3b32012-11-20 22:22:04 +0100136struct osmo_smpp_acl *smpp_acl_alloc(struct smsc *smsc, const char *sys_id);
137struct osmo_smpp_acl *smpp_acl_by_system_id(struct smsc *smsc,
138 const char *sys_id);
139void smpp_acl_delete(struct osmo_smpp_acl *acl);
140
Harald Welted4bdee72012-11-08 19:44:08 +0100141int smpp_tx_submit_r(struct osmo_esme *esme, uint32_t sequence_nr,
142 uint32_t command_status, char *msg_id);
143
Harald Welte8a1b0562012-11-09 12:51:44 +0100144int smpp_tx_alert(struct osmo_esme *esme, uint8_t ton, uint8_t npi,
145 const char *addr, uint8_t avail_status);
146
Harald Weltee07b6a72012-11-23 19:02:37 +0100147int smpp_tx_deliver(struct osmo_esme *esme, struct deliver_sm_t *deliver);
148
Harald Weltef1033cc2012-11-08 16:14:37 +0100149int handle_smpp_submit(struct osmo_esme *esme, struct submit_sm_t *submit,
150 struct submit_sm_resp_t *submit_r);
151
Harald Weltee07b6a72012-11-23 19:02:37 +0100152int smpp_route_pfx_add(struct osmo_smpp_acl *acl,
153 const struct osmo_smpp_addr *pfx);
154int smpp_route_pfx_del(struct osmo_smpp_acl *acl,
155 const struct osmo_smpp_addr *pfx);
Holger Hans Peter Freyther5ecbc932013-07-27 18:39:30 +0200156
157int smpp_vty_init(void);
Holger Hans Peter Freythera7328a52013-07-13 17:09:56 +0200158
159int smpp_determine_scheme(uint8_t dcs, uint8_t *data_coding, int *mode);
Holger Hans Peter Freythere3c391e2015-07-06 16:40:01 +0200160
161
162
163struct gsm_sms;
Neels Hofmeyrc036b792018-11-29 22:37:51 +0100164struct ran_conn;
Holger Hans Peter Freythere3c391e2015-07-06 16:40:01 +0200165
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100166bool smpp_route_smpp_first();
167int smpp_try_deliver(struct gsm_sms *sms, struct msc_a *msc_a);
Harald Weltef1033cc2012-11-08 16:14:37 +0100168#endif