/* Nokia XXXsite family specific code */

/* (C) 2011 by Dieter Spaar <spaar@mirider.augusta.de>
 *
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

/*
  TODO: Attention: There are some static variables used for states during
  configuration. Those variables have to be moved to a BTS specific context,
  otherwise there will most certainly be problems if more than one Nokia BTS
  is used.
*/

#include <time.h>

#include <osmocom/gsm/tlv.h>

#include <openbsc/debug.h>
#include <openbsc/gsm_data.h>
#include <openbsc/abis_nm.h>
#include <openbsc/e1_input.h>
#include <openbsc/signal.h>

#include <osmocom/core/timer.h>

#include "../libabis/input/lapd.h"

/* TODO: put in a separate file ? */

/* TODO: move statics to BTS context */
static int do_reset = 1;
/*static*/ int wait_reset = 0;
struct osmo_timer_list reset_timer; /* timer to re-start after reset */

#define RESET_INTERVAL      0, 3000000 /* 3 seconds */

extern int abis_nm_sendmsg(struct gsm_bts *bts, struct msgb *msg);
/* was static in system_information.c */
extern int generate_cell_chan_list(uint8_t *chan_list, struct gsm_bts *bts);

static void abis_nm_queue_send_next(struct gsm_bts *bts);
static void reset_timer_cb(void *_bts);
static int abis_nm_reset(struct gsm_bts *bts, uint16_t ref);
static int dump_elements(uint8_t *data, int len);

static void bootstrap_om_bts(struct gsm_bts *bts)
{
    LOGP(DNM, LOGL_NOTICE, "bootstrapping OML for BTS %u\n", bts->nr);
        
    if(do_reset)
        abis_nm_reset(bts, 1);
}

static void bootstrap_om_trx(struct gsm_bts_trx *trx)
{
    LOGP(DNM, LOGL_NOTICE, "bootstrapping OML for TRX %u/%u\n",
         trx->bts->nr, trx->nr);
}

static int shutdown_om(struct gsm_bts *bts)
{
    /* TODO !? */
    return 0;
}

#define SAPI_OML    62
#define SAPI_RSL    0

/* 

  Tell LAPD to start start the SAP (send SABM requests) for all signalling
  timeslots in this line 
  
  Attention: this has to be adapted for MISDN  
*/
 
static void start_sabm_in_line(struct e1inp_line *line, int start, int sapi)
{
    struct e1inp_sign_link *link;
    int i;

    for (i = 0; i < ARRAY_SIZE(line->ts); i++) {
        struct e1inp_ts *ts = &line->ts[i];

        if (ts->type != E1INP_TS_TYPE_SIGN)
            continue;

        llist_for_each_entry(link, &ts->sign.sign_links, list) {
            if(sapi != -1 && link->sapi != sapi)
                continue;
            
#if 0 /* debugging */   
            printf("sap start/stop (%d): %d tei=%d sapi=%d\n", start, i + 1, link->tei, link->sapi);
#endif
            
            if (start)
                lapd_sap_start(ts->driver.dahdi.lapd, link->tei, link->sapi);
            else
                lapd_sap_stop(ts->driver.dahdi.lapd, link->tei, link->sapi);
        }
    }
}

/* Callback function to be called every time we receive a signal from INPUT */
static int gbl_sig_cb(unsigned int subsys, unsigned int signal,
              void *handler_data, void *signal_data)
{
    struct gsm_bts *bts;

    if (subsys != SS_GLOBAL)
        return 0;

    switch (signal) {
    case S_GLOBAL_BTS_CLOSE_OM:
        bts = signal_data;
        if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
            shutdown_om(signal_data);
        break;
    }

    return 0;
}

/* Callback function to be called every time we receive a signal from INPUT */
static int inp_sig_cb(unsigned int subsys, unsigned int signal,
              void *handler_data, void *signal_data)
{
    struct input_signal_data *isd = signal_data;

    if (subsys != SS_INPUT)
        return 0;

    switch (signal) {
    case S_INP_LINE_INIT:
        start_sabm_in_line(isd->line, 1, SAPI_OML); /* start only OML */
        break;      
    case S_INP_TEI_DN:
        break;      
    case S_INP_TEI_UP:
        switch (isd->link_type) {
        case E1INP_SIGN_OML:
            if (isd->trx->bts->type != GSM_BTS_TYPE_NOKIA_SITE)
                break;
                
            if (isd->tei == isd->trx->bts->oml_tei)
                bootstrap_om_bts(isd->trx->bts);
            else
                bootstrap_om_trx(isd->trx);
            break;
        }
        break;
    }

    return 0;
}

static void nm_statechg_evt(unsigned int signal,
                struct nm_statechg_signal_data *nsd)
{
    if (nsd->bts->type != GSM_BTS_TYPE_NOKIA_SITE)
        return;
}

static int nm_sig_cb(unsigned int subsys, unsigned int signal,
             void *handler_data, void *signal_data)
{
    if (subsys != SS_NM)
        return 0;

    switch (signal) {
    case S_NM_STATECHG_OPER:
    case S_NM_STATECHG_ADM:
        nm_statechg_evt(signal, signal_data);
        break;
    default:
        break;
    }

    return 0;
}

/* TODO: put in a separate file ? */

