Compare commits

..

18 Commits

Author SHA1 Message Date
Harald Welte
bab983764e Fix Makefile.am for builddir != srcdir 2011-03-05 15:20:18 +01:00
Harald Welte
366d215dbd Makefile: Add libmsc subdirectory to fix 'distcheck' 2011-03-05 15:18:25 +01:00
Harald Welte
f9cf961a66 OM2000: Add support for configuring the TF (Timing Function) 2011-03-05 14:36:47 +01:00
Harald Welte
a0ce349f0c OM2000: Add support for sending TX, RX and TS configuration requests
They can be triggered from the VTY
2011-03-05 14:13:14 +01:00
Harald Welte
c08e8be4ee fix path of bscconfig.h include file 2011-03-04 13:53:51 +01:00
Harald Welte
c1b2cfafd4 Fix build of bsc-nat test 2011-03-04 13:49:02 +01:00
Harald Welte
388cbbfc41 Some more SR1.0.1 related fixes
somehow all the 0x81 in OML became 0x80, and the 0x80 of RSL became
0x80.
2011-03-04 13:45:03 +01:00
Harald Welte
17a7634043 fix erroneous modification of DTX parameter introduced in previous HSL commit 2011-03-04 13:44:49 +01:00
Harald Welte
63467e8f28 Make sure not to feed BSSGP messages into RSL 2011-03-04 13:44:30 +01:00
Harald Welte
26d7907b02 Implement the HSL SR1.0.1 protocol
It seems HSL has fixed most of their obvious issues in the SR1.0.1
release.  However, this creates quite an incompatibility of the
protocol, and we have to adapt accordingly
2011-03-04 13:44:12 +01:00
Harald Welte
fd355a3c6f [HSL] initial support for the HSL 2.75G Femtocell
The HSL Femtocell seems to be a poor man implementation of the
ip.access Abis/IP protocol, but cutting corners wherever possible.

We try to workaround those corners wherever possible...
2011-03-04 13:44:07 +01:00
Harald Welte
89579b4317 prefix sub-directories containing libraries with 'lib'
... and make sure tests work again after restructuring
2011-03-04 13:23:09 +01:00
Harald Welte
5a6b68f416 really delete a3a8 code 2011-03-04 09:24:31 +01:00
Harald Welte
bd34be0a96 bsc_mgcp: use top_builddir instead of top_srcdir 2011-03-03 23:46:55 +01:00
Harald Welte
e5e36af8ae Move 'Gb' protocol stack into its own src/gb subdirectory 2011-03-03 23:45:28 +01:00
Harald Welte
a17faf8512 Rename bsc_nat -> osmo-bsc_nat and bsc_mgcp -> osmo-bsc_mgcp
This now enforces a unique structure: All of our main daemon
programs start with an "osmo-" prefix.
2011-03-03 23:36:48 +01:00
Harald Welte
31c00f7d6f re-structure the OpenBSC directory layout
The new structure divides the code into a number of libraries
for the BSC core functionality, MSC core functionality, Abis transport,
TRAU and other bits.

This doesn't introduce any functional code change but simply moves
around files and alters Makefile.am accordingly.

Next step would be to disentangle a lot of the inter-library
dependencies and make the individual bits of code more independent.
2011-03-03 23:29:05 +01:00
Harald Welte
9349d7ff7c remove a3a8 file that is not used 2011-03-03 23:25:31 +01:00
121 changed files with 1252 additions and 422 deletions

23
openbsc/.gitignore vendored
View File

@@ -6,10 +6,9 @@ Makefile.in
bscconfig.h
bscconfig.h.in
openbsc.pc
bsc_hack
bsc_msc_ip
src/osmo-nitb/osmo-nitb
bsc_mgcp
src/bsc/osmo-bsc
src/osmo-bsc/osmo-bsc
*.*~
*.sw?
@@ -31,15 +30,15 @@ stamp-h1
# apps and app data
hlr.sqlite3
bs11_config
ipaccess-config
ipaccess-find
ipaccess-firmware
ipaccess-proxy
isdnsync
bsc_nat
osmo-sgsn
osmo-gbproxy
src/utils/bs11_config
src/ipaccess/ipaccess-config
src/ipaccess/ipaccess-find
src/ipaccess/ipaccess-firmware
src/ipaccess/ipaccess-proxy
src/utils/isdnsync
src/nat/bsc_nat
src/gprs/osmo-sgsn
src/gprs/osmo-gbproxy
#tests
tests/channel/channel_test

View File

@@ -43,7 +43,7 @@ AC_ARG_ENABLE([osmo-bsc], [AS_HELP_STRING([--enable-osmo-bsc], [Build the Osmo B
])
AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes")
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.1.27)
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.1.30)
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.1.28)
dnl checks for header files
@@ -87,10 +87,20 @@ AC_OUTPUT(
include/openbsc/Makefile
include/Makefile
src/Makefile
src/libtrau/Makefile
src/libabis/Makefile
src/libbsc/Makefile
src/libmsc/Makefile
src/libmgcp/Makefile
src/libcommon/Makefile
src/osmo-nitb/Makefile
src/osmo-bsc/Makefile
src/osmo-bsc_nat/Makefile
src/osmo-bsc_mgcp/Makefile
src/ipaccess/Makefile
src/utils/Makefile
src/libgb/Makefile
src/gprs/Makefile
src/nat/Makefile
src/bsc/Makefile
tests/Makefile
tests/debug/Makefile
tests/gsm0408/Makefile

View File

@@ -22,6 +22,18 @@
*
*/
enum abis_om2k_mo_cls {
OM2K_MO_CLS_TRXC = 0x01,
OM2K_MO_CLS_TS = 0x03,
OM2K_MO_CLS_TF = 0x04,
OM2K_MO_CLS_IS = 0x05,
OM2K_MO_CLS_CON = 0x06,
OM2K_MO_CLS_DP = 0x07,
OM2K_MO_CLS_CF = 0x0a,
OM2K_MO_CLS_TX = 0x0b,
OM2K_MO_CLS_RX = 0x0c,
};
struct abis_om2k_mo {
uint8_t class;
uint8_t bts;
@@ -53,6 +65,10 @@ int abis_om2k_tx_op_info(struct gsm_bts *bts, const struct abis_om2k_mo *mo,
uint8_t operational);
int abis_om2k_tx_is_conf_req(struct gsm_bts *bts, struct om2k_is_conn_grp *cg,
unsigned int num_cg);
int abis_om2k_tx_tf_conf_req(struct gsm_bts *bts);
int abis_om2k_tx_rx_conf_req(struct gsm_bts_trx *trx);
int abis_om2k_tx_tx_conf_req(struct gsm_bts_trx *trx);
int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts);
int abis_om2k_vty_init(void);

View File

@@ -424,6 +424,7 @@ enum gsm_bts_type {
GSM_BTS_TYPE_BS11,
GSM_BTS_TYPE_NANOBTS,
GSM_BTS_TYPE_RBS2000,
GSM_BTS_TYPE_HSL_FEMTO,
};
struct vty;
@@ -600,6 +601,9 @@ struct gsm_bts {
struct llist_head conn_groups;
} con;
} rbs2000;
struct {
unsigned long serno;
} hsl;
};
/* Not entirely sure how ip.access specific this is */

View File

@@ -2,51 +2,12 @@ INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
# build current directory before building gprs
SUBDIRS = . ipaccess gprs
SUBDIRS = libcommon libabis libmgcp libbsc libmsc libtrau osmo-nitb osmo-bsc_mgcp utils ipaccess libgb gprs
# Conditional modules
if BUILD_NAT
SUBDIRS += nat
SUBDIRS += osmo-bsc_nat
endif
if BUILD_BSC
SUBDIRS += bsc
SUBDIRS += osmo-bsc
endif
bin_PROGRAMS = bsc_hack bs11_config isdnsync bsc_mgcp
noinst_LIBRARIES = libbsc.a libmsc.a libvty.a libmgcp.a
libbsc_a_SOURCES = abis_rsl.c abis_nm.c abis_om2000.c gsm_data.c gsm_04_08_utils.c \
chan_alloc.c debug.c socket.c abis_nm_vty.c abis_om2000_vty.c \
gsm_subscriber_base.c subchan_demux.c bsc_rll.c transaction.c \
trau_frame.c trau_mux.c paging.c \
e1_config.c e1_input.c e1_input_vty.c \
input/misdn.c input/ipaccess.c input/dahdi.c input/lapd.c \
handover_logic.c talloc_ctx.c system_information.c rest_octets.c \
bts_siemens_bs11.c bts_ipaccess_nanobts.c bts_ericsson_rbs2000.c mncc_upqueue.c \
bts_unknown.c bsc_version.c bsc_api.c bsc_vty.c meas_rep.c gsm_04_80.c
libmsc_a_SOURCES = gsm_subscriber.c db.c \
mncc.c mncc_builtin.c mncc_sock.c \
gsm_04_08.c gsm_04_11.c transaction.c \
token_auth.c rrlp.c ussd.c silent_call.c \
handover_decision.c auth.c \
osmo_msc.c rtp_proxy.c
libvty_a_SOURCES = common_vty.c
libmgcp_a_SOURCES = mgcp/mgcp_protocol.c mgcp/mgcp_network.c mgcp/mgcp_vty.c
bsc_hack_SOURCES = bsc_hack.c bsc_init.c bsc_vty.c vty_interface_layer3.c sms_queue.c
bsc_hack_LDADD = libmsc.a libbsc.a libvty.a libmsc.a \
-ldl -ldbi $(LIBCRYPT) $(LIBOSMOVTY_LIBS)
bs11_config_SOURCES = bs11_config.c abis_nm.c gsm_data.c debug.c \
rs232.c bts_siemens_bs11.c
isdnsync_SOURCES = isdnsync.c
bsc_mgcp_SOURCES = mgcp/mgcp_main.c debug.c
bsc_mgcp_LDADD = libvty.a libmgcp.a $(LIBOSMOVTY_LIBS)
EXTRA_DIST = input/lapd.h

