From 794d9b29f7fda38f4ccf67845c8a2d63e4c8ca01 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 17 Feb 2009 02:02:14 +0000 Subject: add bits and pieces of documentation --- doc/BS11-OML.txt | 31 +++++++++ doc/call-routing.txt | 25 ++++++++ doc/e1-data-model.txt | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 228 insertions(+) create mode 100644 doc/BS11-OML.txt create mode 100644 doc/call-routing.txt create mode 100644 doc/e1-data-model.txt diff --git a/doc/BS11-OML.txt b/doc/BS11-OML.txt new file mode 100644 index 000000000..e5c3299c9 --- /dev/null +++ b/doc/BS11-OML.txt @@ -0,0 +1,31 @@ +The Siemens BS-11 supports the following additional GSM 12.21 OML operations: + + +CREATE OBJECT + +abis_om_fom_hdr.obj_class can be +A3: +A5: ALCO, BBSIG, CCLK, GPSU, LI, PA +A8: EnvaBTSE +A9: BPORT + +the abis_om_obj_inst.trx_nr field indicates the index of object, whereas the +abis_om_fom_hdr.bts_nr indicates the type of the object. + +enum abis_bs11_objtype { + BS11_OBJ_ALCO = 0x01, + BS11_OBJ_BBSIG = 0x02, /* obj_class: 0,1 */ + BS11_OBJ_TRX1 = 0x03, /* only DEACTIVATE TRX1 */ + BS11_OBJ_CCLK = 0x04, + BS11_OBJ_GPSU = 0x06, + BS11_OBJ_LI = 0x07, + BS11_OBJ_PA = 0x09, /* obj_class: 0, 1*/ +}; + +In case of CREATE ENVABTSE, the abis_om_obj_inst.trx_nr indicates the EnvaBTSEx +number. + +In case of A9 (CREAETE BPORT), the abis_om_obj_inst.bts_nr indicates which BPORT +shall be used. + + diff --git a/doc/call-routing.txt b/doc/call-routing.txt new file mode 100644 index 000000000..3402f9e33 --- /dev/null +++ b/doc/call-routing.txt @@ -0,0 +1,25 @@ +Call routing in OpenBSC + +Flow of events: + + # MO call initiated by MS, CHANNEL RQD, IMMEDIATE ASSIGN + # MS sends CC SETUP message, we assume already on TCH/H FACCH + # OpenBSC does a subscriber lookup based on the target extension + * If a subscriber is found: + # send CALL PROCEEDING message to MO + # page the MT subscriber and ask itI to ask for TCH/H + # once paging completes, we have the TCH/H for the MT end + # send SETUP to MT + # receive CALL CONFIRMED from MT + # set-up the TRAU mux mapping between the E1 subslots for both TCH/H + # receive ALERTING from MT, route ALERTING to MO + # receive CONNECT from MT, confirm to MT with CONNECT_ACK + # send a CONNECT message to MO, receive CONNECT_ACK from MO + * If subscriber is not found: + # send RELEASE COMPLETE with apropriate cause to MO (1: unalloacated 3: no route) + + + +Thoughts about RR/MM: + +* we allocate RR/MM entities on demand, when we need them diff --git a/doc/e1-data-model.txt b/doc/e1-data-model.txt new file mode 100644 index 000000000..8594fe456 --- /dev/null +++ b/doc/e1-data-model.txt @@ -0,0 +1,172 @@ +E1 related data model + +This data model describes the physical relationship of the individual +parts in the network, it is not the logical/protocol side of the GSM +network. + +A BTS is connected to the BSC by some physical link. It could be an actual +E1 link, but it could also be abis-over-IP with a mixture of TCP and RTP/UDP. + +To further complicate the fact, multiple BTS can share one such pysical +link. On a single E1 line, we can easily accomodate up to three BTS with +two TRX each. + +Thus, it is best for OpenBSC to have some kind of abstraction layer. The BSC's +view of a BTS connected to it. We call this 'bts_link'. A bts_link can be +* all the TCP and UDP streams of a Abis-over-IP BTS +* a set of E1 timeslots for OML, RSL and TRAU connections on a E1 link +* a serial line exclusively used for OML messages (T-Link) + +A bts_link can be registered with the OpenBSC core at runtime. + +struct trx_link { + struct gsm_bts_trx *trx; +}; + +struct bts_link { + struct gsm_bts *bts; + struct trx_link trx_links[NUM_TRX]; +}; + +Interface from stack to input core: +====================================================================== +int abis_rsl_sendmsg(struct msgb *msg); + send a message through a RSL link to the TRX specified by the caller in + msg->trx. + +int abis_rsl_rcvmsg(struct msgb *msg); + receive a message from a RSL link from the TRX specified by the + caller in msg->trx. + +int abis_nm_sendmsg(struct msgb *msg); + send a message through a OML link to the BTS specified by the caller in + msg->trx->bts. The caller can just use bts->c0 to get the first TRX + in a BTS. (OML messages are not really sent to a TRX but to the BTS) + +int abis_nm_rcvmsg(struct msgb *msg); + receive a message from a OML link from the BTS specified by the caller + in msg->trx->bts. The caller can just use bts->c0 to get the first + TRX in a BTS. + +int abis_link_event(int event, void *data); + signal some event (such as layer 1 connect/disconnect) from the + input core to the stack. + +int subch_demux_in(mx, const u_int8_t *data, int len); + receive 'len' bytes from a given E1 timeslot (TRAU frames) + +int subchan_mux_out(mx, u_int8_t *data, int len); + obtain 'len' bytes of output data to be sent on E1 timeslot + +Intrface by Input Core for Input Plugins +====================================================================== + +int btslink_register_plugin(); + + +Configuration for the E1 input module +====================================================================== + +BTS + BTS number + number of TRX + OML link + E1 line number + timeslot number + [subslot number] + SAPI + TEI + for each TRX + RSL link + E1 line number + timeslot number + [subslot number] + SAPI + TEI + for each TS + E1 line number + timeslot number + subslot number + + +E1 input module data model +====================================================================== + + +enum e1inp_sign_type { + E1INP_SIGN_NONE, + E1INP_SIGN_OML, + E1INP_SIGN_RSL, +}; + +struct e1inp_sign_link { + /* list of signalling links */ + struct llist_head list; + + enum e1inp_sign_type type; + + /* trx for msg->trx of received msgs */ + struct gsm_bts_trx *trx; + + /* msgb queue of to-be-transmitted msgs */ + struct llist_head tx_list; + + /* SAPI and TEI on the E1 TS */ + u_int8_t sapi; + u_int8_t tei; +} + +enum e1inp_ts_type { + E1INP_TS_TYPE_NONE, + E1INP_TS_TYPE_SIGN, + E1INP_TS_TYPE_TRAU, +}; + +/* A timeslot in the E1 interface */ +struct e1inp_ts { + enum e1inp_ts_type type; + struct e1inp_line *line; + union { + struct { + struct llist_head sign_links; + } sign; + struct { + /* subchannel demuxer for frames from E1 */ + struct subch_demux demux; + /* subchannel muxer for frames to E1 */ + struct subch_mux mux; + } trau; + }; + union { + struct { + /* mISDN driver has one fd for each ts */ + struct bsc_fd; + } misdn; + } driver; +}; + +struct e1inp_line { + unsigned int num; + char *name; + + struct e1inp_ts ts[NR_E1_TS]; + + char *e1inp_driver; + void *driver_data; +}; + +/* Call from the Stack: configuration of this TS has changed */ +int e1inp_update_ts(struct e1inp_ts *ts); + +/* Receive a packet from the E1 driver */ +int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg, + u_int8_t tei, u_int8_t sapi); + +/* Send a packet, callback function in the driver */ +int e1driver_tx_ts(struct e1inp_ts *ts, struct msgb *msg) + + +struct e1inp_driver { + const char *name; + int (*want_write)(struct e1inp_ts *ts); +}; -- cgit v1.2.3