static char *get_msg_type_name_string(uint8_t msg_type)
{
    switch(msg_type) {
    case 0x80:
        return "NOKIA_BTS_CONF_DATA";
    case 0x81:
        return "NOKIA_BTS_ACK";
    case 0x82:
        return "NOKIA_BTS_OMU_STARTED";
    case 0x83:
        return "NOKIA_BTS_START_DOWNLOAD_REQ";
    case 0x84:
        return "NOKIA_BTS_MF_REQ";
    case 0x85:
        return "NOKIA_BTS_AF_REQ";
    case 0x86:
        return "NOKIA_BTS_RESET_REQ";
    case 0x87:
        return "NOKIA_reserved";
    case 0x88:
        return "NOKIA_BTS_CONF_REQ";
    case 0x89:
        return "NOKIA_BTS_TEST_REQ";
    case 0x8A:
        return "NOKIA_BTS_TEST_REPORT";
    case 0x8B:
        return "NOKIA_reserved";
    case 0x8C:
        return "NOKIA_reserved";
    case 0x8D:
        return "NOKIA_reserved";
    case 0x8E:
        return "NOKIA_BTS_CONF_COMPL";
    case 0x8F:
        return "NOKIA_reserved";
    case 0x90:
        return "NOKIA_BTS_STM_TEST_REQ";
    case 0x91:
        return "NOKIA_BTS_STM_TEST_REPORT";
    case 0x92:
        return "NOKIA_BTS_TRANSMISSION_COMMAND";
    case 0x93:
        return "NOKIA_BTS_TRANSMISSION_ANSWER";
    case 0x94:
        return "NOKIA_BTS_HW_DB_UPLOAD_REQ";
    case 0x95:
        return "NOKIA_BTS_START_HW_DB_DOWNLOAD_REQ";
    case 0x96:
        return "NOKIA_BTS_HW_DB_SAVE_REQ";
    case 0x97:
        return "NOKIA_BTS_FLASH_ERASURE_REQ";
    case 0x98:
        return "NOKIA_BTS_HW_DB_DOWNLOAD_REQ";
    case 0x99:
        return "NOKIA_BTS_PWR_SUPPLY_CONTROL";
    case 0x9A:
        return "NOKIA_BTS_ATTRIBUTE_REQ";
    case 0x9B:
        return "NOKIA_BTS_ATTRIBUTE_REPORT";
    case 0x9C:
        return "NOKIA_BTS_HW_REQ";
    case 0x9D:
        return "NOKIA_BTS_HW_REPORT";
    case 0x9E:
        return "NOKIA_BTS_RTE_TEST_REQ";
    case 0x9F:
        return "NOKIA_BTS_RTE_TEST_REPORT";
    case 0xA0:
        return "NOKIA_BTS_HW_DB_VERIFICATION_REQ";
    case 0xA1:
        return "NOKIA_BTS_CLOCK_REQ";
    case 0xA2:
        return "NOKIA_AC_CIRCUIT_REQ_NACK";
    case 0xA3:
        return "NOKIA_AC_INTERRUPTED";
    case 0xA4:
        return "NOKIA_BTS_NEW_TRE_INFO";
    case 0xA5:
        return "NOKIA_AC_BSC_CIRCUITS_ALLOCATED";
    case 0xA6:
        return "NOKIA_BTS_TRE_POLL_LIST";
    case 0xA7:
        return "NOKIA_AC_CIRCUIT_REQ";
    case 0xA8:
        return "NOKIA_BTS_BLOCK_CTRL_REQ";
    case 0xA9:
        return "NOKIA_BTS_GSM_TIME_REQ";
    case 0xAA:
        return "NOKIA_BTS_GSM_TIME";
    case 0xAB:
        return "NOKIA_BTS_OUTPUT_CONTROL";
    case 0xAC:
        return "NOKIA_BTS_STATE_CHANGED";
    case 0xAD:
        return "NOKIA_BTS_SW_SAVE_REQ";
    case 0xAE:
        return "NOKIA_BTS_ALARM";
    case 0xAF:
        return "NOKIA_BTS_CHA_ADM_STATE";
    case 0xB0:
        return "NOKIA_AC_POOL_SIZE_REPORT";
    case 0xB1:
        return "NOKIA_AC_POOL_SIZE_INQUIRY";
    case 0xB2:
        return "NOKIA_BTS_COMMISS_TEST_COMPLETED";
    case 0xB3:
        return "NOKIA_BTS_COMMISS_TEST_REQ";
    case 0xB4:
        return "NOKIA_BTS_TRANSP_BTS_TO_BSC";
    case 0xB5:
        return "NOKIA_BTS_TRANSP_BSC_TO_BTS";
    case 0xB6:
        return "NOKIA_BTS_LCS_COMMAND";
    case 0xB7:
        return "NOKIA_BTS_LCS_ANSWER";
    case 0xB8:
        return "NOKIA_BTS_LMU_FN_OFFSET_COMMAND";
    case 0xB9:
        return "NOKIA_BTS_LMU_FN_OFFSET_ANSWER";
    default:
        return "unknown";   
    }
}

static char *get_element_name_string(uint16_t element)
{
    switch(element) {
    case 0x01:
        return "Ny1";
    case 0x02:
        return "T3105_F";
    case 0x03:
        return "Interference band limits";
    case 0x04:
        return "Interference report timer in secs";
    case 0x05:
        return "Channel configuration per TS";
    case 0x06:
        return "BSIC";
    case 0x07:
        return "RACH report timer in secs";
    case 0x08:
        return "Hardware database status";
    case 0x09:
        return "BTS RX level";
    case 0x0A:
        return "ARFN";
    case 0x0B:
        return "STM antenna attenuation";
    case 0x0C:
        return "Cell allocation bitmap";
    case 0x0D:
        return "Radio definition per TS";
    case 0x0E:
        return "Frame number";
    case 0x0F:
        return "Antenna diversity";
    case 0x10:
        return "T3105_D";
    case 0x11:
        return "File format";
    case 0x12:
        return "Last File";
    case 0x13:
        return "BTS type";
    case 0x14:
        return "Erasure mode";
    case 0x15:
        return "Hopping mode";
    case 0x16:
        return "Floating TRX";
    case 0x17:
        return "Power supplies";
    case 0x18:
        return "Reset type";
    case 0x19:
        return "Averaging period";
    case 0x1A:
        return "RBER2";
    case 0x1B:
        return "LAC";
    case 0x1C:
        return "CI";
    case 0x1D:
        return "Failure parameters";
    case 0x1E:
        return "(RF max power reduction)";
    case 0x1F:
        return "Measured RX_SENS";
    case 0x20:
        return "Extended cell radius";
    case 0x21:
        return "reserved";
    case 0x22:
        return "Success-Failure";
    case 0x23:
        return "Ack-Nack";
    case 0x24:
        return "OMU test results";
    case 0x25:
        return "File identity";
    case 0x26:
        return "Generation and version code";
    case 0x27:
        return "SW description";
    case 0x28:
        return "BCCH LEV";
    case 0x29:
        return "Test type";
    case 0x2A:
        return "Subscriber number";
    case 0x2B:
        return "reserved";
    case 0x2C:
        return "HSN";
    case 0x2D:
        return "reserved";
    case 0x2E:
        return "MS RXLEV";
    case 0x2F:
        return "MS TXLEV";
    case 0x30:
        return "RXQUAL";
    case 0x31:
        return "RX SENS";
    case 0x32:
        return "Alarm block";
    case 0x33:
        return "Neighbouring BCCH levels";
    case 0x34:
        return "STM report type";
    case 0x35:
        return "MA";
    case 0x36:
        return "MAIO";
    case 0x37:
        return "H_FLAG";
    case 0x38:
        return "TCH_ARFN";
    case 0x39:
        return "Clock output";
    case 0x3A:
        return "Transmitted power";
    case 0x3B:
        return "Clock sync";
    case 0x3C:
        return "TMS protocol discriminator";
    case 0x3D:
        return "TMS protocol data";
    case 0x3E:
        return "FER";
    case 0x3F:
        return "SWR result";
    case 0x40:
        return "Object identity";
    case 0x41:
        return "STM RX Antenna Test";
    case 0x42:
        return "reserved";
    case 0x43:
        return "reserved";
    case 0x44:
        return "Object current state";
    case 0x45:
        return "reserved";
    case 0x46:
        return "FU channel configuration";
    case 0x47:
        return "reserved";
    case 0x48:
        return "ARFN of a CU";
    case 0x49:
        return "FU radio definition";
    case 0x4A:
        return "reserved";
    case 0x4B:
        return "Severity";
    case 0x4C:
        return "Diversity selection";
    case 0x4D:
        return "RX antenna test";
    case 0x4E:
        return "RX antenna supervision period";
    case 0x4F:
        return "RX antenna state";
    case 0x50:
        return "Sector configuration";
    case 0x51:
        return "Additional info";
    case 0x52:
        return "SWR parameters";
    case 0x53:
        return "HW inquiry mode";
    case 0x54:
        return "reserved";
    case 0x55:
        return "Availability status";
    case 0x56:
        return "reserved";
    case 0x57:
        return "EAC inputs";
    case 0x58:
        return "EAC outputs";
    case 0x59:
        return "reserved";
    case 0x5A:
        return "Position";
    case 0x5B:
        return "HW unit identity";
    case 0x5C:
        return "RF test signal attenuation";
    case 0x5D:
        return "Operational state";
    case 0x5E:
        return "Logical object identity";
    case 0x5F:
        return "reserved";
    case 0x60:
        return "BS_TXPWR_OM";
    case 0x61:
        return "Loop_Duration";
    case 0x62:
        return "LNA_Path_Selection";
    case 0x63:
        return "Serial number";
    case 0x64:
        return "HW version";
    case 0x65:
        return "Obj. identity and obj. state";
    case 0x66:
        return "reserved";
    case 0x67:
        return "EAC input definition";
    case 0x68:
        return "EAC id and text";
    case 0x69:
        return "HW unit status";
    case 0x6A:
        return "SW release version";
    case 0x6B:
        return "FW version";
    case 0x6C:
        return "Bit_Error_Ratio";
    case 0x6D:
        return "RXLEV_with_Attenuation";
    case 0x6E:
        return "RXLEV_without_Attenuation";
    case 0x6F:
        return "reserved";
    case 0x70:
        return "CU_Results";
    case 0x71:
        return "reserved";
    case 0x72:
        return "LNA_Path_Results";
    case 0x73:
        return "RTE Results";
    case 0x74:
        return "Real Time";
    case 0x75:
        return "RX diversity selection";
    case 0x76:
        return "EAC input config";
    case 0x77:
        return "Feature support";
    case 0x78:
        return "File version";
    case 0x79:
        return "Outputs";
    case 0x7A:
        return "FU parameters";
    case 0x7B:
        return "Diagnostic info";
    case 0x7C:
        return "FU BSIC";
    case 0x7D:
        return "TRX Configuration";
    case 0x7E:
        return "Download status";
    case 0x7F:
        return "RX difference limit";
    case 0x80:
        return "TRX HW capability";
    case 0x81:
        return "Common HW config";
    case 0x82:
        return "Autoconfiguration pool size";
    case 0x83:
        return "TRE diagnostic info";
    case 0x84:
        return "TRE object identity";
    case 0x85:
        return "New TRE Info";
    case 0x86:
        return "Acknowledgement period";
    case 0x87:
        return "Synchronization mode";
    case 0x88:
        return "reserved";
    case 0x89:
        return "Block Control Data";
    case 0x8A:
        return "SW load mode";
    case 0x8B:
        return "Recommended recovery action";
    case 0x8C:
        return "BSC BCF id";
    case 0x8D:
        return "Q1 baud rate";
    case 0x8E:
        return "Allocation status";
    case 0x8F:
        return "Functional entity number";
    case 0x90:
        return "Transmission delay";
    case 0x91:
        return "Loop Duration ms";
    case 0x92:
        return "Logical channel";
    case 0x93:
        return "Q1 address";
    case 0x94:
        return "Alarm detail";
    case 0x95:
        return "Cabinet type";
    case 0x96:
        return "HW unit existence";
    case 0x97:
        return "RF power parameters";
    case 0x98:
        return "Message scenario";
    case 0x99:
        return "HW unit max amount";
    case 0x9A:
        return "Master TRX";
    case 0x9B:
        return "Transparent data";
    case 0x9C:
        return "BSC topology info";
    case 0x9D:
        return "Air i/f modulation";
    case 0x9E:
        return "LCS Q1 command data";
    case 0x9F:
        return "Frame number offset";
    case 0xA0:
        return "Abis TSL";
    case 0xA1:
        return "Dynamic pool info";
    case 0xA2:
        return "LCS LLP data";
    case 0xA3:
        return "LCS Q1 answer data";
    case 0xA4:
        return "DFCA FU Radio Definition";
    case 0xA5:
        return "Antenna hopping";
    case 0xA6:
        return "Field record sequence number";
    case 0xA7:
        return "Timeslot offslot";
    case 0xA8:
        return "EPCR capability";
    case 0xA9:
        return "Connectsite optional element";
    case 0xAA:
        return "TSC";
    case 0xAB:
        return "Special TX Power Setting";
    case 0xAC:
        return "Optional sync settings";
    case 0xFA:
        return "Abis If parameters";
    default:
        return "unknown";   
    }
}