View File

@@ -1,269 +0,0 @@
/* An implementation of the GSM A3A8 algorithm. (Specifically, COMP128.)
*/
/* Copyright 1998, Marc Briceno, Ian Goldberg, and David Wagner.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of the authors nor the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Coded in C merely because C is a much more precise, concise form of
* expression for these purposes. See Judge Patel if you have any problems
* with this...
* Of course, it's only authentication, so it should be exportable for the
* usual boring reasons.
*/
typedef unsigned char Byte;
#include <stdio.h>
/* #define TEST */
/*
* rand[0..15]: the challenge from the base station
* key[0..15]: the SIM's A3/A8 long-term key Ki
* simoutput[0..11]: what you'd get back if you fed rand and key to a real
* SIM.
*
* The GSM spec states that simoutput[0..3] is SRES,
* and simoutput[4..11] is Kc (the A5 session key).
* (See GSM 11.11, Section 8.16. See also the leaked document
* referenced below.)
* Note that Kc is bits 74..127 of the COMP128 output, followed by 10
* zeros.
* In other words, A5 is keyed with only 54 bits of entropy. This
* represents a deliberate weakening of the key used for voice privacy
* by a factor of over 1000.
*
* Verified with a Pacific Bell Schlumberger SIM. Your mileage may vary.
*
* Marc Briceno <marc@scard.org>, Ian Goldberg <iang@cs.berkeley.edu>,
* and David Wagner <daw@cs.berkeley.edu>
*/
void A3A8(/* in */ Byte rand[16], /* in */ Byte key[16],
/* out */ Byte simoutput[12]);
/* The compression tables. */
static const Byte table_0[512] = {
102,177,186,162, 2,156,112, 75, 55, 25, 8, 12,251,193,246,188,
109,213,151, 53, 42, 79,191,115,233,242,164,223,209,148,108,161,
252, 37,244, 47, 64,211, 6,237,185,160,139,113, 76,138, 59, 70,
67, 26, 13,157, 63,179,221, 30,214, 36,166, 69,152,124,207,116,
247,194, 41, 84, 71, 1, 49, 14, 95, 35,169, 21, 96, 78,215,225,
182,243, 28, 92,201,118, 4, 74,248,128, 17, 11,146,132,245, 48,
149, 90,120, 39, 87,230,106,232,175, 19,126,190,202,141,137,176,
250, 27,101, 40,219,227, 58, 20, 51,178, 98,216,140, 22, 32,121,
61,103,203, 72, 29,110, 85,212,180,204,150,183, 15, 66,172,196,
56,197,158, 0,100, 45,153, 7,144,222,163,167, 60,135,210,231,
174,165, 38,249,224, 34,220,229,217,208,241, 68,206,189,125,255,
239, 54,168, 89,123,122, 73,145,117,234,143, 99,129,200,192, 82,
104,170,136,235, 93, 81,205,173,236, 94,105, 52, 46,228,198, 5,
57,254, 97,155,142,133,199,171,187, 50, 65,181,127,107,147,226,
184,218,131, 33, 77, 86, 31, 44, 88, 62,238, 18, 24, 43,154, 23,
80,159,134,111, 9,114, 3, 91, 16,130, 83, 10,195,240,253,119,
177,102,162,186,156, 2, 75,112, 25, 55, 12, 8,193,251,188,246,
213,109, 53,151, 79, 42,115,191,242,233,223,164,148,209,161,108,
37,252, 47,244,211, 64,237, 6,160,185,113,139,138, 76, 70, 59,
26, 67,157, 13,179, 63, 30,221, 36,214, 69,166,124,152,116,207,
194,247, 84, 41, 1, 71, 14, 49, 35, 95, 21,169, 78, 96,225,215,
243,182, 92, 28,118,201, 74, 4,128,248, 11, 17,132,146, 48,245,
90,149, 39,120,230, 87,232,106, 19,175,190,126,141,202,176,137,
27,250, 40,101,227,219, 20, 58,178, 51,216, 98, 22,140,121, 32,
103, 61, 72,203,110, 29,212, 85,204,180,183,150, 66, 15,196,172,
197, 56, 0,158, 45,100, 7,153,222,144,167,163,135, 60,231,210,
165,174,249, 38, 34,224,229,220,208,217, 68,241,189,206,255,125,
54,239, 89,168,122,123,145, 73,234,117, 99,143,200,129, 82,192,
170,104,235,136, 81, 93,173,205, 94,236, 52,105,228, 46, 5,198,
254, 57,155, 97,133,142,171,199, 50,187,181, 65,107,127,226,147,
218,184, 33,131, 86, 77, 44, 31, 62, 88, 18,238, 43, 24, 23,154,
159, 80,111,134,114, 9, 91, 3,130, 16, 10, 83,240,195,119,253
}, table_1[256] = {
19, 11, 80,114, 43, 1, 69, 94, 39, 18,127,117, 97, 3, 85, 43,
27,124, 70, 83, 47, 71, 63, 10, 47, 89, 79, 4, 14, 59, 11, 5,
35,107,103, 68, 21, 86, 36, 91, 85,126, 32, 50,109, 94,120, 6,
53, 79, 28, 45, 99, 95, 41, 34, 88, 68, 93, 55,110,125,105, 20,
90, 80, 76, 96, 23, 60, 89, 64,121, 56, 14, 74,101, 8, 19, 78,
76, 66,104, 46,111, 50, 32, 3, 39, 0, 58, 25, 92, 22, 18, 51,
57, 65,119,116, 22,109, 7, 86, 59, 93, 62,110, 78, 99, 77, 67,
12,113, 87, 98,102, 5, 88, 33, 38, 56, 23, 8, 75, 45, 13, 75,
95, 63, 28, 49,123,120, 20,112, 44, 30, 15, 98,106, 2,103, 29,
82,107, 42,124, 24, 30, 41, 16,108,100,117, 40, 73, 40, 7,114,
82,115, 36,112, 12,102,100, 84, 92, 48, 72, 97, 9, 54, 55, 74,
113,123, 17, 26, 53, 58, 4, 9, 69,122, 21,118, 42, 60, 27, 73,
118,125, 34, 15, 65,115, 84, 64, 62, 81, 70, 1, 24,111,121, 83,
104, 81, 49,127, 48,105, 31, 10, 6, 91, 87, 37, 16, 54,116,126,
31, 38, 13, 0, 72,106, 77, 61, 26, 67, 46, 29, 96, 37, 61, 52,
101, 17, 44,108, 71, 52, 66, 57, 33, 51, 25, 90, 2,119,122, 35
}, table_2[128] = {
52, 50, 44, 6, 21, 49, 41, 59, 39, 51, 25, 32, 51, 47, 52, 43,
37, 4, 40, 34, 61, 12, 28, 4, 58, 23, 8, 15, 12, 22, 9, 18,
55, 10, 33, 35, 50, 1, 43, 3, 57, 13, 62, 14, 7, 42, 44, 59,
62, 57, 27, 6, 8, 31, 26, 54, 41, 22, 45, 20, 39, 3, 16, 56,
48, 2, 21, 28, 36, 42, 60, 33, 34, 18, 0, 11, 24, 10, 17, 61,
29, 14, 45, 26, 55, 46, 11, 17, 54, 46, 9, 24, 30, 60, 32, 0,
20, 38, 2, 30, 58, 35, 1, 16, 56, 40, 23, 48, 13, 19, 19, 27,
31, 53, 47, 38, 63, 15, 49, 5, 37, 53, 25, 36, 63, 29, 5, 7
}, table_3[64] = {
1, 5, 29, 6, 25, 1, 18, 23, 17, 19, 0, 9, 24, 25, 6, 31,
28, 20, 24, 30, 4, 27, 3, 13, 15, 16, 14, 18, 4, 3, 8, 9,
20, 0, 12, 26, 21, 8, 28, 2, 29, 2, 15, 7, 11, 22, 14, 10,
17, 21, 12, 30, 26, 27, 16, 31, 11, 7, 13, 23, 10, 5, 22, 19
}, table_4[32] = {
15, 12, 10, 4, 1, 14, 11, 7, 5, 0, 14, 7, 1, 2, 13, 8,
10, 3, 4, 9, 6, 0, 3, 2, 5, 6, 8, 9, 11, 13, 15, 12
}, *table[5] = { table_0, table_1, table_2, table_3, table_4 };
/*
* This code derived from a leaked document from the GSM standards.
* Some missing pieces were filled in by reverse-engineering a working SIM.
* We have verified that this is the correct COMP128 algorithm.
*
* The first page of the document identifies it as
* _Technical Information: GSM System Security Study_.
* 10-1617-01, 10th June 1988.
* The bottom of the title page is marked
* Racal Research Ltd.
* Worton Drive, Worton Grange Industrial Estate,
* Reading, Berks. RG2 0SB, England.
* Telephone: Reading (0734) 868601 Telex: 847152
* The relevant bits are in Part I, Section 20 (pages 66--67). Enjoy!
*
* Note: There are three typos in the spec (discovered by
* reverse-engineering).
* First, "z = (2 * x[n] + x[n]) mod 2^(9-j)" should clearly read
* "z = (2 * x[m] + x[n]) mod 2^(9-j)".
* Second, the "k" loop in the "Form bits from bytes" section is severely
* botched: the k index should run only from 0 to 3, and clearly the range
* on "the (8-k)th bit of byte j" is also off (should be 0..7, not 1..8,
* to be consistent with the subsequent section).
* Third, SRES is taken from the first 8 nibbles of x[], not the last 8 as
* claimed in the document. (And the document doesn't specify how Kc is
* derived, but that was also easily discovered with reverse engineering.)
* All of these typos have been corrected in the following code.
*/
void A3A8(/* in */ Byte rand[16], /* in */ Byte key[16],
/* out */ Byte simoutput[12])
{
Byte x[32], bit[128];
int i, j, k, l, m, n, y, z, next_bit;
/* ( Load RAND into last 16 bytes of input ) */
for (i=16; i<32; i++)
x[i] = rand[i-16];
/* ( Loop eight times ) */
for (i=1; i<9; i++) {
/* ( Load key into first 16 bytes of input ) */
for (j=0; j<16; j++)
x[j] = key[j];
/* ( Perform substitutions ) */
for (j=0; j<5; j++)
for (k=0; k<(1<<j); k++)
for (l=0; l<(1<<(4-j)); l++) {
m = l + k*(1<<(5-j));
n = m + (1<<(4-j));
y = (x[m]+2*x[n]) % (1<<(9-j));
z = (2*x[m]+x[n]) % (1<<(9-j));
x[m] = table[j][y];
x[n] = table[j][z];
}
/* ( Form bits from bytes ) */
for (j=0; j<32; j++)
for (k=0; k<4; k++)
bit[4*j+k] = (x[j]>>(3-k)) & 1;
/* ( Permutation but not on the last loop ) */
if (i < 8)
for (j=0; j<16; j++) {
x[j+16] = 0;
for (k=0; k<8; k++) {
next_bit = ((8*j + k)*17) % 128;
x[j+16] |= bit[next_bit] << (7-k);
}
}
}
/*
* ( At this stage the vector x[] consists of 32 nibbles.
* The first 8 of these are taken as the output SRES. )
*/
/* The remainder of the code is not given explicitly in the
* standard, but was derived by reverse-engineering.
*/
for (i=0; i<4; i++)
simoutput[i] = (x[2*i]<<4) | x[2*i+1];
for (i=0; i<6; i++)
simoutput[4+i] = (x[2*i+18]<<6) | (x[2*i+18+1]<<2)
| (x[2*i+18+2]>>2);
simoutput[4+6] = (x[2*6+18]<<6) | (x[2*6+18+1]<<2);
simoutput[4+7] = 0;
}
#ifdef TEST
int hextoint(char x)
{
x = toupper(x);
if (x >= 'A' && x <= 'F')
return x-'A'+10;
else if (x >= '0' && x <= '9')
return x-'0';
fprintf(stderr, "bad input.\n");
exit(1);
}
int main(int argc, char **argv)
{
Byte key[16], rand[16], simoutput[12];
int i;
if (argc != 3 || strlen(argv[1]) != 34 || strlen(argv[2]) != 34
|| strncmp(argv[1], "0x", 2) != 0
|| strncmp(argv[2], "0x", 2) != 0) {
fprintf(stderr, "Usage: %s 0x<key> 0x<rand>\n", argv[0]);
exit(1);
}
for (i=0; i<16; i++)
key[i] = (hextoint(argv[1][2*i+2])<<4)
| hextoint(argv[1][2*i+3]);
for (i=0; i<16; i++)
rand[i] = (hextoint(argv[2][2*i+2])<<4)
| hextoint(argv[2][2*i+3]);
A3A8(rand, key, simoutput);
printf("simoutput: ");
for (i=0; i<12; i++)
printf("%02X", simoutput[i]);
printf("\n");
return 0;
}
#endif

