OpenBSC
Threads by month
- ----- 2026 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- 1 participants
- 4322 discussions
Hi,
I am using osmo-nitb version 0.12.0.264-b02f. When I set value to
authorized to 1 for ID 1 via the telnet console then I do not see the
this value change with "show subscriber". The "authorized" field value
in the DB did change from 0 to 1.
- start with new DB freshly initialized by osmo-nitb running in
foreground as root (auth policy closed)
- SIM tries to register and fails as it is not authorized:
(1|2013-02-28 14:57:43|2013-02-28
14:57:43|901700000001198||38178|0||0|1970-01-01 00:00:00)
- set auth with: subscriber id 1 authorized 1
console shows:
<000d> db.c:161 DBI: -7: The requested variable type does not match
what libdbi thinks it should be
<000d> db.c:161 DBI: -7: The requested variable type does not match
what libdbi thinks it should be
<000d> db.c:713 Found Subscriber: ID 0, IMSI 901700000001198, NAME '',
TMSI 4294967295, EXTEN '38178', LAC 0, AUTH 0
- DB shows: 1|2013-02-28 14:57:43|2013-02-28
15:06:11|901700000001198||38178|1||0|1970-01-01 00:00:00
- however in the console it is not changing its state:
OpenBSC# show subscriber id 1
ID: 0, Authorized: 0
- using "subscriber id 1 update" has no effect.
I can see the auth value change in the console after I set auth policy
to accept-all, then let the IMSI update its location, then set
auth-policy back to auth policy closed. And then "subscriber id 1
authorize 1". After this sequence IMSI can update its location value.
Why can I not get the auth value activated from the DB? Is it related
to the db.c about the variable type message? Once the SIM is
registered all is working well and I can make calls.
Regards,
Max
2
1
Hello List
I'm trying to make my openbsc installation work in half rate mode but
I'm facing some errors.
I'm wondering if someone could provide me with more info or help me to
configure openbsc.
I have changed in openbsc.cfg the timeslots 2 to 7 from
phys_chan_config TCH/F into phys_chan_config TCH/H also I have tested
changing neci bit and change audio codecs but no luck.
Am I missed something? Is there any way to run osmo-nitb with gsmtap?
openbsc.cfg is attached
Thanks in advance.
4
6
Dear fellow Osmcoom developers,
it is my pleasure to finally announce the date + venue of OsmoDevCon
2013:
Date: April 04 through April 07, 2013
Place: IN-Berlin, Lehrter Str. 53, Berlin
Like last year, this is an event for developers of the various Osmocom
proejects. Reservation and confirmation of reservation is required.
The event is free of charge. The Room is made available by IN-Berlin
e.V., an Internet related non-profit organization. Lunch catering will
be sponsored (so far by sysmocom GmbH, but if any other sponsors come
up, we are happy to share the cost).
So all you have to cover is your own travel + accomodation costs, as
well as breakfast and dinner. If you are an active developer and cannot
afford travel/accomodation, please let me know and I'll see if we can do
something about it.
If you would like to attend, please send a message to
laforge(a)gnumonks.org applying for registration of the event. The
registration deadline is March 5, i.e. one week from now.
There is no detailed schedule of talks yet. I will start a separate
discussion suggesting / collecting topics in the next couple of days.
More information is (and will be made) available at
http://openbsc.osmocom.org/trac/wiki/OsmoDevCon2013
Further discussion regarding the event should be directed at the
osmocom-event-orga(a)lists.osmocom.org mailing list, to avoid
cross-posting over the various project-specific lists.
Best regards and happy hacking,
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)
1
0
[PATCH] Added a ring buffer log target to store the last N log messages.
by Katerina Barone-Adesi 19 Feb '13
by Katerina Barone-Adesi 19 Feb '13
19 Feb '13
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.
---
.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 | 169 +++++++++++++++++++++++++++++
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, 791 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 655f7a4..c8413af 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..bed09c5
--- /dev/null
+++ b/src/strrb.c
@@ -0,0 +1,169 @@
+/* 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 message slots in the osmo_strrb.
+ * \returns A struct osmo_strrb* on success, NULL in case of error.
+ *
+ * This function creates and initializes a ringbuffer.
+ * Note that the ringbuffer stores at most rb_size - 1 messages.
+ */
+
+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;
+ 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;
+ }
+
+ /* start and end are zero already, which is correct */
+ rb->size = rb_size;
+ 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..c2ca041 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-32767>'%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-32767>",
+ LOG_STR "Logging alarms to osmo_strrb\n"
+ "Maximum number of messages to log (+1)\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..abe649f
--- /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 3
+
+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, 4);
+ 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
2
1
[PATCH] build: resolve link failure in libosmogsm when --disable-talloc is used
by Jan Engelhardt 18 Feb '13
by Jan Engelhardt 18 Feb '13
18 Feb '13
The link stage fails at some point. libosmogsm.so:lapd-core.c uses
talloc_free, but does not link to libtalloc.so. Correct this.
CCLD osmo-arfcn
../src/gsm/.libs/libosmogsm.so: undefined reference to `talloc_free'
collect2: error: ld returned 1 exit status
make[2]: *** [osmo-arfcn] Error 1
---
src/gsm/Makefile.am | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/gsm/Makefile.am b/src/gsm/Makefile.am
index b72a8d4..237e134 100644
--- a/src/gsm/Makefile.am
+++ b/src/gsm/Makefile.am
@@ -23,5 +23,8 @@ libosmogsm_la_SOURCES = a5.c rxlev_stat.c tlv_parser.c comp128.c gsm_utils.c \
libosmogsm_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libosmogsm.map -version-info $(LIBVERSION)
libosmogsm_la_LIBADD = $(top_builddir)/src/libosmocore.la
+if !ENABLE_TALLOC
+libosmogsm_la_LIBDADD = -ltalloc
+endif
EXTRA_DIST = libosmogsm.map
--
1.7.10.4
3
2
Hello All,
can not run GPRS on nanoBTS 140 (1900 version)
everything looks good, but it is impossible to connect ..
do not see any new messages between nanoBTS and SGSN, only some
keep-alives ? (please find attached PCAP file)
everything you can find below, please sorry for flood :(
part of OpeBSC config:
gprs mode gprs
gprs routing area 10
gprs cell bvci 2
gprs nsei 101
gprs nsvc 0 nsvci 101
gprs nsvc 0 local udp port 23000
gprs nsvc 0 remote udp port 23000
gprs nsvc 0 remote ip 192.168.24.26
trx 0
rf_locked 0
arfcn 560
nominal power 23
max_power_red 0
rsl e1 tei 0
timeslot 0
phys_chan_config CCCH+SDCCH4
timeslot 1
phys_chan_config SDCCH8
timeslot 2
phys_chan_config TCH/F
timeslot 3
phys_chan_config PDCH
timeslot 4
phys_chan_config PDCH
timeslot 5
phys_chan_config PDCH
timeslot 6
phys_chan_config PDCH
timeslot 7
phys_chan_config PDCH
part of OpenBSC console:
<0019> input/ipa.c:322 accept()ed new link from 192.168.24.162 to port
3003
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,00) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=BTS(01) INST=(00,ff,ff) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=BASEBAND-TRANSCEIVER(04) INST=(00,00,ff) STATE
CHG: OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=RADIO-CARRIER(02) INST=(00,00,ff) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,00) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,01) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,01) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,01) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,02) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,02) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,02) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,03) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,03) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,03) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=GPRS-CELL(f1) INST=(00,00,ff) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=GPRS-CELL(f1) INST=(00,00,ff) STATE CHG:
OP_STATE=Disabled AVAIL=Failed(01) ADM=Unlocked
<0005> abis_nm.c:315 OC=GPRS-CELL(f1) INST=(00,00,ff) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:1757 OC=GPRS-CELL(f1) INST=(00,00,ff) Sending OPSTART
<0005> abis_nm.c:315 OC=GPRS-CELL(f1) INST=(00,00,ff) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=GPRS-CELL(f1) INST=(00,00,ff) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,04) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,04) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,04) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,05) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,05) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,05) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,06) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,06) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,06) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,07) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,07) STATE CHG:
OP_STATE=Disabled AVAIL=Dependency(05) ADM=Unlocked
<0005> abis_nm.c:315 OC=CHANNEL(03) INST=(00,00,07) STATE CHG:
OP_STATE=Enabled ADM=Unlocked
<0005> abis_nm.c:2418 OC=GPRS-CELL(f1) INST=(00,00,ff) IPACCESS(0xf6):
SET ATTR ACK
SGSN config:
sgsn
gtp local-ip 192.168.24.26
ggsn 0 remote-ip 192.168.24.25
ggsn 0 gtp-version 1
ns
timer tns-block 3
timer tns-block-retries 3
timer tns-reset 3
timer tns-reset-retries 3
timer tns-test 30
timer tns-alive 3
timer tns-alive-retries 10
encapsulation udp local-ip 192.168.24.26
encapsulation udp local-port 23000
encapsulation framerelay-gre enabled 0
bssgp
SGSN console:
<0010> gprs_ns.c:679 NSEI=101 Rx NS RESET (NSVCI=101, cause=O&M
intervention)
<0010> gprs_ns.c:538 NSEI=101 Tx NS RESET ACK (NSVCI=101)
<0010> gprs_ns.c:679 NSEI=101 Rx NS RESET (NSVCI=101, cause=O&M
intervention)
<0010> gprs_ns.c:538 NSEI=101 Tx NS RESET ACK (NSVCI=101)
<0010> gprs_ns.c:865 NSEI=101 Rx NS UNBLOCK
<0011> gprs_bssgp.c:249 BSSGP BVCI=0 Rx RESET cause=Transmission
capacity modified
<0011> gprs_bssgp.c:249 BSSGP BVCI=2 Rx RESET cause=O&M intervention
<0011> gprs_bssgp.c:272 Cell 247-9-10-10 CI 10201 on BVCI 2
<0011> gprs_bssgp.c:306 BSSGP Rx BVCI=2 BVC-BLOCK
<0011> gprs_bssgp.c:344 BSSGP BVCI=2 Rx BVC-UNBLOCK
<0011> gprs_bssgp.c:747 BSSGP BVCI=2 Rx Flow Control BVC
nanoBTS:
MAC_Address='00:02:95:00:0b:8d' IP_Address='192.168.24.162'
Unit_ID='1/0/0' Location_1='' Location_2='BTS_NBT131G'
Equipment_Version='140_029_24' Software_Version='120a002_v149b44d0'
nanoBTS Boot messages:
4050:DBG:CLI_SKT:Remote client 192.168.24.25 connected
4103:DBG:IP_CHAN_SERVER:Created server listening on port 80
4470:DBG:OAM_IM:Started "Primary OML Fallback Client"
4470:DBG:OAM_IM:Started "Secondary OML Server"
4470:DBG:OAM_IM:"IML Site Server": not starting
4470:DBG:OAM_IM:(Not started "IML Site Server")
4470:DBG:OAM_IM:"IML Bts Server": not starting
4470:DBG:OAM_IM:(Not started "IML Bts Server")
4470:DBG:OAM_IM:"IRL Patched Routing Link": not starting
4470:DBG:OAM_IM:(Not started "IRL Patched Routing Link")
4473:DBG:IP_CHANNEL:Assigning RX Client A
4474:DBG:IP_CHAN_RX_A:Attempting connection to 192.168.24.25:3002
4482:DBG:IP_CHAN_SERVER:Created server listening on port 3006
4497:DBG:IDLE:All tasks activated.
5289:DBG:OAM_IM:Set SYSTEM LINK to 40.255
5332:DBG:OAM_MOI:Can Activate?=TRUE
5332:DBG:OAM_MOI:Sw Activate - activating BH idx=0
5332:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=157)
5333:DBG:OAM_IM:roleInstanceProcClearContaineeFlags: BTS:0 flag 3 not
setting or set!
5333:DBG:OAM_IM:roleInstanceProcClearContaineeFlags: GPRS NSE:0 flag 3
not setting or set!
5344:DBG:OAM_MOI:Can Activate?=TRUE
5344:DBG:OAM_MOI:Sw Activate - already activated BH idx=0
5344:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=29)
5345:DBG:OAM_MOI:Can Activate?=TRUE
5345:DBG:OAM_MOI:Sw Activate - already activated BH idx=0
5345:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=157)
5347:DBG:GB_OAM:Received OPEN_REQ for NSE 0.
5356:DBG:OAM_MOI:oid=BTS:0 publisher attributes set
5358:DBG:OAM_MOI:Can Activate?=TRUE
5358:DBG:OAM_MOI:Sw Activate - already activated BH idx=0
5358:DBG:OAM_MOI:Sw Activate - sending trx boot request to activate TRX
idx=0
5358:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=0)
5359:DBG:OAM_MOI:Can Activate?=TRUE
5359:DBG:OAM_MOI:Sw Activate - already activated BH idx=0
5359:DBG:OAM_MOI:Sw Activate - already activated TRX idx=0
5359:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=0)
5362:DBG:OAM_MOI:Can Activate?=TRUE
5362:DBG:OAM_MOI:Sw Activate - already activated BH idx=0
5362:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=0)
5367:DBG:GB_OAM:PDU_GPRS_HEADER_SIZE = 24
5367:DBG:GB_OAM:PDU_GPRS_HEADER_PADDING (paramStart) = 4
5367:DBG:GB_OAM:PDU_GPRS_OUR_HSS_HEADER_SIZE = 28
5367:DBG:GB_OAM:PDU_GPRS_HSS_MALLOC_PADDING = 0
5367:DBG:GB_OAM:PDU_GPRS_UL_HEAD_RESERVED_BYTES = 24
5367:DBG:GB_OAM:PDU_GPRS_UL_TAIL_RESERVED_BYTES = 0
5367:DBG:GB_OAM:PDU_GPRS_DL_HEAD_RESERVED_BYTES = 0
5367:DBG:GB_OAM:PDU_GPRS_DL_TAIL_RESERVED_BYTES = 0
5368:DBG:GBHSS_STACK:Fixing PDU 4371 length: paramSize = 5, totalSize =
4
5371:DBG:OAM_MOI:oid=GPRS NSE:0 subscriber attributes set
5371:DBG:OAM_MOI:oid=GPRS NSE:0 publisher attributes set
5372:DBG:OAM_MOI:Can Activate?=TRUE
5372:DBG:OAM_MOI:Sw Activate - already activated BH idx=0
5372:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=0)
5373:DBG:OAM_MOI:Can Activate?=TRUE
5373:DBG:OAM_MOI:Sw Activate - already activated BH idx=0
5373:DBG:OAM_MOI:Sw Activate - BH(def=0 act=0) TRX(def=0 act=0)
5375:DBG:OAM_MOI:oid=GPRS Cell:0-0 publisher attributes set
5376:DBG:GB_OAM:Received OPEN_REQ for NSVC 0.
5376:DBG:GB_OAM:Received OPEN_REQ for NSVC 1.
5377:DBG:TRX_BOOT:CLI Uart disabled during TRX boot procedure, in 5...
5402:DBG:GBHSS_STACK:nsvc = [101], src_ip = [C0A818A2], src_port =
[23000], dst_ip = [C0A8181A],dst_port = [23000],
5402:DBG:GBHSS_STACK:A new socket created for (IP,Port)
5403:DBG:OAM_MOI:oid=GPRS NSVC:0-0 subscriber attributes set
5403:DBG:OAM_MOI:oid=GPRS NSVC:0-0 publisher attributes set
5415:DBG:GB_OAM:oamDeviceSendOnCnf(6,0).
5415:DBG:OAM_RES:[RES_MGR]<--ResOnCnf--[RES] not sent.
5416:DBG:GB_OAM:oamDeviceSendOnCnf(7,0).
5416:DBG:OAM_RES:[RES_MGR]<--ResOnCnf--[RES] not sent.
6459:DBG:TRX_BOOT:Booting TRX image idx=0
6656:DBG:TRX_BOOT:Got ACK from ULM
8336:DBG:TRX_BOOT:Downloaded ChangeBaudMst to ULM
8439:DBG:TRX_BOOT:DEBUG from TRX: ChangeBaudMst.
9228:DBG:TRX_BOOT:DEBUG from TRX: FPGA Reports (Ver: 0x0300)
10216:DBG:TRX_BOOT:DEBUG from TRX: FPGA SRAM pass=1
10385:DBG:TRX_BOOT:DEBUG from TRX: FPGA HDLC Loopback finished:
Packet Errors=0 Byte Errors=0
10398:DBG:TRX_BOOT:Got POST msg for ULM: All OK
10416:DBG:TRX_BOOT:Got Image Req msg ImageId [0x1004]
10517:DBG:TRX_BOOT:ULM has requested baud rate change to 38400
10535:DBG:TRX_BOOT:Changed baud OK
10574:DBG:TRX_BOOT:DEBUG from TRX: Masterloader.
12949:DBG:TRX_BOOT:DEBUG from TRX: ChangeBaudSlv downloaded to ULS
12994:DBG:TRX_BOOT:DEBUG from TRX: Changed baud OK
15291:DBG:TRX_BOOT:DEBUG from TRX: ChangeBaudSlv downloaded to DLP
15337:DBG:TRX_BOOT:DEBUG from TRX: Changed baud OK
15350:DBG:TRX_BOOT:Got POST msg for ULS: All OK
16028:DBG:TRX_BOOT:Got POST msg for DLP: All OK
16115:DBG:TRX_BOOT:DEBUG from TRX: Got Image Req msg ImageId
[0x1003]
16308:DBG:TRX_BOOT:DEBUG from TRX: Got Image Req msg ImageId
[0x1003]
16477:DBG:TRX_BOOT:DEBUG from TRX: Changed baud OK
16564:DBG:TRX_BOOT:DEBUG from TRX: Got Image Req msg ImageId
[0x1009]
16581:DBG:TRX_BOOT:Got Image Req msg ImageId [0x1008]
17038:DBG:TRX_BOOT:DEBUG from TRX: Changed baud OK
17125:DBG:TRX_BOOT:DEBUG from TRX: Got Image Req msg ImageId
[0x1009]
17142:DBG:TRX_BOOT:Got Image Req msg ImageId [0x1009]
17654:DBG:TRX_BOOT:Got Image Req msg ImageId [0x1007]
18100:DBG:TRX_BOOT:TRX status report: Application code activated
18280:DBG:TRX_BOOT:Booted TRX idx=0
18280:DBG:RSL:478:rsl: EVENT 0x00000bc9 rxd in STATE initial
18280:DBG:RSL:478:rsl: ENTERING open
19266:DBG:GENIE_SERVER:TRX now ready for genie signals.
19613:DBG:RSL:714:rsl: EVENT 0x00000bca rxd in STATE opennotconnected
19617:DBG:OAM_MOI:oid=BBTRX:0-0 subscriber attributes set
19617:DBG:OAM_MOI:oid=BBTRX:0-0 publisher attributes set
19620:DBG:OAM_MOI:oid=GPRS Cell:0-0 subscriber attributes set
19621:DBG:OAM_MOI:oid=Carrier:0-0 subscriber attributes set
19621:DBG:OAM_MOI:oid=Carrier:0-0 publisher attributes set
19637:DBG:RSL:871:rsl: EVENT 0x00000bc8 rxd in STATE offnotconnected
19637:DBG:RSL:871:rsl: ENTERING on
nanoBTS console:
>res::info
----- TRX Status -----
activated=1 attempts(num=07 peak=07 max=25)
responding=1 attempts(num=00 peak=01 max=05)
----- Resources -----
[Baseband Transceiver][0] on
[ Channel][0] on
[ Channel][1] on
[ Channel][2] on
[ Channel][3] on
[ Channel][4] on
[ Channel][5] on
[ Channel][6] on
[ Channel][7] on
[ Radio Carrier][0] on
[ RSL][0] on
[ Alarm][0] on
[ TIB][0] on
[ GPRS NSE][0] on
[ GPRS NSVC][0] on
[ GPRS NSVC][1] off
[ GPRS Cell][0] on
[ GPRS PDCH][0] off
[ GPRS PDCH][1] off
[ GPRS PDCH][2] off
[ GPRS PDCH][3] on
[ GPRS PDCH][4] on
[ GPRS PDCH][5] on
[ GPRS PDCH][6] on
[ GPRS PDCH][7] on
>moi::info
----- MOI Info -----
[ Site] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 4
(noadminstatenotinproc)
(active)
[ BTS:0] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 6
(unlockednotinproc)
band="PCS 1900" arfcn=560 (valid=1) bsic=63 (active)
[ BBTRX:0-0] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 11
(unlockednotinproc)
(active)
[ Channel:0-0-0] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 17
(unlockednotinproc)
BCCH (Combined) <channel fail=0 off=0 d=0 i=0> <pdch
off=1 d=1 i=1> (other)
[ Channel:0-0-1] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 24
(unlockednotinproc)
SDCCH <channel fail=0 off=0 d=0 i=0> <pdch off=1 d=1
i=1> (other)
[ Channel:0-0-2] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 31
(unlockednotinproc)
TCH (Full) <channel fail=0 off=0 d=0 i=0> <pdch off=1
d=1 i=1> (other)
[ Channel:0-0-3] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 38
(unlockednotinproc)
PDCH <channel fail=0 off=0 d=0 i=0> <pdch off=0 d=0
i=0> (pdch)
[ Channel:0-0-4] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 45
(unlockednotinproc)
PDCH <channel fail=0 off=0 d=0 i=0> <pdch off=0 d=0
i=0> (pdch)
[ Channel:0-0-5] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 52
(unlockednotinproc)
PDCH <channel fail=0 off=0 d=0 i=0> <pdch off=0 d=0
i=0> (pdch)
[ Channel:0-0-6] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 59
(unlockednotinproc)
PDCH <channel fail=0 off=0 d=0 i=0> <pdch off=0 d=0
i=0> (pdch)
[ Channel:0-0-7] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 66
(unlockednotinproc)
PDCH <channel fail=0 off=0 d=0 i=0> <pdch off=0 d=0
i=0> (pdch)
[ Carrier:0-0] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 73
(unlockednotinproc)
(active)
[ GPRS NSE:0] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 82
(unlockednotinproc)
(active)
[ GPRS Cell:0-0] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 89
(unlockednotinproc)
(active)
[ GPRS NSVC:0-0] <as=UL ad=UL bd=0 od=0 cd=0 ci=0 rf=0 rd=0 ri=0> 104
(unlockednotinproc)
(active)
[ GPRS NSVC:0-1] <as=LK ad=UL bd=1 od=1 cd=0 ci=0 rf=0 rd=1 ri=1> 109
(lockednotinproc)
(active)
>
>
>moi::states
----- MOI States -----
[ Site] (invalid), Enabled,
[ BTS:0] Unlocked, Enabled,
[ BBTRX:0-0] Unlocked, Enabled,
[ Channel:0-0-0] Unlocked, Enabled,
[ Channel:0-0-1] Unlocked, Enabled,
[ Channel:0-0-2] Unlocked, Enabled,
[ Channel:0-0-3] Unlocked, Enabled,
[ Channel:0-0-4] Unlocked, Enabled,
[ Channel:0-0-5] Unlocked, Enabled,
[ Channel:0-0-6] Unlocked, Enabled,
[ Channel:0-0-7] Unlocked, Enabled,
[ Carrier:0-0] Unlocked, Enabled,
[ GPRS NSE:0] Unlocked, Enabled,
[ GPRS Cell:0-0] Unlocked, Enabled,
[ GPRS NSVC:0-0] Unlocked, Enabled,
[ GPRS NSVC:0-1] (invalid), Disabled, <Offline><Dependency>
>
nanoBTS debug info:
PktResReq
0xffb9027f = 17 df 41 9a cf e8 f4 a2 ae 57 .�A�� ����W
0xffb90289 = ef 90 90 04 01 10 00 07 e0 08 .. ...�.
0xffb90293 = 8b 2b b3 00 00 c3 68 00 00 fc �+�.. �h..�
12121:DBG:RM:!!! unpackPacketResourceRequest() : -2147483647 : General
function failure
12731:DBG:RM:!!! bitUnpackRadioAccessCapability() - numRaCap=0
12732:DBG:RM:!!! bitUnpackRadioAccessCapability() : -2147483647 :
General function failure
PktResReq
0xffb92697 = 17 df 41 9a cf e8 f4 a2 ae 57 .�A�� ����W
0xffb926a1 = ef 90 90 04 01 10 00 07 e0 08 .. ...�.
0xffb926ab = 8b 2b 86 00 00 c3 68 00 00 fc �+�.. �h..�
12732:DBG:RM:!!! unpackPacketResourceRequest() : -2147483647 : General
function failure
13142:DBG:RM:TBF=88 (U/L) - STATS: Immediate Assignment failure
(timeout).
13342:DBG:RM:!!! bitUnpackRadioAccessCapability() - numRaCap=0
13343:DBG:RM:!!! bitUnpackRadioAccessCapability() : -2147483647 :
General function failure
PktResReq
0xffb91f5f = 17 df 41 9a cf e8 f4 a2 ae 57 .�A�� ����W
0xffb91f69 = ef 90 90 04 01 10 00 07 e0 08 .. ...�.
0xffb91f73 = 8b 2b a5 a5 a5 a5 a5 a5 a5 a5 �+��� �����
13343:DBG:RM:!!! unpackPacketResourceRequest() : -2147483647 : General
function failure
13752:DBG:RM:TBF=89 (U/L) - STATS: Immediate Assignment failure
(timeout).
13953:DBG:RM:!!! bitUnpackRadioAccessCapability() - numRaCap=0
13954:DBG:RM:!!! bitUnpackRadioAccessCapability() : -2147483647 :
General function failure
PktResReq
0xffb91827 = 17 df 41 9a cf e8 f4 a2 ae 57 .�A�� ����W
0xffb91831 = ef 90 90 04 01 10 00 07 e0 08 .. ...�.
0xffb9183b = 8b 2b 00 10 5b a5 a5 a5 a5 a5 �+..[ �����
13954:DBG:RM:!!! unpackPacketResourceRequest() : -2147483647 : General
function failure
14366:DBG:RM:TBF=90 (U/L) - STATS: Immediate Assignment failure
(timeout).
14977:DBG:RM:TBF=91 (U/L) - STATS: Immediate Assignment failure
(timeout).
Br,
Sergei
1
0
hi,
just had problems with jitter of RTP via wireless lan. changing size of
jitter buffer did not solve the problems, packets got dropped. this
patch allows to disables the jitter buffer, if a jitter value of 0 is given.
regards,
andreas
4
3
[PATCH] Doxygen tweaks: fixed a lot of typos and minor errors (amended)
by Katerina Barone-Adesi 15 Feb '13
by Katerina Barone-Adesi 15 Feb '13
15 Feb '13
This patch supersedes the previous doxygen patch of today.
---
Doxyfile.codec.in | 4 ++--
Doxyfile.core.in | 4 ++--
Doxyfile.gsm.in | 4 ++--
Doxyfile.vty.in | 4 ++--
include/osmocom/core/conv.h | 2 +-
include/osmocom/core/crcXXgen.h.tpl | 2 +-
include/osmocom/core/crcgen.h | 2 +-
include/osmocom/core/gsmtap_util.h | 2 ++
include/osmocom/core/logging.h | 2 +-
include/osmocom/core/msgb.h | 2 +-
include/osmocom/core/prim.h | 6 ++++--
include/osmocom/core/serial.h | 2 +-
include/osmocom/core/statistics.h | 2 +-
include/osmocom/gsm/lapd_core.h | 8 +++++---
src/bits.c | 4 ++--
src/bitvec.c | 2 +-
src/conv.c | 2 +-
src/crcXXgen.c.tpl | 2 +-
src/gsm/auth_core.c | 4 ++--
src/gsm/lapd_core.c | 3 ++-
src/gsm/tlv_parser.c | 2 +-
src/gsmtap_util.c | 6 +++---
src/msgb.c | 6 +++---
src/serial.c | 2 +-
src/socket.c | 2 +-
src/timer.c | 2 +-
26 files changed, 45 insertions(+), 38 deletions(-)
diff --git a/Doxyfile.codec.in b/Doxyfile.codec.in
index 1b0df5e..4f539c7 100644
--- a/Doxyfile.codec.in
+++ b/Doxyfile.codec.in
@@ -688,7 +688,7 @@ EXAMPLE_RECURSIVE = NO
# directories that contain image that are included in the documentation (see
# the \image command).
-IMAGE_PATH = images/
+# IMAGE_PATH = images/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -1406,7 +1406,7 @@ PERLMOD_MAKEVAR_PREFIX =
# evaluate all C-preprocessor directives found in the sources and include
# files.
-ENABLE_PREPROCESSING = NO
+ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
diff --git a/Doxyfile.core.in b/Doxyfile.core.in
index 4baa3d5..71843cc 100644
--- a/Doxyfile.core.in
+++ b/Doxyfile.core.in
@@ -688,7 +688,7 @@ EXAMPLE_RECURSIVE = NO
# directories that contain image that are included in the documentation (see
# the \image command).
-IMAGE_PATH = images/
+# IMAGE_PATH = images/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -1406,7 +1406,7 @@ PERLMOD_MAKEVAR_PREFIX =
# evaluate all C-preprocessor directives found in the sources and include
# files.
-ENABLE_PREPROCESSING = NO
+ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
diff --git a/Doxyfile.gsm.in b/Doxyfile.gsm.in
index 36a6ae2..c4a837f 100644
--- a/Doxyfile.gsm.in
+++ b/Doxyfile.gsm.in
@@ -688,7 +688,7 @@ EXAMPLE_RECURSIVE = NO
# directories that contain image that are included in the documentation (see
# the \image command).
-IMAGE_PATH = images/
+# IMAGE_PATH = images/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -1406,7 +1406,7 @@ PERLMOD_MAKEVAR_PREFIX =
# evaluate all C-preprocessor directives found in the sources and include
# files.
-ENABLE_PREPROCESSING = NO
+ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
diff --git a/Doxyfile.vty.in b/Doxyfile.vty.in
index 527cdb2..5f7a158 100644
--- a/Doxyfile.vty.in
+++ b/Doxyfile.vty.in
@@ -688,7 +688,7 @@ EXAMPLE_RECURSIVE = NO
# directories that contain image that are included in the documentation (see
# the \image command).
-IMAGE_PATH = images/
+# IMAGE_PATH = images/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -1406,7 +1406,7 @@ PERLMOD_MAKEVAR_PREFIX =
# evaluate all C-preprocessor directives found in the sources and include
# files.
-ENABLE_PREPROCESSING = NO
+ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
# names in the source code. If set to NO (the default) only conditional
diff --git a/include/osmocom/core/conv.h b/include/osmocom/core/conv.h
index e5b2a97..4cc791f 100644
--- a/include/osmocom/core/conv.h
+++ b/include/osmocom/core/conv.h
@@ -25,7 +25,7 @@
*/
/*! \file conv.h
- * \file Osmocom convolutional encoder and decoder
+ * Osmocom convolutional encoder and decoder
*/
#ifndef __OSMO_CONV_H__
diff --git a/include/osmocom/core/crcXXgen.h.tpl
b/include/osmocom/core/crcXXgen.h.tpl
index 89d083a..a931bc3 100644
--- a/include/osmocom/core/crcXXgen.h.tpl
+++ b/include/osmocom/core/crcXXgen.h.tpl
@@ -28,7 +28,7 @@
*/
/*! \file crcXXgen.h
- * \file Osmocom generic CRC routines (for max XX bits poly) header
+ * Osmocom generic CRC routines (for max XX bits poly) header
*/
diff --git a/include/osmocom/core/crcgen.h b/include/osmocom/core/crcgen.h
index 8e208a7..69cef04 100644
--- a/include/osmocom/core/crcgen.h
+++ b/include/osmocom/core/crcgen.h
@@ -28,7 +28,7 @@
*/
/*! \file crcgen.h
- * \file Osmocom generic CRC routines global header
+ * Osmocom generic CRC routines global header
*/
#include <osmocom/core/crc8gen.h>
diff --git a/include/osmocom/core/gsmtap_util.h
b/include/osmocom/core/gsmtap_util.h
index 5609381..eaa32a0 100644
--- a/include/osmocom/core/gsmtap_util.h
+++ b/include/osmocom/core/gsmtap_util.h
@@ -54,4 +54,6 @@ int gsmtap_send(struct gsmtap_inst *gti, uint16_t
arfcn, uint8_t ts,
int8_t signal_dbm, uint8_t snr, const uint8_t *data,
unsigned int len);
+/*! @} */
+
#endif /* _GSMTAP_UTIL_H */
diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index dc55d37..19f35b2 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -163,7 +163,7 @@ struct log_target {
/*! \brief call-back function to be called when the logging framework
* wants to log somethnig.
- * \param[[in] target logging target
+ * \param[in] target logging target
* \param[in] level log level of currnet message
* \param[in] string the string that is to be written to the log
*/
diff --git a/include/osmocom/core/msgb.h b/include/osmocom/core/msgb.h
index a1939ab..fe2733b 100644
--- a/include/osmocom/core/msgb.h
+++ b/include/osmocom/core/msgb.h
@@ -361,7 +361,7 @@ static inline int msgb_trim(struct msgb *msg, int len)
}
/*! \brief Trim the msgb to a given layer3 length
- * \pram[in] msg message buffer
+ * \param[in] msg message buffer
* \param[in] l3len new layer3 length
* \returns 0 in case of success, negative in case of error
*/
diff --git a/include/osmocom/core/prim.h b/include/osmocom/core/prim.h
index b1026fe..f61d808 100644
--- a/include/osmocom/core/prim.h
+++ b/include/osmocom/core/prim.h
@@ -5,7 +5,7 @@
* @{
*/
-/*! \file prim.c */
+/*! \file prim.h */
#include <stdint.h>
#include <osmocom/core/msgb.h>
@@ -37,7 +37,7 @@ struct osmo_prim_hdr {
/*! \brief initialize a primitive header
* \param[in,out] oph primitive header
* \param[in] sap Service Access Point
- * \param[in] primtive Primitive Number
+ * \param[in] primitive Primitive Number
* \param[in] operation Primitive Operation (REQ/RESP/IND/CONF)
* \param[in] msg Message
*/
@@ -55,4 +55,6 @@ osmo_prim_init(struct osmo_prim_hdr *oph, unsigned int sap,
/*! \brief primitive handler callback type */
typedef int (*osmo_prim_cb)(struct osmo_prim_hdr *oph, void *ctx);
+/*! @} */
+
#endif /* OSMO_PRIMITIVE_H */
diff --git a/include/osmocom/core/serial.h b/include/osmocom/core/serial.h
index 889bd8a..1640a6d 100644
--- a/include/osmocom/core/serial.h
+++ b/include/osmocom/core/serial.h
@@ -25,7 +25,7 @@
*/
/*! \file serial.h
- * \file Osmocom serial port helpers
+ * Osmocom serial port helpers
*/
#ifndef __OSMO_SERIAL_H__
diff --git a/include/osmocom/core/statistics.h
b/include/osmocom/core/statistics.h
index 04816c1..ade0074 100644
--- a/include/osmocom/core/statistics.h
+++ b/include/osmocom/core/statistics.h
@@ -34,7 +34,7 @@ static inline void osmo_counter_reset(struct
osmo_counter *ctr)
struct osmo_counter *osmo_counter_alloc(const char *name);
/*! \brief Free the specified counter
- * \param[ctr] Counter
+ * \param[in] ctr Counter
*/
void osmo_counter_free(struct osmo_counter *ctr);
diff --git a/include/osmocom/gsm/lapd_core.h b/include/osmocom/gsm/lapd_core.h
index 0f4e889..c2fdc62 100644
--- a/include/osmocom/gsm/lapd_core.h
+++ b/include/osmocom/gsm/lapd_core.h
@@ -11,9 +11,9 @@
* @{
*/
-/*! \file lapd.h */
-
-/* primitive related sutff */
+/*! \file lapd_core.h
+ * primitive related stuff
+ */
/*! \brief LAPD related primitives (L2<->L3 SAP)*/
enum osmo_dl_prim {
@@ -168,4 +168,6 @@ int lapd_set_mode(struct lapd_datalink *dl, enum
lapd_mode mode);
int lapd_ph_data_ind(struct msgb *msg, struct lapd_msg_ctx *lctx);
int lapd_recv_dlsap(struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx);
+/*! @} */
+
#endif /* _OSMOCOM_LAPD_H */
diff --git a/src/bits.c b/src/bits.c
index f3453e5..6be6d7a 100644
--- a/src/bits.c
+++ b/src/bits.c
@@ -180,8 +180,8 @@ uint32_t osmo_revbytebits_8(uint8_t x)
}
/*! \brief reverse bit-order of each byte in a buffer
- * \param buf buffer containing bytes to be bit-reversed
- * \param[in] length of buffer in bytes
+ * \param[in] buf buffer containing bytes to be bit-reversed
+ * \param[in] len length of buffer in bytes
*
* This function reverses the bits in each byte of the buffer
*/
diff --git a/src/bitvec.c b/src/bitvec.c
index 714c11b..8da5a48 100644
--- a/src/bitvec.c
+++ b/src/bitvec.c
@@ -132,7 +132,7 @@ unsigned int bitvec_get_nth_set_bit(const struct
bitvec *bv, unsigned int n)
/*! \brief set a bit at given position in a bit vector
* \param[in] bv bit vector on which to operate
- * \param[in] bitnum number of bit to be set
+ * \param[in] bitnr number of bit to be set
* \param[in] bit value to which the bit is to be set
*/
int bitvec_set_bit_pos(struct bitvec *bv, unsigned int bitnr,
diff --git a/src/conv.c b/src/conv.c
index ebc3eda..f13deef 100644
--- a/src/conv.c
+++ b/src/conv.c
@@ -27,7 +27,7 @@
*/
/*! \file conv.c
- * \file Osmocom convolutional encoder and decoder
+ * Osmocom convolutional encoder and decoder
*/
#include "config.h"
#ifdef HAVE_ALLOCA_H
diff --git a/src/crcXXgen.c.tpl b/src/crcXXgen.c.tpl
index 2a4bf21..7e45c11 100644
--- a/src/crcXXgen.c.tpl
+++ b/src/crcXXgen.c.tpl
@@ -27,7 +27,7 @@
*/
/*! \file crcXXgen.c
- * \file Osmocom generic CRC routines (for max XX bits poly)
+ * Osmocom generic CRC routines (for max XX bits poly)
*/
#include <stdint.h>
diff --git a/src/gsm/auth_core.c b/src/gsm/auth_core.c
index 5cf8dfc..3a0866b 100644
--- a/src/gsm/auth_core.c
+++ b/src/gsm/auth_core.c
@@ -93,7 +93,7 @@ int osmo_auth_supported(enum osmo_auth_algo algo)
/*! \brief Generate authentication vector
* \param[out] vec Generated authentication vector
* \param[in] aud Subscriber-specific key material
- * \param[in] rand Random challenge to be used
+ * \param[in] _rand Random challenge to be used
*
* This function performs the core cryptographic function of the AUC,
* computing authentication triples/quintuples based on the permanent
@@ -125,7 +125,7 @@ int osmo_auth_gen_vec(struct osmo_auth_vector *vec,
* \param[in] aud Subscriber-specific key material
* \param[in] rand_auts RAND value sent by the SIM/MS
* \param[in] auts AUTS value sent by the SIM/MS
- * \param[in] rand Random challenge to be used to generate vector
+ * \param[in] _rand Random challenge to be used to generate vector
*
* This function performs a special variant of the core cryptographic
* function of the AUC: computing authentication triples/quintuples
diff --git a/src/gsm/lapd_core.c b/src/gsm/lapd_core.c
index 0dc78eb..b33cf6e 100644
--- a/src/gsm/lapd_core.c
+++ b/src/gsm/lapd_core.c
@@ -25,7 +25,7 @@
* @{
*/
-/*! \file lapd.c */
+/*! \file lapd_core.c */
/*!
* Notes on Buffering: rcv_buffer, tx_queue, tx_hist, send_buffer, send_queue
@@ -2167,3 +2167,4 @@ int lapd_recv_dlsap(struct osmo_dlsap_prim *dp,
struct lapd_msg_ctx *lctx)
return rc;
}
+/*! @} */
diff --git a/src/gsm/tlv_parser.c b/src/gsm/tlv_parser.c
index d18a6bf..8cb2139 100644
--- a/src/gsm/tlv_parser.c
+++ b/src/gsm/tlv_parser.c
@@ -6,7 +6,7 @@
/*! \addtogroup tlv
* @{
*/
-/*! \file tlv.c */
+/*! \file tlv_parser.c */
struct tlv_definition tvlv_att_def;
struct tlv_definition vtvlv_gan_att_def;
diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c
index 77ab0c6..82690a9 100644
--- a/src/gsmtap_util.c
+++ b/src/gsmtap_util.c
@@ -49,7 +49,7 @@
/*! \brief convert RSL channel number to GSMTAP channel type
- * \param[in] rsl_cantype RSL channel type
+ * \param[in] rsl_chantype RSL channel type
* \param[in] link_id RSL link identifier
* \returns GSMTAP channel type
*/
@@ -216,7 +216,7 @@ int gsmtap_source_add_sink_fd(int gsmtap_fd)
/*! \brief Send a \ref msgb through a GSMTAP source
* \param[in] gti GSMTAP instance
- * \param[in] msgb message buffer
+ * \param[in] msg message buffer
*/
int gsmtap_sendmsg(struct gsmtap_inst *gti, struct msgb *msg)
{
@@ -339,7 +339,7 @@ int gsmtap_source_add_sink(struct gsmtap_inst *gti)
/*! \brief Open GSMTAP source socket, connect and register osmo_fd
* \param[in] host host name or IP address in string format
* \param[in] port UDP port number in host byte order
- * \param[in] osmo_wq_mode Register \ref osmo_wqueue (1) or not (0)
+ * \param[in] ofd_wq_mode Register \ref osmo_wqueue (1) or not (0)
*
* Open GSMTAP source (sending) socket, connect it to host/port,
* allocate 'struct gsmtap_inst' and optionally osmo_fd/osmo_wqueue
diff --git a/src/msgb.c b/src/msgb.c
index c8564db..359a545 100644
--- a/src/msgb.c
+++ b/src/msgb.c
@@ -74,7 +74,7 @@ void msgb_free(struct msgb *m)
/*! \brief Enqueue message buffer to tail of a queue
* \param[in] queue linked list header of queue
- * \param[in] msgb message buffer to be added to the queue
+ * \param[in] msg message buffer to be added to the queue
*
* The function will append the specified message buffer \a msg to the
* queue implemented by \ref llist_head \a queue
@@ -89,7 +89,7 @@ void msgb_enqueue(struct llist_head *queue, struct msgb *msg)
* \returns message buffer (if any) or NULL if queue empty
*
* The function will remove the first message buffer from the queue
- * implemented by 'ref llist_head \a queue.
+ * implemented by \ref llist_head \a queue.
*/
struct msgb *msgb_dequeue(struct llist_head *queue)
{
@@ -105,7 +105,7 @@ struct msgb *msgb_dequeue(struct llist_head *queue)
}
/*! \brief Re-set all message buffer pointers
- * \param[in] m message buffer that is to be resetted
+ * \param[in] msg message buffer that is to be resetted
*
* This will re-set the various internal pointers into the underlying
* message buffer, i.e. remvoe all headroom and treat the msgb as
diff --git a/src/serial.c b/src/serial.c
index a025ae9..66ee756 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -27,7 +27,7 @@
*/
/*! \file serial.c
- * \file Osmocom serial port helpers
+ * Osmocom serial port helpers
*/
#include <errno.h>
diff --git a/src/socket.c b/src/socket.c
index a5530d0..6ff00f0 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -129,7 +129,7 @@ int osmo_sock_init(uint16_t family, uint16_t type,
uint8_t proto,
}
/*! \brief Initialize a socket and fill \ref osmo_fd
- * \param[out] osmocom file descriptor (will be filled in)
+ * \param[out] ofd file descriptor (will be filled in)
* \param[in] family Address Family like AF_INET, AF_INET6, AF_UNSPEC
* \param[in] type Socket type like SOCK_DGRAM, SOCK_STREAM
* \param[in] proto Protocol like IPPROTO_TCP, IPPROTO_UDP
diff --git a/src/timer.c b/src/timer.c
index 98cbf6e..5988aef 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -128,7 +128,7 @@ int osmo_timer_pending(struct osmo_timer_list *timer)
/*! \brief compute the remaining time of a timer
* \param[in] timer the to-be-checked timer
- * \param[in] the current time (NULL if not known)
+ * \param[in] now the current time (NULL if not known)
* \param[out] remaining remaining time until timer fires
* \return 0 if timer has not expired yet, -1 if it has
*
--
1.7.9.5
2
1
[PATCH] Added a ring buffer log target to store the last N log messages.
by Katerina Barone-Adesi 14 Feb '13
by Katerina Barone-Adesi 14 Feb '13
14 Feb '13
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.
---
.gitignore | 2 +
include/osmocom/core/logging.h | 5 +
include/osmocom/core/loggingrb.h | 40 +++++++
include/osmocom/core/ringbuffer.h | 58 +++++++++
src/Makefile.am | 4 +-
src/loggingrb.c | 98 +++++++++++++++
src/ringbuffer.c | 173 +++++++++++++++++++++++++++
src/vty/logging_vty.c | 85 ++++++++++++-
tests/Makefile.am | 13 +-
tests/loggingrb/logging_test.err | 3 +
tests/loggingrb/loggingrb_test.c | 83 +++++++++++++
tests/ringbuffer/ringbuffer_test.c | 225 +++++++++++++++++++++++++++++++++++
tests/ringbuffer/ringbuffer_test.ok | 1 +
tests/testsuite.at | 13 ++
14 files changed, 795 insertions(+), 8 deletions(-)
create mode 100644 include/osmocom/core/loggingrb.h
create mode 100644 include/osmocom/core/ringbuffer.h
create mode 100644 src/loggingrb.c
create mode 100644 src/ringbuffer.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/ringbuffer/ringbuffer_test.c
create mode 100644 tests/ringbuffer/ringbuffer_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 655f7a4..dc55d37 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_RINGBUF, /*!< \brief ringbuffer-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/ringbuffer.h
b/include/osmocom/core/ringbuffer.h
new file mode 100644
index 0000000..7e16af7
--- /dev/null
+++ b/include/osmocom/core/ringbuffer.h
@@ -0,0 +1,58 @@
+#ifndef _RINGBUFFER_H
+#define _RINGBUFFER_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 ringbuffer Osmocom ringbuffers
+ * @{
+ */
+
+/*! \file ringbuffer.h
+ * \brief Osmocom ringbuffer handling routines
+ */
+
+#include <unistd.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <osmocom/core/talloc.h>
+
+/*! \brief A structure representing a ringbuffer */
+
+#define RB_MAX_MESSAGE_SIZE 240
+struct ringbuffer {
+ 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 ringbuffer *ringbuffer_create(TALLOC_CTX * ctx, size_t rb_size);
+bool ringbuffer_is_empty(const struct ringbuffer *rb);
+const char *ringbuffer_get_nth(const struct ringbuffer *rb,
+ unsigned int string_index);
+bool _ringbuffer_is_bufindex_valid(const struct ringbuffer *rb,
+ unsigned int offset);
+size_t ringbuffer_elements(const struct ringbuffer *rb);
+int ringbuffer_add(struct ringbuffer *rb, const char *data);
+
+/*! @} */
+
+#endif /* _RINGBUFFER_H */
diff --git a/src/Makefile.am b/src/Makefile.am
index b425ea1..1a0f621 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 ringbuffer.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..87cdddd
--- /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/ringbuffer.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)
+{
+ ringbuffer_add(target->tgt_rb.rb, log);
+}
+
+/*! \brief Return the number of log strings in the ringbuffer-backed target.
+ * \param[in] target The target to search.
+ *
+ * \return The number of log strings in the ringbuffer-backed target.
+ */
+size_t log_target_rb_used_size(struct log_target const *target)
+{
+ return ringbuffer_elements(target->tgt_rb.rb);
+}
+
+/*! \brief Return the capacity of the ringbuffer-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 ringbuffer-backed target.
+ */
+size_t log_target_rb_avail_size(struct log_target const *target)
+{
+ struct ringbuffer *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 ringbuffer_get_nth(target->tgt_rb.rb, logindex);
+}
+
+/*! \brief Create a new logging target for ringbuffer logging.
+ * \param[in] size The size of the internal backing ringbuffer.
+ * \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 ringbuffer *rb;
+
+ target = log_target_create();
+ if (!target)
+ return NULL;
+
+ rb = ringbuffer_create(target, size);
+ if (!rb) {
+ log_target_destroy(target);
+ return NULL;
+ }
+
+ target->tgt_rb.rb = rb;
+ target->type = LOG_TGT_TYPE_RINGBUF;
+ target->output = _rb_output;
+
+ return target;
+}
+
+/* @} */
diff --git a/src/ringbuffer.c b/src/ringbuffer.c
new file mode 100644
index 0000000..3e882b1
--- /dev/null
+++ b/src/ringbuffer.c
@@ -0,0 +1,173 @@
+/* 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 ringb.c
+ * \brief Lossy ringbuffer for logging; keeps newest messages.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+
+#include <osmocom/core/ringbuffer.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 ringbuffer.
+ * \param[in] ctx The talloc memory context which should own this.
+ * \param[in] rb_size The number of message slots in the ringbuffer.
+ * \returns A struct ringbuffer* on success, NULL in case of error.
+ *
+ * This function creates and initializes a ringbuffer.
+ * Note that the ringbuffer stores at most rb_size - 1 messages.
+ */
+
+/* http://talloc.samba.org/talloc/doc/html/libtalloc__bestpractices.html
+ * recommends functions that return dynamically allocated values use this style
+ */
+
+struct ringbuffer *ringbuffer_create(TALLOC_CTX * ctx, size_t rb_size)
+{
+ struct ringbuffer *rb = NULL;
+ unsigned int i;
+
+ rb = talloc_zero(ctx, struct ringbuffer);
+ if (!rb)
+ goto alloc_error;
+ 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;
+ }
+
+ /* start and end are zero already, which is correct */
+ rb->size = rb_size;
+ return rb;
+
+alloc_error: /* talloc_free(NULL) is safe */
+ talloc_free(rb);
+ return NULL;
+}
+
+/*! \brief Check if a ringbuffer is empty.
+ * \param[in] rb The ringbuffer to check.
+ * \returns True if the buffer is empty, false otherwise.
+ */
+bool ringbuffer_is_empty(const struct ringbuffer *rb)
+{
+ return rb->end == rb->start;
+}
+
+/*! \brief Return a pointer to the Nth string in the ringbuffer.
+ * \param[in] rb The ringbuffer to search.
+ * \param[in] string_index The index sought (N), zero-indexed.
+ *
+ * Return a pointer to the Nth string in the ringbuffer.
+ * 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 *ringbuffer_get_nth(const struct ringbuffer *rb,
+ unsigned int string_index)
+{
+ unsigned int offset = string_index + rb->start;
+
+ if ((offset >= rb->size) && (rb->start > rb->end))
+ offset -= rb->size;
+ if (_ringbuffer_is_bufindex_valid(rb, offset))
+ return rb->buffer[offset];
+
+ return NULL;
+}
+
+bool _ringbuffer_is_bufindex_valid(const struct ringbuffer *rb,
+ unsigned int bufi)
+{
+ if (ringbuffer_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 a ringbuffer.
+ * \param[in] rb The ringbuffer to count the elements of.
+ *
+ * \returns The number of log messages in the ringbuffer.
+ */
+size_t ringbuffer_elements(const struct ringbuffer *rb)
+{
+ if (rb->end < rb->start)
+ return rb->end + (rb->size - rb->start);
+
+ return rb->end - rb->start;
+}
+
+/*! \brief Add a string to the ringbuffer.
+ * \param[in] rb The ringbuffer to add to.
+ * \param[in] data The string to add.
+ *
+ * Add a message to the ring buffer.
+ * Older messages will be overwritten as necessary.
+ * \returns 0 normally, 1 as a warning (ie, if data was truncated).
+ */
+int ringbuffer_add(struct ringbuffer *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..3051974 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/ringbuffer.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 ringbuffer *rb;
+ struct log_target *tgt = log_target_find(LOG_TGT_TYPE_RINGBUF, NULL);
+ if (!tgt) {
+ vty_out(vty, "%% No alarms, run 'log alarms <2-32767>'%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ rb = tgt->tgt_rb.rb;
+ num_alarms = ringbuffer_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", ringbuffer_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-32767>",
+ LOG_STR "Logging alarms to ringbuffer\n"
+ "Maximum number of messages to log (+1)\n")
+{
+ struct log_target *tgt;
+ unsigned int rbsize = atoi(argv[0]);
+
+ tgt = log_target_find(LOG_TGT_TYPE_RINGBUF, NULL);
+ if (tgt)
+ log_target_destroy(tgt);
+
+ tgt = log_target_create_rb(rbsize);
+ if (!tgt) {
+ vty_out(vty, "%% Unable to create ringbuffer (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 ringbuffer\n")
+{
+ struct log_target *tgt;
+
+ tgt = log_target_find(LOG_TGT_TYPE_RINGBUF, NULL);
+ if (!tgt) {
+ vty_out(vty, "%% No ringbuffer 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_RINGBUF:
+ 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..21ba88d 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 ringbuffer/ringbuffer_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
+
+ringbuffer_ringbuffer_test_SOURCES = ringbuffer/ringbuffer_test.c
+ringbuffer_ringbuffer_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 ringbuffer/ringbuffer_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/ringbuffer/ringbuffer_test.c
b/tests/ringbuffer/ringbuffer_test.c
new file mode 100644
index 0000000..b7563ca
--- /dev/null
+++ b/tests/ringbuffer/ringbuffer_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/ringbuffer.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/logging.h>
+
+struct ringbuffer *rb0, *rb1, *rb2, *rb3, *rb4, *rb5;
+
+#define STR0 "hello"
+#define STR1 "a"
+#define STR2 "world"
+#define STR3 "sky"
+#define STR4 "moon"
+
+#define TESTSIZE 3
+
+void init_rbs(void)
+{
+ rb0 = ringbuffer_create(NULL, TESTSIZE);
+
+ rb1 = ringbuffer_create(NULL, TESTSIZE);
+ ringbuffer_add(rb1, STR0);
+
+ rb2 = ringbuffer_create(NULL, TESTSIZE);
+ ringbuffer_add(rb2, STR0);
+ ringbuffer_add(rb2, STR1);
+
+ rb3 = ringbuffer_create(NULL, TESTSIZE);
+ ringbuffer_add(rb3, STR0);
+ ringbuffer_add(rb3, STR1);
+ ringbuffer_add(rb3, STR2);
+
+ rb4 = ringbuffer_create(NULL, TESTSIZE);
+ ringbuffer_add(rb4, STR0);
+ ringbuffer_add(rb4, STR1);
+ ringbuffer_add(rb4, STR2);
+ ringbuffer_add(rb4, STR3);
+
+ rb5 = ringbuffer_create(NULL, TESTSIZE);
+ ringbuffer_add(rb5, STR0);
+ ringbuffer_add(rb5, STR1);
+ ringbuffer_add(rb5, STR2);
+ ringbuffer_add(rb5, STR3);
+ ringbuffer_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(_ringbuffer_is_bufindex_valid(rb1, 0));
+ assert(!_ringbuffer_is_bufindex_valid(rb1, 1));
+ assert(!_ringbuffer_is_bufindex_valid(rb1, 2));
+
+ assert(!_ringbuffer_is_bufindex_valid(rb3, 0));
+ assert(_ringbuffer_is_bufindex_valid(rb3, 1));
+ assert(_ringbuffer_is_bufindex_valid(rb3, 2));
+
+ assert(_ringbuffer_is_bufindex_valid(rb4, 0));
+ assert(!_ringbuffer_is_bufindex_valid(rb4, 1));
+ assert(_ringbuffer_is_bufindex_valid(rb4, 2));
+
+ assert(_ringbuffer_is_bufindex_valid(rb5, 0));
+ assert(_ringbuffer_is_bufindex_valid(rb5, 1));
+ assert(!_ringbuffer_is_bufindex_valid(rb5, 2));
+}
+
+void test_elems(void)
+{
+ assert(ringbuffer_elements(rb0) == 0);
+ assert(ringbuffer_elements(rb1) == 1);
+ assert(ringbuffer_elements(rb2) == 2);
+ assert(ringbuffer_elements(rb3) == 2);
+}
+
+void test_getn(void)
+{
+ assert(!ringbuffer_get_nth(rb0, 0));
+ assert(!strcmp(STR0, ringbuffer_get_nth(rb2, 0)));
+ assert(!strcmp(STR1, ringbuffer_get_nth(rb2, 1)));
+ assert(!strcmp(STR1, ringbuffer_get_nth(rb3, 0)));
+ assert(!strcmp(STR2, ringbuffer_get_nth(rb3, 1)));
+ assert(!ringbuffer_get_nth(rb3, 2));
+}
+
+void test_getn_wrap(void)
+{
+ assert(!strcmp(STR2, ringbuffer_get_nth(rb4, 0)));
+ assert(!strcmp(STR3, ringbuffer_get_nth(rb4, 1)));
+
+ assert(!strcmp(STR3, ringbuffer_get_nth(rb5, 0)));
+ assert(!strcmp(STR4, ringbuffer_get_nth(rb5, 1)));
+}
+
+void test_add(void)
+{
+ struct ringbuffer *rb = ringbuffer_create(NULL, 4);
+ assert(rb->start == 0);
+ assert(rb->end == 0);
+
+ ringbuffer_add(rb, "a");
+ ringbuffer_add(rb, "b");
+ ringbuffer_add(rb, "c");
+ assert(rb->start == 0);
+ assert(rb->end == 3);
+ assert(ringbuffer_elements(rb) == 3);
+
+ ringbuffer_add(rb, "d");
+ assert(rb->start == 1);
+ assert(rb->end == 0);
+ assert(ringbuffer_elements(rb) == 3);
+ assert(!strcmp("b", ringbuffer_get_nth(rb, 0)));
+ assert(!strcmp("c", ringbuffer_get_nth(rb, 1)));
+ assert(!strcmp("d", ringbuffer_get_nth(rb, 2)));
+
+ ringbuffer_add(rb, "e");
+ assert(rb->start == 2);
+ assert(rb->end == 1);
+ assert(!strcmp("c", ringbuffer_get_nth(rb, 0)));
+ assert(!strcmp("d", ringbuffer_get_nth(rb, 1)));
+ assert(!strcmp("e", ringbuffer_get_nth(rb, 2)));
+
+ ringbuffer_add(rb, "f");
+ assert(rb->start == 3);
+ assert(rb->end == 2);
+ assert(!strcmp("d", ringbuffer_get_nth(rb, 0)));
+ assert(!strcmp("e", ringbuffer_get_nth(rb, 1)));
+ assert(!strcmp("f", ringbuffer_get_nth(rb, 2)));
+
+ ringbuffer_add(rb, "g");
+ assert(rb->start == 0);
+ assert(rb->end == 3);
+ assert(!strcmp("e", ringbuffer_get_nth(rb, 0)));
+ assert(!strcmp("f", ringbuffer_get_nth(rb, 1)));
+ assert(!strcmp("g", ringbuffer_get_nth(rb, 2)));
+
+ ringbuffer_add(rb, "h");
+ assert(rb->start == 1);
+ assert(rb->end == 0);
+ assert(!strcmp("f", ringbuffer_get_nth(rb, 0)));
+ assert(!strcmp("g", ringbuffer_get_nth(rb, 1)));
+ assert(!strcmp("h", ringbuffer_get_nth(rb, 2)));
+
+ talloc_free(rb);
+}
+
+void test_long_msg(void)
+{
+ struct ringbuffer *rb = ringbuffer_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';
+
+ ringbuffer_add(rb, tests1);
+ strcpy(tests2, tests1);
+
+ /* Verify that no stale data from test1 is lingering... */
+ bzero(tests1, test_size);
+ free(tests1);
+
+ rb_content = ringbuffer_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/ringbuffer/ringbuffer_test.ok
b/tests/ringbuffer/ringbuffer_test.ok
new file mode 100644
index 0000000..9ac5124
--- /dev/null
+++ b/tests/ringbuffer/ringbuffer_test.ok
@@ -0,0 +1 @@
+All tests passed
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 5029b9e..74dd214 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([ringbuffer])
+AT_KEYWORDS([ringbuffer])
+cat $abs_srcdir/ringbuffer/ringbuffer_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/ringbuffer/ringbuffer_test], [],
[expout], [ignore])
+AT_CLEANUP
--
1.7.9.5
2
1
[PATCH] RTP: Allow disabling jitter buffer by setting a buffer size of 0
by Andreas Eversberg 14 Feb '13
by Andreas Eversberg 14 Feb '13
14 Feb '13
---
src/trau/osmo_ortp.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/src/trau/osmo_ortp.c b/src/trau/osmo_ortp.c
index a9503ea..6d3db58 100644
--- a/src/trau/osmo_ortp.c
+++ b/src/trau/osmo_ortp.c
@@ -258,7 +258,10 @@ int osmo_rtp_socket_set_param(struct osmo_rtp_socket *rs,
switch (param) {
case OSMO_RTP_P_JITBUF:
- rtp_session_set_jitter_compensation(rs->sess, val);
+ rtp_session_enable_jitter_buffer(rs->sess,
+ (val) ? TRUE : FALSE);
+ if (val)
+ rtp_session_set_jitter_compensation(rs->sess, val);
break;
#if 0
case OSMO_RTP_P_JIT_ADAP:
--
1.7.3.4
--------------090702060102080101070403--
1
0