static char *get_bts_type_string(uint8_t type)
{
    switch(type) {
    case 0x0A: 
        return "MetroSite GSM 900";
    case 0x0B: 
        return "MetroSite GSM 1800";
    case 0x0C:
        return "MetroSite GSM 1900 (PCS)";
    case 0x0D:
        return "MetroSite GSM 900 & 1800";
    case 0x0E:
        return "InSite GSM 900";
    case 0x0F:
        return "InSite GSM 1800";
    case 0x10:
        return "InSite GSM 1900";
    case 0x11:
        return "UltraSite GSM 900";
    case 0x12:
        return "UltraSite GSM 1800";
    case 0x13:
        return "UltraSite GSM/US-TDMA 1900";
    case 0x14:
        return "UltraSite GSM 900 & 1800";
    case 0x16:
        return "UltraSite GSM/US-TDMA 850";
    case 0x18:
        return "MetroSite GSM/US-TDMA 850";
    case 0x19:
        return "UltraSite GSM 800/1900";
    default:
        return "unknown";   
    }
}

static char *get_severity_string(uint8_t severity)
{
    switch(severity) {
    case 0:
        return "indeterminate";
    case 1:
        return "critical";
    case 2:
        return "major";
    case 3:
        return "minor";
    case 4:
        return "warning";
    default:
        return "unknown";   
    }
}

/* TODO: put in a separate file ? */

/* some message IDs */

#define NOKIA_MSG_CONF_DATA             128
#define NOKIA_MSG_ACK                   129
#define NOKIA_MSG_OMU_STARTED           130
#define NOKIA_MSG_START_DOWNLOAD_REQ    131
#define NOKIA_MSG_MF_REQ                132
#define NOKIA_MSG_RESET_REQ             134
#define NOKIA_MSG_CONF_REQ              136
#define NOKIA_MSG_CONF_COMPLETE         142
#define NOKIA_MSG_BLOCK_CTRL_REQ        168
#define NOKIA_MSG_STATE_CHANGED         172
#define NOKIA_MSG_ALARM                 174

/* some element IDs */

#define NOKIA_EI_BTS_TYPE       0x13
#define NOKIA_EI_ACK            0x23
#define NOKIA_EI_ADD_INFO       0x51
#define NOKIA_EI_SEVERITY       0x4B
#define NOKIA_EI_ALARM_DETAIL   0x94

#define OM_ALLOC_SIZE       1024
#define OM_HEADROOM_SIZE    128

