blob: 3dd6562427d6a52d569883cb18b4bcdb8416aa99 [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>
10
11#include <smpp34.h>
12#include <smpp34_structs.h>
13#include <smpp34_params.h>
14
Harald Welte338e3b32012-11-20 22:22:04 +010015#define SMPP_SYS_ID_LEN 16
16#define SMPP_PASSWD_LEN 16
17
Holger Hans Peter Freythera7328a52013-07-13 17:09:56 +020018#define MODE_7BIT 7
19#define MODE_8BIT 8
20
Harald Weltef1033cc2012-11-08 16:14:37 +010021enum esme_read_state {
22 READ_ST_IN_LEN = 0,
23 READ_ST_IN_MSG = 1,
24};
25
Harald Welte338e3b32012-11-20 22:22:04 +010026struct osmo_smpp_acl;
27
Harald Weltee07b6a72012-11-23 19:02:37 +010028struct osmo_smpp_addr {
29 uint8_t ton;
30 uint8_t npi;
31 char addr[21+1];
32};
33
Harald Weltef1033cc2012-11-08 16:14:37 +010034struct osmo_esme {
35 struct llist_head list;
36 struct smsc *smsc;
Harald Welte338e3b32012-11-20 22:22:04 +010037 struct osmo_smpp_acl *acl;
Harald Weltee94db492012-11-08 20:11:05 +010038 int use;
39
Harald Welte8a1b0562012-11-09 12:51:44 +010040 uint32_t own_seq_nr;
41
Harald Weltef1033cc2012-11-08 16:14:37 +010042 struct osmo_wqueue wqueue;
43 struct sockaddr_storage sa;
44 socklen_t sa_len;
45
46 enum esme_read_state read_state;
47 uint32_t read_len;
48 uint32_t read_idx;
49 struct msgb *read_msg;
50
51 uint8_t smpp_version;
Harald Welte338e3b32012-11-20 22:22:04 +010052 char system_id[SMPP_SYS_ID_LEN+1];
Harald Weltef1033cc2012-11-08 16:14:37 +010053
54 uint8_t bind_flags;
55};
56
Harald Welte338e3b32012-11-20 22:22:04 +010057struct osmo_smpp_acl {
58 struct llist_head list;
59 struct smsc *smsc;
Harald Weltee07b6a72012-11-23 19:02:37 +010060 struct osmo_esme *esme;
Harald Welte338e3b32012-11-20 22:22:04 +010061 char *description;
62 char system_id[SMPP_SYS_ID_LEN+1];
63 char passwd[SMPP_PASSWD_LEN+1];
64 int default_route;
Harald Weltee07b6a72012-11-23 19:02:37 +010065 int deliver_src_imsi;
Harald Welte3f786002013-03-13 15:29:27 +010066 int osmocom_ext;
Harald Weltec75ed6d2013-05-28 20:58:02 +020067 int dcs_transparent;
Harald Weltee07b6a72012-11-23 19:02:37 +010068 struct llist_head route_list;
Harald Welte338e3b32012-11-20 22:22:04 +010069};
70
Harald Weltee07b6a72012-11-23 19:02:37 +010071enum osmo_smpp_rtype {
72 SMPP_ROUTE_NONE,
73 SMPP_ROUTE_PREFIX,
74};
75
76struct osmo_smpp_route {
77 struct llist_head list; /*!< in acl.route_list */
78 struct llist_head global_list; /*!< in smsc->route_list */
79 struct osmo_smpp_acl *acl;
80 enum osmo_smpp_rtype type;
81 union {
82 struct osmo_smpp_addr prefix;
83 } u;
84};
85
86
Harald Weltef1033cc2012-11-08 16:14:37 +010087struct smsc {
88 struct osmo_fd listen_ofd;
89 struct llist_head esme_list;
Harald Welte338e3b32012-11-20 22:22:04 +010090 struct llist_head acl_list;
Harald Weltee07b6a72012-11-23 19:02:37 +010091 struct llist_head route_list;
Harald Welte338e3b32012-11-20 22:22:04 +010092 uint16_t listen_port;
93 char system_id[SMPP_SYS_ID_LEN+1];
94 int accept_all;
Holger Hans Peter Freyther42cf2e02015-07-06 16:41:30 +020095 int smpp_first;
Harald Weltee07b6a72012-11-23 19:02:37 +010096 struct osmo_smpp_acl *def_route;
Harald Weltef1033cc2012-11-08 16:14:37 +010097 void *priv;
98};
99
Harald Weltee07b6a72012-11-23 19:02:37 +0100100int smpp_addr_eq(const struct osmo_smpp_addr *a,
101 const struct osmo_smpp_addr *b);
Harald Weltef1033cc2012-11-08 16:14:37 +0100102
103int smpp_smsc_init(struct smsc *smsc, uint16_t port);
104
Harald Weltee94db492012-11-08 20:11:05 +0100105void smpp_esme_get(struct osmo_esme *esme);
106void smpp_esme_put(struct osmo_esme *esme);
107
Harald Weltee07b6a72012-11-23 19:02:37 +0100108struct osmo_esme *
109smpp_route(const struct smsc *smsc, const struct osmo_smpp_addr *dest);
110
Harald Welte338e3b32012-11-20 22:22:04 +0100111struct osmo_smpp_acl *smpp_acl_alloc(struct smsc *smsc, const char *sys_id);
112struct osmo_smpp_acl *smpp_acl_by_system_id(struct smsc *smsc,
113 const char *sys_id);
114void smpp_acl_delete(struct osmo_smpp_acl *acl);
115
Harald Welted4bdee72012-11-08 19:44:08 +0100116int smpp_tx_submit_r(struct osmo_esme *esme, uint32_t sequence_nr,
117 uint32_t command_status, char *msg_id);
118
Harald Welte8a1b0562012-11-09 12:51:44 +0100119int smpp_tx_alert(struct osmo_esme *esme, uint8_t ton, uint8_t npi,
120 const char *addr, uint8_t avail_status);
121
Harald Weltee07b6a72012-11-23 19:02:37 +0100122int smpp_tx_deliver(struct osmo_esme *esme, struct deliver_sm_t *deliver);
123
Harald Weltef1033cc2012-11-08 16:14:37 +0100124int handle_smpp_submit(struct osmo_esme *esme, struct submit_sm_t *submit,
125 struct submit_sm_resp_t *submit_r);
126
Harald Weltee07b6a72012-11-23 19:02:37 +0100127int smpp_route_pfx_add(struct osmo_smpp_acl *acl,
128 const struct osmo_smpp_addr *pfx);
129int smpp_route_pfx_del(struct osmo_smpp_acl *acl,
130 const struct osmo_smpp_addr *pfx);
Holger Hans Peter Freyther5ecbc932013-07-27 18:39:30 +0200131
132int smpp_vty_init(void);
Holger Hans Peter Freythera7328a52013-07-13 17:09:56 +0200133
134int smpp_determine_scheme(uint8_t dcs, uint8_t *data_coding, int *mode);
Holger Hans Peter Freythere3c391e2015-07-06 16:40:01 +0200135
136
137
138struct gsm_sms;
139struct gsm_subscriber_connection;
140
Holger Hans Peter Freyther42cf2e02015-07-06 16:41:30 +0200141int smpp_route_smpp_first(struct gsm_sms *sms,
142 struct gsm_subscriber_connection *conn);
Holger Hans Peter Freythere3c391e2015-07-06 16:40:01 +0200143int smpp_try_deliver(struct gsm_sms *sms,
144 struct gsm_subscriber_connection *conn);
Harald Weltef1033cc2012-11-08 16:14:37 +0100145#endif