| 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 uint8_t *data, int len); |
| receive 'len' bytes from a given E1 timeslot (TRAU frames) |
| |
| int subchan_mux_out(mx, uint8_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 */ |
| uint8_t sapi; |
| uint8_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 osmo_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, |
| uint8_t tei, uint8_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); |
| }; |