static uint8_t fu_config_template[] =
{
  0x7F, 0x7A, 0x39, 
  /* ID = 0x7A (FU parameters) ## constructed ## */
  /* length = 57 */
  /* [3] */

     0x5F, 0x40, 0x04, 
     /* ID = 0x40 (Object identity) */
     /* length = 4 */
     /* [6] */
     0x00, 0x07, 0x01, 0xFF, 

     0x41, 0x02, 
     /* ID = 0x01 (Ny1) */
     /* length = 2 */
     /* [12] */
     0x00, 0x05, 

     0x42, 0x02, 
     /* ID = 0x02 (T3105_F) */
     /* length = 2 */
     /* [16] */
     0x00, 0x28, 

     0x50, 0x02, 
     /* ID = 0x10 (T3105_D) */
     /* length = 2 */
     /* [20] */
     0x00, 0x28, 

     0x43, 0x05, 
     /* ID = 0x03 (Interference band limits) */
     /* length = 5 */
     /* [24] */
     0x0F, 0x1B, 0x27, 0x33, 0x3F, 

     0x44, 0x02, 
     /* ID = 0x04 (Interference report timer in secs) */
     /* length = 2 */
     /* [31] */
     0x00, 0x10, 

     0x47, 0x01, 
     /* ID = 0x07 (RACH report timer in secs) */
     /* length = 1 */
     /* [35] */
     0x1E, 

     0x4C, 0x10, 
     /* ID = 0x0C (Cell allocation bitmap) ####### */
     /* length = 16 */
     /* [38] */
     0x8F, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 

     0x59, 0x01, 
     /* ID = 0x19 (Averaging period) */
     /* length = 1 */
     /* [56] */
     0x01, 

     0x5E, 0x01, 
     /* ID = 0x1E ((RF max power reduction)) */
     /* length = 1 */
     /* [59] */
     0x00, 

   
  0x7F, 0x46, 0x11, 
  /* ID = 0x46 (FU channel configuration) ## constructed ## */
  /* length = 17 */
  /* [63] */

     0x5F, 0x40, 0x04, 
     /* ID = 0x40 (Object identity) */
     /* length = 4 */
     /* [66] */
     0x00, 0x07, 0x01, 0xFF, 

     0x45, 0x08, 
     /* ID = 0x05 (Channel configuration per TS) */
     /* length = 8 */
     /* [72] */
     0x01, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 

   
  0x7F, 0x65, 0x0B, 
  /* ID = 0x65 (Obj. identity and obj. state) ## constructed ## */
  /* length = 11 */
  /* [83] */

     0x5F, 0x40, 0x04, 
     /* ID = 0x40 (Object identity) */
     /* length = 4 */
     /* [86] */
     0x00, 0x04, 0x01, 0xFF, 

     0x5F, 0x44, 0x01, 
     /* ID = 0x44 (Object current state) */
     /* length = 1 */
     /* [93] */
     0x03, 

   
  0x7F, 0x7C, 0x0A, 
  /* ID = 0x7C (FU BSIC) ## constructed ## */
  /* length = 10 */
  /* [97] */

     0x5F, 0x40, 0x04, 
     /* ID = 0x40 (Object identity) */
     /* length = 4 */
     /* [100] */
     0x00, 0x07, 0x01, 0xFF, 

     0x46, 0x01, 
     /* ID = 0x06 (BSIC) */
     /* length = 1 */
     /* [106] */
     0x00, 

   
  0x7F, 0x48, 0x0B, 
  /* ID = 0x48 (ARFN of a CU) ## constructed ## */
  /* length = 11 */
  /* [110] */

     0x5F, 0x40, 0x04, 
     /* ID = 0x40 (Object identity) */
     /* length = 4 */
     /* [113] */
     0x00, 0x08, 0x01, 0xFF, 

     0x4A, 0x02, 
     /* ID = 0x0A (ARFN) ####### */
     /* length = 2 */
     /* [119] */
     0x03, 0x62, 

   
  0x7F, 0x49, 0x59, 
  /* ID = 0x49 (FU radio definition) ## constructed ## */
  /* length = 89 */
  /* [124] */

     0x5F, 0x40, 0x04, 
     /* ID = 0x40 (Object identity) */
     /* length = 4 */
     /* [127] */
     0x00, 0x07, 0x01, 0xFF, 

     0x4D, 0x50, 
     /* ID = 0x0D (Radio definition per TS) ####### */
     /* length = 80 */
     /* [133] */
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* MA */
     0x03, 0x62, /* HSN, MAIO or ARFCN if no hopping */
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x03, 0x62, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x03, 0x62, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x03, 0x62, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x03, 0x62, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x03, 0x62, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x03, 0x62, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x03, 0x62, 
};

/* TODO: put in a separate file ? */

/*
  build the configuration for each TRX  
*/

static int make_fu_config(struct gsm_bts_trx *trx, uint8_t id, uint8_t *fu_config, int *hopping)
{
    int i;
    
    *hopping = 0;
    
    memcpy(fu_config, fu_config_template, sizeof(fu_config_template));
    
    /* set ID */
    
    fu_config[  6 + 2] = id;
    fu_config[ 66 + 2] = id;
    fu_config[ 86 + 2] = id;
    fu_config[100 + 2] = id;
    fu_config[113 + 2] = id;
    fu_config[127 + 2] = id;
    
    /* set ARFCN */
    
    uint16_t arfcn = trx->arfcn;
    
    fu_config[119] = arfcn >> 8;
    fu_config[119 + 1] = arfcn & 0xFF;
    
    for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
        struct gsm_bts_trx_ts *ts = &trx->ts[i];

        if (ts->hopping.enabled) {
            /* reverse order */
            int j;
            for(j = 0; j < ts->hopping.ma_len; j++)
                fu_config[133 + (i * 10) + (7 - j)] = ts->hopping.ma_data[j];
            fu_config[133 + 8 + (i * 10)] = ts->hopping.hsn;
            fu_config[133 + 8 + 1 + (i * 10)] = ts->hopping.maio;
            *hopping = 1;
        } else {
            fu_config[133 + 8 + (i * 10)] = arfcn >> 8;
            fu_config[133 + 8 + 1 + (i * 10)] = arfcn & 0xFF;
        }
    }
    
    /* set BSIC */
    
    /* 
       Attention: all TRX except the first one seem to get the TSC
       from the CHANNEL ACTIVATION command (in CHANNEL IDENTIFICATION,
       GSM 04.08 CHANNEL DESCRIPTION). 
       There was a bug in rsl_chan_activate_lchan() setting this parameter.       
    */
    
    uint8_t bsic = trx->bts->bsic;
            
    fu_config[106] = bsic;
            
    /* set CA */
    
    if(generate_cell_chan_list(&fu_config[38], trx->bts) != 0) {    
        fprintf(stderr, "generate_cell_chan_list failed\n");
        return 0;
    }
                                    
    /* set channel configuration */
    
    for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
        struct gsm_bts_trx_ts *ts = &trx->ts[i];
        uint8_t chan_config;                
        
        /*
            0 = FCCH + SCH + BCCH + CCCH
            1 = FCCH + SCH + BCCH + CCCH + SDCCH/4 + SACCH/4
            2 = BCCH + CCCH (This combination is not used in any BTS)
            3 = FCCH + SCH + BCCH + CCCH + SDCCH/4 with SDCCH2 used as CBCH
            4 = SDCCH/8 + SACCH/8
            5 = SDCCH/8 with SDCCH2 used as CBCH
            6 = TCH/F + FACCH/F + SACCH/F
            7 = E-RACH (Talk family)
            9 = Dual rate (capability for TCH/F and TCH/H)
            10 = reserved for BTS internal use
            11 = PBCCH + PCCCH + PDTCH + PACCH + PTCCH (This channel configuration type can be used in GPRS release 2).
            0xFF = spare TS 
        */
        
        if(ts->pchan == GSM_PCHAN_NONE)
            chan_config = 0xFF;
        else if(ts->pchan == GSM_PCHAN_CCCH)
            chan_config = 0;
        else if(ts->pchan == GSM_PCHAN_CCCH_SDCCH4)
            chan_config = 1;
        else if(ts->pchan == GSM_PCHAN_TCH_F)
            chan_config = 6; /* 9 should work too */
        else if(ts->pchan == GSM_PCHAN_TCH_H)
            chan_config = 9;
        else if(ts->pchan == GSM_PCHAN_SDCCH8_SACCH8C)
            chan_config = 4;
        else if(ts->pchan == GSM_PCHAN_PDCH)
            chan_config = 11;
        else {      
            fprintf(stderr, "unsupported channel config %d for timeslot %d\n", ts->pchan, i);
            return 0;
        }
        
        fu_config[72 + i] = chan_config; 
    }   
    return sizeof(fu_config_template);
}

