add bits and pieces of documentation
This commit is contained in:
parent
7ccf77810b
commit
794d9b29f7
|
@ -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.
|
||||
|
||||
|
|
@ -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
|
|
@ -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);
|
||||
};
|
Loading…
Reference in New Issue