View File

@@ -2,7 +2,6 @@ INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall -fno-strict-aliasing $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(LIBOSMOVTY_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libgb.a
noinst_HEADERS = gprs_sndcp.h
if HAVE_LIBGTP
@@ -11,16 +10,13 @@ else
bin_PROGRAMS = osmo-gbproxy
endif
libgb_a_SOURCES = gprs_ns.c gprs_ns_frgre.c gprs_ns_vty.c \
gprs_bssgp.c gprs_bssgp_util.c gprs_bssgp_vty.c \
gprs_llc.c gprs_llc_vty.c crc24.c
osmo_gbproxy_SOURCES = gb_proxy.c gb_proxy_main.c gb_proxy_vty.c \
$(top_srcdir)/src/socket.c $(top_srcdir)/src/debug.c
osmo_gbproxy_LDADD = libgb.a $(top_builddir)/src/libvty.a
osmo_gbproxy_SOURCES = gb_proxy.c gb_proxy_main.c gb_proxy_vty.c
osmo_gbproxy_LDADD = $(top_builddir)/src/libgb/libgb.a \
$(top_builddir)/src/libcommon/libcommon.a
osmo_sgsn_SOURCES = gprs_gmm.c gprs_sgsn.c gprs_sndcp.c gprs_sndcp_vty.c \
sgsn_main.c sgsn_vty.c sgsn_libgtp.c \
$(top_srcdir)/src/socket.c $(top_srcdir)/src/debug.c
osmo_sgsn_LDADD = libgb.a $(top_builddir)/src/libvty.a -lgtp
gprs_llc.c gprs_llc_vty.c crc24.c
osmo_sgsn_LDADD = $(top_builddir)/src/libgb/libgb.a \
$(top_builddir)/src/libcommon/libcommon.a \
-lgtp

View File

@@ -7,7 +7,15 @@ bin_PROGRAMS = ipaccess-find ipaccess-config ipaccess-proxy
ipaccess_find_SOURCES = ipaccess-find.c
ipaccess_config_SOURCES = ipaccess-config.c ipaccess-firmware.c network_listen.c
ipaccess_config_LDADD = $(top_builddir)/src/libbsc.a $(top_builddir)/src/libmsc.a \
$(top_builddir)/src/libbsc.a $(top_builddir)/src/libvty.a -ldl -ldbi $(LIBCRYPT)
ipaccess_proxy_SOURCES = ipaccess-proxy.c ../debug.c
# FIXME: resolve the bogus dependencies patched around here:
ipaccess_config_LDADD = $(top_builddir)/src/libbsc/libbsc.a \
$(top_builddir)/src/libmsc/libmsc.a \
$(top_builddir)/src/libabis/libabis.a \
$(top_builddir)/src/libbsc/libbsc.a \
$(top_builddir)/src/libtrau/libtrau.a \
$(top_builddir)/src/libcommon/libcommon.a \
-ldl -ldbi $(LIBCRYPT)
ipaccess_proxy_SOURCES = ipaccess-proxy.c
ipaccess_proxy_LDADD = $(top_builddir)/src/libcommon/libcommon.a

View File

@@ -0,0 +1,14 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libabis.a
libabis_a_SOURCES = e1_input.c e1_input_vty.c \
input/misdn.c \
input/ipaccess.c \
input/hsl.c \
input/dahdi.c \
input/lapd.c
EXTRA_DIST = input/lapd.h

View File

@@ -54,7 +54,7 @@
#include <openbsc/signal.h>
#include <openbsc/misdn.h>
#include "../bscconfig.h"
#include "../../bscconfig.h"
#define NUM_E1_TS 32

View File

@@ -36,7 +36,7 @@
#include <openbsc/vty.h>
#include <openbsc/debug.h>
#include "../bscconfig.h"
#include "../../bscconfig.h"
#define E1_DRIVER_NAMES "(misdn|dahdi)"
#define E1_DRIVER_HELP "mISDN supported E1 Card\n" \

View File

@@ -22,7 +22,7 @@
*
*/
#include "../../bscconfig.h"
#include "../../../bscconfig.h"
#ifdef HAVE_DAHDI_USER_H

View File

@@ -0,0 +1,460 @@
/* OpenBSC Abis input driver for HSL Femto */
/* (C) 2011 by Harald Welte <laforge@gnumonks.org>
* (C) 2011 by On-Waves
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
/* HSL uses a much more primitive/simplified version of the IPA multiplex.
*
* They have taken out the nice parts like the ID_GET / ID_RESP for resolving
* the UNIT ID, as well as the keepalive ping/pong messages. Furthermore, the
* Stream Identifiers are fixed on the BTS side (RSL always 0, OML always 0xff)
* and both OML+RSL share a single TCP connection.
*
* Other oddities include the encapsulation of BSSGP messages in the L3_INFO IE
* of RSL
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <osmocore/select.h>
#include <osmocore/tlv.h>
#include <osmocore/msgb.h>
#include <openbsc/debug.h>
#include <openbsc/gsm_data.h>
#include <openbsc/abis_nm.h>
#include <openbsc/abis_rsl.h>
#include <openbsc/subchan_demux.h>
#include <openbsc/e1_input.h>
#include <openbsc/ipaccess.h>
#include <openbsc/socket.h>
#include <openbsc/signal.h>
#include <osmocore/talloc.h>
#define HSL_TCP_PORT 2500
#define HSL_PROTO_DEBUG 0xdd
#define PRIV_OML 1
#define PRIV_RSL 2
/* data structure for one E1 interface with A-bis */
struct hsl_e1_handle {
struct bsc_fd listen_fd;
struct gsm_network *gsmnet;
};
static struct hsl_e1_handle *e1h;
#define TS1_ALLOC_SIZE 900
#define OML_UP 0x0001
#define RSL_UP 0x0002
int hsl_drop_oml(struct gsm_bts *bts)
{
struct gsm_bts_trx *trx;
struct e1inp_ts *ts;
struct e1inp_line *line;
struct bsc_fd *bfd;
if (!bts || !bts->oml_link)
return -1;
/* send OML down */
ts = bts->oml_link->ts;
line = ts->line;
e1inp_event(ts, S_INP_TEI_DN, bts->oml_link->tei, bts->oml_link->sapi);
bfd = &ts->driver.ipaccess.fd;
bsc_unregister_fd(bfd);
close(bfd->fd);
bfd->fd = -1;
/* clean up OML and RSL */
e1inp_sign_link_destroy(bts->oml_link);
bts->oml_link = NULL;
e1inp_sign_link_destroy(bts->c0->rsl_link);
bts->c0->rsl_link = NULL;
bts->ip_access.flags = 0;
/* kill the E1 line now... as we have no one left to use it */
talloc_free(line);
return -1;
}
static int hsl_drop_ts_fd(struct e1inp_ts *ts, struct bsc_fd *bfd)
{
struct e1inp_sign_link *link, *link2;
int bts_nr = -1;
llist_for_each_entry_safe(link, link2, &ts->sign.sign_links, list) {
bts_nr = link->trx->bts->bts_nr;
e1inp_sign_link_destroy(link);
}
bsc_unregister_fd(bfd);
close(bfd->fd);
bfd->fd = -1;
talloc_free(ts->line);
return bts_nr;
}
struct gsm_bts *find_bts_by_serno(struct gsm_network *net, unsigned long serno)
{
struct gsm_bts *bts;
llist_for_each_entry(bts, &net->bts_list, list) {
if (bts->type != GSM_BTS_TYPE_HSL_FEMTO)
continue;
if (serno == bts->hsl.serno)
return bts;
}
return NULL;
}
static int process_hsl_rsl(struct msgb *msg, struct e1inp_line *line)
{
char serno_buf[16];
uint8_t serno_len;
unsigned long serno;
struct gsm_bts *bts;
switch (msg->l2h[1]) {
case 0x80:
/*, contains Serial Number + SW version */
if (msg->l2h[2] != 0xc0)
break;
serno_len = msg->l2h[3];
if (serno_len > sizeof(serno_buf)-1)
serno_len = sizeof(serno_buf)-1;
memcpy(serno_buf, msg->l2h+4, serno_len);
serno_buf[serno_len] = '\0';
serno = strtoul(serno_buf, NULL, 10);
bts = find_bts_by_serno(e1h->gsmnet, serno);
if (!bts) {
LOGP(DINP, LOGL_ERROR, "Unable to find BTS config for "
"serial number %lu(%s)\n", serno, serno_buf);
return -EIO;
}
DEBUGP(DINP, "Identified HSL BTS Serial Number %lu\n", serno);
/* we shouldn't hardcode it, but HSL femto also hardcodes it... */
bts->oml_tei = 255;
bts->c0->rsl_tei = 0;
bts->oml_link = e1inp_sign_link_create(&line->ts[PRIV_OML - 1],
E1INP_SIGN_OML, bts->c0,
bts->oml_tei, 0);
bts->c0->rsl_link = e1inp_sign_link_create(&line->ts[PRIV_OML - 1],
E1INP_SIGN_RSL, bts->c0,
bts->c0->rsl_tei, 0);
e1inp_event(&line->ts[PRIV_OML-1], S_INP_TEI_UP, 255, 0);
e1inp_event(&line->ts[PRIV_OML-1], S_INP_TEI_UP, 0, 0);
bts->ip_access.flags |= OML_UP;
bts->ip_access.flags |= (RSL_UP << 0);
msgb_free(msg);
return 1; /* == we have taken over the msg */
case 0x82:
/* FIXME: do something with BSSGP, i.e. forward it over
* NSIP to OsmoSGSN */
msgb_free(msg);
return 1;
}
return 0;
}
static int handle_ts1_read(struct bsc_fd *bfd)
{
struct e1inp_line *line = bfd->data;
unsigned int ts_nr = bfd->priv_nr;
struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];
struct e1inp_sign_link *link;
struct msgb *msg;
struct ipaccess_head *hh;
int ret = 0, error;
msg = ipaccess_read_msg(bfd, &error);
if (!msg) {
if (error == 0) {
int ret = hsl_drop_ts_fd(e1i_ts, bfd);
if (ret >= 0)
LOGP(DINP, LOGL_NOTICE, "BTS %u disappeared, dead socket\n",
ret);
else
LOGP(DINP, LOGL_NOTICE, "unknown BTS disappeared, dead socket\n");
}
return error;
}
DEBUGP(DMI, "RX %u: %s\n", ts_nr, hexdump(msgb_l2(msg), msgb_l2len(msg)));
hh = (struct ipaccess_head *) msg->data;
if (hh->proto == HSL_PROTO_DEBUG) {
LOGP(DINP, LOGL_NOTICE, "HSL debug: %s\n", msg->data + sizeof(*hh));
msgb_free(msg);
return ret;
}
/* HSL proprietary RSL extension */
if (hh->proto == 0 && (msg->l2h[0] == 0x81 || msg->l2h[0] == 0x80)) {
ret = process_hsl_rsl(msg, line);
if (ret < 0) {
/* FIXME: close connection */
hsl_drop_ts_fd(e1i_ts, bfd);
return ret;
} else if (ret == 1)
return 0;
/* else: continue... */
}
#ifdef HSL_SR_1_0
/* HSL for whatever reason chose to use 0x81 instead of 0x80 for FOM */
if (hh->proto == 255 && msg->l2h[0] == (ABIS_OM_MDISC_FOM | 0x01))
msg->l2h[0] = ABIS_OM_MDISC_FOM;
#endif
link = e1inp_lookup_sign_link(e1i_ts, hh->proto, 0);
if (!link) {
LOGP(DINP, LOGL_ERROR, "no matching signalling link for "
"hh->proto=0x%02x\n", hh->proto);
msgb_free(msg);
return -EIO;
}
msg->trx = link->trx;
switch (link->type) {
case E1INP_SIGN_RSL:
if (!(msg->trx->bts->ip_access.flags & (RSL_UP << msg->trx->nr))) {
e1inp_event(e1i_ts, S_INP_TEI_UP, link->tei, link->sapi);
msg->trx->bts->ip_access.flags |= (RSL_UP << msg->trx->nr);
}
ret = abis_rsl_rcvmsg(msg);
break;
case E1INP_SIGN_OML:
if (!(msg->trx->bts->ip_access.flags & OML_UP)) {
e1inp_event(e1i_ts, S_INP_TEI_UP, link->tei, link->sapi);
msg->trx->bts->ip_access.flags |= OML_UP;
}
ret = abis_nm_rcvmsg(msg);
break;
default:
LOGP(DINP, LOGL_NOTICE, "Unknown HSL protocol class 0x%02x\n", hh->proto);
msgb_free(msg);
break;
}
return ret;
}
static int ts_want_write(struct e1inp_ts *e1i_ts)
{
e1i_ts->driver.ipaccess.fd.when |= BSC_FD_WRITE;
return 0;
}
static void timeout_ts1_write(void *data)
{
struct e1inp_ts *e1i_ts = (struct e1inp_ts *)data;
/* trigger write of ts1, due to tx delay timer */
ts_want_write(e1i_ts);
}
static int handle_ts1_write(struct bsc_fd *bfd)
{
struct e1inp_line *line = bfd->data;
unsigned int ts_nr = bfd->priv_nr;
struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];
struct e1inp_sign_link *sign_link;
struct msgb *msg;
u_int8_t proto;
int ret;
bfd->when &= ~BSC_FD_WRITE;
/* get the next msg for this timeslot */
msg = e1inp_tx_ts(e1i_ts, &sign_link);
if (!msg) {
/* no message after tx delay timer */
return 0;
}
switch (sign_link->type) {
case E1INP_SIGN_OML:
proto = IPAC_PROTO_OML;
#ifdef HSL_SR_1_0
/* HSL uses 0x81 for FOM for some reason */
if (msg->data[0] == ABIS_OM_MDISC_FOM)
msg->data[0] = ABIS_OM_MDISC_FOM | 0x01;
#endif
break;
case E1INP_SIGN_RSL:
proto = IPAC_PROTO_RSL;
break;
default:
msgb_free(msg);
bfd->when |= BSC_FD_WRITE; /* come back for more msg */
return -EINVAL;
}
msg->l2h = msg->data;
ipaccess_prepend_header(msg, sign_link->tei);
DEBUGP(DMI, "TX %u: %s\n", ts_nr, hexdump(msg->l2h, msgb_l2len(msg)));
ret = send(bfd->fd, msg->data, msg->len, 0);
msgb_free(msg);
/* set tx delay timer for next event */
e1i_ts->sign.tx_timer.cb = timeout_ts1_write;
e1i_ts->sign.tx_timer.data = e1i_ts;
/* Reducing this might break the nanoBTS 900 init. */
bsc_schedule_timer(&e1i_ts->sign.tx_timer, 0, e1i_ts->sign.delay);
return ret;
}
/* callback from select.c in case one of the fd's can be read/written */
static int hsl_fd_cb(struct bsc_fd *bfd, unsigned int what)
{
struct e1inp_line *line = bfd->data;
unsigned int ts_nr = bfd->priv_nr;
unsigned int idx = ts_nr-1;
struct e1inp_ts *e1i_ts;
int rc = 0;
/* In case of early RSL we might not yet have a line */
if (line)
e1i_ts = &line->ts[idx];
if (!line || e1i_ts->type == E1INP_TS_TYPE_SIGN) {
if (what & BSC_FD_READ)
rc = handle_ts1_read(bfd);
if (what & BSC_FD_WRITE)
rc = handle_ts1_write(bfd);
} else
LOGP(DINP, LOGL_ERROR, "unknown E1 TS type %u\n", e1i_ts->type);
return rc;
}
struct e1inp_driver hsl_driver = {
.name = "HSL",
.want_write = ts_want_write,
.default_delay = 0,
};
/* callback of the OML listening filedescriptor */
static int listen_fd_cb(struct bsc_fd *listen_bfd, unsigned int what)
{
int ret;
int idx = 0;
int i;
struct e1inp_line *line;
struct e1inp_ts *e1i_ts;
struct bsc_fd *bfd;
struct sockaddr_in sa;
socklen_t sa_len = sizeof(sa);
if (!(what & BSC_FD_READ))
return 0;
ret = accept(listen_bfd->fd, (struct sockaddr *) &sa, &sa_len);
if (ret < 0) {
perror("accept");
return ret;
}
LOGP(DINP, LOGL_NOTICE, "accept()ed new HSL link from %s\n",
inet_ntoa(sa.sin_addr));
line = talloc_zero(tall_bsc_ctx, struct e1inp_line);
if (!line) {
close(ret);
return -ENOMEM;
}
line->driver = &hsl_driver;
//line->driver_data = e1h;
/* create virrtual E1 timeslots for signalling */
e1inp_ts_config(&line->ts[1-1], line, E1INP_TS_TYPE_SIGN);
/* initialize the fds */
for (i = 0; i < ARRAY_SIZE(line->ts); ++i)
line->ts[i].driver.ipaccess.fd.fd = -1;
e1i_ts = &line->ts[idx];
bfd = &e1i_ts->driver.ipaccess.fd;
bfd->fd = ret;
bfd->data = line;
bfd->priv_nr = PRIV_OML;
bfd->cb = hsl_fd_cb;
bfd->when = BSC_FD_READ;
ret = bsc_register_fd(bfd);
if (ret < 0) {
LOGP(DINP, LOGL_ERROR, "could not register FD\n");
close(bfd->fd);
talloc_free(line);
return ret;
}
return ret;
//return e1inp_line_register(line);
}
int hsl_setup(struct gsm_network *gsmnet)
{
int ret;
/* register the driver with the core */
/* FIXME: do this in the plugin initializer function */
ret = e1inp_driver_register(&hsl_driver);
if (ret)
return ret;
e1h = talloc_zero(tall_bsc_ctx, struct hsl_e1_handle);
if (!e1h)
return -ENOMEM;
e1h->gsmnet = gsmnet;
/* Listen for connections */
ret = make_sock(&e1h->listen_fd, IPPROTO_TCP, 0, HSL_TCP_PORT,
listen_fd_cb);
if (ret < 0)
return ret;
return 0;
}