/* TODO: put in a separate file ? */

static uint8_t bts_config_1[] =
{
  0x4E, 0x02, 
  /* ID = 0x0E (Frame number) */
  /* length = 2 */
  /* [2] */
  0xFF, 0xFF, 

  0x5F, 0x4E, 0x02, 
  /* ID = 0x4E (RX antenna supervision period) */
  /* length = 2 */
  /* [7] */
  0xFF, 0xFF, 

  0x5F, 0x50, 0x02, 
  /* ID = 0x50 (Sector configuration) */
  /* length = 2 */
  /* [12] */
  0x01, 0x01, 
};

static uint8_t bts_config_2[] =
{
  0x55, 0x02, 
  /* ID = 0x15 (Hopping mode) */
  /* length = 2 */
  /* [2] */
  0x01, 0x00, 

  0x5F, 0x75, 0x02, 
  /* ID = 0x75 (RX diversity selection) */
  /* length = 2 */
  /* [7] */
  0x01, 0x01, 
};

static uint8_t bts_config_3[] =
{  
  0x5F, 0x20, 0x02, 
  /* ID = 0x20 (Extended cell radius) */
  /* length = 2 */
  /* [3] */
  0x01, 0x00, 
};

static uint8_t bts_config_4[] =
{    
  0x5F, 0x74, 0x09, 
  /* ID = 0x74 (Real Time) */
  /* length = 9 */
  /* [3] year-high, year-low, month, day, hour, minute, second, msec-high, msec-low */
  0x07, 0xDB, 0x06, 0x02, 0x0B, 0x20, 0x0C, 0x00, 
  0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [15] */
  0x01, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [21] */
  0x02, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [27] */
  0x03, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [33] */
  0x04, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [39] */
  0x05, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [45] */
  0x06, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [51] */
  0x07, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [57] */
  0x08, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [63] */
  0x09, 0x01, 0x00, 

  0x5F, 0x76, 0x03, 
  /* ID = 0x76 (EAC input config) */
  /* length = 3 */
  /* [69] */
  0x0A, 0x01, 0x00, 
};

static uint8_t bts_config_insite[] =
{
  0x4E, 0x02, 
  /* ID = 0x0E (Frame number) */
  /* length = 2 */
  /* [2] */
  0xFF, 0xFF, 

  0x5F, 0x4E, 0x02, 
  /* ID = 0x4E (RX antenna supervision period) */
  /* length = 2 */
  /* [7] */
  0xFF, 0xFF, 

  0x5F, 0x50, 0x02, 
  /* ID = 0x50 (Sector configuration) */
  /* length = 2 */
  /* [12] */
  0x01, 0x01, 

  0x55, 0x02, 
  /* ID = 0x15 (Hopping mode) */
  /* length = 2 */
  /* [16] */
  0x01, 0x00, 

  0x5F, 0x20, 0x02, 
  /* ID = 0x20 (Extended cell radius) */
  /* length = 2 */
  /* [21] */
  0x01, 0x00, 

  0x5F, 0x74, 0x09, 
  /* ID = 0x74 (Real Time) */
  /* length = 9 */
  /* [26] */
  0x07, 0xDB, 0x07, 0x0A, 0x0F, 0x09, 0x0B, 0x00, 
  0x00, 
};

void set_real_time(uint8_t *real_time)
{
    time_t t;
    struct tm *tm;

    t = time(NULL);
    tm = localtime(&t);

    /* year-high, year-low, month, day, hour, minute, second, msec-high, msec-low */
  
    real_time[0] = (1900 + tm->tm_year) >> 8;
    real_time[1] = (1900 + tm->tm_year) & 0xFF;
    real_time[2] = tm->tm_mon + 1;
    real_time[3] = tm->tm_mday;
    real_time[4] = tm->tm_hour;
    real_time[5] = tm->tm_min;
    real_time[6] = tm->tm_sec;
    real_time[7] = 0; 
    real_time[8] = 0;
}

/* TODO: put in a separate file ? */

/*

  build the configuration data
  
*/

static int make_bts_config(uint8_t bts_type, int n_trx, uint8_t *fu_config, int need_hopping)
{
    /* is it an InSite BTS ? */
    if(bts_type == 0x0E || bts_type == 0x0F || bts_type == 0x10) { /* TODO */
        if(n_trx != 1) {
            fprintf(stderr, "InSite has only one TRX\n");       
            return 0;
        }
        if(need_hopping != 0) {
            fprintf(stderr, "InSite does not support hopping\n");
            return 0;
        }
        memcpy(fu_config, bts_config_insite, sizeof(bts_config_insite));
        set_real_time(&fu_config[26]);
        return sizeof(bts_config_insite);
    }
                
    int len = 0;
    int i;
    
    memcpy(fu_config + len, bts_config_1, sizeof(bts_config_1));    
    
    /* set sector configuration */
    fu_config[len + 12 - 1] = 1 + n_trx; /* len */
    for(i = 0; i < n_trx; i++)
        fu_config[len + 12 + 1 + i] = ((i + 1) & 0xFF);
    
    len += (sizeof(bts_config_1) + (n_trx - 1));

    memcpy(fu_config + len, bts_config_2, sizeof(bts_config_2));
    /* set hopping mode (Baseband and RF hopping work for the MetroSite) */
    if(need_hopping)
        fu_config[len + 2 + 1] = 1; /* 0: no hopping, 1: Baseband hopping, 2: RF hopping */
    len += sizeof(bts_config_2);
    
    /* set extended cell radius for each TRX */ 
    for(i = 0; i < n_trx; i++) {
        memcpy(fu_config + len, bts_config_3, sizeof(bts_config_3));
        fu_config[len + 3] = ((i + 1) & 0xFF);
        len += sizeof(bts_config_3);
    }
    
    memcpy(fu_config + len, bts_config_4, sizeof(bts_config_4));
    set_real_time(&fu_config[len + 3]);
    len += sizeof(bts_config_4);
    
    return len;
}

/* TODO: put in a separate file ? */

static struct msgb *nm_msgb_alloc(void)
{
    return msgb_alloc_headroom(OM_ALLOC_SIZE, OM_HEADROOM_SIZE,
                   "OML");
}

/* TODO: put in a separate file ? */

struct abis_om_nokia_hdr {
    uint8_t  msg_type;
    uint8_t  spare;
    uint16_t reference;
    uint8_t  data[0];
} __attribute__ ((packed));

