Merge commit '7f6615a37df0dadbe86fdfc980e0a8a15013a80e'
authorSylvain Munaut <tnt@246tNt.com>
Sat, 13 Nov 2010 21:48:15 +0000 (22:48 +0100)
committerSylvain Munaut <tnt@246tNt.com>
Sat, 13 Nov 2010 21:48:15 +0000 (22:48 +0100)
16 files changed:
src/shared/libosmocore/Makefile.am
src/shared/libosmocore/configure.in
src/shared/libosmocore/include/osmocom/Makefile.am
src/shared/libosmocore/include/osmocom/codec/Makefile.am [new file with mode: 0644]
src/shared/libosmocore/include/osmocom/codec/codec.h
src/shared/libosmocore/include/osmocore/gsm0808.h
src/shared/libosmocore/include/osmocore/gsm_utils.h
src/shared/libosmocore/include/osmocore/msgb.h
src/shared/libosmocore/include/osmocore/panic.h
src/shared/libosmocore/libosmocodec.pc.in [new file with mode: 0644]
src/shared/libosmocore/src/gsm0808.c
src/shared/libosmocore/src/gsm_utils.c
src/shared/libosmocore/src/msgfile.c
src/shared/libosmocore/src/panic.c
src/shared/libosmocore/src/select.c
src/shared/libosmocore/tests/msgfile/msgconfig.cfg

index 81da629..93254e8 100644 (file)
@@ -5,7 +5,7 @@ INCLUDES = $(all_includes) -I$(top_srcdir)/include
 SUBDIRS = include src tests
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libosmocore.pc libosmovty.pc
+pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc
 
 BUILT_SOURCES = $(top_srcdir)/.version
 $(top_srcdir)/.version:
index 30f9d9c..825152d 100644 (file)
@@ -99,9 +99,11 @@ AM_CONDITIONAL(ENABLE_MSGFILE, test "x$enable_msgfile" = "x1")
 
 AC_OUTPUT(
        libosmocore.pc
+       libosmocodec.pc
        libosmovty.pc
        include/osmocom/Makefile
        include/osmocom/vty/Makefile
+       include/osmocom/codec/Makefile
        include/osmocom/crypt/Makefile
        include/osmocore/Makefile
        include/osmocore/protocol/Makefile
index fd9074c..ec548fb 100644 (file)
@@ -1,5 +1,5 @@
 if ENABLE_VTY
-SUBDIRS = vty crypt
+SUBDIRS = vty codec crypt
 else
-SUBDIRS = crypt
+SUBDIRS = codec crypt
 endif
diff --git a/src/shared/libosmocore/include/osmocom/codec/Makefile.am b/src/shared/libosmocore/include/osmocom/codec/Makefile.am
new file mode 100644 (file)
index 0000000..c213602
--- /dev/null
@@ -0,0 +1,3 @@
+osmocodec_HEADERS = codec.h
+
+osmocodecdir = $(includedir)/osmocom/codec
index 82013e5..6f9ffea 100644 (file)
@@ -4,7 +4,8 @@
 #include <stdint.h>
 
 extern uint16_t gsm610_bitorder[];     /* FR */
-extern uint16_t gsm620_bitorder[];     /* HR */
+extern uint16_t gsm620_unvoiced_bitorder[]; /* HR unvoiced */
+extern uint16_t gsm620_voiced_bitorder[];   /* HR voiced */
 extern uint16_t gsm660_bitorder[];     /* EFR */
 
 extern uint16_t gsm690_12_2_bitorder[];        /* AMR 12.2  kbits */
index 2d609c9..1d85377 100644 (file)
@@ -26,6 +26,7 @@ struct msgb;
 
 struct msgb *gsm0808_create_layer3(struct msgb *msg, uint16_t netcode, uint16_t countrycode, int lac, uint16_t ci);
 struct msgb *gsm0808_create_reset(void);
+struct msgb *gsm0808_create_clear_command(uint8_t reason);
 struct msgb *gsm0808_create_clear_complete(void);
 struct msgb *gsm0808_create_cipher_complete(struct msgb *layer3, uint8_t alg_id);
 struct msgb *gsm0808_create_cipher_reject(uint8_t cause);
@@ -35,7 +36,9 @@ struct msgb *gsm0808_create_assignment_completed(uint8_t rr_cause,
                                                 uint8_t chosen_channel, uint8_t encr_alg_id,
                                                 uint8_t speech_mode);
 struct msgb *gsm0808_create_assignment_failure(uint8_t cause, uint8_t *rr_cause);
+struct msgb *gsm0808_create_clear_rqst(uint8_t cause);
 
+struct msgb *gsm0808_create_dtap(struct msgb *msg, uint8_t link_id);
 void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id);
 
 const struct tlv_definition *gsm0808_att_tlvdef();