View File

@@ -0,0 +1,25 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libbsc.a
libbsc_a_SOURCES = abis_nm.c abis_nm_vty.c \
abis_om2000.c abis_om2000_vty.c \
abis_rsl.c bsc_rll.c \
paging.c \
bts_ericsson_rbs2000.c \
bts_ipaccess_nanobts.c \
bts_siemens_bs11.c \
bts_hsl_femtocell.c \
bts_unknown.c \
chan_alloc.c \
gsm_subscriber_base.c \
handover_decision.c handover_logic.c meas_rep.c \
rest_octets.c system_information.c \
e1_config.c \
transaction.c \
bsc_api.c bsc_msc.c bsc_vty.c \
gsm_04_08_utils.c \
bsc_init.c

View File

@@ -1080,6 +1080,12 @@ static int abis_nm_rcvmsg_fom(struct msgb *mb)
case NM_MT_IPACC_RESTART_NACK:
dispatch_signal(SS_NM, S_NM_IPACC_RESTART_NACK, NULL);
break;
case NM_MT_SET_BTS_ATTR_ACK:
/* The HSL wants an OPSTART _after_ the SI has been set */
if (mb->trx->bts->type == GSM_BTS_TYPE_HSL_FEMTO) {
abis_nm_opstart(mb->trx->bts, NM_OC_BTS, 255, 255, 255);
}
break;
}
abis_nm_queue_send_next(mb->trx->bts);