#define ABIS_OM_NOKIA_HDR_SIZE (sizeof(struct abis_om_hdr) + sizeof(struct abis_om_nokia_hdr))

static int abis_nm_send(struct gsm_bts *bts, uint8_t msg_type, uint16_t ref, uint8_t *data, int len_data)
{
    struct abis_om_hdr *oh;
    struct abis_om_nokia_hdr *noh;
    struct msgb *msg = nm_msgb_alloc();
    
    oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_NOKIA_HDR_SIZE + len_data);
        
    oh->mdisc = ABIS_OM_MDISC_FOM;
    oh->placement = ABIS_OM_PLACEMENT_ONLY;
    oh->sequence = 0;
    oh->length = sizeof(struct abis_om_nokia_hdr) + len_data;

    noh = (struct abis_om_nokia_hdr *)oh->data; 
    
    noh->msg_type = msg_type;
    noh->spare = 0;
    noh->reference = htons(ref);
    memcpy(noh->data, data, len_data);
    
    DEBUGPC(DNM, "Sending %s\n", get_msg_type_name_string(msg_type));

    return abis_nm_sendmsg(bts, msg);
}

/* TODO: put in a separate file ? */

static uint8_t download_req[] = {
  0x5F, 0x25, 0x0B, 
  /* ID = 0x25 (File identity) */
  /* length = 11 */
  /* [3] */
  0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 
  0x2A, 0x2A, 0x2A, 

  0x5F, 0x78, 0x03, 
  /* ID = 0x78 (File version) */
  /* length = 3 */
  /* [17] */
  0x2A, 0x2A, 0x2A, 

  0x5F, 0x81, 0x0A, 0x01, 
  /* ID = 0x8A (SW load mode) */
  /* length = 1 */
  /* [24] */
  0x01, 

  0x5F, 0x81, 0x06, 0x01, 
  /* ID = 0x86 (Acknowledgement period) */
  /* length = 1 */
  /* [29] */
  0x01, 
};

static int abis_nm_download_req(struct gsm_bts *bts, uint16_t ref)
{
    uint8_t *data = download_req;
    int len_data = sizeof(download_req);
    
    return abis_nm_send(bts, NOKIA_MSG_START_DOWNLOAD_REQ, ref, data, len_data);
}

/* TODO: put in a separate file ? */

static uint8_t ack[] = {
  0x5F, 0x23, 0x01, 
  /* ID = 0x23 (Ack-Nack) */
  /* length = 1 */
  /* [3] */
  0x01, 
};

static int abis_nm_ack(struct gsm_bts *bts, uint16_t ref)
{
    uint8_t *data = ack;
    int len_data = sizeof(ack);
    
    return abis_nm_send(bts, NOKIA_MSG_ACK, ref, data, len_data);
}

/* TODO: put in a separate file ? */

static uint8_t reset[] = {
  0x5F, 0x40, 0x04, 
  /* ID = 0x40 (Object identity) */
  /* length = 4 */
  /* [3] */
  0x00, 0x01, 0xFF, 0xFF, 
};

static int abis_nm_reset(struct gsm_bts *bts, uint16_t ref)
{
    uint8_t *data = reset;
    int len_data = sizeof(reset);
    
    return abis_nm_send(bts, NOKIA_MSG_RESET_REQ, ref, data, len_data);
}

/* TODO: put in a separate file ? */

static int abis_nm_send_multi_segments(struct gsm_bts *bts, uint8_t msg_type, uint16_t ref, uint8_t *data, int len)
{
    int len_remain, len_to_send, max_send;
    int seq = 0;
    int ret;
        
    len_remain = len;
    
    while(len_remain) { 
        struct abis_om_hdr *oh;
        struct abis_om_nokia_hdr *noh;
        struct msgb *msg = nm_msgb_alloc();
        
        if(seq == 0)
            max_send = 256 - sizeof(struct abis_om_nokia_hdr);
        else
            max_send = 256;
            
        if(len_remain > max_send) {
            len_to_send = max_send;
            
            if(seq == 0) {
                /* first segment */
                oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_NOKIA_HDR_SIZE + len_to_send);
        
                oh->mdisc = ABIS_OM_MDISC_FOM;
                oh->placement = ABIS_OM_PLACEMENT_FIRST; /* first segment of multi-segment message */
                oh->sequence = seq;
                oh->length = 0; /* 256 bytes */
            
                noh = (struct abis_om_nokia_hdr *)oh->data; 
    
                noh->msg_type = msg_type;
                noh->spare = 0;
                noh->reference = htons(ref);
                memcpy(noh->data, data, len_to_send);
            } else {
                /* segment in between */
                oh = (struct abis_om_hdr *) msgb_put(msg, sizeof(struct abis_om_hdr) + len_to_send);
        
                oh->mdisc = ABIS_OM_MDISC_FOM;
                oh->placement = ABIS_OM_PLACEMENT_MIDDLE; /* segment of multi-segment message */
                oh->sequence = seq;
                oh->length = 0; /* 256 bytes */
            
                memcpy(oh->data, data, len_to_send);
            }
        }
        else {
        
            len_to_send = len_remain;
        
            /* check if message fits in a single segment */
            
            if(seq == 0)
                return abis_nm_send(bts, msg_type, ref, data, len_to_send);
                    
            /* last segment */
            
            oh = (struct abis_om_hdr *) msgb_put(msg, sizeof(struct abis_om_hdr) + len_to_send);
        
            oh->mdisc = ABIS_OM_MDISC_FOM;
            oh->placement = ABIS_OM_PLACEMENT_LAST; /* last segment of multi-segment message */
            oh->sequence = seq;
            oh->length = len_to_send;
            
            memcpy(oh->data, data, len_to_send);
        }
    
        DEBUGPC(DNM, "Sending multi-segment %d\n", seq);

        ret = abis_nm_sendmsg(bts, msg);
        if(ret < 0)
            return ret;
        
        abis_nm_queue_send_next(bts);
            
        /* next segment */  
        len_remain -= len_to_send;
        data += len_to_send;
        seq++;
    }
    return ret;
}

/* TODO: put in a separate file ? */

static int abis_nm_send_config(struct gsm_bts *bts, uint8_t bts_type)
{
    struct gsm_bts_trx *trx;        
    uint8_t config[2048]; /* TODO: might be too small if lots of TRX are used */
    int len = 0;
    int idx = 0;
    int ret;
    int hopping = 0;
    int need_hopping = 0;
        
    memset(config, 0, sizeof(config));
        
    llist_for_each_entry(trx, &bts->trx_list, list)
    {
#if 0 /* debugging */   
        printf("TRX\n");
        printf("  arfcn: %d\n", trx->arfcn);
        printf("  bsic: %d\n", trx->bts->bsic);
        uint8_t ca[20];
        memset(ca, 0xFF, sizeof(ca));
        ret = generate_cell_chan_list(ca, trx->bts);
        printf("  ca (%d): %s\n", ret, osmo_hexdump(ca, sizeof(ca)));                                    
        int i;
        for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
            struct gsm_bts_trx_ts *ts = &trx->ts[i];
                
            printf("  pchan %d: %d\n", i, ts->pchan);
        }           
#endif          
        ret = make_fu_config(trx, idx + 1, config + len, &hopping);
        need_hopping |= hopping;
        len += ret;
            
        idx++;
    }
        
    ret = make_bts_config(bts_type, idx, config + len, need_hopping);
    len += ret;
        
