FreeCalypso > hg > themwi-smsc
comparison doc/Arch-design @ 0:9e364c18e0e8
beginning of architectural design spec
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Wed, 20 Dec 2023 03:50:06 +0000 |
| parents | |
| children | c4f8a32af088 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:9e364c18e0e8 |
|---|---|
| 1 Themyscira Wireless SMSC implementation | |
| 2 Architectural design specification | |
| 3 | |
| 4 1. Purpose and scope of the software | |
| 5 | |
| 6 The purpose of the present software project is to facilitate store-and-forward | |
| 7 SMS exchange among the following parties: | |
| 8 | |
| 9 * Locally owned mobile telephone numbers (LOMTNs) that belong to Themyscira | |
| 10 Wireless, with Short Message Service accessed either via the local GSM network | |
| 11 (Osmocom-based) or via direct command line access to the SMSC; | |
| 12 | |
| 13 * The outside world: the total set of all SMS-capable E.164 telephone numbers | |
| 14 in the world, with whom our users must be able to freely exchange SMS just | |
| 15 like users of any other cellular phone carrier in USA; | |
| 16 | |
| 17 * USA-specific 5-digit and 6-digit short codes: these services aren't accessible | |
| 18 from anywhere in the world, only from USA (each country has its own services | |
| 19 of this type), but because we are located in USA, we must provide the same | |
| 20 access to public services as any other cellular phone carrier; | |
| 21 | |
| 22 * Any downstream parties who enter into an interconnection agreement with ThemWi | |
| 23 for the purpose of sharing our SMS uplink to the outside world. | |
| 24 | |
| 25 1.1. NANP specifics | |
| 26 | |
| 27 The design of our SMSC makes the following assumptions that are specific to | |
| 28 North American Numbering Plan: | |
| 29 | |
| 30 * All LOMTNs and all downstream peer MTNs are expected to be NANP numbers; | |
| 31 any/all SMS source or destination numbers in country codes other than +1 are | |
| 32 treated as belonging in the Outside World, accessible only via the SMPP | |
| 33 "uplink" connection to our upstream SMS connectivity provider. | |
| 34 | |
| 35 * The set of SMS destination numbers that can be sent to the upstream includes | |
| 36 not only non-NANP and not-locally-known NANP E.164 numbers, but also any/all | |
| 37 SMS short codes in USA-specific NXXXX or NXXXXX format. | |
| 38 | |
| 39 * In the case of Mobile-Originated SMS from the local GSM network, if the | |
| 40 user-entered destination number is not explicitly international (TON=1) and | |
| 41 does not fit the format of a USA SMS short code, other USA-customary dialing | |
| 42 formats are supported, as in 10-digit NPANXXXXXX or 11-digit 1NPANXXXXXX | |
| 43 without '+' prefix. | |
| 44 | |
| 45 themwi-nanp software package is a strict dependency for themwi-smsc: themwi-nanp | |
| 46 utilities must be used to manage the database of locally owned NANP numbers, | |
| 47 and the present software uses themwi-nanp libraries to access that database. | |
| 48 | |
| 49 1.2. Hierarchical arrangement of upstream and downstream peers | |
| 50 | |
| 51 The telecom landscape in USA is such that anyone can obtain 10-digit telephone | |
| 52 numbers (TNs) very easily and very cheaply, but making them SMS-capable (able | |
| 53 to function as Mobile Telephone Numbers or MTNs) is much more difficult. | |
| 54 Suitably equipped providers such as Bandwidth.com are generally unwilling to | |
| 55 provide service directly to small customers, and we (Themyscira Wireless team) | |
| 56 were able to find only one company (Sopranica Telecom) who buys P2P SMS | |
| 57 interconnection service from Bandwidth and was willing to resell to us. | |
| 58 | |
| 59 Suppose that many different ultra-small parties wish to set up their own indie | |
| 60 GSM networks in different parts of USA. Each of these tiny fiefdoms can serve | |
| 61 as its own administration and get its own TNs from a provider such as BulkVS. | |
| 62 How would all of these tiny fiefdoms then add SMS capability? The feedback we | |
| 63 got from Sopranica is that asking them to set up a sub-account on their | |
| 64 Bandwidth service for each microfiefdom would be too much work - hence San Diego | |
| 65 2G Association (the primary instance of Themyscira Wireless) will need to serve | |
| 66 as a third-level reseller, getting Bandwidth SMS interconnection service from | |
| 67 Sopranica and then further subletting it to other microfiefdoms. | |
| 68 | |
| 69 Vertical hierarchy support in ThemWi-SMSC is designed to support the just- | |
| 70 described use case. Each SMSC instance has a set of locally owned mobile TNs | |
| 71 (LOMTNs, owned by the local fiefdom operating this SMSC instance), a single | |
| 72 upstream SMPP link pointing up the hierarchy tree (toward the Outside World) | |
| 73 and any number of downstream SMPP links to downstream peers. The total set of | |
| 74 phone numbers known to each SMSC instance is its own local set (themwi-nanp | |
| 75 database of locally owned TNs) plus the set of numbers assigned to downstream | |
| 76 peers - all other E.164 numbers everywhere in the world (plus all non-E.164 USA | |
| 77 SMS short codes) belong in the Outside World and are sent to the "uplink" | |
| 78 connection. Messages are then routed as follows: | |
| 79 | |
| 80 * Any SM originating from a local GSM subscriber can go to another GSM | |
| 81 subscriber, to a known downstream peer or to the Outside World. | |
| 82 | |
| 83 * Any SM that are injected directly into the SMSC from local shell access are | |
| 84 treated the same way as Mobile-Originated SMS from local GSM users - hence | |
| 85 this mechanism can be used to send SMS to the local GSM network or to the | |
| 86 Outside World. | |
| 87 | |
| 88 * Any SM coming from the uplink connection can be addressing a local GSM | |
| 89 subscriber or a downstream peer - but either way it must be a number known | |
| 90 to this SMSC, otherwise something is badly misconfigured somewhere. | |
| 91 | |
| 92 * Any SM coming from a downlink connection can go to a local GSM subscriber, to | |
| 93 a different downstream peer or to the Outside World. | |
| 94 | |
| 95 1.2.1. Direction of SMPP connections | |
| 96 | |
| 97 Despite the name "Short Message Peer to Peer", SMPP is an asymmetric client- | |
| 98 server protocol, not symmetric peer-to-peer. Our primary, above-all-else | |
| 99 requirement when it comes to SMPP is to connect to the "big daddy" SMSC of | |
| 100 Bandwidth.com, the one that allows us to receive SMS from and send SMS to | |
| 101 anywhere in the Outside World. BW requires that we connect to their SMSC server | |
| 102 in the role of an SMPP client and bind as a bidirectional transceiver - both | |
| 103 message directions then flow over this single long-lived TCP connection from our | |
| 104 client to their server. | |
| 105 | |
| 106 This externally imposed requirement dictates the entire architectural design of | |
| 107 ThemWi-SMSC with respect to SMPP. Each instance of ThemWi-SMSC can have a | |
| 108 single upstream peer to whom we connect in the role of an SMPP client, and it | |
| 109 can optionally act as an SMPP server accepting TCP connections from downstream | |
| 110 peers. The master instance of ThemWi-SMSC at smsc.sandiego2g.org will point | |
| 111 its "upstream" link at Bandwidth.com SMPP server, using credentials given to us | |
| 112 by Sopranica, whereas other small fiefdoms who wish to join our service resale | |
| 113 tree will point the "upstream" link of their ThemWi-SMSC instances to | |
| 114 smsc.sandiego2g.org, and we (SD2G) will assign them authentication credentials | |
| 115 and manage their downstream number pools. | |
| 116 | |
| 117 1.3. Possible use outside of originally intended North American use case | |
| 118 | |
| 119 If your situation and/or interests do not match the very specific use case for | |
| 120 which the present software is designed (if you are located outside of North | |
| 121 America, and/or you have no interest in attaining SMS interconnection with the | |
| 122 national mobile telephony environment of whichever country you call home), you | |
| 123 can still play with the present implementation of GSM-oriented SMSC: the uplink | |
| 124 connection to the Outside World can be omitted, and if you don't have real TNs | |
| 125 (telephone numbers) in North American Numbering Plan (either because you are | |
| 126 outside of North America or because you are in NA but not interested in official | |
| 127 phone network interconnection), you can operate ThemWi-SMSC (plus the attached | |
| 128 Osmocom GSM network) with fake NANP numbers instead. | |
| 129 | |
| 130 To be clear, this support for modes of usage outside of the primary design goals | |
| 131 of ThemWi-SMSC is intended only to facilitate "play" and evaluation (getting a | |
| 132 feel for what may be the first SMSC implementation connecting to Osmocom CNI | |
| 133 via GSUP), not for serious long-term usage. If your actual desired use case is | |
| 134 an isolated GSM network with a totally ad hoc or "free" numbering plan (the | |
| 135 default which one gets with a "vanilla" installation of Osmocom CNI), or a GSM | |
| 136 network that is interconnected with the national mobile telephony environment | |
| 137 of some country other than USA, you need a different SMSC design that is | |
| 138 tailored for your numbering plan (free-form or non-USA national) that will be | |
| 139 different from NANP, and for local telecom environment quirks that will almost | |
| 140 certainly be different from those in USA. | |
| 141 | |
| 142 If you like the general idea and overall design of ThemWi-SMSC, but require an | |
| 143 adaptation to a different numbering plan or a different telecom environment | |
| 144 (isolated or a national interconnect in some other country), you should be able | |
| 145 to take the present code base and modify just the numbering plan aspects, | |
| 146 producing a derivative-work SMSC for your different needs. | |
| 147 | |
| 148 2. ThemWi-SMSC software architecture | |
| 149 | |
| 150 2.1. Modularity of components | |
| 151 | |
| 152 A complete deployment of ThemWi-SMSC, as in our own use case at Themyscira | |
| 153 Wireless, includes a local GSM network (Osmocom-based) and a connection to the | |
| 154 hierarchical SMPP tree that eventually leads to the Outside World SMS | |
| 155 connectivity provider at the top. However, our software implementation will be | |
| 156 modular, divided into separate software components for: | |
| 157 | |
| 158 * The internal core of the SMSC (one daemon process and some command line | |
| 159 utilities); | |
| 160 | |
| 161 * A pair of daemon processes devoted to the task of connecting the SMSC to the | |
| 162 local Osmocom-based GSM network, to be omitted if you don't have one; | |
| 163 | |
| 164 * A dedicated daemon process serving the SMPP link to the upstream peer, to be | |
| 165 omitted if you have no upstream link; | |
| 166 | |
| 167 * Another dedicated sw component serving downstream peer SMPP connections, one | |
| 168 process instance per downstream peer, or none if you have no such peers. | |
| 169 | |
| 170 This modularity allows the software to be used and (hopefully) appreciated | |
| 171 outside of its primary intended use case. At one extreme, someone could have | |
| 172 an isolated Osmocom GSM network, modify it slightly to use MSISDNs that look | |
| 173 like (fake) NANP numbers, hook up ThemWi-SMSC and use this SMSC as a replacement | |
| 174 for the Osmocom-default one, paving the way for factoring the SMSC function out | |
| 175 of OsmoMSC. At the other extreme, if someone is located in USA and wishes to | |
| 176 interconnect to the world of SMS through the chain of 3 resellers (Bandwidth | |
| 177 followed by Sopranica followed by San Diego 2G Association), they can run an | |
| 178 instance of ThemWi-SMSC without any GSM network at all. (You will still need | |
| 179 Osmocom libraries, but no Osmocom processes and no hardware.) In such a | |
| 180 deployment, all incoming SMS to your number(s) will be written into the | |
| 181 persistent store which you can read, and you can send outgoing SMS with a | |
| 182 command line utility. | |
| 183 | |
| 184 2.2. Persistent message store | |
| 185 | |
| 186 Every SM that passes through ThemWi-SMSC gets written into an append-only | |
| 187 persistent message store (PMS). Because this store is append-only, no messages | |
| 188 are ever deleted - however, each message in PMS can be in one of two states: | |
| 189 active or historical. An active SM is one for which the SMSC still needs to | |
| 190 make delivery attempts, either attempts at GSM MT delivery or attempts at | |
| 191 delivery to the appropriate upstream or downstream SMPP peer. A historical SM | |
| 192 is one for which no further action will be taken by any component of our SMSC. | |
| 193 An SM can enter "historical" state in several ways: | |
| 194 | |
| 195 * For some LOMTNs the act of writing incoming messages into PMS constitutes | |
| 196 final delivery in itself, and no other delivery actions are needed. In this | |
| 197 case a newly entered SM is directly written into PMS in the "historical" | |
| 198 state, without ever going through "active". | |
| 199 | |
| 200 * For messages that need to be delivered to a GSM MS or to an SMPP peer, once | |
| 201 that delivery has been made successfully, the message transitions from active | |
| 202 to historical. | |
| 203 | |
| 204 * In the case of failed deliveries (permament error, or expiration time reached | |
| 205 after repeated temporary failures), the failed message also transitions from | |
| 206 active to historical. | |
| 207 | |
| 208 The persistent message store is a simple binary file (/var/sms/pms.bin) | |
| 209 consisting of directly abutted 'struct sm_record' records. Each message record | |
| 210 is exactly 256 bytes (see struct definition - we were able to fit everything we | |
| 211 needed under the 256 byte mark, and then padded the struct to perfect round | |
| 212 size), and this perfect power-of-2 record size makes it very easy to perform | |
| 213 operations such as binary search via mmap or stripping initial megabytes of | |
| 214 historical records - see subsequent sections for more detailed description. | |
| 215 | |
| 216 PMS is append-only as already stated, but already-written records do not become | |
| 217 fully immutable until they become historical. For as long as a given SM is in | |
| 218 the active state, themwi-smsc-core daemon can and will update that record in | |
| 219 pms.bin: | |
| 220 | |
| 221 * For messages addressed to local GSM subscribers, dest_imsi will be filled | |
| 222 when the MSISDN-to-IMSI lookup operation on the destination number succeeds; | |
| 223 | |
| 224 * Upon discharge (successful delivery, permanent error or validity period | |
| 225 expiration after temporary failures), themwi-smsc-core will transition the | |
| 226 sm_record into historical state by filling disposition and time_disch struct | |
| 227 members; | |
| 228 | |
| 229 * Additional info may be written into dest_extra_info upon discharge, depending | |
| 230 on the destination type and thus the mode of final delivery. | |
| 231 | |
| 232 Once an sm_record transitions into historical state, it is then immutable for | |
| 233 archival purposes; archives of historical messages can be kept for years or even | |
| 234 decades, depending on local administration policy. | |
| 235 | |
| 236 2.2.1. Historical megabyte count | |
| 237 | |
| 238 Given the simple binary structure of the main PMS file, each megabyte (2**20 | |
| 239 bytes) holds exactly 4096 messages. It is envisioned that as a busy SMSC runs | |
| 240 for a long time, a significant number of historical messages will accumulate, | |
| 241 and the content of PMS may become many megabytes of historical messages followed | |
| 242 by some active SMs at the end. When themwi-smsc-core daemon restarts, it has | |
| 243 to read the entire PMS in order to collect all still-active SMs. Having to | |
| 244 read through many megabytes of historical SMs to get to active ones at the end | |
| 245 becomes unacceptable at large archive sizes, hence a mechanism is needed for | |
| 246 marking where the historical-only portion ends and the possibly-active portion | |
| 247 begins. | |
| 248 | |
| 249 There will be an auxiliary file named historical-mb, containing a single ASCII | |
| 250 line giving the number of historical megabytes in pms.bin. If this file reads | |
| 251 1, the first 4096 SM records are historical, if the auxiliary file reads 2, the | |
| 252 first 8192 SM records are historical, and so forth. This auxiliary file will be | |
| 253 used as follows: | |
| 254 | |
| 255 * Upon startup, themwi-smsc-core will read this historical-mb file and skip that | |
| 256 many initial megabytes of pms.bin; | |
| 257 | |
| 258 * At run time, themwi-smsc-core will track the index of the oldest still-active | |
| 259 SM in PMS. Whenever this index crosses a megabyte boundary, historical-mb | |
| 260 will be updated. | |
| 261 | |
| 262 2.2.2. Offline storage | |
| 263 | |
| 264 Even with the historical-mb mechanism of the previous section, the fact remains | |
| 265 that disk space on live servers is not infinite. If the archive of historical | |
| 266 messages grows so big that it needs to be removed from the SMSC server to free | |
| 267 up disk space, one can carry out the following procedure: | |
| 268 | |
| 269 * Temporarily stop themwi-smsc-core daemon at the level of runit or systemctl | |
| 270 or whatever you are using - this operation will bring down the entire SMSC, | |
| 271 so do it during a scheduled maintenance window; | |
| 272 | |
| 273 * Use dd to split pms.bin into historical and active portions: | |
| 274 | |
| 275 dd if=pms.bin of=pms-hist.bin bs=1048576 count=N | |
| 276 dd if=pms.bin of=pms-new.bin bs=1048576 skip=N | |
| 277 | |
| 278 * Move pms-hist.bin to offline storage; | |
| 279 | |
| 280 * Replace the long file with the shortened one: | |
| 281 | |
| 282 mv pms-new.bin pms.bin | |
| 283 echo 0 > historical-mb | |
| 284 | |
| 285 * Re-enable themwi-smsc-core and restart all other SMSC daemons. | |
| 286 | |
| 287 2.2.3. themwi-smsc-dump reading tool | |
| 288 | |
| 289 The program named themwi-smsc-dump will be a standalone command line utility | |
| 290 (fully static in its operation, not talking to any daemons or services) for | |
| 291 reading and parsing (decoding) pms.bin. It will open pms.bin with O_RDONLY, do | |
| 292 a read-only mmap on it, and then access this PMS as a memory-mapped file. | |
| 293 Several different modes of operation will be provided: | |
| 294 | |
| 295 * It will be possible to dump and decode the entire PMS, as needed during early | |
| 296 debugging. | |
| 297 | |
| 298 * It will be possible to specify a starting date/time at which the dump should | |
| 299 begin. As records are added in strict forward chronological order, it is | |
| 300 possible to find a record nearest (by time_entry timestamp) to a given time | |
| 301 point by binary search, very efficient on a memory-mapped file. | |
| 302 | |
| 303 * Once the dump has a starting point (beginning of the file or a time point | |
| 304 found by binary search), the tool can be told to dump till the end, display | |
| 305 some count of messages, or run until a certain ending date/time is crossed. | |
| 306 | |
| 307 * The tool can dump all message records in the selected range, or only those | |
| 308 matching specific filters such as a particular source or destination type, or | |
| 309 a specific phone number. | |
| 310 | |
| 311 The complexity described above is needed for the following reasons: | |
| 312 | |
| 313 * One radical idea is to grant limited access (by way of a very strict wrapper) | |
| 314 to themwi-smsc-dump to unprivileged users of the network served by the SMSC, | |
| 315 i.e., to end users. The idea is that each individual user should be able to | |
| 316 give their ssh public key to the administrator of the community network, and | |
| 317 then ssh into a special restricted service on the SMSC that does not grant | |
| 318 any system shell access, but allows them to access services under their own | |
| 319 phone number. Such an empowered end user should be able to submit SMS from | |
| 320 their own phone number using the power of a full-size computer (as opposed to | |
| 321 very painful text entry on the numeric keypad of a traditional GSM phone), | |
| 322 and to see a full log of all messages received by or sent from their own | |
| 323 phone number. | |
| 324 | |
| 325 * By the nature of her job, the administrator of the SMSC (and of the community | |
| 326 GSM network to which this SMSC belongs) necessarily has access to every | |
| 327 message that passes through the system, all metadata and actual content. | |
| 328 While this access is technically necessary, an administrator who is worthy of | |
| 329 her trusted position must not abuse this trust, and must do everything | |
| 330 possible to avoid looking at users' private message content when it is not | |
| 331 necessary to do so for technical troubleshooting reasons. Toward this | |
| 332 objective, themwi-smsc-dump must make it easy to look at only technically | |
| 333 necessary information, without throwing unnecessary private info into the | |
| 334 operator's eyeballs. |