View File

@@ -117,7 +117,12 @@ enum abis_om2k_msgtype {
OM2K_MSGT_RESET_CMD = 0x0078,
OM2K_MSGT_RESET_COMPL = 0x007a,
OM2K_MSGT_RESET_REJ = 0x007b,
OM2K_MSGT_RX_CONF_REQ = 0x007c,
OM2K_MSGT_RX_CONF_REQ_ACK = 0x007e,
OM2K_MSGT_RX_CONF_REQ_REJ = 0x007f,
OM2K_MSGT_RX_CONF_RES_ACK = 0x0080,
OM2K_MSGT_RX_CONF_RES_NACK = 0x0081,
OM2K_MSGT_RX_CONF_RES = 0x0082,
OM2K_MSGT_START_REQ = 0x0084,
OM2K_MSGT_START_REQ_ACK = 0x0086,
OM2K_MSGT_START_REQ_REJ = 0x0087,
@@ -135,32 +140,55 @@ enum abis_om2k_msgtype {
OM2K_MSGT_TEST_RES_NACK = 0x0099,
OM2K_MSGT_TEST_RES = 0x009a,
OM2K_MSGT_TF_CONF_REQ = 0x00a0,
OM2K_MSGT_TF_CONF_REQ_ACK = 0x00a2,
OM2K_MSGT_TF_CONF_REQ_REJ = 0x00a3,
OM2K_MSGT_TF_CONF_RES_ACK = 0x00a4,
OM2K_MSGT_TF_CONF_RES_NACK = 0x00a5,
OM2K_MSGT_TF_CONF_RES = 0x00a6,
OM2K_MSGT_TS_CONF_REQ = 0x00a8,
OM2K_MSGT_TS_CONF_REQ_ACK = 0x00aa,
OM2K_MSGT_TS_CONF_REQ_REJ = 0x00ab,
OM2K_MSGT_TS_CONF_RES_ACK = 0x00ac,
OM2K_MSGT_TS_CONF_RES_NACK = 0x00ad,
OM2K_MSGT_TS_CONF_RES = 0x00ae,
OM2K_MSGT_TX_CONF_REQ = 0x00b0,
OM2K_MSGT_TX_CONF_REQ_ACK = 0x00b2,
OM2K_MSGT_TX_CONF_REQ_REJ = 0x00b3,
OM2K_MSGT_TX_CONF_RES_ACK = 0x00b4,
OM2K_MSGT_TX_CONF_RES_NACK = 0x00b5,
OM2K_MSGT_TX_CONF_RES = 0x00b6,
OM2K_MSGT_NEGOT_REQ_ACK = 0x0104,
OM2K_MSGT_NEGOT_REQ_NACK = 0x0105,
OM2K_MSGT_NEGOT_REQ = 0x0106,
};
enum abis_om2k_dei {
OM2K_DEI_BCC = 0x06,
OM2K_DEI_BSIC = 0x09,
OM2K_DEI_CAL_TIME = 0x0d,
OM2K_DEI_COMBINATION = 0x0f,
OM2K_DEI_CON_CONN_LIST = 0x10,
OM2K_DEI_END_LIST_NR = 0x13,
OM2K_DEI_FILLING_MARKER = 0x1c,
OM2K_DEI_FN_OFFSET = 0x1d,
OM2K_DEI_FREQ_LIST = 0x1e,
OM2K_DEI_FREQ_SPEC_RX = 0x1f,
OM2K_DEI_FREQ_SPEC_TX = 0x20,
OM2K_DEI_HSN = 0x21,
OM2K_DEI_IS_CONN_LIST = 0x27,
OM2K_DEI_LIST_NR = 0x28,
OM2K_DEI_MAIO = 0x2b,
OM2K_DEI_OP_INFO = 0x2e,
OM2K_DEI_POWER = 0x2f,
OM2K_DEI_RX_DIVERSITY = 0x33,
OM2K_DEI_TF_MODE = 0x3a,
OM2K_DEI_TS_NR = 0x3c,
OM2K_DEI_EXT_RANGE = 0x47,
OM2K_DEI_NEGOT_REC1 = 0x90,
OM2K_DEI_NEGOT_REC2 = 0x91,
};
enum abis_om2k_mo_cls {
OM2K_MO_CLS_TRXC = 0x01,
OM2K_MO_CLS_TS = 0x03,
OM2K_MO_CLS_TF = 0x04,
OM2K_MO_CLS_IS = 0x05,
OM2K_MO_CLS_CON = 0x06,
OM2K_MO_CLS_DP = 0x07,
OM2K_MO_CLS_CF = 0x0a,
OM2K_MO_CLS_TX = 0x0b,
OM2K_MO_CLS_RX = 0x0c,
OM2K_DEI_FS_OFFSET = 0x98,
};
static const struct value_string om2k_msgcode_vals[] = {
@@ -549,6 +577,7 @@ static void fill_om2k_hdr(struct abis_om2k_hdr *o2h, const struct abis_om2k_mo *
const struct abis_om2k_mo om2k_mo_cf = { OM2K_MO_CLS_CF, 0, 0xFF, 0 };
const struct abis_om2k_mo om2k_mo_is = { OM2K_MO_CLS_IS, 0, 0xFF, 0 };
const struct abis_om2k_mo om2k_mo_con = { OM2K_MO_CLS_CON, 0, 0xFF, 0 };
const struct abis_om2k_mo om2k_mo_tf = { OM2K_MO_CLS_TF, 0, 0xFF, 0 };
static int abis_om2k_cal_time_resp(struct gsm_bts *bts)
{
@@ -683,6 +712,161 @@ int abis_om2k_tx_con_conf_req(struct gsm_bts *bts, uint8_t *data,
return abis_om2k_sendmsg(bts, msg);
}
static void om2k_trx_to_mo(struct abis_om2k_mo *mo,
const struct gsm_bts_trx *trx,
enum abis_om2k_mo_cls cls)
{
mo->class = cls;
mo->bts = 0;
mo->inst = trx->nr;
mo->assoc_so = 0;
}
static void om2k_ts_to_mo(struct abis_om2k_mo *mo,
const struct gsm_bts_trx_ts *ts)
{
mo->class = OM2K_MO_CLS_TS;
mo->bts = 0;
mo->inst = ts->nr;
mo->assoc_so = ts->trx->nr;
}
/* Configure a Receiver MO */
int abis_om2k_tx_rx_conf_req(struct gsm_bts_trx *trx)
{
struct msgb *msg = om2k_msgb_alloc();
struct abis_om2k_hdr *o2k;
struct abis_om2k_mo mo;
om2k_trx_to_mo(&mo, trx, OM2K_MO_CLS_RX);
o2k = (struct abis_om2k_hdr *) msgb_put(msg, sizeof(*o2k));
fill_om2k_hdr(o2k, &mo, OM2K_MSGT_RX_CONF_REQ, 3+2);
msgb_tv16_put(msg, OM2K_DEI_FREQ_SPEC_RX, trx->arfcn);
msgb_tv_put(msg, OM2K_DEI_RX_DIVERSITY, 0x03); /* A+B */
return abis_om2k_sendmsg(trx->bts, msg);
}
/* Configure a Transmitter MO */
int abis_om2k_tx_tx_conf_req(struct gsm_bts_trx *trx)
{
struct msgb *msg = om2k_msgb_alloc();
struct abis_om2k_hdr *o2k;
struct abis_om2k_mo mo;
om2k_trx_to_mo(&mo, trx, OM2K_MO_CLS_TX);
o2k = (struct abis_om2k_hdr *) msgb_put(msg, sizeof(*o2k));
fill_om2k_hdr(o2k, &mo, OM2K_MSGT_TX_CONF_REQ, 3+2+2+2);
msgb_tv16_put(msg, OM2K_DEI_FREQ_SPEC_TX, trx->arfcn);
msgb_tv_put(msg, OM2K_DEI_POWER, trx->nominal_power-trx->max_power_red);
msgb_tv_put(msg, OM2K_DEI_FILLING_MARKER, 0); /* Filling enabled */
msgb_tv_put(msg, OM2K_DEI_BCC, trx->bts->bsic & 0x7);
/* Dedication Information is optional */
return abis_om2k_sendmsg(trx->bts, msg);
}
enum abis_om2k_tf_mode {
OM2K_TF_MODE_MASTER = 0x00,
OM2K_TF_MODE_STANDALONE = 0x01,
OM2K_TF_MODE_SLAVE = 0x02,
OM2K_TF_MODE_UNDEFINED = 0xff,
};
static const uint8_t fs_offset_undef[5] = { 0xff, 0xff, 0xff, 0xff, 0xff };
int abis_om2k_tx_tf_conf_req(struct gsm_bts *bts)
{
struct msgb *msg = om2k_msgb_alloc();
struct abis_om2k_hdr *o2k;
o2k = (struct abis_om2k_hdr *) msgb_put(msg, sizeof(*o2k));
fill_om2k_hdr(o2k, &om2k_mo_tf, OM2K_MSGT_TF_CONF_REQ,
2+1+sizeof(fs_offset_undef));
msgb_tv_put(msg, OM2K_DEI_TF_MODE, OM2K_TF_MODE_STANDALONE);
msgb_tv_fixed_put(msg, OM2K_DEI_FS_OFFSET,
sizeof(fs_offset_undef), fs_offset_undef);
return abis_om2k_sendmsg(bts, msg);
}
static uint8_t pchan2comb(enum gsm_phys_chan_config pchan)
{
switch (pchan) {
case GSM_PCHAN_CCCH:
return 4;
case GSM_PCHAN_CCCH_SDCCH4:
return 5;
case GSM_PCHAN_SDCCH8_SACCH8C:
return 3;
case GSM_PCHAN_TCH_F:
case GSM_PCHAN_TCH_H:
case GSM_PCHAN_PDCH:
case GSM_PCHAN_TCH_F_PDCH:
return 8;
default:
return 0;
}
}
/* Compute a frequency list in OM2000 fomrmat */
static int om2k_gen_freq_list(uint8_t *list, struct gsm_bts_trx_ts *ts)
{
uint8_t *cur = list;
if (ts->hopping.enabled) {
unsigned int i;
for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
if (bitvec_get_bit_pos(&ts->hopping.arfcns, i)) {
*cur++ = 0x00;
*cur++ = i >> 8;
*cur++ = i & 0xff;
}
}
} else {
*cur++ = 0x00; /* TX/RX address */
*cur++ = ts->trx->arfcn >> 8;
*cur++ = ts->trx->arfcn && 0xff;
}
return (cur - list);
}
int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts)
{
struct msgb *msg = om2k_msgb_alloc();
struct abis_om2k_hdr *o2k;
struct abis_om2k_mo mo;
uint8_t freq_list[64*3]; /* BA max size: 64 ARFCN */
int freq_list_len;
om2k_ts_to_mo(&mo, ts);
freq_list_len = om2k_gen_freq_list(freq_list, ts);
if (freq_list_len < 0)
return freq_list_len;
o2k = (struct abis_om2k_hdr *) msgb_put(msg, sizeof(*o2k));
fill_om2k_hdr(o2k, &mo, OM2K_MSGT_TS_CONF_REQ,
2+2+TLV_GROSS_LEN(freq_list_len)+2+2+2+2+3+2);
msgb_tv_put(msg, OM2K_DEI_COMBINATION, pchan2comb(ts->pchan));
msgb_tv_put(msg, OM2K_DEI_TS_NR, ts->nr);
msgb_tlv_put(msg, OM2K_DEI_FREQ_LIST, freq_list_len, freq_list);
msgb_tv_put(msg, OM2K_DEI_HSN, ts->hopping.hsn);
msgb_tv_put(msg, OM2K_DEI_MAIO, ts->hopping.maio);
msgb_tv_put(msg, OM2K_DEI_BSIC, ts->trx->bts->bsic);
msgb_tv_put(msg, OM2K_DEI_RX_DIVERSITY, 0x03); /* A+B */
msgb_tv16_put(msg, OM2K_DEI_FN_OFFSET, 0);
msgb_tv_put(msg, OM2K_DEI_EXT_RANGE, 0); /* Off */
/* Optional: Interference Rejection Combining */
return abis_om2k_sendmsg(ts->trx->bts, msg);
}
static int abis_om2k_tx_negot_req_ack(struct gsm_bts *bts, const struct abis_om2k_mo *mo,
uint8_t *data, unsigned int len)
@@ -844,6 +1028,18 @@ int abis_om2k_rcvmsg(struct msgb *msg)
case OM2K_MSGT_CON_CONF_RES:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_CON_CONF_RES_ACK);
break;
case OM2K_MSGT_TX_CONF_RES:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TX_CONF_RES_ACK);
break;
case OM2K_MSGT_RX_CONF_RES:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_RX_CONF_RES_ACK);
break;
case OM2K_MSGT_TS_CONF_RES:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TS_CONF_RES_ACK);
break;
case OM2K_MSGT_TF_CONF_RES:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TF_CONF_RES_ACK);
break;
case OM2K_MSGT_CONNECT_COMPL:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_RESET_CMD);
break;
@@ -864,6 +1060,10 @@ int abis_om2k_rcvmsg(struct msgb *msg)
case OM2K_MSGT_START_REQ_ACK:
case OM2K_MSGT_CON_CONF_REQ_ACK:
case OM2K_MSGT_IS_CONF_REQ_ACK:
case OM2K_MSGT_TX_CONF_REQ_ACK:
case OM2K_MSGT_RX_CONF_REQ_ACK:
case OM2K_MSGT_TS_CONF_REQ_ACK:
case OM2K_MSGT_TF_CONF_REQ_ACK:
case OM2K_MSGT_ENABLE_REQ_ACK:
case OM2K_MSGT_ALARM_STATUS_REQ_ACK:
case OM2K_MSGT_DISABLE_REQ_ACK:

