OpenBSC API change.
authorAndreas Eversberg <andreas@eversberg.eu>
Thu, 21 May 2009 11:24:38 +0000 (13:24 +0200)
committerAndreas Eversberg <andreas@eversberg.eu>
Thu, 21 May 2009 11:24:38 +0000 (13:24 +0200)
modified:   README
modified:   bootstrap.c
modified:   bootstrap.h
modified:   default/gsm.conf
modified:   gsm.cpp
modified:   gsm_conf.c

README
bootstrap.c
bootstrap.h
default/gsm.conf
gsm.cpp
gsm_conf.c

diff --git a/README b/README
index 88950e4..0857d0b 100644 (file)
--- a/README
+++ b/README
@@ -500,5 +500,6 @@ Changes after Version 1.5
  -> exnsion's settings has pritority over other tones_dir setting.
 - Debug option now works for GSM.
 - Fixed some GSM information elements.
+- OpenBSC api changes.
 
 
index 0c309a3..12a63fc 100644 (file)
@@ -38,7 +38,6 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
-#include <openbsc/openbsc.h>
 #include <openbsc/gsm_data.h>
 #include <openbsc/gsm_04_08.h>
 #include <openbsc/db.h>
@@ -786,12 +785,6 @@ static int set_system_infos(struct gsm_bts_trx *trx)
 }
 
 /*
- * Inform anyone...
- */
-static void bsc_hack_channel_allocated(struct gsm_lchan *lchan) {
-}
-
-/*
  * Patch the various SYSTEM INFORMATION tables to update
  * the LAI
  */
@@ -871,13 +864,41 @@ void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
        }
 }
 
-void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all)
+static int bootstrap_bts(struct gsm_bts *bts, int lac, int arfcn)
+{
+       bts->location_area_code = lac;
+       bts->trx[0].arfcn = arfcn;
+
+       /* Control Channel Description */
+       memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr));
+       bts->chan_desc.att = 1;
+       bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
+       bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
+       bts->chan_desc.t3212 = 0;
+
+       patch_tables(bts);
+
+       paging_init(bts);
+
+       return 0;
+}
+
+
+struct gsm_network *bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *), int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all)
 {
        struct gsm_bts *bts;
        struct gsm_network *gsmnet;
 
+       /* seed the PRNG for TMSI */
+       srand(time(NULL));
+
+       /* initialize our data structures */
+       gsmnet = gsm_network_init(2, (gsm_bts_type)bts_type, mcc, mnc, mncc_recv);
+       if (!gsmnet)
+               return 0;
+
        /* open database */
-       if (db_init(hlr)) {
+       if (db_init(hlr, gsmnet)) {
                fprintf(stderr, "DB: Failed to init HLR database '%s'. Please check the option settings.\n", hlr);
                return NULL;
        }        
@@ -886,19 +907,10 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int
                return NULL;
        }
 
-       /* seed the PRNG for TMSI */
-       srand(time(NULL));
-
-       /* initialize our data structures */
-       gsmnet = gsm_network_init(1, (gsm_bts_type)bts_type, mcc, mnc, mncc_recv);
-       if (!gsmnet)
-               return 0;
-
        gsmnet->name_long = name_long;
        gsmnet->name_short = name_short;
        bts = &gsmnet->bts[0];
-       bts->location_area_code = lac;
-       bts->trx[0].arfcn = arfcn;
+       bootstrap_bts(bts, lac, arfcn);
 
        /* Control Channel Description */
        memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr));
@@ -910,17 +922,24 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int
        patch_tables(bts);
 
        paging_init(bts);
-       bts->paging.channel_allocated = bsc_hack_channel_allocated;
 
        telnet_init(gsmnet, 4242);
 
        /* E1 mISDN input setup */
        if (bts_type == GSM_BTS_TYPE_BS11) {
+               gsmnet->num_bts = 1;
                if (e1_config(bts, cardnr, release_l2))
                        return NULL;
        } else {
-               if (ia_config(bts))
+               bts->ip_access.site_id = 1801;
+               bts->ip_access.bts_id = 0;
+               bts = &gsmnet->bts[1];
+               bootstrap_bts(bts, lac, arfcn);
+               bts->ip_access.site_id = 1800;
+               bts->ip_access.bts_id = 0;
+               if (ipaccess_setup(gsmnet))
                        return NULL;
+
        }
 
        if (allow_all)
@@ -929,7 +948,7 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int
        return gsmnet;
 }
 