index 7dc2388..0aadd2e 100644 (file)
@@ -87,6 +87,7 @@ static inline int rach_max_trans_raw2val(int raw) {
 
 #define        ARFCN_PCS       0x8000
 #define        ARFCN_UPLINK    0x4000
+#define        ARFCN_FLAG_MASK 0xf000  /* Reserve the upper 5 bits for flags */
 
 enum gsm_band gsm_arfcn2band(uint16_t arfcn);
 
index 395c7c2..6fd24c7 100644 (file)
@@ -62,10 +62,11 @@ extern void msgb_reset(struct msgb *m);
 
 #ifdef MSGB_DEBUG
 #include <osmocore/panic.h>
-static inline void msgb_abort(struct msgb *msg, const char *text)
-{
-       osmo_panic("%s", text);
-}
+#define MSGB_ABORT(msg, fmt, args ...) do {            \
+       osmo_panic("msgb(%p): " fmt, msg, ## args);     \
+       } while(0)
+#else
+#define MSGB_ABORT(msg, fmt, args ...)
 #endif
 
 #define msgb_l1(m)     ((void *)(m->l1h))
@@ -106,10 +107,9 @@ static inline int msgb_headroom(const struct msgb *msgb)
 static inline unsigned char *msgb_put(struct msgb *msgb, unsigned int len)
 {
        unsigned char *tmp = msgb->tail;
-#ifdef MSGB_DEBUG
-       if (msgb_tailroom(msgb) < len)
-               msgb_abort(msgb, "Not enough tailroom\n");
-#endif
+       if (msgb_tailroom(msgb) < (int) len)
+               MSGB_ABORT(msgb, "Not enough tailroom msgb_push (%u < %u)\n",
+                          msgb_tailroom(msgb), len);
        msgb->tail += len;
        msgb->len += len;
        return tmp;
@@ -157,10 +157,9 @@ static inline uint32_t msgb_get_u32(struct msgb *msgb)
 }
 static inline unsigned char *msgb_push(struct msgb *msgb, unsigned int len)
 {
-#ifdef MSGB_DEBUG
-       if (msgb_headroom(msgb) < len)
-               msgb_abort(msgb, "Not enough headroom\n");
-#endif
+       if (msgb_headroom(msgb) < (int) len)
+               MSGB_ABORT(msgb, "Not enough headroom msgb_push (%u < %u)\n",
+                          msgb_headroom(msgb), len);
        msgb->data -= len;
        msgb->len += len;
        return msgb->data;
index cee9535..c5a8377 100644 (file)
@@ -6,6 +6,6 @@
 typedef void (*osmo_panic_handler_t)(const char *fmt, va_list args);
 
 void osmo_panic(const char *fmt, ...);
-void osmo_set_panic_handler(osmo_panic_handler_t *h);
+void osmo_set_panic_handler(osmo_panic_handler_t h);
 
 #endif
diff --git a/src/shared/libosmocore/libosmocodec.pc.in b/src/shared/libosmocore/libosmocodec.pc.in
new file mode 100644 (file)
index 0000000..3030230
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Osmocom Codec related utilities Library
+Description: C Utility Library
+Version: @VERSION@
+Libs: -L${libdir} -losmocodec
+Cflags: -I${includedir}/
+
index 636c211..dc450cc 100644 (file)
@@ -108,6 +108,19 @@ struct msgb *gsm0808_create_clear_complete(void)
        return msg;
 }
 
+struct msgb *gsm0808_create_clear_command(uint8_t reason)
+{
+       struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+                                              "bssmap: clear command");
+       if (!msg)
+               return NULL;
+
+       msg->l3h = msgb_tv_put(msg, BSSAP_MSG_BSS_MANAGEMENT, 4);
+       msgb_v_put(msg, BSS_MAP_MSG_CLEAR_CMD);
+       msgb_tlv_put(msg, GSM0808_IE_CAUSE, 1, &reason);
+       return msg;
+}
+
 struct msgb *gsm0808_create_cipher_complete(struct msgb *layer3, uint8_t alg_id)
 {
        struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
@@ -271,6 +284,26 @@ struct msgb *gsm0808_create_assignment_failure(uint8_t cause, uint8_t *rr_cause)
        return msg;
 }
 
