So far three persons have indicated their interest to join
a meeting at my place.
Considering the time it takes to drive to my place, it
probably makes sense to have the meeting at the weekend
(either Saturday or Sunday) so that there is more time
for the meeting itself. I can suggest one of the following
dates for the first meeting, somewhere between 10:00 to
18:00 on each day:
25.8. (Sa) or 26.8. (Su)
1.9. (Sa) or 2.9. (Su)
8.9. (Sa) or 9.9. (Su)
So please let me know when you have time and also make
suggestions in which Osmocom topic you are interested
in so that we can have some sort of agenda for the
meeting to make best use of the time.
Best regards,
Dieter
--
Dieter Spaar, Germany spaar(a)mirider.augusta.de
Hello everyone,
I've just finnished writing together a small web interface for the OpenBSC
HLR. It allows you to modify various parameters in the database and also
provides a set of functions to modify the HLR or sending SMSes in your own
scripts.
The project is still very alpha but it seems to work reasonably good. Feel
free to give any feedback!
Screenshots and source code is available on my website:
https://stormhub.org/simplehlr/
--
*Best regards,
Peter Caprioli*
This is a Mailman mailing list bounce action notice:
List: OpenBSC
Member: fabrice.poundeu(a)smail.inf.fh-bonn-rhein-sieg.de
Action: Subscription disabled.
Reason: Excessive or fatal bounces.
The triggering bounce notice is attached below.
Questions? Contact the Mailman site administrator at
mailman(a)lists.osmocom.org.
Hi All,
as I've just been made aware of by a business contact, there is a
NEWSDR'13 workshop which, among other things, has OsmocomBB and OpenBSC
on the list of topics:
http://ecewp.ece.wpi.edu/wordpress/sdr-boston/newsdr-13/call-for-papers/
Did anyone ever hear of this workshop? Did the organizers ever make
contact with us? I'm a bit surprised that somebody organizes a workshop
with "our" projects on the agenda without even sending the CfP to us.
Or maybe I just missed it?
In case somebody is submitting a paper there: Please make sure to
coordinate here in order to avoid different developers/contributors from
submitting similar/related topics.
Regards,
Harald
--
- Harald Welte <laforge(a)gnumonks.org> http://laforge.gnumonks.org/
============================================================================
"Privacy in residential applications is a desirable marketing option."
(ETSI EN 300 175-7 Ch. A6)
I've never heard of either this workshop or the SDR Boston Listserv and
don't know any of the people on the organizing committee. One of the
moderators of the mailing list, which I just joined, is an EE professor at
Northeastern University, Miriam Lesser, who is well known in the FPGA
community.
Since I'm based in Boston, I'll plan to attend provided I'm not traveling
for my day job. If anyone would like to participate by proxy, please let
me know. [If I can get my act together in time, I may demo OpenBTS ported
to a Xilinx Zynq using the new Close-Haul GAPfiller RF front end.]
-Robin
Hello All,
Did anyone ever experienced such strange problems when downloading firmware into BS-11?
===
$ bs11_config
bs11_config (C) 2009-2010 by Harald Welte and Dieter Spaar
This is FREE SOFTWARE with ABSOLUTELY NO WARRANTY
LMT LOGON: ACK
PHASE: 1 Software required Abis-link: Down
<0005> abis_nm.c:1196 Software Load (BTS 0, File "BTSBMC76.SWI")
Software Load Initiate ACK
===
...and then nothing happens for hours. I.e., no progress percentage, segment acknowledges, etc.
Does it mean that BTS is broken or something other?
Regards,
Sergey.
"Range Networks formally introduced today its executive management
team to deliver a complete open source software version of the
cellular system. Range Networks says it is the world’s leading
provider of American-made commercial open source cellular systems and
is slashing the cost to own and operate mobile networks."
http://www.dailywireless.org/2013/03/26/range-networks-open-source-cellular…
Hi,
I was discussing this crash[1] with Jan at the 29C3 and recently in
Iceland. On top of that Katarina pointed me to the best practises[2]
of talloc. In general I disagree with them[3] but they provide a nice
solution for the SGSN/MSGB ownership issue.
Methods that send a msgb should create a new local context and attach
it to a global context for all local contexts (so we see them in the
leak report). This would probably be done with a helper function in
libosmocore.
Once the msgb is created, we will steal it into the local context. Then
we pass it down the rabbit hole. Once it is reaching the write_queue it
is stolen back (or into a write queue context). The initial caller will
free his local context. And now there are three options:
a.) The msgb has made it into the write_queue.
b.) The msgb has been already deleted due to an error
c.) The msgb is still in the local context and will be freed.
Using the talloc_steal and the local context will make sure we do not
leak and do not double free. We can (and should) add a warning to see
under which circumstances the msgb has not been freed.
I think the implementation of this will be about 10-15 lines of code
(probably too optimistic).
comments?
holger
[1] http://openbsc.osmocom.org/trac/ticket/55
[2] http://talloc.samba.org/talloc/doc/html/libtalloc__bestpractices.html
[3] Most of our functions only allocate one object. There is no point
in having a hierachy of ROOT -> SingleObject. This indirection is
wasteful in most cases.
This is just a proposal how a scalable cost-effective solution can look
like. It is not implemented yet, but the goal is to work out a right
approach.
I developed quite similar things in 2003, when I interfaced ip.access BSC
to S-12 and AXE-10.
This is a piece of operator infrastructure, desired to be sold to MNO. In
Russia it also assumes certification procedure, held by authorized center.
On Mon, Mar 25, 2013 at 1:16 PM, John Wu <jwjohn0(a)gmail.com> wrote:
> Hi Dmitri,
> Have you developed the solution connect private GSM network to operator
> core network?
> But this should be allowed by the local operator, right?
>
>
> On Sat, Mar 23, 2013 at 5:09 PM, Dmitri Soloviev <dmi3sol(a)gmail.com>wrote:
>
>> Hi
>>
>> we've got several requests to extend existing GSM networks with our radio
>> equipment, where ip transport is appreciated.
>>
>> Please take a look at my vision of interfacing A-over-ip to a legacy GSM
>> A-interface.
>>
>> Building blocks:
>>
>> 1. OpenBSC with ip.access-compatible A-over-ip interface
>>
>> 2. MGCP-controlled transcoder, built with Sangoma D-series cards. Can be
>> assumed as a shared resource, available for several BSC instances.
>> http://www.sangoma.com/assets/docs/datasheets/en/d500.pdf
>>
>> 3. TelscaleSS7card - a stand-alone signaling and media gateway, with 2 E1
>> and 2 Ethernet interfaces, running embedded linux on board.
>> It converts A-over-ip to A-interface, acts as MGCP call agent for BTSs,
>> transcoders and other telscaleSS7cards. A card is implemented in PCI form
>> factor, but bus is used just to provide power supply.
>> In other words, a card can act either as a combined SG+MG, converting
>> A-over-ip into SS7 and RTP into E1 timeslot, or just a MG, converting RTP
>> into E1, without any impact on the host system.
>>
>>
>> When a [signaling gateway + call agent] detects ASSIGNMENT_REQUEST or
>> HANDOVER_REQUEST, it stores cic value. As soon as ASSIGNMENT_COMPLETE or
>> HO_REQ_ACK is detected, it builds RTP chain that unites
>> BTS<->transcoder<->media_gateway. The chain is broken after the call is
>> finished.
>>
>> Depending on the chosen cross plane, 4U 19" industrial PC can carry
>> several BSC instances with transcoding, serving about 20 E1 interfaces (ea
>> about 80 ARFCNs). Performance requirements for industrial PC cards are also
>> negligible: computer will run OpenBSC and configure transcoder cards, being
>> controlled by means of MGCP.
>>
>>
>>
>> Best Regards,
>> Dmitri
>>
>
>
Hi
we've got several requests to extend existing GSM networks with our radio
equipment, where ip transport is appreciated.
Please take a look at my vision of interfacing A-over-ip to a legacy GSM
A-interface.
Building blocks:
1. OpenBSC with ip.access-compatible A-over-ip interface
2. MGCP-controlled transcoder, built with Sangoma D-series cards. Can be
assumed as a shared resource, available for several BSC instances.
http://www.sangoma.com/assets/docs/datasheets/en/d500.pdf
3. TelscaleSS7card - a stand-alone signaling and media gateway, with 2 E1
and 2 Ethernet interfaces, running embedded linux on board.
It converts A-over-ip to A-interface, acts as MGCP call agent for BTSs,
transcoders and other telscaleSS7cards. A card is implemented in PCI form
factor, but bus is used just to provide power supply.
In other words, a card can act either as a combined SG+MG, converting
A-over-ip into SS7 and RTP into E1 timeslot, or just a MG, converting RTP
into E1, without any impact on the host system.
When a [signaling gateway + call agent] detects ASSIGNMENT_REQUEST or
HANDOVER_REQUEST, it stores cic value. As soon as ASSIGNMENT_COMPLETE or
HO_REQ_ACK is detected, it builds RTP chain that unites
BTS<->transcoder<->media_gateway. The chain is broken after the call is
finished.
Depending on the chosen cross plane, 4U 19" industrial PC can carry several
BSC instances with transcoding, serving about 20 E1 interfaces (ea about 80
ARFCNs). Performance requirements for industrial PC cards are also
negligible: computer will run OpenBSC and configure transcoder cards, being
controlled by means of MGCP.
Best Regards,
Dmitri
Hello,
I am using a setup consisting of an ip.access nanoBTS (165) and the sysmocom sysmoBSC for detecting and analysing malware on mobile phones. So far, I sniff the IP traffic at the Uplink-Interface and the traffic between the nanoBTS and the sysmoBSC for SMS. Now I want to extend my project and detect calls. When analysing a pcap file I can easily find a call that has been connected by the BSC in the RSL protocol. However, if the call could not be connected (because the dialed number is not in the HLR), I can not find any sign of a connection between BTS and BSC whatsoever. When analysing a new malware, I don't know the number the malware dials, so I can't give the extension to a second phone. I thought the BTS transferred the dialed number to the BSC, the BSC knows the extension doesn't exist and refuses the connection. In which protocol can I find the attempt to connect and the dialed number?
Another solution I thought of was using Asterisk with a softphone that all calls are routed to. Is that possible? Is there any way to use the sysmoBSC with an Asterisk server? I found lots of tutorials on how to use openBSC with Asterisk, but nothing on osmo-nitb+Asterisk and the sysmoBSC. Asterisk would run on a second machine connected to the sysmoBSC of course.
Regards,
Philip
hi,
(somehow i already sent this patch to the list. but it seems to be gone.)
this patch should fix the underrun problem. it will only send radio link
failure to bsc one and then stop processing timeout counter.
regards,
andreas
In case that the counter S reached 0, it will stay 0. Subsequent received
good and bad SACCH frames must not cause to trigger radio link failure
again. Once the BSC has been indicated about link failure, it will release
channel.
The counting of S has been moved to a seperate function.
This patch will ensure that the link failure is indicated only once. But
even if the link failure would be sent multiple times, the BSC should
ignore it. The BSC releases the channel and may only reuse it after confirm
from BTS. (There cannot be any link failure indications after confirm of
channel release.)
The allowed timeout value range is 4..64, as defined in TS 05.08, so if the
BSC sends an attribute with value out of range or other failure criterion,
the Set BTS Attributes message is NACKed.
---
src/common/oml.c | 12 ++++++++--
src/osmo-bts-sysmo/l1_if.c | 50 +++++++++++++++++++++++++++----------------
2 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/src/common/oml.c b/src/common/oml.c
index 4e2dead..bf90ff1 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -446,10 +446,16 @@ static int oml_rx_set_bts_attr(struct gsm_bts *bts, struct msgb *msg)
btsb->interference.intave = *TLVP_VAL(&tp, NM_ATT_INTAVE_PARAM);
/* 9.4.14 Connection Failure Criterion */
- if (TLVP_PRESENT(&tp, NM_ATT_CONN_FAIL_CRIT) &&
- (TLVP_LEN(&tp, NM_ATT_CONN_FAIL_CRIT) >= 2) &&
- *TLVP_VAL(&tp, NM_ATT_CONN_FAIL_CRIT) == 0x01) {
+ if (TLVP_PRESENT(&tp, NM_ATT_CONN_FAIL_CRIT)) {
const uint8_t *val = TLVP_VAL(&tp, NM_ATT_CONN_FAIL_CRIT);
+
+ if (TLVP_LEN(&tp, NM_ATT_CONN_FAIL_CRIT) < 2
+ || val[0] != 0x01 || val[1] < 4 || val[1] > 64) {
+ LOGP(DOML, LOGL_NOTICE, "Given Conn. Failure Criterion "
+ "not supported. Please use critetion 0x01 with "
+ "RADIO_LINK_TIMEOUT value of 4..64\n");
+ return oml_fom_ack_nack(msg, NM_NACK_PARAM_RANGE);
+ }
btsb->radio_link_timeout = val[1];
}
/* if val[0] != 0x01: can be 'operator dependent' and needs to
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index df660c5..bdba4c2 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -647,11 +647,39 @@ static int process_meas_res(struct gsm_lchan *lchan, GsmL1_MeasParam_t *m)
return lchan_new_ul_meas(lchan, &ulm);
}
+/* process radio link timeout counter S */
+static void radio_link_timeout(struct gsm_lchan *lchan, int bad_frame)
+{
+ struct gsm_bts_role_bts *btsb = lchan->ts->trx->bts->role;
+
+ /* if link loss criterion already reached */
+ if (lchan->s == 0)
+ return;
+
+ if (bad_frame) {
+ /* count down radio link counter S */
+ lchan->s--;
+ DEBUGP(DMEAS, "counting down radio link counter S=%d\n",
+ lchan->s);
+ if (lchan->s == 0)
+ rsl_tx_conn_fail(lchan, RSL_ERR_RADIO_LINK_FAIL);
+ return;
+ }
+
+ if (lchan->s < btsb->radio_link_timeout) {
+ /* count up radio link counter S */
+ lchan->s += 2;
+ if (lchan->s > btsb->radio_link_timeout)
+ lchan->s = btsb->radio_link_timeout;
+ DEBUGP(DMEAS, "counting up radio link counter S=%d\n",
+ lchan->s);
+ }
+}
+
static int handle_ph_data_ind(struct femtol1_hdl *fl1, GsmL1_PhDataInd_t *data_ind,
struct msgb *l1p_msg)
{
struct gsm_bts_trx *trx = fl1->priv;
- struct gsm_bts_role_bts *btsb = trx->bts->role;
struct osmo_phsap_prim pp;
struct gsm_lchan *lchan;
struct lapdm_entity *le;
@@ -681,25 +709,9 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1, GsmL1_PhDataInd_t *data_i
switch (data_ind->sapi) {
case GsmL1_Sapi_Sacch:
- /* process radio link timeout coniter S */
- if (data_ind->msgUnitParam.u8Size == 0) {
- /* count down radio link counter S */
- lchan->s--;
- DEBUGP(DMEAS, "counting down radio link counter S=%d\n",
- lchan->s);
- if (lchan->s == 0)
- rsl_tx_conn_fail(lchan,
- RSL_ERR_RADIO_LINK_FAIL);
+ radio_link_timeout(lchan, (data_ind->msgUnitParam.u8Size == 0));
+ if (data_ind->msgUnitParam.u8Size == 0)
break;
- }
- if (lchan->s < btsb->radio_link_timeout) {
- /* count up radio link counter S */
- lchan->s += 2;
- if (lchan->s > btsb->radio_link_timeout)
- lchan->s = btsb->radio_link_timeout;
- DEBUGP(DMEAS, "counting up radio link counter S=%d\n",
- lchan->s);
- }
/* save the SACCH L1 header in the lchan struct for RSL MEAS RES */
if (data_ind->msgUnitParam.u8Size < 2) {
LOGP(DL1C, LOGL_NOTICE, "SACCH with size %u<2 !?!\n",
--
1.7.3.4
--------------050705040601090706090209--
In case that the counter S reached 0, it will stay 0. Subsequent received
good and bad SACCH frames must not cause to trigger radio link failure
again. Once the BSC has been indicated about link failure, it will release
channel.
This patch will ensure that the link failure is indicated only once. But
even if the link failure would be sent multiple times, the BSC should
ignore it. The BSC releases the channel and may only reuse it after confirm
from BTS. (There cannot be any link failure indications after confirm of
channel release.)
The minimum timeout value is 4, as defined in TS 05.08, so if the BSC
sends an attribute with a value < 4, this (wrong) value is ignored and the
default value of 32 is used.
---
src/common/oml.c | 6 +++---
src/osmo-bts-sysmo/l1_if.c | 7 +++++--
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/common/oml.c b/src/common/oml.c
index 4e2dead..afedefd 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -447,10 +447,10 @@ static int oml_rx_set_bts_attr(struct gsm_bts *bts, struct msgb *msg)
/* 9.4.14 Connection Failure Criterion */
if (TLVP_PRESENT(&tp, NM_ATT_CONN_FAIL_CRIT) &&
- (TLVP_LEN(&tp, NM_ATT_CONN_FAIL_CRIT) >= 2) &&
- *TLVP_VAL(&tp, NM_ATT_CONN_FAIL_CRIT) == 0x01) {
+ (TLVP_LEN(&tp, NM_ATT_CONN_FAIL_CRIT) >= 2)) {
const uint8_t *val = TLVP_VAL(&tp, NM_ATT_CONN_FAIL_CRIT);
- btsb->radio_link_timeout = val[1];
+ if (val[0] == 0x01 && val[1] >= 4)
+ btsb->radio_link_timeout = val[1];
}
/* if val[0] != 0x01: can be 'operator dependent' and needs to
* be parsed by bts driver */
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index df660c5..5728df0 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -681,8 +681,11 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1, GsmL1_PhDataInd_t *data_i
switch (data_ind->sapi) {
case GsmL1_Sapi_Sacch:
- /* process radio link timeout coniter S */
+ /* process radio link timeout counter S */
if (data_ind->msgUnitParam.u8Size == 0) {
+ /* if link loss criterion already reached */
+ if (lchan->s == 0)
+ break;
/* count down radio link counter S */
lchan->s--;
DEBUGP(DMEAS, "counting down radio link counter S=%d\n",
@@ -692,7 +695,7 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1, GsmL1_PhDataInd_t *data_i
RSL_ERR_RADIO_LINK_FAIL);
break;
}
- if (lchan->s < btsb->radio_link_timeout) {
+ if (lchan->s > 0 && lchan->s < btsb->radio_link_timeout) {
/* count up radio link counter S */
lchan->s += 2;
if (lchan->s > btsb->radio_link_timeout)
--
1.7.3.4
--------------050806080900000401040704--
In case that the counter S reached 0 (or have been initialized with 0
value at start of lchan), it will stay 0. Subsequent received good and bad
SACCH frames must not cause to trigger radio link failure again. Once the
BSC has been indicated about link failure, it will close channel.
---
src/osmo-bts-sysmo/l1_if.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index df660c5..5728df0 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -681,8 +681,11 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1, GsmL1_PhDataInd_t *data_i
switch (data_ind->sapi) {
case GsmL1_Sapi_Sacch:
- /* process radio link timeout coniter S */
+ /* process radio link timeout counter S */
if (data_ind->msgUnitParam.u8Size == 0) {
+ /* if link loss criterion already reached */
+ if (lchan->s == 0)
+ break;
/* count down radio link counter S */
lchan->s--;
DEBUGP(DMEAS, "counting down radio link counter S=%d\n",
@@ -692,7 +695,7 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1, GsmL1_PhDataInd_t *data_i
RSL_ERR_RADIO_LINK_FAIL);
break;
}
- if (lchan->s < btsb->radio_link_timeout) {
+ if (lchan->s > 0 && lchan->s < btsb->radio_link_timeout) {
/* count up radio link counter S */
lchan->s += 2;
if (lchan->s > btsb->radio_link_timeout)
--
1.7.3.4
--------------030009070902010606020306--
Dear Jolly,
from a quick look it appears to be that a very long running connection
could overflow lchan->s to a negative number. Could you either make this
code robust or explain why it is not needed? E.g. if we assume that this
happens once per multiframe the counter will overflow within 1.3 hours?
holger
Hi Andreas,
I've found some time to review the trx and l1sap branches you have
created in the osmo-bts.git repository.
Let me start by mentioning that I support and encourage your work.
However, I think we have to set some general rules before we can merge
the code.
For us, the most important factor is that we do not loose features or
introduce regressions with more or less every new commit to osmo-bts.
Furthermore, we would like to stay with 'one commit, one feature/fix'.
I understand your primary goal ist go generalize some code and then
create a working solution for the OpenBTS or OsmocomBB based
transceiver. However, for the way to get the changes are integrated is
to first introduce all the infrastructure/core changes while keeping
osmo-bts-sysmo functional and that with all existing features. Once
those core/infrastructure changes are merged, we can easily include
support the extra code for the osmo-bts-trx and in fact even do all
development commits to master, as long as they don't touch the core
code.
Looking at your commits:
http://cgit.osmocom.org/cgit/osmo-bts/commit/?h=jolly/trx&id=a82995738303d7…
is fine, as it just removes old code.
http://cgit.osmocom.org/cgit/osmo-bts/commit/?h=jolly/trx&id=9be2099855532c…
looks fine to me, too, we should be able to merge that. My only comment
would be: Are you sure this should not be configured via OML from the
BSC? I think TS 12.21 Chapter 9.4.14 should be the proper way to
configure it. Do you agree? If yes, please use OML configuration and
remove the VTY option.
http://cgit.osmocom.org/cgit/osmo-bts/commit/?h=jolly/trx&id=7322254e68b7d5…
seems fine to me. Can you pleaes confirm from your side that it
_should_ not alter/remove any existing code/behavior, but just introduce
that L1SAP intermediate interface? Have you tested it with
osmo-bts-sysmo?
http://cgit.osmocom.org/cgit/osmo-bts/commit/?h=jolly/trx&id=1c3712962195d1…
seems to not just remove the direct handling of primitives, but also add
some code, particularly the gsmtap_ip command line argument. Can you
please split that in a separate patch? Also, have you tested
osmo-bts-sysmo after this commit?
Regards,
Harald
--
- Harald Welte <laforge(a)gnumonks.org> http://laforge.gnumonks.org/
============================================================================
"Privacy in residential applications is a desirable marketing option."
(ETSI EN 300 175-7 Ch. A6)
On Wed, Feb 29, 2012 at 09:21:34AM +0100, jolly wrote:
> hi,
Hi jolly,
> i have tested it with several configurations. i would like to commit it
> to master. any suggestions?
Do you remember your test setup and the results of it? There appears to
be an issue with iPhone4s and iPhone5 phones (and PCS). It appears to me
that there are at least three issues with the generation:
* The SI1 rest_octets indicated DCS while PCS was used (this is fixed)
* The Ext-Ind claims that SI2 carries the complete BA even if SI2ter/2bis
are scheduled.
* The BA-Ind is the same for SDCCH/BCCH. We should use 0/1.
Could you have a look at it?
thanks
holger
The log target can be used via log alarms and show alarms.
Why? This feature was proposed/requested at
http://openbsc.osmocom.org/trac/wiki/Tasks/ErrorLogTarget
All messages use the same amount of space, prioritizing simplicity.
Renames as per tnt's request.
UI changed to reflect number of usable messages, as per zecke's request.
---
.gitignore | 2 +
include/osmocom/core/logging.h | 5 +
include/osmocom/core/loggingrb.h | 40 +++++++
include/osmocom/core/strrb.h | 58 ++++++++++
src/Makefile.am | 4 +-
src/loggingrb.c | 98 +++++++++++++++++
src/strrb.c | 170 +++++++++++++++++++++++++++++
src/vty/logging_vty.c | 85 ++++++++++++++-
tests/Makefile.am | 13 ++-
tests/loggingrb/logging_test.err | 3 +
tests/loggingrb/logging_test.ok | 0
tests/loggingrb/loggingrb_test.c | 83 +++++++++++++++
tests/strrb/strrb_test.c | 225 +++++++++++++++++++++++++++++++++++++++
tests/strrb/strrb_test.ok | 1 +
tests/testsuite.at | 13 +++
15 files changed, 792 insertions(+), 8 deletions(-)
create mode 100644 include/osmocom/core/loggingrb.h
create mode 100644 include/osmocom/core/strrb.h
create mode 100644 src/loggingrb.c
create mode 100644 src/strrb.c
create mode 100644 tests/loggingrb/logging_test.err
create mode 100644 tests/loggingrb/logging_test.ok
create mode 100644 tests/loggingrb/loggingrb_test.c
create mode 100644 tests/strrb/strrb_test.c
create mode 100644 tests/strrb/strrb_test.ok
diff --git a/.gitignore b/.gitignore
index 24ca677..aedd9fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -69,6 +69,8 @@ tests/gb/bssgp_fc_test
tests/gsm0408/gsm0408_test
tests/logging/logging_test
tests/fr/fr_test
+tests/loggingrb/loggingrb_test
+tests/ringbuf/ringbuf_test
utils/osmo-arfcn
utils/osmo-auc-gen
diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index 54262b7..fa3365a 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -114,6 +114,7 @@ enum log_target_type {
LOG_TGT_TYPE_SYSLOG, /*!< \brief syslog based logging */
LOG_TGT_TYPE_FILE, /*!< \brief text file logging */
LOG_TGT_TYPE_STDERR, /*!< \brief stderr logging */
+ LOG_TGT_TYPE_STRRB, /*!< \brief osmo_strrb-backed logging */
};
/*! \brief structure representing a logging target */
@@ -154,6 +155,10 @@ struct log_target {
struct {
void *vty;
} tgt_vty;
+
+ struct {
+ void *rb;
+ } tgt_rb;
};
/*! \brief call-back function to be called when the logging framework
diff --git a/include/osmocom/core/loggingrb.h b/include/osmocom/core/loggingrb.h
new file mode 100644
index 0000000..a6f377b
--- /dev/null
+++ b/include/osmocom/core/loggingrb.h
@@ -0,0 +1,40 @@
+#ifndef _LOGGINGRB_H
+#define _LOGGINGRB_H
+
+/* (C) 2012-2013 by Katerina Barone-Adesi <kat.obsc(a)gmail.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+
+/*! \defgroup loggingrb Osmocom ringbuffer-backed logging
+ * @{
+ */
+
+/*! \file loggingrb.h
+ */
+
+struct log_info;
+
+size_t log_target_rb_used_size(struct log_target const *target);
+size_t log_target_rb_avail_size(struct log_target const *target);
+const char *log_target_rb_get(struct log_target const *target, size_t logindex);
+struct log_target *log_target_create_rb(size_t size);
+
+/*! @} */
+
+#endif /* _LOGGINGRB_H */
diff --git a/include/osmocom/core/strrb.h b/include/osmocom/core/strrb.h
new file mode 100644
index 0000000..cfc56dc
--- /dev/null
+++ b/include/osmocom/core/strrb.h
@@ -0,0 +1,58 @@
+#ifndef _STRRB_H
+#define _STRRB_H
+
+/* (C) 2012-2013 by Katerina Barone-Adesi <kat.obsc(a)gmail.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+/*! \defgroup osmo_strrb Osmocom ringbuffers for log strings
+ * @{
+ */
+
+/*! \file strrb.h
+ * \brief Osmocom string ringbuffer handling routines
+ */
+
+#include <unistd.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <osmocom/core/talloc.h>
+
+/*! \brief A structure representing an osmocom string ringbuffer */
+
+#define RB_MAX_MESSAGE_SIZE 240
+struct osmo_strrb {
+ uint16_t start; /*!< \brief index of the first slot */
+ uint16_t end; /*!< \brief index of the last slot */
+ uint16_t size; /*!< \brief max number of messages to store */
+ char **buffer; /*!< \brief storage for messages */
+};
+
+struct osmo_strrb *osmo_strrb_create(TALLOC_CTX * ctx, size_t rb_size);
+bool osmo_strrb_is_empty(const struct osmo_strrb *rb);
+const char *osmo_strrb_get_nth(const struct osmo_strrb *rb,
+ unsigned int string_index);
+bool _osmo_strrb_is_bufindex_valid(const struct osmo_strrb *rb,
+ unsigned int offset);
+size_t osmo_strrb_elements(const struct osmo_strrb *rb);
+int osmo_strrb_add(struct osmo_strrb *rb, const char *data);
+
+/*! @} */
+
+#endif /* _STRRB_H */
diff --git a/src/Makefile.am b/src/Makefile.am
index b425ea1..081be96 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -11,8 +11,8 @@ libosmocore_la_SOURCES = timer.c select.c signal.c msgb.c bits.c \
write_queue.c utils.c socket.c \
logging.c logging_syslog.c rate_ctr.c \
gsmtap_util.c crc16.c panic.c backtrace.c \
- conv.c application.c rbtree.c \
- crc8gen.c crc16gen.c crc32gen.c crc64gen.c
+ conv.c application.c rbtree.c strrb.c \
+ loggingrb.c crc8gen.c crc16gen.c crc32gen.c crc64gen.c
BUILT_SOURCES = crc8gen.c crc16gen.c crc32gen.c crc64gen.c
diff --git a/src/loggingrb.c b/src/loggingrb.c
new file mode 100644
index 0000000..bb339eb
--- /dev/null
+++ b/src/loggingrb.c
@@ -0,0 +1,98 @@
+/* Ringbuffer-backed logging support code */
+
+/* (C) 2012-2013 by Katerina Barone-Adesi
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+/*! \addtogroup logging
+ * @{
+ */
+
+/*! \file loggingrb.c */
+
+#include <osmocom/core/strrb.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/loggingrb.h>
+
+static void _rb_output(struct log_target *target,
+ unsigned int level, const char *log)
+{
+ osmo_strrb_add(target->tgt_rb.rb, log);
+}
+
+/*! \brief Return the number of log strings in the osmo_strrb-backed target.
+ * \param[in] target The target to search.
+ *
+ * \return The number of log strings in the osmo_strrb-backed target.
+ */
+size_t log_target_rb_used_size(struct log_target const *target)
+{
+ return osmo_strrb_elements(target->tgt_rb.rb);
+}
+
+/*! \brief Return the capacity of the osmo_strrb-backed target.
+ * \param[in] target The target to search.
+ *
+ * Note that this is the capacity (aka max number of messages +1).
+ * It is not the number of unused message slots.
+ * \return The number of log strings in the osmo_strrb-backed target.
+ */
+size_t log_target_rb_avail_size(struct log_target const *target)
+{
+ struct osmo_strrb *rb = target->tgt_rb.rb;
+ return rb->size;
+}
+
+/*! \brief Return the nth log entry in a target.
+ * \param[in] target The target to search.
+ * \param[in] logindex The index of the log entry/error message.
+ *
+ * \return A pointer to the nth message, or NULL if logindex is invalid.
+ */
+const char *log_target_rb_get(struct log_target const *target, size_t logindex)
+{
+ return osmo_strrb_get_nth(target->tgt_rb.rb, logindex);
+}
+
+/*! \brief Create a new logging target for ringbuffer-backed logging.
+ * \param[in] size The size of the internal backing osmo_strrb (messages +1).
+ * \returns A log target in case of success, NULL in case of error.
+ */
+struct log_target *log_target_create_rb(size_t size)
+{
+ struct log_target *target;
+ struct osmo_strrb *rb;
+
+ target = log_target_create();
+ if (!target)
+ return NULL;
+
+ rb = osmo_strrb_create(target, size);
+ if (!rb) {
+ log_target_destroy(target);
+ return NULL;
+ }
+
+ target->tgt_rb.rb = rb;
+ target->type = LOG_TGT_TYPE_STRRB;
+ target->output = _rb_output;
+
+ return target;
+}
+
+/* @} */
diff --git a/src/strrb.c b/src/strrb.c
new file mode 100644
index 0000000..580c65c
--- /dev/null
+++ b/src/strrb.c
@@ -0,0 +1,170 @@
+/* Ringbuffer implementation, tailored for logging.
+ * This is a lossy ringbuffer. It keeps up to N of the newest messages,
+ * overwriting the oldest as newer ones come in.
+ *
+ * (C) 2012-2013, Katerina Barone-Adesi <kat.obsc(a)gmail.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+/*! \file strrb.c
+ * \brief Lossy string ringbuffer for logging; keeps newest messages.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+
+#include <osmocom/core/strrb.h>
+
+/* Ringbuffer assumptions, invarients, and notes:
+ * - start is the index of the first used index slot in the ring buffer.
+ * - end is the index of the next index slot in the ring buffer.
+ * - start == end => buffer is empty
+ * - Consequence: the buffer can hold at most size - 1 messages
+ * (if this were not the case, full and empty buffers would be indistinguishable
+ * given the conventions in this implementation).
+ * - Whenever the ringbuffer is full, start is advanced. The second oldest
+ * message becomes unreachable by valid indexes (end is not a valid index)
+ * and the oldest message is overwritten (if there was a message there, which
+ * is the case unless this is the first time the ringbuffer becomes full).
+*/
+
+/*! \brief Create an empty, initialized osmo_strrb.
+ * \param[in] ctx The talloc memory context which should own this.
+ * \param[in] rb_size The number of messages the osmo_strrb can hold.
+ * \returns A struct osmo_strrb* on success, NULL in case of error.
+ *
+ * This function creates and initializes a ringbuffer.
+ */
+
+struct osmo_strrb *osmo_strrb_create(TALLOC_CTX * ctx, size_t rb_size)
+{
+ struct osmo_strrb *rb = NULL;
+ unsigned int i;
+
+ rb = talloc_zero(ctx, struct osmo_strrb);
+ if (!rb)
+ goto alloc_error;
+
+ /* start and end are zero already, which is correct */
+ rb->size = rb_size + 1; /* one space is overhead */
+
+ rb->buffer = talloc_array(rb, char *, rb->size);
+ if (!rb->buffer)
+ goto alloc_error;
+ for (i = 0; i < rb->size; i++) {
+ rb->buffer[i] =
+ talloc_zero_size(rb->buffer, RB_MAX_MESSAGE_SIZE);
+ if (!rb->buffer[i])
+ goto alloc_error;
+ }
+
+ return rb;
+
+alloc_error: /* talloc_free(NULL) is safe */
+ talloc_free(rb);
+ return NULL;
+}
+
+/*! \brief Check if an osmo_strrb is empty.
+ * \param[in] rb The osmo_strrb to check.
+ * \returns True if the osmo_strrb is empty, false otherwise.
+ */
+bool osmo_strrb_is_empty(const struct osmo_strrb *rb)
+{
+ return rb->end == rb->start;
+}
+
+/*! \brief Return a pointer to the Nth string in the osmo_strrb.
+ * \param[in] rb The osmo_strrb to search.
+ * \param[in] string_index The index sought (N), zero-indexed.
+ *
+ * Return a pointer to the Nth string in the osmo_strrb.
+ * Return NULL if there is no Nth string.
+ * Note that N is zero-indexed.
+ * \returns A pointer to the target string on success, NULL in case of error.
+ */
+const char *osmo_strrb_get_nth(const struct osmo_strrb *rb,
+ unsigned int string_index)
+{
+ unsigned int offset = string_index + rb->start;
+
+ if ((offset >= rb->size) && (rb->start > rb->end))
+ offset -= rb->size;
+ if (_osmo_strrb_is_bufindex_valid(rb, offset))
+ return rb->buffer[offset];
+
+ return NULL;
+}
+
+bool _osmo_strrb_is_bufindex_valid(const struct osmo_strrb *rb,
+ unsigned int bufi)
+{
+ if (osmo_strrb_is_empty(rb))
+ return 0;
+ if ((bufi >= rb->size) || (bufi < 0))
+ return 0;
+ if (rb->start < rb->end)
+ return (bufi >= rb->start) && (bufi < rb->end);
+ return (bufi < rb->end) || (bufi >= rb->start);
+}
+
+/*! \brief Count the number of log messages in an osmo_strrb.
+ * \param[in] rb The osmo_strrb to count the elements of.
+ *
+ * \returns The number of log messages in the osmo_strrb.
+ */
+size_t osmo_strrb_elements(const struct osmo_strrb *rb)
+{
+ if (rb->end < rb->start)
+ return rb->end + (rb->size - rb->start);
+
+ return rb->end - rb->start;
+}
+
+/*! \brief Add a string to the osmo_strrb.
+ * \param[in] rb The osmo_strrb to add to.
+ * \param[in] data The string to add.
+ *
+ * Add a message to the osmo_strrb.
+ * Older messages will be overwritten as necessary.
+ * \returns 0 normally, 1 as a warning (ie, if data was truncated).
+ */
+int osmo_strrb_add(struct osmo_strrb *rb, const char *data)
+{
+ size_t len = strlen(data);
+ int ret = 0;
+
+ if (len >= RB_MAX_MESSAGE_SIZE) {
+ len = RB_MAX_MESSAGE_SIZE - 1;
+ ret = 1;
+ }
+
+ memcpy(rb->buffer[rb->end], data, len);
+ rb->buffer[rb->end][len] = '\0';
+
+ rb->end += 1;
+ rb->end %= rb->size;
+
+ /* The buffer is full; oldest message is forgotten - see notes above */
+ if (rb->end == rb->start) {
+ rb->start += 1;
+ rb->start %= rb->size;
+ }
+ return ret;
+}
diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c
index d473f12..ace346a 100644
--- a/src/vty/logging_vty.c
+++ b/src/vty/logging_vty.c
@@ -27,8 +27,8 @@
#include <osmocom/core/talloc.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/utils.h>
-
-//#include <openbsc/vty.h>
+#include <osmocom/core/strrb.h>
+#include <osmocom/core/loggingrb.h>
#include <osmocom/vty/command.h>
#include <osmocom/vty/buffer.h>
@@ -252,8 +252,8 @@ static void vty_print_logtarget(struct vty *vty, const struct log_info *info,
#define SHOW_LOG_STR "Show current logging configuration\n"
DEFUN(show_logging_vty,
- show_logging_vty_cmd,
- "show logging vty",
+ show_logging_vty_cmd,
+ "show logging vty",
SHOW_STR SHOW_LOG_STR
"Show current logging configuration for this vty\n")
{
@@ -267,6 +267,33 @@ DEFUN(show_logging_vty,
return CMD_SUCCESS;
}
+DEFUN(show_alarms,
+ show_alarms_cmd,
+ "show alarms",
+ SHOW_STR SHOW_LOG_STR
+ "Show the contents of the logging ringbuffer\n")
+{
+ int i, num_alarms;
+ struct osmo_strrb *rb;
+ struct log_target *tgt = log_target_find(LOG_TGT_TYPE_STRRB, NULL);
+ if (!tgt) {
+ vty_out(vty, "%% No alarms, run 'log alarms <2-32700>'%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ rb = tgt->tgt_rb.rb;
+ num_alarms = osmo_strrb_elements(rb);
+
+ vty_out(vty, "%% Showing %i alarms%s", num_alarms, VTY_NEWLINE);
+
+ for (i = 0; i < num_alarms; i++)
+ vty_out(vty, "%% %s%s", osmo_strrb_get_nth(rb, i),
+ VTY_NEWLINE);
+
+ return CMD_SUCCESS;
+}
+
gDEFUN(cfg_description, cfg_description_cmd,
"description .TEXT",
"Save human-readable decription of the object\n"
@@ -510,6 +537,49 @@ DEFUN(cfg_no_log_file, cfg_no_log_file_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_log_alarms, cfg_log_alarms_cmd,
+ "log alarms <2-32700>",
+ LOG_STR "Logging alarms to osmo_strrb\n"
+ "Maximum number of messages to log\n")
+{
+ struct log_target *tgt;
+ unsigned int rbsize = atoi(argv[0]);
+
+ tgt = log_target_find(LOG_TGT_TYPE_STRRB, NULL);
+ if (tgt)
+ log_target_destroy(tgt);
+
+ tgt = log_target_create_rb(rbsize);
+ if (!tgt) {
+ vty_out(vty, "%% Unable to create osmo_strrb (size %u)%s",
+ rbsize, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ log_add_target(tgt);
+
+ vty->index = tgt;
+ vty->node = CFG_LOG_NODE;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_log_alarms, cfg_no_log_alarms_cmd,
+ "no log alarms",
+ NO_STR LOG_STR "Logging alarms to osmo_strrb\n")
+{
+ struct log_target *tgt;
+
+ tgt = log_target_find(LOG_TGT_TYPE_STRRB, NULL);
+ if (!tgt) {
+ vty_out(vty, "%% No osmo_strrb target found%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ log_target_destroy(tgt);
+
+ return CMD_SUCCESS;
+}
+
static int config_write_log_single(struct vty *vty, struct log_target *tgt)
{
int i;
@@ -533,6 +603,10 @@ static int config_write_log_single(struct vty *vty, struct log_target *tgt)
case LOG_TGT_TYPE_FILE:
vty_out(vty, "log file %s%s", tgt->tgt_file.fname, VTY_NEWLINE);
break;
+ case LOG_TGT_TYPE_STRRB:
+ vty_out(vty, "log alarms %zu%s",
+ log_target_rb_avail_size(tgt), VTY_NEWLINE);
+ break;
}
vty_out(vty, " logging filter all %u%s",
@@ -590,6 +664,7 @@ void logging_vty_add_cmds(const struct log_info *cat)
logging_level_cmd.doc = log_vty_command_description(cat);
install_element_ve(&logging_level_cmd);
install_element_ve(&show_logging_vty_cmd);
+ install_element_ve(&show_alarms_cmd);
install_node(&cfg_log_node, config_write_log);
install_default(CFG_LOG_NODE);
@@ -603,6 +678,8 @@ void logging_vty_add_cmds(const struct log_info *cat)
install_element(CONFIG_NODE, &cfg_no_log_stderr_cmd);
install_element(CONFIG_NODE, &cfg_log_file_cmd);
install_element(CONFIG_NODE, &cfg_no_log_file_cmd);
+ install_element(CONFIG_NODE, &cfg_log_alarms_cmd);
+ install_element(CONFIG_NODE, &cfg_no_log_alarms_cmd);
#ifdef HAVE_SYSLOG_H
install_element(CONFIG_NODE, &cfg_log_syslog_cmd);
install_element(CONFIG_NODE, &cfg_log_syslog_local_cmd);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index be0b5f4..bc9b7de 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -4,7 +4,9 @@ check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test \
smscb/smscb_test bits/bitrev_test a5/a5_test \
conv/conv_test auth/milenage_test lapd/lapd_test \
gsm0808/gsm0808_test gsm0408/gsm0408_test \
- gb/bssgp_fc_test logging/logging_test fr/fr_test
+ gb/bssgp_fc_test logging/logging_test fr/fr_test \
+ loggingrb/loggingrb_test strrb/strrb_test
+
if ENABLE_MSGFILE
check_PROGRAMS += msgfile/msgfile_test
endif
@@ -54,6 +56,12 @@ logging_logging_test_LDADD = $(top_builddir)/src/libosmocore.la
fr_fr_test_SOURCES = fr/fr_test.c
fr_fr_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gb/libosmogb.la
+loggingrb_loggingrb_test_SOURCES = logging/logging_test.c
+loggingrb_loggingrb_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/vty/libosmovty.la
+
+strrb_strrb_test_SOURCES = strrb/strrb_test.c
+strrb_strrb_test_LDADD = $(top_builddir)/src/libosmocore.la
+
# The `:;' works around a Bash 3.2 bug when the output is not writeable.
$(srcdir)/package.m4: $(top_srcdir)/configure.ac
@@ -82,7 +90,8 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \
gb/bssgp_fc_tests.ok gb/bssgp_fc_tests.sh \
msgfile/msgfile_test.ok msgfile/msgconfig.cfg \
logging/logging_test.ok logging/logging_test.err \
- fr/fr_test.ok
+ fr/fr_test.ok loggingrb/logging_test.ok \
+ loggingrb/logging_test.err strrb/strrb_test.ok
DISTCLEANFILES = atconfig
diff --git a/tests/loggingrb/logging_test.err b/tests/loggingrb/logging_test.err
new file mode 100644
index 0000000..b59d2e8
--- /dev/null
+++ b/tests/loggingrb/logging_test.err
@@ -0,0 +1,3 @@
+[1;31mYou should see this
+[0;m[1;32mYou should see this
+[0;m
\ No newline at end of file
diff --git a/tests/loggingrb/logging_test.ok b/tests/loggingrb/logging_test.ok
new file mode 100644
index 0000000..e69de29
diff --git a/tests/loggingrb/loggingrb_test.c b/tests/loggingrb/loggingrb_test.c
new file mode 100644
index 0000000..1ab5212
--- /dev/null
+++ b/tests/loggingrb/loggingrb_test.c
@@ -0,0 +1,83 @@
+/* simple test for the debug interface */
+/*
+ * (C) 2008, 2009 by Holger Hans Peter Freyther <zecke(a)selfish.org>
+ * (C) 2012-2013 by Katerina Barone-Adesi <kat.obsc(a)gmail.com>
+ * 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 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 <assert.h>
+
+#include <osmocom/core/logging.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/ringb.h>
+#include <osmocom/vty/logging_rbvty.h>
+
+enum {
+ DRLL,
+ DCC,
+ DMM,
+};
+
+static const struct log_info_cat default_categories[] = {
+ [DRLL] = {
+ .name = "DRLL",
+ .description = "A-bis Radio Link Layer (RLL)",
+ .color = "\033[1;31m",
+ .enabled = 1, .loglevel = LOGL_NOTICE,
+ },
+ [DCC] = {
+ .name = "DCC",
+ .description = "Layer3 Call Control (CC)",
+ .color = "\033[1;32m",
+ .enabled = 1, .loglevel = LOGL_NOTICE,
+ },
+ [DMM] = {
+ .name = NULL,
+ .description = "Layer3 Mobility Management (MM)",
+ .color = "\033[1;33m",
+ .enabled = 1, .loglevel = LOGL_NOTICE,
+ },
+};
+
+const struct log_info log_info = {
+ .cat = default_categories,
+ .num_cat = ARRAY_SIZE(default_categories),
+};
+
+int main(int argc, char **argv)
+{
+ struct log_target *ringbuf_target;
+
+ log_init(&log_info, NULL);
+ ringbuf_target = log_target_create_rbvty(NULL, 0x1000);
+ log_add_target(ringbuf_target);
+ log_set_all_filter(ringbuf_target, 1);
+ log_set_print_filename(ringbuf_target, 0);
+
+ log_parse_category_mask(ringbuf_target, "DRLL:DCC");
+ log_parse_category_mask(ringbuf_target, "DRLL");
+ DEBUGP(DCC, "You should not see this\n");
+
+ log_parse_category_mask(ringbuf_target, "DRLL:DCC");
+ DEBUGP(DRLL, "You should see this\n");
+ DEBUGP(DCC, "You should see this\n");
+ DEBUGP(DMM, "You should not see this\n");
+ fprintf(stderr, ringbuffer_get_nth(ringbuf_target->tgt_rbvty.rb, 0));
+ fprintf(stderr, ringbuffer_get_nth(ringbuf_target->tgt_rbvty.rb, 1));
+ assert(!ringbuffer_get_nth(ringbuf_target->tgt_rbvty.rb, 2));
+
+ return 0;
+}
diff --git a/tests/strrb/strrb_test.c b/tests/strrb/strrb_test.c
new file mode 100644
index 0000000..b7c5e27
--- /dev/null
+++ b/tests/strrb/strrb_test.c
@@ -0,0 +1,225 @@
+/* (C) 2012-2013 by Katerina Barone-Adesi <kat.obsc(a)gmail.com>
+ * All Rights Reserved
+ *
+ * This program is iree software; you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+
+#include <osmocom/core/strrb.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/logging.h>
+
+struct osmo_strrb *rb0, *rb1, *rb2, *rb3, *rb4, *rb5;
+
+#define STR0 "hello"
+#define STR1 "a"
+#define STR2 "world"
+#define STR3 "sky"
+#define STR4 "moon"
+
+#define TESTSIZE 2
+
+void init_rbs(void)
+{
+ rb0 = osmo_strrb_create(NULL, TESTSIZE);
+
+ rb1 = osmo_strrb_create(NULL, TESTSIZE);
+ osmo_strrb_add(rb1, STR0);
+
+ rb2 = osmo_strrb_create(NULL, TESTSIZE);
+ osmo_strrb_add(rb2, STR0);
+ osmo_strrb_add(rb2, STR1);
+
+ rb3 = osmo_strrb_create(NULL, TESTSIZE);
+ osmo_strrb_add(rb3, STR0);
+ osmo_strrb_add(rb3, STR1);
+ osmo_strrb_add(rb3, STR2);
+
+ rb4 = osmo_strrb_create(NULL, TESTSIZE);
+ osmo_strrb_add(rb4, STR0);
+ osmo_strrb_add(rb4, STR1);
+ osmo_strrb_add(rb4, STR2);
+ osmo_strrb_add(rb4, STR3);
+
+ rb5 = osmo_strrb_create(NULL, TESTSIZE);
+ osmo_strrb_add(rb5, STR0);
+ osmo_strrb_add(rb5, STR1);
+ osmo_strrb_add(rb5, STR2);
+ osmo_strrb_add(rb5, STR3);
+ osmo_strrb_add(rb5, STR4);
+}
+
+void free_rbs(void)
+{
+ talloc_free(rb0);
+ talloc_free(rb1);
+ talloc_free(rb2);
+ talloc_free(rb3);
+ talloc_free(rb4);
+ talloc_free(rb5);
+}
+
+void test_offset_valid(void)
+{
+ assert(_osmo_strrb_is_bufindex_valid(rb1, 0));
+ assert(!_osmo_strrb_is_bufindex_valid(rb1, 1));
+ assert(!_osmo_strrb_is_bufindex_valid(rb1, 2));
+
+ assert(!_osmo_strrb_is_bufindex_valid(rb3, 0));
+ assert(_osmo_strrb_is_bufindex_valid(rb3, 1));
+ assert(_osmo_strrb_is_bufindex_valid(rb3, 2));
+
+ assert(_osmo_strrb_is_bufindex_valid(rb4, 0));
+ assert(!_osmo_strrb_is_bufindex_valid(rb4, 1));
+ assert(_osmo_strrb_is_bufindex_valid(rb4, 2));
+
+ assert(_osmo_strrb_is_bufindex_valid(rb5, 0));
+ assert(_osmo_strrb_is_bufindex_valid(rb5, 1));
+ assert(!_osmo_strrb_is_bufindex_valid(rb5, 2));
+}
+
+void test_elems(void)
+{
+ assert(osmo_strrb_elements(rb0) == 0);
+ assert(osmo_strrb_elements(rb1) == 1);
+ assert(osmo_strrb_elements(rb2) == 2);
+ assert(osmo_strrb_elements(rb3) == 2);
+}
+
+void test_getn(void)
+{
+ assert(!osmo_strrb_get_nth(rb0, 0));
+ assert(!strcmp(STR0, osmo_strrb_get_nth(rb2, 0)));
+ assert(!strcmp(STR1, osmo_strrb_get_nth(rb2, 1)));
+ assert(!strcmp(STR1, osmo_strrb_get_nth(rb3, 0)));
+ assert(!strcmp(STR2, osmo_strrb_get_nth(rb3, 1)));
+ assert(!osmo_strrb_get_nth(rb3, 2));
+}
+
+void test_getn_wrap(void)
+{
+ assert(!strcmp(STR2, osmo_strrb_get_nth(rb4, 0)));
+ assert(!strcmp(STR3, osmo_strrb_get_nth(rb4, 1)));
+
+ assert(!strcmp(STR3, osmo_strrb_get_nth(rb5, 0)));
+ assert(!strcmp(STR4, osmo_strrb_get_nth(rb5, 1)));
+}
+
+void test_add(void)
+{
+ struct osmo_strrb *rb = osmo_strrb_create(NULL, 3);
+ assert(rb->start == 0);
+ assert(rb->end == 0);
+
+ osmo_strrb_add(rb, "a");
+ osmo_strrb_add(rb, "b");
+ osmo_strrb_add(rb, "c");
+ assert(rb->start == 0);
+ assert(rb->end == 3);
+ assert(osmo_strrb_elements(rb) == 3);
+
+ osmo_strrb_add(rb, "d");
+ assert(rb->start == 1);
+ assert(rb->end == 0);
+ assert(osmo_strrb_elements(rb) == 3);
+ assert(!strcmp("b", osmo_strrb_get_nth(rb, 0)));
+ assert(!strcmp("c", osmo_strrb_get_nth(rb, 1)));
+ assert(!strcmp("d", osmo_strrb_get_nth(rb, 2)));
+
+ osmo_strrb_add(rb, "e");
+ assert(rb->start == 2);
+ assert(rb->end == 1);
+ assert(!strcmp("c", osmo_strrb_get_nth(rb, 0)));
+ assert(!strcmp("d", osmo_strrb_get_nth(rb, 1)));
+ assert(!strcmp("e", osmo_strrb_get_nth(rb, 2)));
+
+ osmo_strrb_add(rb, "f");
+ assert(rb->start == 3);
+ assert(rb->end == 2);
+ assert(!strcmp("d", osmo_strrb_get_nth(rb, 0)));
+ assert(!strcmp("e", osmo_strrb_get_nth(rb, 1)));
+ assert(!strcmp("f", osmo_strrb_get_nth(rb, 2)));
+
+ osmo_strrb_add(rb, "g");
+ assert(rb->start == 0);
+ assert(rb->end == 3);
+ assert(!strcmp("e", osmo_strrb_get_nth(rb, 0)));
+ assert(!strcmp("f", osmo_strrb_get_nth(rb, 1)));
+ assert(!strcmp("g", osmo_strrb_get_nth(rb, 2)));
+
+ osmo_strrb_add(rb, "h");
+ assert(rb->start == 1);
+ assert(rb->end == 0);
+ assert(!strcmp("f", osmo_strrb_get_nth(rb, 0)));
+ assert(!strcmp("g", osmo_strrb_get_nth(rb, 1)));
+ assert(!strcmp("h", osmo_strrb_get_nth(rb, 2)));
+
+ talloc_free(rb);
+}
+
+void test_long_msg(void)
+{
+ struct osmo_strrb *rb = osmo_strrb_create(NULL, 2);
+ int test_size = RB_MAX_MESSAGE_SIZE + 7;
+ char *tests1, *tests2;
+ const char *rb_content;
+ int i;
+
+ tests1 = malloc(test_size);
+ tests2 = malloc(test_size);
+ /* Be certain allocating memory worked before continuing */
+ assert(tests1);
+ assert(tests2);
+
+ for (i = 0; i < RB_MAX_MESSAGE_SIZE; i += 2) {
+ tests1[i] = 'a';
+ tests1[i + 1] = 'b';
+ }
+ tests1[i] = '\0';
+
+ osmo_strrb_add(rb, tests1);
+ strcpy(tests2, tests1);
+
+ /* Verify that no stale data from test1 is lingering... */
+ bzero(tests1, test_size);
+ free(tests1);
+
+ rb_content = osmo_strrb_get_nth(rb, 0);
+ assert(!strncmp(tests2, rb_content, RB_MAX_MESSAGE_SIZE - 1));
+ assert(!rb_content[RB_MAX_MESSAGE_SIZE - 1]);
+ assert(strlen(rb_content) == RB_MAX_MESSAGE_SIZE - 1);
+
+ free(tests2);
+ talloc_free(rb);
+}
+
+int main(int argc, char **argv)
+{
+ init_rbs();
+ test_offset_valid();
+ test_elems();
+ test_getn();
+ test_getn_wrap();
+ test_add();
+ test_long_msg();
+ printf("All tests passed\n");
+
+ free_rbs();
+ return 0;
+}
diff --git a/tests/strrb/strrb_test.ok b/tests/strrb/strrb_test.ok
new file mode 100644
index 0000000..9ac5124
--- /dev/null
+++ b/tests/strrb/strrb_test.ok
@@ -0,0 +1 @@
+All tests passed
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 5029b9e..21fad1d 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -99,3 +99,16 @@ cat $abs_srcdir/fr/fr_test.err > experr
AT_CHECK([$abs_top_builddir/tests/fr/fr_test], [], [expout], [experr])
AT_CLEANUP
+
+AT_SETUP([loggingrb])
+AT_KEYWORDS([loggingrb])
+cat $abs_srcdir/loggingrb/logging_test.ok > expout
+cat $abs_srcdir/loggingrb/logging_test.err > experr
+AT_CHECK([$abs_top_builddir/tests/loggingrb/loggingrb_test], [], [expout], [experr])
+AT_CLEANUP
+
+AT_SETUP([strrb])
+AT_KEYWORDS([strrb])
+cat $abs_srcdir/strrb/strrb_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/strrb/strrb_test], [], [expout], [ignore])
+AT_CLEANUP
--
1.8.1.2
hi,
long time ago i had these patches at a seperate "rtpmux" branch. now i
added them to a new branch (jolly/trx). they are very well tested now,
and i think they should get merged after some review. it is my aim to
support all speech codecs at osmo-nitb (built-in call handling, as well
as MNCC socket interface). these patches are essential for patches that
will follow during next weeks.
http://cgit.osmocom.org/cgit/openbsc/commit/?h=jolly/testing&id=f029472c1e4…
Adding traffic forwarding via RTP to remote application
Instead of forwarding traffic through MNCC interface, traffic can
now be forwarded to a given RTP destination. A special MNCC message
is used for that. The traffic can still be forwarded through MNCC
interface when this special MNCC message is not used.
It also works with E1 based BTSs.
In conjunction with LCR's "rtp-bridge" feature, the RTP traffic
can be directly exchanged with a remote SIP endpoint, so that the
traffic is not forwarded by LCR itself. This way the performance
of handling traffic only depends on OpenBSC and the remote SIP
endpoint. Also the traffic is exchanged with the SIP endpoint
without transcoding, to have maximum performance.
http://cgit.osmocom.org/cgit/openbsc/commit/?h=jolly/testing&id=eb333169ae0…
Adding handling of BFI (Bad Frame Indicatior) of received TRAU frames
If a bad TRAU frame is received, it is forwarded to MNCC application
as GSM_TCHF_BAD_FRAME. The application can now handle the GAP of
missing audio. (e.g. with extrapolation)
If TRAU frames are forwarded via RTP, bad frames are dropped, but frame
counter and timestamp of RTP sender state is increased.
http://cgit.osmocom.org/cgit/openbsc/commit/?h=jolly/testing&id=7fb2bf09ec2…
Allow dynamic RTP payload types between application and MNCC interface
Since EFR/AMR/HR codecs use dynamic RTP payload, the payload type can
be set. If it is set, the frame type must be set also, so OpenBSC
knows what frame types are received via RTP.
This modification only affects traffic beween application and MNCC
interface, not the RTP traffic between OpenBSC and BTS.
http://cgit.osmocom.org/cgit/openbsc/commit/?h=jolly/testing&id=42eb7251b96…
Fixed delay problems, if RTP stream jitters too much
The RTP stream is generated or forwarded by OpenBSC to nanoBTS. Due to
switching of streams (hold/retrieve call), packet loss or even stalling
of sender's process, the time stamp must be corrected. If outdated
packets are received, they get dropped.
http://cgit.osmocom.org/cgit/openbsc/commit/?h=jolly/testing&id=ee20ef2691f…
Finished support for all codecs (RTP bridge and MNCC interface)
The code is not yet tested.
AMR rate is currently fixed to 5.9k.
http://cgit.osmocom.org/cgit/openbsc/commit/?h=jolly/testing&id=5140fa39898…
Fixed problem of mute audio on some calls
When reading from RTP socket, the first read() may fail right after
connecting to remote socket. Subsequent read() will work as it should.
I have not checked why this read fails, but I don't see any reason
why we should stop reading, just because one read() fails at the
beginning.
http://cgit.osmocom.org/cgit/openbsc/commit/?h=jolly/testing&id=82e1a17ecb7…
Fix: TCHH/HR payloads are 15 bytes (ToC + 14 bytes of speech data)
note: this last fix can be applied to the patches above, rather than
merged seperately.
any suggestions?
andreas
Hi,
I sent previous message but didn't get anything, so I'm sending this group.
Thanks,
---------- Forwarded message ----------
From: Ivan Mikey <ivanmikey2(a)gmail.com>
Date: Thu, Feb 28, 2013 at 1:32 PM
Subject: ASN1C
To: baseband-devel(a)lists.osmocom.org
Hi,
I've been searching for help regarding the ASN1C in
http://cgit.osmocom.org/cgit/.
I'm not sure if this is the right group to contact or not, if not please
let me know and I apologize for it.
I've installed the following
SS7/MAP
asn1c
libasn1c
libosmo-asn1-map
libosmo-asn1-tcap
libosmo-tcap
libsu
osmo-tcap-map
and then did the below and I got the following errors.
/osmo-tcap-map/test$ make
cc -lasn1c -losmo-asn1-map -losmo-asn1-tcap -lm -o gprs_update gprs_update.o
gprs_update.o: In function `create_map_invoke':
gprs_update.c:(.text+0xf0): undefined reference to `asn_long2INTEGER'
gprs_update.c:(.text+0x111): undefined reference to `ANY_new_fromType'
gprs_update.o: In function `upd_gprs_loc_invoke':
gprs_update.c:(.text+0x160): undefined reference to `OCTET_STRING_fromBuf'
gprs_update.c:(.text+0x17d): undefined reference to `OCTET_STRING_fromBuf'
gprs_update.c:(.text+0x19a): undefined reference to `OCTET_STRING_fromBuf'
gprs_update.c:(.text+0x1ad): undefined reference to
`asn_DEF_UpdateGprsLocationArg'
gprs_update.c:(.text+0x1b5): undefined reference to `xer_fprint'
gprs_update.c:(.text+0x1c4): undefined reference to
`asn_DEF_UpdateGprsLocationArg'
gprs_update.c:(.text+0x1e2): undefined reference to `asn_DEF_Component'
gprs_update.c:(.text+0x1ea): undefined reference to `xer_fprint'
gprs_update.o: In function `upd_gprs_loc_aarq':
gprs_update.c:(.text+0x2d7): undefined reference to
`OBJECT_IDENTIFIER_set_arcs'
gprs_update.c:(.text+0x2e7): undefined reference to `asn_DEF_DialoguePDU'
gprs_update.c:(.text+0x2ef): undefined reference to `xer_fprint'
gprs_update.o: In function `tcap_msg':
gprs_update.c:(.text+0x3e9): undefined reference to `OCTET_STRING_fromBuf'
gprs_update.c:(.text+0x415): undefined reference to
`OBJECT_IDENTIFIER_set_arcs'
gprs_update.c:(.text+0x42c): undefined reference to `asn_DEF_DialoguePDU'
gprs_update.c:(.text+0x434): undefined reference to `ANY_fromType'
gprs_update.c:(.text+0x443): undefined reference to `asn_DEF_ExternalPDU'
gprs_update.c:(.text+0x448): undefined reference to `ANY_new_fromType'
gprs_update.c:(.text+0x492): undefined reference to `asn_set_add'
gprs_update.c:(.text+0x4a2): undefined reference to `asn_DEF_TCMessage'
gprs_update.c:(.text+0x4aa): undefined reference to `xer_fprint'
collect2: ld returned 1 exit status
make: *** [gprs_update] Error 1
Thanks
Ivan