-int shutdown_net(void *network)
+int shutdown_net(struct gsm_network *network)
 {
        struct gsm_network *net = (struct gsm_network *)network;
        unsigned int i;
index 515774b..cc3277a 100644 (file)
@@ -1,4 +1,4 @@
 
-void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all);
-int shutdown_net(void *network);
+struct gsm_network *bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *), int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all);
+int shutdown_net(struct gsm_network *network);
 
index b7d7bac..6ee6db5 100644 (file)
@@ -4,7 +4,7 @@
 # Enable debugging of OpenBSC library.
 # Refer to OpenBSC project for debugging options.
 # By default, debugging is turned off.
-#debug DRLL:DCC:DMM:DRR:DRSL:DNM
+#debug DRLL:DCC:DNM:DRR:DRSL:DNM:DSMS:DMNCC:DPAG:DMUX
 
 # Two Loopback interfaces for audio transfer between OpenBSC and mISDN.
 # The first interface must provide B-channelis for each call mobile call.
@@ -72,3 +72,6 @@ bts bs11 9 123
 # emergency facility. If you can't do that, don't touch it!
 #no-emergency-shutdown
 
+
+
+
diff --git a/gsm.cpp b/gsm.cpp
index 3150694..663fab5 100644 (file)
--- a/gsm.cpp
+++ b/gsm.cpp
 
 #include "main.h"
 extern "C" {
-#include "openbsc/openbsc.h"
+#include "openbsc/gsm_data.h"
 #include "openbsc/mncc.h"
 #include "openbsc/trau_frame.h"
+#include "openbsc/select.h"
+#include "openbsc/debug.h"
 #include "bootstrap.h"
 #include "gsm_audio.h"
 
@@ -40,7 +42,7 @@ static struct gsm_mncc *create_mncc(int msg_type, unsigned int callref)
        mncc->callref = callref;
        return (mncc);
 }
-static int send_and_free_mncc(void *net, unsigned int msg_type, void *data)
+static int send_and_free_mncc(struct gsm_network *net, unsigned int msg_type, void *data)
 {
        int ret;
 
@@ -243,7 +245,7 @@ void Pgsm::trau_send(void *_tf)
        frame->msg_type = GSM_TRAU_FRAME;
        frame->callref = p_m_g_callref;
        memcpy(frame->data, tf, sizeof(struct decoded_trau_frame));
-       mncc_send(gsm->network, frame->msg_type, frame);
+       mncc_send((struct gsm_network *)gsm->network, frame->msg_type, frame);
 }
 
 
@@ -402,7 +404,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc
                add_trace("cause", "value", "%d", mncc->cause_value);
                add_trace("reason", NULL, "callref already in use");
                end_trace();
-               send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+               send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
                new_state(PORT_STATE_RELEASE);
                p_m_delete = 1;
                return;
@@ -423,7 +425,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc
                add_trace("cause", "value", "%d", mncc->cause_value);
                add_trace("reason", NULL, "port is blocked");
                end_trace();
-               send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+               send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
                new_state(PORT_STATE_RELEASE);
                p_m_delete = 1;
                return;
@@ -494,7 +496,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc
                add_trace("cause", "value", "%d", mncc->cause_value);
                add_trace("reason", NULL, "no channel");
                end_trace();
-               send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+               send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
                new_state(PORT_STATE_RELEASE);
                p_m_delete = 1;
                return;
@@ -524,7 +526,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc
        mode->lchan_mode = 0x01; /* GSM V1 */
        add_trace("mode", NULL, "0x%02x", mode->lchan_mode);
        end_trace();
-       send_and_free_mncc(gsm->network, mode->msg_type, mode);
+       send_and_free_mncc((struct gsm_network *)gsm->network, mode->msg_type, mode);
 
        /* send call proceeding */
        gsm_trace_header(p_m_mISDNport, this, MNCC_CALL_PROC_REQ, DIRECTION_OUT);
@@ -539,7 +541,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc
                add_trace("progress", "descr", "%d", proceeding->progress_descr);
        }
        end_trace();
-       send_and_free_mncc(gsm->network, proceeding->msg_type, proceeding);
+       send_and_free_mncc((struct gsm_network *)gsm->network, proceeding->msg_type, proceeding);
 
        new_state(PORT_STATE_IN_PROCEEDING);
 
@@ -547,7 +549,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc
                gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
                end_trace();
                frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
-               send_and_free_mncc(gsm->network, frame->msg_type, frame);
+               send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame);
                p_m_g_tch_connected = 1;
        }
 
