blob: e72f81fef77f548b21a7401ed034ba66abe40bd2 [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
Harald Weltef1033cc2012-11-08 16:14:37 +010018enum esme_read_state {
19 READ_ST_IN_LEN = 0,
20 READ_ST_IN_MSG = 1,
21};
22
Harald Welte338e3b32012-11-20 22:22:04 +010023struct osmo_smpp_acl;
24
Harald Weltee07b6a72012-11-23 19:02:37 +010025struct osmo_smpp_addr {
26 uint8_t ton;
27 uint8_t npi;
28 char addr[21+1];
29};
30
Harald Weltef1033cc2012-11-08 16:14:37 +010031struct osmo_esme {
32 struct llist_head list;
33 struct smsc *smsc;
Harald Welte338e3b32012-11-20 22:22:04 +010034 struct osmo_smpp_acl *acl;
Harald Weltee94db492012-11-08 20:11:05 +010035 int use;
36
Harald Welte8a1b0562012-11-09 12:51:44 +010037 uint32_t own_seq_nr;
38
Harald Weltef1033cc2012-11-08 16:14:37 +010039 struct osmo_wqueue wqueue;
40 struct sockaddr_storage sa;
41 socklen_t sa_len;
42
43 enum esme_read_state read_state;
44 uint32_t read_len;
45 uint32_t read_idx;
46 struct msgb *read_msg;
47
48 uint8_t smpp_version;
Harald Welte338e3b32012-11-20 22:22:04 +010049 char system_id[SMPP_SYS_ID_LEN+1];
Harald Weltef1033cc2012-11-08 16:14:37 +010050
51 uint8_t bind_flags;
52};
53
Harald Welte338e3b32012-11-20 22:22:04 +010054struct osmo_smpp_acl {
55 struct llist_head list;
56 struct smsc *smsc;
Harald Weltee07b6a72012-11-23 19:02:37 +010057 struct osmo_esme *esme;
Harald Welte338e3b32012-11-20 22:22:04 +010058 char *description;
59 char system_id[SMPP_SYS_ID_LEN+1];
60 char passwd[SMPP_PASSWD_LEN+1];
61 int default_route;
Harald Weltee07b6a72012-11-23 19:02:37 +010062 int deliver_src_imsi;
Harald Welte3f786002013-03-13 15:29:27 +010063 int osmocom_ext;
Harald Weltee07b6a72012-11-23 19:02:37 +010064 struct llist_head route_list;
Harald Welte338e3b32012-11-20 22:22:04 +010065};
66
Harald Weltee07b6a72012-11-23 19:02:37 +010067enum osmo_smpp_rtype {
68 SMPP_ROUTE_NONE,
69 SMPP_ROUTE_PREFIX,
70};
71
72struct osmo_smpp_route {
73 struct llist_head list; /*!< in acl.route_list */
74 struct llist_head global_list; /*!< in smsc->route_list */
75 struct osmo_smpp_acl *acl;
76 enum osmo_smpp_rtype type;
77 union {
78 struct osmo_smpp_addr prefix;
79 } u;
80};
81
82
Harald Weltef1033cc2012-11-08 16:14:37 +010083struct smsc {
84 struct osmo_fd listen_ofd;
85 struct llist_head esme_list;
Harald Welte338e3b32012-11-20 22:22:04 +010086 struct llist_head acl_list;
Harald Weltee07b6a72012-11-23 19:02:37 +010087 struct llist_head route_list;
Harald Welte338e3b32012-11-20 22:22:04 +010088 uint16_t listen_port;
89 char system_id[SMPP_SYS_ID_LEN+1];
90 int accept_all;
Harald Weltee07b6a72012-11-23 19:02:37 +010091 struct osmo_smpp_acl *def_route;
Harald Weltef1033cc2012-11-08 16:14:37 +010092 void *priv;
93};
94
Harald Weltee07b6a72012-11-23 19:02:37 +010095int smpp_addr_eq(const struct osmo_smpp_addr *a,
96 const struct osmo_smpp_addr *b);
Harald Weltef1033cc2012-11-08 16:14:37 +010097
98int smpp_smsc_init(struct smsc *smsc, uint16_t port);
99
Harald Weltee94db492012-11-08 20:11:05 +0100100void smpp_esme_get(struct osmo_esme *esme);
101void smpp_esme_put(struct osmo_esme *esme);
102
Harald Weltee07b6a72012-11-23 19:02:37 +0100103struct osmo_esme *
104smpp_route(const struct smsc *smsc, const struct osmo_smpp_addr *dest);
105
Harald Welte338e3b32012-11-20 22:22:04 +0100106struct osmo_smpp_acl *smpp_acl_alloc(struct smsc *smsc, const char *sys_id);
107struct osmo_smpp_acl *smpp_acl_by_system_id(struct smsc *smsc,
108 const char *sys_id);
109void smpp_acl_delete(struct osmo_smpp_acl *acl);
110
Harald Welted4bdee72012-11-08 19:44:08 +0100111int smpp_tx_submit_r(struct osmo_esme *esme, uint32_t sequence_nr,
112 uint32_t command_status, char *msg_id);
113
Harald Welte8a1b0562012-11-09 12:51:44 +0100114int smpp_tx_alert(struct osmo_esme *esme, uint8_t ton, uint8_t npi,
115 const char *addr, uint8_t avail_status);
116
Harald Weltee07b6a72012-11-23 19:02:37 +0100117int smpp_tx_deliver(struct osmo_esme *esme, struct deliver_sm_t *deliver);
118
Harald Weltef1033cc2012-11-08 16:14:37 +0100119int handle_smpp_submit(struct osmo_esme *esme, struct submit_sm_t *submit,
120 struct submit_sm_resp_t *submit_r);
121
Harald Weltee07b6a72012-11-23 19:02:37 +0100122int smpp_route_pfx_add(struct osmo_smpp_acl *acl,
123 const struct osmo_smpp_addr *pfx);
124int smpp_route_pfx_del(struct osmo_smpp_acl *acl,
125 const struct osmo_smpp_addr *pfx);
Harald Weltef1033cc2012-11-08 16:14:37 +0100126#endif