From 177094b4c988f126ead93a5d3f25b4bedefa2d97 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 7 Jun 2011 12:21:51 +0200 Subject: src: use include/osmocom/abis instead of include/osmocom/gsm/abis Harald prefers short paths. This patch also remove commented includes in several files. --- configure.ac | 3 +- include/osmocom/Makefile.am | 2 +- include/osmocom/abis/Makefile.am | 3 + include/osmocom/abis/e1_input.h | 225 ++++++++++++++++++++++++++++++ include/osmocom/abis/ipaccess.h | 93 +++++++++++++ include/osmocom/abis/subchan_demux.h | 101 ++++++++++++++ include/osmocom/abis/trau_frame.h | 63 +++++++++ include/osmocom/gsm/Makefile.am | 1 - include/osmocom/gsm/abis/Makefile.am | 3 - include/osmocom/gsm/abis/e1_input.h | 226 ------------------------------- include/osmocom/gsm/abis/ipaccess.h | 93 ------------- include/osmocom/gsm/abis/subchan_demux.h | 101 -------------- include/osmocom/gsm/abis/trau_frame.h | 63 --------- src/e1_input.c | 14 +- src/input/dahdi.c | 2 - src/input/hsl.c | 11 +- src/input/ipaccess.c | 13 +- src/input/lapd.c | 1 - src/input/misdn.c | 2 +- src/subchan_demux.c | 6 +- src/trau_frame.c | 5 +- tests/e1inp_ipa_bsc_test.c | 2 +- 22 files changed, 498 insertions(+), 535 deletions(-) create mode 100644 include/osmocom/abis/Makefile.am create mode 100644 include/osmocom/abis/e1_input.h create mode 100644 include/osmocom/abis/ipaccess.h create mode 100644 include/osmocom/abis/subchan_demux.h create mode 100644 include/osmocom/abis/trau_frame.h delete mode 100644 include/osmocom/gsm/Makefile.am delete mode 100644 include/osmocom/gsm/abis/Makefile.am delete mode 100644 include/osmocom/gsm/abis/e1_input.h delete mode 100644 include/osmocom/gsm/abis/ipaccess.h delete mode 100644 include/osmocom/gsm/abis/subchan_demux.h delete mode 100644 include/osmocom/gsm/abis/trau_frame.h diff --git a/configure.ac b/configure.ac index 02ecdb4..774302a 100644 --- a/configure.ac +++ b/configure.ac @@ -43,8 +43,7 @@ AC_OUTPUT( libosmoabis.pc include/Makefile include/osmocom/Makefile - include/osmocom/gsm/Makefile - include/osmocom/gsm/abis/Makefile + include/osmocom/abis/Makefile src/Makefile src/input/Makefile tests/Makefile diff --git a/include/osmocom/Makefile.am b/include/osmocom/Makefile.am index 999a3ee..f9d5e7c 100644 --- a/include/osmocom/Makefile.am +++ b/include/osmocom/Makefile.am @@ -1 +1 @@ -SUBDIRS=gsm +SUBDIRS=abis diff --git a/include/osmocom/abis/Makefile.am b/include/osmocom/abis/Makefile.am new file mode 100644 index 0000000..8bdcc96 --- /dev/null +++ b/include/osmocom/abis/Makefile.am @@ -0,0 +1,3 @@ +osmoabis_HEADERS = e1_input.h subchan_demux.h ipaccess.h trau_frame.h + +osmoabisdir = $(includedir)/osmocom/gsm/abis diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h new file mode 100644 index 0000000..c5a4137 --- /dev/null +++ b/include/osmocom/abis/e1_input.h @@ -0,0 +1,225 @@ +#ifndef _E1_INPUT_H +#define _E1_INPUT_H + +#include +#include + +#include +#include +#include +#include +#include + +#define NUM_E1_TS 32 + +enum e1inp_sign_type { + E1INP_SIGN_NONE, + E1INP_SIGN_OML, + E1INP_SIGN_RSL, +}; +const char *e1inp_signtype_name(enum e1inp_sign_type tp); + +struct e1inp_ts; + +struct e1inp_sign_link { + /* list of signalling links */ + struct llist_head list; + + /* to which timeslot do we belong? */ + struct e1inp_ts *ts; + + 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; + + union { + struct { + uint8_t channel; + } misdn; + } driver; +}; + +enum e1inp_ts_type { + E1INP_TS_TYPE_NONE, + E1INP_TS_TYPE_SIGN, + E1INP_TS_TYPE_TRAU, +}; +const char *e1inp_tstype_name(enum e1inp_ts_type tp); + +/* A timeslot in the E1 interface */ +struct e1inp_ts { + enum e1inp_ts_type type; + int num; + + /* to which line do we belong ? */ + struct e1inp_line *line; + + union { + struct { + /* list of all signalling links on this TS */ + struct llist_head sign_links; + /* delay for the queue */ + int delay; + /* timer when to dequeue next frame */ + struct osmo_timer_list tx_timer; + } 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 fd; + } misdn; + struct { + /* ip.access driver has one fd for each ts */ + struct osmo_fd fd; + } ipaccess; + struct { + /* DAHDI driver has one fd for each ts */ + struct osmo_fd fd; + struct lapd_instance *lapd; + } dahdi; + } driver; +}; + +struct gsm_e1_subslot { + /* Number of E1 link */ + uint8_t e1_nr; + /* Number of E1 TS inside E1 link */ + uint8_t e1_ts; + /* Sub-slot within the E1 TS, 0xff if full TS */ + uint8_t e1_ts_ss; +}; + +enum e1inp_line_role { + E1INP_LINE_R_NONE, + E1INP_LINE_R_BSC, + E1INP_LINE_R_BTS, + E1INP_LINE_R_MAX +}; + +struct e1inp_driver { + struct llist_head list; + const char *name; + int (*want_write)(struct e1inp_ts *ts); + int (*line_update)(struct e1inp_line *line, enum e1inp_line_role role); + int default_delay; +}; + +struct e1inp_line { + struct llist_head list; + int refcnt; + + unsigned int num; + const char *name; + + /* array of timestlots */ + struct e1inp_ts ts[NUM_E1_TS]; + + int (*rx)(struct msgb *msg, struct e1inp_ts *ts); + int (*rx_err)(int error); + + struct e1inp_driver *driver; + void *driver_data; +}; + +/* SS_INPUT signals */ +enum signal_input { + S_INP_NONE, + S_INP_TEI_UP, + S_INP_TEI_DN, + S_INP_LINE_INIT, + S_INP_LINE_ALARM, + S_INP_LINE_NOALARM, +}; + +/* register a driver with the E1 core */ +int e1inp_driver_register(struct e1inp_driver *drv); + +/* fine a previously registered driver */ +struct e1inp_driver *e1inp_driver_find(const char *name); + +/* register a line with the E1 core */ +int e1inp_line_register(struct e1inp_line *line); + +/* get a line by its ID */ +struct e1inp_line *e1inp_line_get(uint8_t e1_nr); + +/* create a line in the E1 input core */ +struct e1inp_line *e1inp_line_create(uint8_t e1_nr, const char *driver_name, int (*rx)(struct msgb *msg, struct e1inp_ts *ts), int (*rx_err)(int error)); + +/* find a sign_link for given TEI and SAPI in a TS */ +struct e1inp_sign_link * +e1inp_lookup_sign_link(struct e1inp_ts *ts, uint8_t tei, + uint8_t sapi); + +/* create a new signalling link in a E1 timeslot */ +struct e1inp_sign_link * +e1inp_sign_link_create(struct e1inp_ts *ts, enum e1inp_sign_type type, + struct gsm_bts_trx *trx, uint8_t tei, + uint8_t sapi); + +/* configure and initialize one e1inp_ts */ +int e1inp_ts_config_sign(struct e1inp_ts *ts, struct e1inp_line *line); +int e1inp_ts_config_trau(struct e1inp_ts *ts, struct e1inp_line *line, + int (*subch_cb)(struct subch_demux *dmx, int ch, + uint8_t *data, int len, void *_priv)); + +/* 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); + +/* called by driver if it wants to transmit on a given TS */ +struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts, + struct e1inp_sign_link **sign_link); + +/* called by driver in case some kind of link state event */ +int e1inp_event(struct e1inp_ts *ts, int evt, uint8_t tei, uint8_t sapi); + +/* Write LAPD frames to the fd. */ +void e1_set_pcap_fd(int fd); + +/* called by TRAU muxer to obtain the destination mux entity */ +struct subch_mux *e1inp_get_mux(uint8_t e1_nr, uint8_t ts_nr); + +void e1inp_sign_link_destroy(struct e1inp_sign_link *link); +int e1inp_line_update(struct e1inp_line *line, enum e1inp_line_role role); + +struct gsm_network; +int ipaccess_setup(struct gsm_network *gsmnet); +int hsl_setup(struct gsm_network *gsmnet); + +extern struct llist_head e1inp_driver_list; +extern struct llist_head e1inp_line_list; + +int e1inp_vty_init(void); +void e1inp_init(void); + +int _abis_nm_sendmsg(struct msgb *msg, int to_trx_oml); + +/* XXX */ +struct input_signal_data { + int link_type; + uint8_t tei; + uint8_t sapi; + struct gsm_bts_trx *trx; + struct e1inp_line *line; +}; + +#endif /* _E1_INPUT_H */ diff --git a/include/osmocom/abis/ipaccess.h b/include/osmocom/abis/ipaccess.h new file mode 100644 index 0000000..2792572 --- /dev/null +++ b/include/osmocom/abis/ipaccess.h @@ -0,0 +1,93 @@ +#ifndef _OSMO_PROTO_IPACCESS_H +#define _OSMO_PROTO_IPACCESS_H + +#include + +#define IPA_TCP_PORT_OML 3002 +#define IPA_TCP_PORT_RSL 3003 + +struct ipaccess_head { + uint16_t len; /* network byte order */ + uint8_t proto; + uint8_t data[0]; +} __attribute__ ((packed)); + +struct ipaccess_head_ext { + uint8_t proto; + uint8_t data[0]; +} __attribute__ ((packed)); + +enum ipaccess_proto { + IPAC_PROTO_RSL = 0x00, + IPAC_PROTO_IPACCESS = 0xfe, + IPAC_PROTO_SCCP = 0xfd, + IPAC_PROTO_OML = 0xff, + + + /* OpenBSC extensions */ + IPAC_PROTO_OSMO = 0xee, + IPAC_PROTO_MGCP_OLD = 0xfc, +}; + +enum ipaccess_proto_ext { + IPAC_PROTO_EXT_CTRL = 0x00, + IPAC_PROTO_EXT_MGCP = 0x01, + IPAC_PROTO_EXT_LAC = 0x02, +}; + +enum ipaccess_msgtype { + IPAC_MSGT_PING = 0x00, + IPAC_MSGT_PONG = 0x01, + IPAC_MSGT_ID_GET = 0x04, + IPAC_MSGT_ID_RESP = 0x05, + IPAC_MSGT_ID_ACK = 0x06, + + /* OpenBSC extension */ + IPAC_MSGT_SCCP_OLD = 0xff, +}; + +enum ipaccess_id_tags { + IPAC_IDTAG_SERNR = 0x00, + IPAC_IDTAG_UNITNAME = 0x01, + IPAC_IDTAG_LOCATION1 = 0x02, + IPAC_IDTAG_LOCATION2 = 0x03, + IPAC_IDTAG_EQUIPVERS = 0x04, + IPAC_IDTAG_SWVERSION = 0x05, + IPAC_IDTAG_IPADDR = 0x06, + IPAC_IDTAG_MACADDR = 0x07, + IPAC_IDTAG_UNIT = 0x08, +}; + +/* + * Firmware specific header + */ +struct sdp_firmware { + char magic[4]; + char more_magic[2]; + uint16_t more_more_magic; + uint32_t header_length; + uint32_t file_length; + char sw_part[20]; + char text1[64]; + char time[12]; + char date[14]; + char text2[10]; + char version[20]; + uint16_t table_offset; + /* stuff i don't know */ +} __attribute__((packed)); + +struct sdp_header_entry { + uint16_t something1; + char text1[64]; + char time[12]; + char date[14]; + char text2[10]; + char version[20]; + uint32_t length; + uint32_t addr1; + uint32_t addr2; + uint32_t start; +} __attribute__((packed)); + +#endif /* _OSMO_PROTO_IPACCESS_H */ diff --git a/include/osmocom/abis/subchan_demux.h b/include/osmocom/abis/subchan_demux.h new file mode 100644 index 0000000..b71c856 --- /dev/null +++ b/include/osmocom/abis/subchan_demux.h @@ -0,0 +1,101 @@ +#ifndef _SUBCH_DEMUX_H +#define _SUBCH_DEMUX_H +/* A E1 sub-channel (de)multiplexer with TRAU frame sync */ + +/* (C) 2009 by Harald Welte + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include +#include + +#define NR_SUBCH 4 +#define TRAU_FRAME_SIZE 40 +#define TRAU_FRAME_BITS (TRAU_FRAME_SIZE*8) + +/***********************************************************************/ +/* DEMULTIPLEXER */ +/***********************************************************************/ + +struct demux_subch { + uint8_t out_bitbuf[TRAU_FRAME_BITS]; + uint16_t out_idx; /* next bit to be written in out_bitbuf */ + /* number of consecutive zeros that we have received (for sync) */ + unsigned int consecutive_zeros; + /* are we in TRAU frame sync or not? */ + unsigned int in_sync; +}; + +struct subch_demux { + /* bitmask of currently active subchannels */ + uint8_t chan_activ; + /* one demux_subch struct for every subchannel */ + struct demux_subch subch[NR_SUBCH]; + /* callback to be called once we have received a complete + * frame on a given subchannel */ + int (*out_cb)(struct subch_demux *dmx, int ch, uint8_t *data, int len, + void *); + /* user-provided data, transparently passed to out_cb() */ + void *data; +}; + +/* initialize one demultiplexer instance */ +int subch_demux_init(struct subch_demux *dmx); + +/* feed 'len' number of muxed bytes into the demultiplexer */ +int subch_demux_in(struct subch_demux *dmx, uint8_t *data, int len); + +/* activate decoding/processing for one subchannel */ +int subch_demux_activate(struct subch_demux *dmx, int subch); + +/* deactivate decoding/processing for one subchannel */ +int subch_demux_deactivate(struct subch_demux *dmx, int subch); + +/***********************************************************************/ +/* MULTIPLEXER */ +/***********************************************************************/ + +/* one element in the tx_queue of a muxer sub-channel */ +struct subch_txq_entry { + struct llist_head list; + + unsigned int bit_len; /* total number of bits in 'bits' */ + unsigned int next_bit; /* next bit to be transmitted */ + + uint8_t bits[0]; /* one bit per byte */ +}; + +struct mux_subch { + struct llist_head tx_queue; +}; + +/* structure representing one instance of the subchannel muxer */ +struct subch_mux { + struct mux_subch subch[NR_SUBCH]; +}; + +/* initialize a subchannel muxer instance */ +int subchan_mux_init(struct subch_mux *mx); + +/* request the output of 'len' multiplexed bytes */ +int subchan_mux_out(struct subch_mux *mx, uint8_t *data, int len); + +/* enqueue some data into one sub-channel of the muxer */ +int subchan_mux_enqueue(struct subch_mux *mx, int s_nr, const uint8_t *data, + int len); + +#endif /* _SUBCH_DEMUX_H */ diff --git a/include/osmocom/abis/trau_frame.h b/include/osmocom/abis/trau_frame.h new file mode 100644 index 0000000..a76da33 --- /dev/null +++ b/include/osmocom/abis/trau_frame.h @@ -0,0 +1,63 @@ +#ifndef _TRAU_FRAME_H +#define _TRAU_FRAME_H +/* TRAU frame handling according to GSM TS 08.60 */ + +/* (C) 2009 by Harald Welte + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include + +/* 21 for FR/EFR, 25 for AMR, 15 for OM, 15 for data, 13 for E-data, 21 idle */ +#define MAX_C_BITS 25 +/* 260 for FR/EFR, 256 for AMR, 264 for OM, 288 for E-data */ +#define MAX_D_BITS 288 +/* for all speech frames */ +#define MAX_T_BITS 4 +/* for OM */ +#define MAX_S_BITS 6 +/* for E-data */ +#define MAX_M_BITS 2 + +struct decoded_trau_frame { + uint8_t c_bits[MAX_C_BITS]; + uint8_t d_bits[MAX_D_BITS]; + uint8_t t_bits[MAX_T_BITS]; + uint8_t s_bits[MAX_S_BITS]; + uint8_t m_bits[MAX_M_BITS]; +}; + +#define TRAU_FT_FR_UP 0x02 /* 0 0 0 1 0 - 3.5.1.1.1 */ +#define TRAU_FT_FR_DOWN 0x1c /* 1 1 1 0 0 - 3.5.1.1.1 */ +#define TRAU_FT_EFR 0x1a /* 1 1 0 1 0 - 3.5.1.1.1 */ +#define TRAU_FT_AMR 0x06 /* 0 0 1 1 0 - 3.5.1.2 */ +#define TRAU_FT_OM_UP 0x07 /* 0 0 1 0 1 - 3.5.2 */ +#define TRAU_FT_OM_DOWN 0x1b /* 1 1 0 1 1 - 3.5.2 */ +#define TRAU_FT_DATA_UP 0x08 /* 0 1 0 0 0 - 3.5.3 */ +#define TRAU_FT_DATA_DOWN 0x16 /* 1 0 1 1 0 - 3.5.3 */ +#define TRAU_FT_D145_SYNC 0x14 /* 1 0 1 0 0 - 3.5.3 */ +#define TRAU_FT_EDATA 0x1f /* 1 1 1 1 1 - 3.5.4 */ +#define TRAU_FT_IDLE_UP 0x10 /* 1 0 0 0 0 - 3.5.5 */ +#define TRAU_FT_IDLE_DOWN 0x0e /* 0 1 1 1 0 - 3.5.5 */ + + +int decode_trau_frame(struct decoded_trau_frame *fr, const uint8_t *trau_bits); +int encode_trau_frame(uint8_t *trau_bits, const struct decoded_trau_frame *fr); +int trau_frame_up2down(struct decoded_trau_frame *fr); + + +#endif /* _TRAU_FRAME_H */ diff --git a/include/osmocom/gsm/Makefile.am b/include/osmocom/gsm/Makefile.am deleted file mode 100644 index f9d5e7c..0000000 --- a/include/osmocom/gsm/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS=abis diff --git a/include/osmocom/gsm/abis/Makefile.am b/include/osmocom/gsm/abis/Makefile.am deleted file mode 100644 index 8bdcc96..0000000 --- a/include/osmocom/gsm/abis/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -osmoabis_HEADERS = e1_input.h subchan_demux.h ipaccess.h trau_frame.h - -osmoabisdir = $(includedir)/osmocom/gsm/abis diff --git a/include/osmocom/gsm/abis/e1_input.h b/include/osmocom/gsm/abis/e1_input.h deleted file mode 100644 index 1911568..0000000 --- a/include/osmocom/gsm/abis/e1_input.h +++ /dev/null @@ -1,226 +0,0 @@ -#ifndef _E1_INPUT_H -#define _E1_INPUT_H - -#include -#include - -#include -//#include -#include -#include -#include -#include - -#define NUM_E1_TS 32 - -enum e1inp_sign_type { - E1INP_SIGN_NONE, - E1INP_SIGN_OML, - E1INP_SIGN_RSL, -}; -const char *e1inp_signtype_name(enum e1inp_sign_type tp); - -struct e1inp_ts; - -struct e1inp_sign_link { - /* list of signalling links */ - struct llist_head list; - - /* to which timeslot do we belong? */ - struct e1inp_ts *ts; - - 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; - - union { - struct { - uint8_t channel; - } misdn; - } driver; -}; - -enum e1inp_ts_type { - E1INP_TS_TYPE_NONE, - E1INP_TS_TYPE_SIGN, - E1INP_TS_TYPE_TRAU, -}; -const char *e1inp_tstype_name(enum e1inp_ts_type tp); - -/* A timeslot in the E1 interface */ -struct e1inp_ts { - enum e1inp_ts_type type; - int num; - - /* to which line do we belong ? */ - struct e1inp_line *line; - - union { - struct { - /* list of all signalling links on this TS */ - struct llist_head sign_links; - /* delay for the queue */ - int delay; - /* timer when to dequeue next frame */ - struct osmo_timer_list tx_timer; - } 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 fd; - } misdn; - struct { - /* ip.access driver has one fd for each ts */ - struct osmo_fd fd; - } ipaccess; - struct { - /* DAHDI driver has one fd for each ts */ - struct osmo_fd fd; - struct lapd_instance *lapd; - } dahdi; - } driver; -}; - -struct gsm_e1_subslot { - /* Number of E1 link */ - uint8_t e1_nr; - /* Number of E1 TS inside E1 link */ - uint8_t e1_ts; - /* Sub-slot within the E1 TS, 0xff if full TS */ - uint8_t e1_ts_ss; -}; - -enum e1inp_line_role { - E1INP_LINE_R_NONE, - E1INP_LINE_R_BSC, - E1INP_LINE_R_BTS, - E1INP_LINE_R_MAX -}; - -struct e1inp_driver { - struct llist_head list; - const char *name; - int (*want_write)(struct e1inp_ts *ts); - int (*line_update)(struct e1inp_line *line, enum e1inp_line_role role); - int default_delay; -}; - -struct e1inp_line { - struct llist_head list; - int refcnt; - - unsigned int num; - const char *name; - - /* array of timestlots */ - struct e1inp_ts ts[NUM_E1_TS]; - - int (*rx)(struct msgb *msg, struct e1inp_ts *ts); - int (*rx_err)(int error); - - struct e1inp_driver *driver; - void *driver_data; -}; - -/* SS_INPUT signals */ -enum signal_input { - S_INP_NONE, - S_INP_TEI_UP, - S_INP_TEI_DN, - S_INP_LINE_INIT, - S_INP_LINE_ALARM, - S_INP_LINE_NOALARM, -}; - -/* register a driver with the E1 core */ -int e1inp_driver_register(struct e1inp_driver *drv); - -/* fine a previously registered driver */ -struct e1inp_driver *e1inp_driver_find(const char *name); - -/* register a line with the E1 core */ -int e1inp_line_register(struct e1inp_line *line); - -/* get a line by its ID */ -struct e1inp_line *e1inp_line_get(uint8_t e1_nr); - -/* create a line in the E1 input core */ -struct e1inp_line *e1inp_line_create(uint8_t e1_nr, const char *driver_name, int (*rx)(struct msgb *msg, struct e1inp_ts *ts), int (*rx_err)(int error)); - -/* find a sign_link for given TEI and SAPI in a TS */ -struct e1inp_sign_link * -e1inp_lookup_sign_link(struct e1inp_ts *ts, uint8_t tei, - uint8_t sapi); - -/* create a new signalling link in a E1 timeslot */ -struct e1inp_sign_link * -e1inp_sign_link_create(struct e1inp_ts *ts, enum e1inp_sign_type type, - struct gsm_bts_trx *trx, uint8_t tei, - uint8_t sapi); - -/* configure and initialize one e1inp_ts */ -int e1inp_ts_config_sign(struct e1inp_ts *ts, struct e1inp_line *line); -int e1inp_ts_config_trau(struct e1inp_ts *ts, struct e1inp_line *line, - int (*subch_cb)(struct subch_demux *dmx, int ch, - uint8_t *data, int len, void *_priv)); - -/* 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); - -/* called by driver if it wants to transmit on a given TS */ -struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts, - struct e1inp_sign_link **sign_link); - -/* called by driver in case some kind of link state event */ -int e1inp_event(struct e1inp_ts *ts, int evt, uint8_t tei, uint8_t sapi); - -/* Write LAPD frames to the fd. */ -void e1_set_pcap_fd(int fd); - -/* called by TRAU muxer to obtain the destination mux entity */ -struct subch_mux *e1inp_get_mux(uint8_t e1_nr, uint8_t ts_nr); - -void e1inp_sign_link_destroy(struct e1inp_sign_link *link); -int e1inp_line_update(struct e1inp_line *line, enum e1inp_line_role role); - -struct gsm_network; -int ipaccess_setup(struct gsm_network *gsmnet); -int hsl_setup(struct gsm_network *gsmnet); - -extern struct llist_head e1inp_driver_list; -extern struct llist_head e1inp_line_list; - -int e1inp_vty_init(void); -void e1inp_init(void); - -int _abis_nm_sendmsg(struct msgb *msg, int to_trx_oml); - -/* XXX */ -struct input_signal_data { - int link_type; - uint8_t tei; - uint8_t sapi; - struct gsm_bts_trx *trx; - struct e1inp_line *line; -}; - -#endif /* _E1_INPUT_H */ diff --git a/include/osmocom/gsm/abis/ipaccess.h b/include/osmocom/gsm/abis/ipaccess.h deleted file mode 100644 index 2792572..0000000 --- a/include/osmocom/gsm/abis/ipaccess.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef _OSMO_PROTO_IPACCESS_H -#define _OSMO_PROTO_IPACCESS_H - -#include - -#define IPA_TCP_PORT_OML 3002 -#define IPA_TCP_PORT_RSL 3003 - -struct ipaccess_head { - uint16_t len; /* network byte order */ - uint8_t proto; - uint8_t data[0]; -} __attribute__ ((packed)); - -struct ipaccess_head_ext { - uint8_t proto; - uint8_t data[0]; -} __attribute__ ((packed)); - -enum ipaccess_proto { - IPAC_PROTO_RSL = 0x00, - IPAC_PROTO_IPACCESS = 0xfe, - IPAC_PROTO_SCCP = 0xfd, - IPAC_PROTO_OML = 0xff, - - - /* OpenBSC extensions */ - IPAC_PROTO_OSMO = 0xee, - IPAC_PROTO_MGCP_OLD = 0xfc, -}; - -enum ipaccess_proto_ext { - IPAC_PROTO_EXT_CTRL = 0x00, - IPAC_PROTO_EXT_MGCP = 0x01, - IPAC_PROTO_EXT_LAC = 0x02, -}; - -enum ipaccess_msgtype { - IPAC_MSGT_PING = 0x00, - IPAC_MSGT_PONG = 0x01, - IPAC_MSGT_ID_GET = 0x04, - IPAC_MSGT_ID_RESP = 0x05, - IPAC_MSGT_ID_ACK = 0x06, - - /* OpenBSC extension */ - IPAC_MSGT_SCCP_OLD = 0xff, -}; - -enum ipaccess_id_tags { - IPAC_IDTAG_SERNR = 0x00, - IPAC_IDTAG_UNITNAME = 0x01, - IPAC_IDTAG_LOCATION1 = 0x02, - IPAC_IDTAG_LOCATION2 = 0x03, - IPAC_IDTAG_EQUIPVERS = 0x04, - IPAC_IDTAG_SWVERSION = 0x05, - IPAC_IDTAG_IPADDR = 0x06, - IPAC_IDTAG_MACADDR = 0x07, - IPAC_IDTAG_UNIT = 0x08, -}; - -/* - * Firmware specific header - */ -struct sdp_firmware { - char magic[4]; - char more_magic[2]; - uint16_t more_more_magic; - uint32_t header_length; - uint32_t file_length; - char sw_part[20]; - char text1[64]; - char time[12]; - char date[14]; - char text2[10]; - char version[20]; - uint16_t table_offset; - /* stuff i don't know */ -} __attribute__((packed)); - -struct sdp_header_entry { - uint16_t something1; - char text1[64]; - char time[12]; - char date[14]; - char text2[10]; - char version[20]; - uint32_t length; - uint32_t addr1; - uint32_t addr2; - uint32_t start; -} __attribute__((packed)); - -#endif /* _OSMO_PROTO_IPACCESS_H */ diff --git a/include/osmocom/gsm/abis/subchan_demux.h b/include/osmocom/gsm/abis/subchan_demux.h deleted file mode 100644 index b71c856..0000000 --- a/include/osmocom/gsm/abis/subchan_demux.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _SUBCH_DEMUX_H -#define _SUBCH_DEMUX_H -/* A E1 sub-channel (de)multiplexer with TRAU frame sync */ - -/* (C) 2009 by Harald Welte - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -#include -#include - -#define NR_SUBCH 4 -#define TRAU_FRAME_SIZE 40 -#define TRAU_FRAME_BITS (TRAU_FRAME_SIZE*8) - -/***********************************************************************/ -/* DEMULTIPLEXER */ -/***********************************************************************/ - -struct demux_subch { - uint8_t out_bitbuf[TRAU_FRAME_BITS]; - uint16_t out_idx; /* next bit to be written in out_bitbuf */ - /* number of consecutive zeros that we have received (for sync) */ - unsigned int consecutive_zeros; - /* are we in TRAU frame sync or not? */ - unsigned int in_sync; -}; - -struct subch_demux { - /* bitmask of currently active subchannels */ - uint8_t chan_activ; - /* one demux_subch struct for every subchannel */ - struct demux_subch subch[NR_SUBCH]; - /* callback to be called once we have received a complete - * frame on a given subchannel */ - int (*out_cb)(struct subch_demux *dmx, int ch, uint8_t *data, int len, - void *); - /* user-provided data, transparently passed to out_cb() */ - void *data; -}; - -/* initialize one demultiplexer instance */ -int subch_demux_init(struct subch_demux *dmx); - -/* feed 'len' number of muxed bytes into the demultiplexer */ -int subch_demux_in(struct subch_demux *dmx, uint8_t *data, int len); - -/* activate decoding/processing for one subchannel */ -int subch_demux_activate(struct subch_demux *dmx, int subch); - -/* deactivate decoding/processing for one subchannel */ -int subch_demux_deactivate(struct subch_demux *dmx, int subch); - -/***********************************************************************/ -/* MULTIPLEXER */ -/***********************************************************************/ - -/* one element in the tx_queue of a muxer sub-channel */ -struct subch_txq_entry { - struct llist_head list; - - unsigned int bit_len; /* total number of bits in 'bits' */ - unsigned int next_bit; /* next bit to be transmitted */ - - uint8_t bits[0]; /* one bit per byte */ -}; - -struct mux_subch { - struct llist_head tx_queue; -}; - -/* structure representing one instance of the subchannel muxer */ -struct subch_mux { - struct mux_subch subch[NR_SUBCH]; -}; - -/* initialize a subchannel muxer instance */ -int subchan_mux_init(struct subch_mux *mx); - -/* request the output of 'len' multiplexed bytes */ -int subchan_mux_out(struct subch_mux *mx, uint8_t *data, int len); - -/* enqueue some data into one sub-channel of the muxer */ -int subchan_mux_enqueue(struct subch_mux *mx, int s_nr, const uint8_t *data, - int len); - -#endif /* _SUBCH_DEMUX_H */ diff --git a/include/osmocom/gsm/abis/trau_frame.h b/include/osmocom/gsm/abis/trau_frame.h deleted file mode 100644 index a76da33..0000000 --- a/include/osmocom/gsm/abis/trau_frame.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef _TRAU_FRAME_H -#define _TRAU_FRAME_H -/* TRAU frame handling according to GSM TS 08.60 */ - -/* (C) 2009 by Harald Welte - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -#include - -/* 21 for FR/EFR, 25 for AMR, 15 for OM, 15 for data, 13 for E-data, 21 idle */ -#define MAX_C_BITS 25 -/* 260 for FR/EFR, 256 for AMR, 264 for OM, 288 for E-data */ -#define MAX_D_BITS 288 -/* for all speech frames */ -#define MAX_T_BITS 4 -/* for OM */ -#define MAX_S_BITS 6 -/* for E-data */ -#define MAX_M_BITS 2 - -struct decoded_trau_frame { - uint8_t c_bits[MAX_C_BITS]; - uint8_t d_bits[MAX_D_BITS]; - uint8_t t_bits[MAX_T_BITS]; - uint8_t s_bits[MAX_S_BITS]; - uint8_t m_bits[MAX_M_BITS]; -}; - -#define TRAU_FT_FR_UP 0x02 /* 0 0 0 1 0 - 3.5.1.1.1 */ -#define TRAU_FT_FR_DOWN 0x1c /* 1 1 1 0 0 - 3.5.1.1.1 */ -#define TRAU_FT_EFR 0x1a /* 1 1 0 1 0 - 3.5.1.1.1 */ -#define TRAU_FT_AMR 0x06 /* 0 0 1 1 0 - 3.5.1.2 */ -#define TRAU_FT_OM_UP 0x07 /* 0 0 1 0 1 - 3.5.2 */ -#define TRAU_FT_OM_DOWN 0x1b /* 1 1 0 1 1 - 3.5.2 */ -#define TRAU_FT_DATA_UP 0x08 /* 0 1 0 0 0 - 3.5.3 */ -#define TRAU_FT_DATA_DOWN 0x16 /* 1 0 1 1 0 - 3.5.3 */ -#define TRAU_FT_D145_SYNC 0x14 /* 1 0 1 0 0 - 3.5.3 */ -#define TRAU_FT_EDATA 0x1f /* 1 1 1 1 1 - 3.5.4 */ -#define TRAU_FT_IDLE_UP 0x10 /* 1 0 0 0 0 - 3.5.5 */ -#define TRAU_FT_IDLE_DOWN 0x0e /* 0 1 1 1 0 - 3.5.5 */ - - -int decode_trau_frame(struct decoded_trau_frame *fr, const uint8_t *trau_bits); -int encode_trau_frame(uint8_t *trau_bits, const struct decoded_trau_frame *fr); -int trau_frame_up2down(struct decoded_trau_frame *fr); - - -#endif /* _TRAU_FRAME_H */ diff --git a/src/e1_input.c b/src/e1_input.c index d806766..8a4e1b9 100644 --- a/src/e1_input.c +++ b/src/e1_input.c @@ -44,20 +44,10 @@ #include #include #include -//#include -//#include -#include -//#include -//#include +#include #include -#include -//#include -//#include +#include #include -//#include -//#include - -//#include "../../bscconfig.h" #define NUM_E1_TS 32 diff --git a/src/input/dahdi.c b/src/input/dahdi.c index a431a3a..ba8ce02 100644 --- a/src/input/dahdi.c +++ b/src/input/dahdi.c @@ -22,8 +22,6 @@ * */ -//#include "../../../bscconfig.h" - #ifdef HAVE_DAHDI_USER_H #include diff --git a/src/input/hsl.c b/src/input/hsl.c index 211768c..689698c 100644 --- a/src/input/hsl.c +++ b/src/input/hsl.c @@ -47,19 +47,10 @@ #include #include #include -#include +#include #include #include #include -/*#include -#include -#include -#include -#include -#include -#include -#include -#include */ #include #define HSL_TCP_PORT 2500 diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c index 9894920..40d69b6 100644 --- a/src/input/ipaccess.c +++ b/src/input/ipaccess.c @@ -39,18 +39,9 @@ #include #include #include -#include -#include +#include +#include #include -/*#include -#include -#include -#include -#include -#include -#include -#include -#include */ #define PRIV_OML 1 #define PRIV_RSL 2 diff --git a/src/input/lapd.c b/src/input/lapd.c index 060edb6..c8b777c 100644 --- a/src/input/lapd.c +++ b/src/input/lapd.c @@ -43,7 +43,6 @@ #include #include #include -//#include #define SABM_INTERVAL 0, 300000 diff --git a/src/input/misdn.c b/src/input/misdn.c index 45d5e06..c97169a 100644 --- a/src/input/misdn.c +++ b/src/input/misdn.c @@ -44,7 +44,7 @@ #include #include #include -#include +#include #include /*#include #include diff --git a/src/subchan_demux.c b/src/subchan_demux.c index 6ff66bc..73efd31 100644 --- a/src/subchan_demux.c +++ b/src/subchan_demux.c @@ -26,11 +26,9 @@ #include #include -#include -#include -//#include +#include +#include #include -//#include void *tall_tqe_ctx; diff --git a/src/trau_frame.c b/src/trau_frame.c index b884bf3..bf0dbd4 100644 --- a/src/trau_frame.c +++ b/src/trau_frame.c @@ -25,10 +25,9 @@ #include #include -#include -#include +#include +#include #include -//#include static uint32_t get_bits(const uint8_t *bitbuf, int offset, int num) { diff --git a/tests/e1inp_ipa_bsc_test.c b/tests/e1inp_ipa_bsc_test.c index 8985e98..5ef725e 100644 --- a/tests/e1inp_ipa_bsc_test.c +++ b/tests/e1inp_ipa_bsc_test.c @@ -1,5 +1,5 @@ #include -#include +#include static int rx_cb(struct msgb *msg, struct e1inp_ts *ts) { -- cgit v1.2.3-55-g7522