+struct msgb *gsm0808_create_clear_rqst(uint8_t cause)
+{
+       struct msgb *msg;
+
+       msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+                                 "bssmap: clear rqst");
+       if (!msg)
+               return NULL;
+
+       msg->l3h = msgb_put(msg, 2 + 4);
+       msg->l3h[0] = BSSAP_MSG_BSS_MANAGEMENT;
+       msg->l3h[1] = 4;
+
+       msg->l3h[2] = BSS_MAP_MSG_CLEAR_RQST;
+       msg->l3h[3] = GSM0808_IE_CAUSE;
+       msg->l3h[4] = 1;
+       msg->l3h[5] = cause;
+       return msg;
+}
+
 void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id)
 {
        uint8_t *hh = msgb_push(msg, 3);
@@ -279,6 +312,29 @@ void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id)
        hh[2] = msg->len - 3;
 }
 
+struct msgb *gsm0808_create_dtap(struct msgb *msg_l3, uint8_t link_id)
+{
+       struct dtap_header *header;
+       uint8_t *data;
+       struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+                                              "dtap");
+       if (!msg)
+               return NULL;
+
+       /* DTAP header */
+       msg->l3h = msgb_put(msg, sizeof(*header));
+       header = (struct dtap_header *) &msg->l3h[0];
+       header->type = BSSAP_MSG_DTAP;
+       header->link_id = link_id;
+       header->length = msgb_l3len(msg_l3);
+
+       /* Payload */
+       data = msgb_put(msg, header->length);
+       memcpy(data, msg_l3->l3h, header->length);
+
+       return msg;
+}
+
 static const struct tlv_definition bss_att_tlvdef = {
        .def = {
                [GSM0808_IE_IMSI]                   = { TLV_TYPE_TLV },
index 4b4e2c6..31e3cd6 100644 (file)
@@ -359,7 +359,11 @@ void generate_backtrace()
 
 enum gsm_band gsm_arfcn2band(uint16_t arfcn)
 {
-       if (arfcn & ARFCN_PCS)
+       int is_pcs = arfcn & ARFCN_PCS;
+
+       arfcn &= ~ARFCN_FLAG_MASK;
+
+       if (is_pcs)
                return GSM_BAND_1900;
        else if (arfcn <= 124)
                return GSM_BAND_900;
@@ -386,8 +390,11 @@ uint16_t gsm_arfcn2freq10(uint16_t arfcn, int uplink)
 {
        uint16_t freq10_ul;
        uint16_t freq10_dl;
+       int is_pcs = arfcn & ARFCN_PCS;
+
+       arfcn &= ~ARFCN_FLAG_MASK;
 
-       if (arfcn & ARFCN_PCS) {
+       if (is_pcs) {
                /* DCS 1900 */
                arfcn &= ~ARFCN_PCS;
                freq10_ul = 18502 + 2 * (arfcn-512);
index 051f5b7..68f0581 100644 (file)
@@ -70,6 +70,10 @@ static void handle_line(struct msg_entries *entries, char *line)
        char *items[3];
        int last_item = 0;
 
+       /* Skip comments from the file */
+       if (line[0] == '#')
+               return;
+
        for (i = 0; i < len; ++i) {
                if (line[i] == '\n' || line[i] == '\r')
                        line[i] = '\0';
index a25067d..5fb7b56 100644 (file)
@@ -20,6 +20,7 @@
  *
  */
 
+#include <osmocore/gsm_utils.h>
 #include <osmocore/panic.h>
 
 #include "../config.h"
@@ -36,6 +37,7 @@ static osmo_panic_handler_t osmo_panic_handler = (void*)0;
 static void osmo_panic_default(const char *fmt, va_list args)
 {
        vfprintf(stderr, fmt, args);
+       generate_backtrace();
        abort();
 }
 
@@ -64,7 +66,7 @@ void osmo_panic(const char *fmt, ...)
 }
  
 
-void osmo_set_panic_handler(osmo_panic_handler_t *h)
+void osmo_set_panic_handler(osmo_panic_handler_t h)
 {
        osmo_panic_handler = h;
 }
index f52b0a0..5aa2beb 100644 (file)
@@ -5,8 +5,9 @@
  * (C) 2000-2009 by Harald Welte <laforge@gnumonks.org>
  *
  *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License version 2 
- *  as published by the Free Software Foundation
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 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