View File

@@ -410,6 +410,62 @@ DEFUN(om2k_is_conf_req, om2k_is_conf_req_cmd,
return CMD_SUCCESS;
}
DEFUN(om2k_conf_req, om2k_conf_req_cmd,
"configuration-request",
"Send the configuration request for current MO\n")
{
struct oml_node_state *oms = vty->index;
struct gsm_bts *bts = oms->bts;
struct gsm_bts_trx *trx = NULL;
struct gsm_bts_trx_ts *ts = NULL;
switch (oms->mo.class) {
case OM2K_MO_CLS_TS:
trx = gsm_bts_trx_by_nr(bts, oms->mo.assoc_so);
if (!trx) {
vty_out(vty, "%% BTS %u has no TRX %u%s", bts->nr,
oms->mo.assoc_so, VTY_NEWLINE);
return CMD_WARNING;
}
if (oms->mo.inst >= ARRAY_SIZE(trx->ts)) {
vty_out(vty, "%% Timeslot %u out of range%s",
oms->mo.inst, VTY_NEWLINE);
return CMD_WARNING;
}
ts = &trx->ts[oms->mo.inst];
abis_om2k_tx_ts_conf_req(ts);
break;
case OM2K_MO_CLS_RX:
case OM2K_MO_CLS_TX:
case OM2K_MO_CLS_TRXC:
trx = gsm_bts_trx_by_nr(bts, oms->mo.inst);
if (!trx) {
vty_out(vty, "%% BTS %u has no TRX %u%s", bts->nr,
oms->mo.inst, VTY_NEWLINE);
return CMD_WARNING;
}
switch (oms->mo.class) {
case OM2K_MO_CLS_RX:
abis_om2k_tx_rx_conf_req(trx);
break;
case OM2K_MO_CLS_TX:
abis_om2k_tx_rx_conf_req(trx);
break;
default:
break;
}
break;
case OM2K_MO_CLS_TF:
abis_om2k_tx_tf_conf_req(bts);
break;
default:
vty_out(vty, "%% Don't know how to configure MO%s",
VTY_NEWLINE);
}
return CMD_SUCCESS;
}
void abis_om2k_config_write_bts(struct vty *vty, struct gsm_bts *bts)
{
struct is_conn_group *igrp;
@@ -446,6 +502,7 @@ int abis_om2k_vty_init(void)
install_element(OM2K_NODE, &om2k_disable_cmd);
install_element(OM2K_NODE, &om2k_op_info_cmd);
install_element(OM2K_NODE, &om2k_test_cmd);
install_element(OM2K_NODE, &om2k_conf_req_cmd);
install_element(OM2K_NODE, &om2k_is_conf_req_cmd);
install_element(OM2K_NODE, &om2k_con_list_dec_cmd);
install_element(OM2K_NODE, &om2k_con_list_tei_cmd);

View File

@@ -636,11 +636,14 @@ static void error_timeout_cb(void *data)
rsl_lchan_set_state(lchan, LCHAN_S_NONE);
}
static int rsl_rx_rf_chan_rel_ack(struct gsm_lchan *lchan);
/* Chapter 8.4.14 / 4.7: Tell BTS to release the radio channel */
static int rsl_rf_chan_release(struct gsm_lchan *lchan, int error)
{
struct abis_rsl_dchan_hdr *dh;
struct msgb *msg;
int rc;
if (lchan->state == LCHAN_S_REL_ERR) {
LOGP(DRSL, LOGL_NOTICE, "%s is in error state not sending release.\n",
@@ -671,8 +674,16 @@ static int rsl_rf_chan_release(struct gsm_lchan *lchan, int error)
msg->trx->bts->network->T3111 + 2, 0);
}
rc = abis_rsl_sendmsg(msg);
/* BTS will respond by RF CHAN REL ACK */
return abis_rsl_sendmsg(msg);
#ifdef HSL_SR_1_0
/* The HSL Femto seems to 'forget' sending a REL ACK for TS1...TS7 */
if (lchan->ts->trx->bts->type == GSM_BTS_TYPE_HSL_FEMTO && lchan->ts->nr != 0)
rc = rsl_rx_rf_chan_rel_ack(lchan);
#endif
return rc;
}
static int rsl_rx_rf_chan_rel_ack(struct gsm_lchan *lchan)