#if 0 /* debugging */   
    dump_elements(config, len); 
#endif
    
    return abis_nm_send_multi_segments(bts, NOKIA_MSG_CONF_DATA, 1, config, len);
}

#define GET_NEXT_BYTE if(idx >= len) return 0; \
                        ub = data[idx++]; 

static int find_element(uint8_t *data, int len, uint16_t id, uint8_t *value, int max_value)
{   
    uint8_t ub;
    int idx = 0;
    int found = 0;
    int constructed;
    uint16_t id_value;
        
    for(;;) {   
    
        GET_NEXT_BYTE;
        
        /* encoding bit, construced means that other elements are contained */
        constructed = ((ub & 0x20) ? 1 : 0);
        
        if((ub & 0x1F) == 0x1F) {
            /* fixed pattern, ID follows */
            GET_NEXT_BYTE; /* ID */
            id_value = ub & 0x7F;
            if(ub & 0x80) { 
                /* extension bit */
                GET_NEXT_BYTE; /* ID low part */
                id_value = (id_value << 7) | (ub & 0x7F);
            }
            if(id_value == id)
                found = 1;
        }
        else {
            id_value = (ub & 0x3F);
            if(id_value == id)
                found = 1;
        }
        
        GET_NEXT_BYTE; /* length */
        
        if(found) {
            /* get data */
            uint8_t n = ub;
            uint8_t i;
            for(i = 0; i < n; i++) {
                GET_NEXT_BYTE;
                if(max_value <= 0)
                    return -1; /* buffer too small */
                *value = ub;
                value++;
                max_value--;
            }
            return n; /* length */
        }
        else {
            /* skip data */
            uint8_t n = ub;
            uint8_t i;
            for(i = 0; i < n; i++) {
                GET_NEXT_BYTE;
            }
        }
    }
    return 0; /* not found */
}

static int dump_elements(uint8_t *data, int len)
{   
    uint8_t ub;
    int idx = 0;
    int constructed;
    uint16_t id_value;
    static char indent[100] = ""; /* TODO: move static to BTS context */
        
    for(;;) {   
    
        GET_NEXT_BYTE;
        
        /* encoding bit, construced means that other elements are contained */
        constructed = ((ub & 0x20) ? 1 : 0);
        
        if((ub & 0x1F) == 0x1F) {
            /* fixed pattern, ID follows */
            GET_NEXT_BYTE; /* ID */
            id_value = ub & 0x7F;
            if(ub & 0x80) { 
                /* extension bit */
                GET_NEXT_BYTE; /* ID low part */
                id_value = (id_value << 7) | (ub & 0x7F);
            }
            
        }
        else {
            id_value = (ub & 0x3F);
        }
        
        GET_NEXT_BYTE; /* length */
        
        printf("%s--ID = 0x%02X (%s) %s\n", indent, id_value, get_element_name_string(id_value), constructed ? "** constructed **" : "");
        printf("%s  length = %d\n", indent, ub);        
        printf("%s  %s\n", indent, osmo_hexdump(data + idx, ub));

        if(constructed) {
            int indent_len = strlen(indent);
            strcat(indent, "   ");          
            
            dump_elements(data + idx, ub);          
            
            indent[indent_len] = 0;
        }
        /* skip data */
        uint8_t n = ub;
        uint8_t i;
        for(i = 0; i < n; i++) {
            GET_NEXT_BYTE;
        }
    }
    return 0;
}

/* TODO: put in a separate file ? */

/* taken from abis_nm.c */

static void abis_nm_queue_send_next(struct gsm_bts *bts)
{
    int wait = 0;
    struct msgb *msg;
    /* the queue is empty */
    while (!llist_empty(&bts->abis_queue)) {
        msg = msgb_dequeue(&bts->abis_queue);
        wait = OBSC_NM_W_ACK_CB(msg);
        _abis_nm_sendmsg(msg, 0);

        if (wait)
            break;
    }

    bts->abis_nm_pend = wait;
}

/* TODO: put in a separate file ? */

/* timer for restarting OML after BTS reset */

static void reset_timer_cb(void *_bts)
{
    struct gsm_bts *bts = _bts;
    struct gsm_e1_subslot *e1_link = &bts->oml_e1_link;
    struct e1inp_line *line;
    
    wait_reset = 0;
    
    /* OML link */
    line = e1inp_line_get(e1_link->e1_nr);
    if (!line) {
        LOGP(DINP, LOGL_ERROR, "BTS %u OML link referring to "
             "non-existing E1 line %u\n", bts->nr, e1_link->e1_nr);
        return;
    }
    
    start_sabm_in_line(line, 0, -1); /* stop all first */
    start_sabm_in_line(line, 1, SAPI_OML); /* start only OML */
}

/* TODO: put in a separate file ? */

/*
  This is how the configuration is done:
  
  - start OML link
  
  - reset BTS
  
  - receive ACK, wait some time and restart OML link
  
  - receive OMU STARTED message, send START DOWNLOAD REQ
  
  - receive CNF REQ message, send CONF DATA
  
  - receive ACK, start RSL link(s)
  
  ACK some other messages received from the BTS.
  
  Probably its also possible to configure the BTS without a reset, this 
  has not been tested yet.
*/