@@ -583,7 +585,7 @@ void Pgsm::start_dtmf_ind(unsigned int msg_type, unsigned int callref, struct gs
        end_trace();
        resp = create_mncc(MNCC_START_DTMF_RSP, p_m_g_callref);
        resp->keypad = mncc->keypad;
-       send_and_free_mncc(gsm->network, resp->msg_type, resp);
+       send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp);
 
        /* send dialing information */
        message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_INFORMATION);
@@ -604,7 +606,7 @@ void Pgsm::stop_dtmf_ind(unsigned int msg_type, unsigned int callref, struct gsm
        end_trace();
        resp = create_mncc(MNCC_STOP_DTMF_RSP, p_m_g_callref);
        resp->keypad = mncc->keypad;
-       send_and_free_mncc(gsm->network, resp->msg_type, resp);
+       send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp);
 }
 
 /* PROCEEDING INDICATION */
@@ -626,7 +628,7 @@ void Pgsm::call_conf_ind(unsigned int msg_type, unsigned int callref, struct gsm
        mode->lchan_mode = 0x01; /* GSM V1 */
        add_trace("mode", NULL, "0x%02x", mode->lchan_mode);
        end_trace();
-       send_and_free_mncc(gsm->network, mode->msg_type, mode);
+       send_and_free_mncc((struct gsm_network *)gsm->network, mode->msg_type, mode);
 
 }
 
@@ -658,7 +660,7 @@ void Pgsm::setup_cnf(unsigned int msg_type, unsigned int callref, struct gsm_mnc
        gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_COMPL_REQ, DIRECTION_OUT);
        resp = create_mncc(MNCC_SETUP_COMPL_REQ, p_m_g_callref);
        end_trace();
-       send_and_free_mncc(gsm->network, resp->msg_type, resp);
+       send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp);
 
        message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_CONNECT);
        message_put(message);
@@ -669,7 +671,7 @@ void Pgsm::setup_cnf(unsigned int msg_type, unsigned int callref, struct gsm_mnc
                gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
                end_trace();
                frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
-               send_and_free_mncc(gsm->network, frame->msg_type, frame);
+               send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame);
                p_m_g_tch_connected = 1;
        }
 }
@@ -688,7 +690,7 @@ void Pgsm::setup_compl_ind(unsigned int msg_type, unsigned int callref, struct g
                gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
                end_trace();
                frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
-               send_and_free_mncc(gsm->network, frame->msg_type, frame);
+               send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame);
                p_m_g_tch_connected = 1;
        }
 }
@@ -723,7 +725,7 @@ void Pgsm::disc_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc
        add_trace("cause", "value", "%d", resp->cause_value);
 #endif
        end_trace();
-       send_and_free_mncc(gsm->network, resp->msg_type, resp);
+       send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp);
 
        /* sending release to endpoint */
        while(p_epointlist) {
@@ -794,14 +796,14 @@ void Pgsm::hold_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc
        gsm_trace_header(p_m_mISDNport, this, MNCC_HOLD_CNF, DIRECTION_OUT);
        end_trace();
        resp = create_mncc(MNCC_HOLD_CNF, p_m_g_callref);
-       send_and_free_mncc(gsm->network, resp->msg_type, resp);
+       send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp);
 
        /* disable audio */
        if (p_m_g_tch_connected) { /* it should be true */
                gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_DROP, DIRECTION_OUT);
                end_trace();
                frame = create_mncc(MNCC_FRAME_DROP, p_m_g_callref);
-               send_and_free_mncc(gsm->network, frame->msg_type, frame);
+               send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame);
                p_m_g_tch_connected = 0;
        }
 }
@@ -826,14 +828,14 @@ void Pgsm::retr_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc
        gsm_trace_header(p_m_mISDNport, this, MNCC_RETRIEVE_CNF, DIRECTION_OUT);
        end_trace();
        resp = create_mncc(MNCC_RETRIEVE_CNF, p_m_g_callref);
-       send_and_free_mncc(gsm->network, resp->msg_type, resp);
+       send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp);
 
        /* enable audio */
        if (!p_m_g_tch_connected) { /* it should be true */
                gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
                end_trace();
                frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
-               send_and_free_mncc(gsm->network, frame->msg_type, frame);
+               send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame);
                p_m_g_tch_connected = 1;
        }
 }
@@ -841,7 +843,7 @@ void Pgsm::retr_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc
 /*
  * BSC sends message to port
  */