View File

@@ -92,13 +92,14 @@ int bsc_shutdown_net(struct gsm_network *net)
static int generate_and_rsl_si(struct gsm_bts_trx *trx, enum osmo_sysinfo_type i)
{
struct gsm_bts *bts = trx->bts;
int rc;
int si_len, rc, j;
/* Only generate SI if this SI is not in "static" (user-defined) mode */
if (!(bts->si_mode_static & (1 << i))) {
rc = gsm_generate_si(bts, i);
if (rc < 0)
return rc;
si_len = rc;
}
DEBUGP(DRR, "SI%s: %s\n", gsm_sitype_name(i),
@@ -109,8 +110,25 @@ static int generate_and_rsl_si(struct gsm_bts_trx *trx, enum osmo_sysinfo_type i
case SYSINFO_TYPE_5bis:
case SYSINFO_TYPE_5ter:
case SYSINFO_TYPE_6:
rc = rsl_sacch_filling(trx, gsm_sitype2rsl(i),
GSM_BTS_SI(bts, i), rc);
if (trx->bts->type == GSM_BTS_TYPE_HSL_FEMTO) {
/* HSL has mistaken SACCH INFO MODIFY for SACCH FILLING,
* so we need a special workaround here */
/* This assumes a combined BCCH and TCH on TS1...7 */
for (j = 0; j < 4; j++)
rsl_sacch_info_modify(&trx->ts[0].lchan[j],
gsm_sitype2rsl(i),
GSM_BTS_SI(bts, i), si_len);
for (j = 1; j < 8; j++) {
rsl_sacch_info_modify(&trx->ts[j].lchan[0],
gsm_sitype2rsl(i),
GSM_BTS_SI(bts, i), si_len);
rsl_sacch_info_modify(&trx->ts[j].lchan[1],
gsm_sitype2rsl(i),
GSM_BTS_SI(bts, i), si_len);
}
} else
rc = rsl_sacch_filling(trx, gsm_sitype2rsl(i),
GSM_BTS_SI(bts, i), rc);
break;
default:
rc = rsl_bcch_info(trx, gsm_sitype2rsl(i),
@@ -423,9 +441,16 @@ int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *),
register_signal_handler(SS_INPUT, inp_sig_cb, NULL);
llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
bootstrap_bts(bts);
if (!is_ipaccess_bts(bts))
rc = bootstrap_bts(bts);
switch (bts->type) {
case GSM_BTS_TYPE_NANOBTS:
case GSM_BTS_TYPE_HSL_FEMTO:
break;
default:
rc = e1_reconfig_bts(bts);
break;
}
if (rc < 0) {
fprintf(stderr, "Error in E1 input driver setup\n");
@@ -435,6 +460,7 @@ int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *),
/* initialize nanoBTS support omce */
rc = ipaccess_setup(bsc_gsmnet);
rc = hsl_setup(bsc_gsmnet);
return 0;
}

View File

@@ -50,7 +50,7 @@
#include <openbsc/osmo_msc_data.h>
#include <openbsc/osmo_bsc_rf.h>
#include "../bscconfig.h"
#include "../../bscconfig.h"
/* FIXME: this should go to some common file */
static const struct value_string gprs_ns_timer_strs[] = {
@@ -253,6 +253,8 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
bts->ip_access.site_id, bts->ip_access.bts_id,
bts->oml_tei, VTY_NEWLINE);
else if (bts->type == GSM_BTS_TYPE_HSL_FEMTO)
vty_out(vty, " Serial Number: %lu%s", bts->hsl.serno, VTY_NEWLINE);
vty_out(vty, " NM State: ");
net_dump_nmstate(vty, &bts->nm_state);
vty_out(vty, " Site Mgr NM State: ");
@@ -497,13 +499,19 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
VTY_NEWLINE);
}
}
if (is_ipaccess_bts(bts)) {
switch (bts->type) {
case GSM_BTS_TYPE_NANOBTS:
vty_out(vty, " ip.access unit_id %u %u%s",
bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
vty_out(vty, " oml ip.access stream_id %u%s", bts->oml_tei, VTY_NEWLINE);
} else {
break;
case GSM_BTS_TYPE_HSL_FEMTO:
vty_out(vty, " hsl serial-number %lu%s", bts->hsl.serno, VTY_NEWLINE);
break;
default:
config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
break;
}
/* if we have a limit, write it */
@@ -1584,6 +1592,23 @@ DEFUN(cfg_bts_unit_id,
return CMD_SUCCESS;
}
DEFUN(cfg_bts_serno,
cfg_bts_serno_cmd,
"hsl serial-number STRING",
"Set the HSL Serial Number of this BTS\n")
{
struct gsm_bts *bts = vty->index;
if (bts->type != GSM_BTS_TYPE_HSL_FEMTO) {
vty_out(vty, "%% BTS is not of HSL type%s", VTY_NEWLINE);
return CMD_WARNING;
}
bts->hsl.serno = strtoul(argv[0], NULL, 10);
return CMD_SUCCESS;
}
#define OML_STR "Organization & Maintenance Link\n"
#define IPA_STR "ip.access Specific Options\n"
@@ -2696,6 +2721,7 @@ int bsc_vty_init(void)
install_element(BTS_NODE, &cfg_bts_tsc_cmd);
install_element(BTS_NODE, &cfg_bts_bsic_cmd);
install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
install_element(BTS_NODE, &cfg_bts_serno_cmd);
install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);

View File

@@ -29,7 +29,7 @@
#include <openbsc/e1_input.h>
#include <openbsc/signal.h>
#include "input/lapd.h"
#include "../libabis/input/lapd.h"
static void bootstrap_om_bts(struct gsm_bts *bts)
{

View File

@@ -0,0 +1,162 @@
/* OpenBSC support code for HSL Femtocell */
/* (C) 2011 by Harald Welte <laforge@gnumonks.org>
* (C) 2011 by OnWaves
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include <sys/types.h>
#include <arpa/inet.h>
#include <osmocore/tlv.h>
#include <openbsc/gsm_data.h>
#include <openbsc/abis_nm.h>
#include <openbsc/abis_rsl.h>
#include <openbsc/signal.h>
#include <openbsc/e1_input.h>
static struct gsm_bts_model model_hslfemto = {
.type = GSM_BTS_TYPE_HSL_FEMTO,
.nm_att_tlvdef = {
.def = {
/* no HSL specific OML attributes that we know of */
},
},
};
static const uint8_t l1_msg[] = {
#ifdef HSL_SR_1_0
0x80, 0x8a,
#else
0x81, 0x8a,
#endif
0xC4, 0x0b,
};
static const uint8_t conn_trau_msg[] = {
#ifdef HSL_SR_1_0
0x80, 0x81,
#else
0x81, 0x81,
#endif
0xC1, 16,
0x02, 0x00, 0x00, 0x00, 0xC0, 0xA8, 0xEA, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const uint8_t conn_trau_msg2[] = {
#ifdef HSL_SR_1_0
0x80, 0x81,
#else
0x81, 0x81,
#endif
0xC1, 16,
0x02, 0x00, 0xd4, 0x07, 0xC0, 0xA8, 0xEA, 0x01,
0x38, 0xA4, 0x45, 0x00, 0x04, 0x59, 0x40, 0x00
};
static uint8_t oml_arfcn_bsic[] = {
#ifdef HSL_SR_1_0
0x81, 0x80, 0x00, 10,
#else
0x80, 0x80, 0x00, 10,
#endif
NM_MT_SET_BTS_ATTR, NM_OC_BTS, 0xff, 0xff, 0xff,
NM_ATT_BCCH_ARFCN, 0x03, 0x67,
NM_ATT_BSIC, 0x00
};
static inline struct msgb *hsl_alloc_msgb(void)
{
return msgb_alloc_headroom(1024, 127, "HSL");
}
static int hslfemto_bootstrap_om(struct gsm_bts *bts)
{
struct msgb *msg;
uint8_t *cur;
msg = hsl_alloc_msgb();
cur = msgb_put(msg, sizeof(l1_msg));
memcpy(msg->data, l1_msg, sizeof(l1_msg));
msg->trx = bts->c0;
abis_rsl_sendmsg(msg);
#if 1
msg = hsl_alloc_msgb();
cur = msgb_put(msg, sizeof(conn_trau_msg));
memcpy(msg->data, conn_trau_msg, sizeof(conn_trau_msg));
msg->trx = bts->c0;
abis_rsl_sendmsg(msg);
#endif
msg = hsl_alloc_msgb();
cur = msgb_put(msg, sizeof(conn_trau_msg2));
memcpy(msg->data, conn_trau_msg2, sizeof(conn_trau_msg2));
msg->trx = bts->c0;
abis_rsl_sendmsg(msg);
*((uint16_t *)oml_arfcn_bsic+10) = htons(bts->c0->arfcn);
oml_arfcn_bsic[13] = bts->bsic;
msg = hsl_alloc_msgb();
cur = msgb_put(msg, sizeof(oml_arfcn_bsic));
memcpy(msg->data, oml_arfcn_bsic, sizeof(oml_arfcn_bsic));
msg->trx = bts->c0;
_abis_nm_sendmsg(msg, 0);
/* Delay the OPSTART until after SI have been set via RSL */
//abis_nm_opstart(bts, NM_OC_BTS, 255, 255, 255);
return 0;
}
/* Callback function to be called every time we receive a signal from INPUT */
static int inp_sig_cb(unsigned int subsys, unsigned int signal,
void *handler_data, void *signal_data)
{
struct input_signal_data *isd = signal_data;
if (subsys != SS_INPUT)
return 0;
switch (signal) {
case S_INP_TEI_UP:
switch (isd->link_type) {
case E1INP_SIGN_OML:
hslfemto_bootstrap_om(isd->trx->bts);
break;
}
}
return 0;
}
int bts_model_hslfemto_init(void)
{
model_hslfemto.features.data = &model_hslfemto._features_data[0];
model_hslfemto.features.data_len = sizeof(model_hslfemto._features_data);
gsm_btsmodel_set_feature(&model_hslfemto, BTS_FEAT_GPRS);
gsm_btsmodel_set_feature(&model_hslfemto, BTS_FEAT_EGPRS);
register_signal_handler(SS_INPUT, inp_sig_cb, NULL);
return gsm_bts_model_register(&model_hslfemto);
}

View File

@@ -22,12 +22,12 @@
#include <stdlib.h>
#include <errno.h>
#include <openbsc/msgb.h>
#include <osmocore/talloc.h>
#include <osmocore/msgb.h>
#include <openbsc/debug.h>
#include <openbsc/gsm_data.h>
#include <openbsc/meas_rep.h>
#include <openbsc/signal.h>
#include <openbsc/talloc.h>
/* process an already parsed measurement report */
static int process_meas_rep(struct gsm_meas_rep *mr)

View File

@@ -370,9 +370,14 @@ static int generate_si5(u_int8_t *output, struct gsm_bts *bts)
memset(output, GSM_MACBLOCK_PADDING, GSM_MACBLOCK_LEN);
/* ip.access nanoBTS needs l2_plen!! */
if (is_ipaccess_bts(bts)) {
switch (bts->type) {
case GSM_BTS_TYPE_NANOBTS:
case GSM_BTS_TYPE_HSL_FEMTO:
*output++ = (l2_plen << 2) | 1;
l2_plen++;
break;
default:
break;
}
si5 = (struct gsm48_system_information_type_5 *) output;
@@ -397,9 +402,14 @@ static int generate_si6(u_int8_t *output, struct gsm_bts *bts)
memset(output, GSM_MACBLOCK_PADDING, GSM_MACBLOCK_LEN);
/* ip.access nanoBTS needs l2_plen!! */
if (is_ipaccess_bts(bts)) {
switch (bts->type) {
case GSM_BTS_TYPE_NANOBTS:
case GSM_BTS_TYPE_HSL_FEMTO:
*output++ = (l2_plen << 2) | 1;
l2_plen++;
break;
default:
break;
}
si6 = (struct gsm48_system_information_type_6 *) output;

View File

@@ -0,0 +1,7 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libcommon.a
libcommon_a_SOURCES = bsc_version.c common_vty.c debug.c gsm_data.c socket.c talloc_ctx.c

View File

@@ -17,7 +17,7 @@
*
*/
#include "bscconfig.h"
#include "../../bscconfig.h"
const char *openbsc_copyright =
"Copyright (C) 2008-2010 Harald Welte, Holger Freyther\r\n"

View File

@@ -416,6 +416,7 @@ static const struct value_string bts_types[] = {
{ GSM_BTS_TYPE_BS11, "bs11" },
{ GSM_BTS_TYPE_NANOBTS, "nanobts" },
{ GSM_BTS_TYPE_RBS2000, "rbs2000" },
{ GSM_BTS_TYPE_HSL_FEMTO, "hsl_femto" },
{ 0, NULL }
};
@@ -571,6 +572,8 @@ int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type)
bts->model = model;
switch (bts->type) {
case GSM_BTS_TYPE_HSL_FEMTO:
bts->c0->rsl_tei = 0;
case GSM_BTS_TYPE_NANOBTS:
/* Set the default OML Stream ID to 0xff */
bts->oml_tei = 0xff;

View File

@@ -0,0 +1,9 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall -fno-strict-aliasing $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(LIBOSMOVTY_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libgb.a
libgb_a_SOURCES = gprs_ns.c gprs_ns_frgre.c gprs_ns_vty.c \
gprs_bssgp.c gprs_bssgp_util.c gprs_bssgp_vty.c
#gprs_llc.c gprs_llc_vty.c crc24.c

View File

@@ -0,0 +1,7 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libmgcp.a
libmgcp_a_SOURCES = mgcp_protocol.c mgcp_network.c mgcp_vty.c

View File

@@ -0,0 +1,19 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libmsc.a
libmsc_a_SOURCES = auth.c \
db.c \
gsm_04_08.c gsm_04_11.c gsm_04_80.c \
gsm_subscriber.c \
mncc.c mncc_builtin.c mncc_sock.c \
rrlp.c \
silent_call.c \
sms_queue.c \
token_auth.c \
ussd.c \
vty_interface_layer3.c \
osmo_msc.c

View File

@@ -75,6 +75,11 @@ struct gsm_lai {
static u_int32_t new_callref = 0x80000001;
void cc_tx_to_mncc(struct gsm_network *net, struct msgb *msg)
{
net->mncc_recv(net, msg);
}
static int gsm48_conn_sendmsg(struct msgb *msg, struct gsm_subscriber_connection *conn,
struct gsm_trans *trans)
{

View File

@@ -0,0 +1,7 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
noinst_LIBRARIES = libtrau.a
libtrau_a_SOURCES = rtp_proxy.c subchan_demux.c trau_frame.c trau_mux.c trau_upqueue.c

View File

@@ -442,7 +442,7 @@ static int rtp_socket_read(struct rtp_socket *rs, struct rtp_sub_socket *rss)
if (rc < 0)
goto out_free;
msgb_free(msg);
cc_tx_to_mncc(rs->receive.net, new_msg);
trau_tx_to_mncc(rs->receive.net, new_msg);
break;
case RTP_NONE: /* if socket exists, but disabled by app */

View File

@@ -213,7 +213,7 @@ int trau_mux_input(struct gsm_e1_subslot *src_e1_ss,
}
frame->msg_type = GSM_TCHF_FRAME;
frame->callref = ue->callref;
cc_tx_to_mncc(ue->net, msg);
trau_tx_to_mncc(ue->net, msg);
return 0;
}

View File

@@ -1,4 +1,4 @@
/* mncc_upqueue.c - Pass msgb's up the chain */
/* trau_upqueue.c - Pass msgb's up the chain */
/* (C) 2010 by Harald Welte <laforge@gnumonks.org>
* All Rights Reserved
@@ -21,7 +21,7 @@
#include <openbsc/mncc.h>
#include <openbsc/gsm_data.h>
void cc_tx_to_mncc(struct gsm_network *net, struct msgb *msg)
void trau_tx_to_mncc(struct gsm_network *net, struct msgb *msg)
{
net->mncc_recv(net, msg);
}

View File

@@ -1,13 +0,0 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOSCCP_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(LIBOSMOVTY_LIBS) $(COVERAGE_LDFLAGS)
bin_PROGRAMS = bsc_nat
bsc_nat_SOURCES = bsc_filter.c bsc_mgcp_utils.c bsc_nat.c bsc_nat_utils.c \
bsc_nat_vty.c bsc_sccp.c bsc_ussd.c \
$(top_srcdir)/src/debug.c $(top_srcdir)/src/bsc_msc.c
bsc_nat_LDADD = $(top_builddir)/src/libvty.a \
$(top_builddir)/src/libmgcp.a $(top_builddir)/src/libbsc.a \
-lrt $(LIBOSMOSCCP_LIBS)

View File

@@ -7,9 +7,12 @@ bin_PROGRAMS = osmo-bsc
osmo_bsc_SOURCES = osmo_bsc_main.c osmo_bsc_rf.c osmo_bsc_vty.c osmo_bsc_api.c \
osmo_bsc_grace.c osmo_bsc_msc.c osmo_bsc_sccp.c \
osmo_bsc_filter.c osmo_bsc_bssap.c osmo_bsc_audio.c \
$(top_srcdir)/src/debug.c $(top_srcdir)/src/bsc_msc.c \
$(top_srcdir)/src/bsc_init.c
osmo_bsc_LDADD = $(top_builddir)/src/libvty.a \
$(top_builddir)/src/libmgcp.a $(top_builddir)/src/libbsc.a \
osmo_bsc_filter.c osmo_bsc_bssap.c osmo_bsc_audio.c
# once again since TRAU uses CC symbol :(
osmo_bsc_LDADD = $(top_builddir)/src/libbsc/libbsc.a \
$(top_builddir)/src/libmsc/libmsc.a \
$(top_builddir)/src/libbsc/libbsc.a \
$(top_builddir)/src/libabis/libabis.a \
$(top_builddir)/src/libtrau/libtrau.a \
$(top_builddir)/src/libcommon/libcommon.a \
$(LIBOSMOSCCP_LIBS)

View File

@@ -41,7 +41,7 @@
#include <unistd.h>
#include "bscconfig.h"
#include "../../bscconfig.h"
static struct log_target *stderr_target;
struct gsm_network *bsc_gsmnet = 0;

View File

@@ -0,0 +1,10 @@
INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(LIBOSMOCORE_LIBS) $(COVERAGE_LDFLAGS)
bin_PROGRAMS = bsc_mgcp
bsc_mgcp_SOURCES = mgcp_main.c
bsc_mgcp_LDADD = $(top_builddir)/src/libcommon/libcommon.a \
$(top_builddir)/src/libmgcp/libmgcp.a \
$(LIBOSMOVTY_LIBS)

Some files were not shown because too many files have changed in this diff Show More