static int abis_nm_rcvmsg_fom(struct msgb *mb)
{
    struct gsm_bts *bts = mb->trx->bts;
    struct abis_om_hdr *oh = msgb_l2(mb);
    struct abis_om_nokia_hdr *noh = msgb_l3(mb);
    uint8_t mt = noh->msg_type;
    int ret = 0;
    uint16_t ref = ntohs(noh->reference);
    /* TODO: move statics to BTS context */
    static int conf = 0;
    static uint8_t bts_type = 0xFF;
    uint8_t info[256];
    uint8_t ack = 0xFF;
    uint8_t severity = 0xFF;
    int str_len;
    int len_data;

    if(wait_reset) {
        LOGP(DNM, LOGL_INFO, "Ignore message while waiting for reset\n");
        return ret;
    }

    if(oh->length < sizeof(struct abis_om_nokia_hdr)) { 
        LOGP(DNM, LOGL_ERROR, "Message too short\n");
        return -EINVAL;
    }
    
    len_data = oh->length - sizeof(struct abis_om_nokia_hdr);
    LOGP(DNM, LOGL_INFO, "(0x%02X) %s\n", mt, get_msg_type_name_string(mt));
#if 0 /* debugging */   
    dump_elements(noh->data, len_data); 
#endif
    
    switch (mt) {
    case NOKIA_MSG_OMU_STARTED:
        if(find_element(noh->data, len_data, NOKIA_EI_BTS_TYPE, &bts_type, sizeof(uint8_t)) == sizeof(uint8_t))
            LOGP(DNM, LOGL_INFO, "BTS type = %d (%s)\n", bts_type, get_bts_type_string(bts_type));
        else
            LOGP(DNM, LOGL_ERROR, "BTS type not found\n");
        /* send START_DOWNLOAD_REQ */
        abis_nm_download_req(bts, ref);
        break;
    case NOKIA_MSG_MF_REQ:
        break;
    case NOKIA_MSG_CONF_REQ:
        /* send ACK */
        abis_nm_ack(bts, ref);
        abis_nm_queue_send_next(bts);
        /* send CONF_DATA */
        abis_nm_send_config(bts, bts_type);
        conf = 1;
        break;
    case NOKIA_MSG_ACK:
        if(find_element(noh->data, len_data, NOKIA_EI_ACK, &ack, sizeof(uint8_t)) == sizeof(uint8_t)) {
            LOGP(DNM, LOGL_INFO, "ACK = %d\n", ack);
            if(ack != 1) {
                LOGP(DNM, LOGL_ERROR, "No ACK received (%d)\n", ack);
                /* TODO: properly handle failures (NACK) */                     
            }
        }
        else
            LOGP(DNM, LOGL_ERROR, "ACK not found\n");

        /* TODO: the assumption for the following is that no NACK was received */
            
        /* ACK for reset message ? */
        if(do_reset != 0) {
            do_reset = 0;
            
            /* 
              TODO: For the InSite processing the received data is 
              blocked in the driver during reset.
              Otherwise the LAPD module might assert because the InSite
              sends garbage on the E1 line during reset.
              This is done by looking at "wait_reset" in the driver
              (function handle_ts1_read()) and ignoring the received data.
              It seems to be necessary for the MetroSite too.
            */
            wait_reset = 1;
            
            reset_timer.cb = &reset_timer_cb;
            reset_timer.data = bts;
            osmo_timer_schedule(&reset_timer, RESET_INTERVAL);
            
            struct gsm_e1_subslot *e1_link = &bts->oml_e1_link;
            struct e1inp_line *line;
            /* OML link */
            line = e1inp_line_get(e1_link->e1_nr);
            if (!line) {
                LOGP(DINP, LOGL_ERROR, "BTS %u OML link referring to "
                     "non-existing E1 line %u\n", bts->nr, e1_link->e1_nr);
                return -ENOMEM;
            }
    
            start_sabm_in_line(line, 0, -1); /* stop all first */           
        }
        
        /* ACK for CONF DATA message ? */
        if(conf != 0) {         
            /* start TRX  (RSL link) */
            
            struct gsm_e1_subslot *e1_link = &mb->trx->rsl_e1_link;
            struct e1inp_line *line;
            
            conf = 0;
            
            /* RSL Link */
            line = e1inp_line_get(e1_link->e1_nr);
            if (!line) {
                LOGP(DINP, LOGL_ERROR, "TRX (%u/%u) RSL link referring "
                     "to non-existing E1 line %u\n", mb->trx->bts->nr,
                     mb->trx->nr, e1_link->e1_nr);
                return -ENOMEM;
            }            
            /* start TRX */         
            start_sabm_in_line(line, 1, SAPI_RSL); /* start only RSL */
        }
        break;
    case NOKIA_MSG_STATE_CHANGED:
        /* send ACK */
        abis_nm_ack(bts, ref);
        break;
    case NOKIA_MSG_CONF_COMPLETE:
        /* send ACK */
        abis_nm_ack(bts, ref);
        break;
    case NOKIA_MSG_BLOCK_CTRL_REQ: /* seems to be send when something goes wrong !? */
        /* send ACK (do we have to send an ACK ?) */
        abis_nm_ack(bts, ref);
        break;
    case NOKIA_MSG_ALARM:
        find_element(noh->data, len_data, NOKIA_EI_SEVERITY, &severity, sizeof(severity));
        /* TODO: there might be alarms with both elements set */
        str_len = find_element(noh->data, len_data, NOKIA_EI_ADD_INFO, info, sizeof(info));
        if(str_len > 0) {
            info[str_len] = 0;
            LOGP(DNM, LOGL_INFO, "ALARM Severity %s (%d) : %s\n", get_severity_string(severity), severity, info);
        } else { /* nothing found, try details */       
            str_len = find_element(noh->data, len_data, NOKIA_EI_ALARM_DETAIL, info, sizeof(info));
            if(str_len > 0) {
                uint16_t code;
                info[str_len] = 0;              
                code = (info[0] << 8) + info[1];
                LOGP(DNM, LOGL_INFO, "ALARM Severity %s (%d), code 0x%X : %s\n", get_severity_string(severity), severity, code, info + 2);
            }
        }
        /* send ACK */
        abis_nm_ack(bts, ref);
        break;
    }

    abis_nm_queue_send_next(bts);
    
    return ret;
}

/* TODO: put in a separate file ? */

int abis_nokia_rcvmsg(struct msgb *msg)
{
    struct abis_om_hdr *oh = msgb_l2(msg);
    int rc = 0;

    /* Various consistency checks */
    if (oh->placement != ABIS_OM_PLACEMENT_ONLY) {
        LOGP(DNM, LOGL_ERROR, "ABIS OML placement 0x%x not supported\n",
            oh->placement);
        if (oh->placement != ABIS_OM_PLACEMENT_FIRST)
            return -EINVAL;
    }
    if (oh->sequence != 0) {
        LOGP(DNM, LOGL_ERROR, "ABIS OML sequence 0x%x != 0x00\n",
            oh->sequence);
        return -EINVAL;
    }
    msg->l3h = (unsigned char *)oh + sizeof(*oh);

    switch (oh->mdisc) {
    case ABIS_OM_MDISC_FOM:
        LOGP(DNM, LOGL_INFO, "ABIS_OM_MDISC_FOM\n");
        rc = abis_nm_rcvmsg_fom(msg);
        break;
    case ABIS_OM_MDISC_MANUF:
        LOGP(DNM, LOGL_INFO, "ABIS_OM_MDISC_MANUF\n");
        break;
    case ABIS_OM_MDISC_MMI:
    case ABIS_OM_MDISC_TRAU:
        LOGP(DNM, LOGL_ERROR, "unimplemented ABIS OML message discriminator 0x%x\n",
            oh->mdisc);
        break;
    default:
        LOGP(DNM, LOGL_ERROR, "unknown ABIS OML message discriminator 0x%x\n",
            oh->mdisc);
        return -EINVAL;
    }

    msgb_free(msg);
    return rc;
}

static int bts_model_nokia_site_start(struct gsm_network *net);

static struct gsm_bts_model model_nokia_site = {
    .type = GSM_BTS_TYPE_NOKIA_SITE,
    .name = "nokia_site",
    .start = bts_model_nokia_site_start,
    .oml_rcvmsg = &abis_nokia_rcvmsg
};

static struct gsm_network *my_net;

static int bts_model_nokia_site_start(struct gsm_network *net)
{
    model_nokia_site.features.data = &model_nokia_site._features_data[0];
    model_nokia_site.features.data_len = sizeof(model_nokia_site._features_data);

    gsm_btsmodel_set_feature(&model_nokia_site, BTS_FEAT_HOPPING);
    gsm_btsmodel_set_feature(&model_nokia_site, BTS_FEAT_HSCSD);

    osmo_signal_register_handler(SS_INPUT, inp_sig_cb, NULL);
    osmo_signal_register_handler(SS_GLOBAL, gbl_sig_cb, NULL);
    osmo_signal_register_handler(SS_NM, nm_sig_cb, NULL);

    my_net = net;
    
    return 0;
}

int bts_model_nokia_site_init(void)
{
    return gsm_bts_model_register(&model_nokia_site);
}