-static int message_bcs(void *net, int msg_type, void *arg)
+static int message_bcs(struct gsm_network *net, int msg_type, void *arg)
 {
        struct gsm_mncc *mncc = (struct gsm_mncc *)arg;
        unsigned int callref = mncc->callref;
@@ -896,7 +898,7 @@ static int message_bcs(void *net, int msg_type, void *arg)
                        add_trace("cause", "location", "%d", rej->cause_location);
                        add_trace("cause", "value", "%d", rej->cause_value);
                        end_trace();
-                       send_and_free_mncc(gsm->network, rej->msg_type, rej);
+                       send_and_free_mncc((struct gsm_network *)gsm->network, rej->msg_type, rej);
                        return 0;
                }
                /* creating port object, transparent until setup with hdlc */
@@ -1157,7 +1159,7 @@ void Pgsm::message_setup(unsigned int epoint_id, int message_id, union parameter
        //todo
 
        end_trace();
-       send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+       send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
 
        new_state(PORT_STATE_OUT_SETUP);
 
@@ -1189,7 +1191,7 @@ void Pgsm::message_notify(unsigned int epoint_id, int message_id, union paramete
                        end_trace();
                        mncc = create_mncc(MNCC_NOTIFY_REQ, p_m_g_callref);
                        mncc->notify = notify;
-                       send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+                       send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
                }
        }
 }
@@ -1212,7 +1214,7 @@ void Pgsm::message_alerting(unsigned int epoint_id, int message_id, union parame
                add_trace("progress", "descr", "%d", mncc->progress_descr);
        }
        end_trace();
-       send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+       send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
 
        new_state(PORT_STATE_IN_ALERTING);
 
@@ -1220,7 +1222,7 @@ void Pgsm::message_alerting(unsigned int epoint_id, int message_id, union parame
                gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
                end_trace();
                mncc = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
-               send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+               send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
                p_m_g_tch_connected = 1;
        }
 }
@@ -1286,7 +1288,7 @@ void Pgsm::message_connect(unsigned int epoint_id, int message_id, union paramet
                add_trace("connected", "number", "%s", mncc->connected_number);
        }
        end_trace();
-       send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+       send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
 
        new_state(PORT_STATE_CONNECT_WAITING);
 }
@@ -1316,7 +1318,7 @@ void Pgsm::message_disconnect(unsigned int epoint_id, int message_id, union para
        add_trace("cause", "location", "%d", mncc->cause_location);
        add_trace("cause", "value", "%d", mncc->cause_value);
        end_trace();
-       send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+       send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
 
        new_state(PORT_STATE_OUT_DISCONNECT);
 
@@ -1324,7 +1326,7 @@ void Pgsm::message_disconnect(unsigned int epoint_id, int message_id, union para
                gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
                end_trace();
                mncc = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
-               send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+               send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
                p_m_g_tch_connected = 1;
        }
 }
@@ -1346,7 +1348,7 @@ void Pgsm::message_release(unsigned int epoint_id, int message_id, union paramet
        add_trace("cause", "location", "%d", mncc->cause_location);
        add_trace("cause", "value", "%d", mncc->cause_value);
        end_trace();
-       send_and_free_mncc(gsm->network, mncc->msg_type, mncc);
+       send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc);
 
        new_state(PORT_STATE_RELEASE);
        p_m_delete = 1;
@@ -1488,7 +1490,7 @@ int handle_gsm(void)
 {
        int ret1, ret2;
 
-       ret1 = bsc_upqueue(gsm->network);
+       ret1 = bsc_upqueue((struct gsm_network *)gsm->network);
        ret2 = bsc_select_main(1); /* polling */
        if (ret1 || ret2)
                return 1;
@@ -1579,10 +1581,10 @@ int gsm_exit(int rc)
                        gsm_sock_close();
                /* shutdown network */
                if (gsm->network)
-                       shutdown_net(gsm->network);
+                       shutdown_net((struct gsm_network *)gsm->network);
                /* free network */
                if (gsm->network) {
-                       free(gsm->network); /* TBD */
+                       free((struct gsm_network *)gsm->network); /* TBD */
                }
                free(gsm);
                gsm = NULL;
index 8898cf2..aadb7d1 100644 (file)
@@ -10,7 +10,7 @@
 \*****************************************************************************/ 
 
 #include "main.h"
-#include "openbsc/openbsc.h"
+#include "openbsc/gsm_data.h"
 
 
 char *gsm_conf_error = "";