Changeset 2e411c7b0d24639968b0e551f4bf1c1e2627caf7

Show
Ignore:
Timestamp:
03/01/10 21:59:06 (5 months ago)
Author:
Harald Welte <laforge@gnumonks.org>
Parents:
8b0079909d1ae229862e3372dbfb26955772725d
Children:
474d19f5c00f6224852e28606dbe4f2e455198c0
git-committer:
Harald Welte <laforge@gnumonks.org> / 2010-03-01T21:59:06Z+0100
Message:

value_string functions and some RSL related stuff has moved to libosmocore

Location:
openbsc
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • openbsc/include/openbsc/gsm_data.h

    rdfe6c7d r2e411c7  
    33 
    44#include <sys/types.h> 
    5  
    6 struct value_string { 
    7         unsigned int value; 
    8         const char *str; 
    9 }; 
    10  
    11 const char *get_value_string(const struct value_string *vs, u_int32_t val); 
    12 int get_string_value(const struct value_string *vs, const char *str); 
    135 
    146enum gsm_phys_chan_config { 
  • openbsc/src/abis_rsl.c

    rdfe6c7d r2e411c7  
    4141#include <openbsc/meas_rep.h> 
    4242#include <openbsc/rtp_proxy.h> 
     43#include <osmocore/rsl.h> 
    4344 
    4445#define RSL_ALLOC_SIZE          1024 
     
    4647 
    4748#define MAX(a, b) (a) >= (b) ? (a) : (b) 
    48  
    49 static const struct tlv_definition rsl_att_tlvdef = { 
    50         .def = { 
    51                 [RSL_IE_CHAN_NR]                = { TLV_TYPE_TV }, 
    52                 [RSL_IE_LINK_IDENT]             = { TLV_TYPE_TV }, 
    53                 [RSL_IE_ACT_TYPE]               = { TLV_TYPE_TV }, 
    54                 [RSL_IE_BS_POWER]               = { TLV_TYPE_TV }, 
    55                 [RSL_IE_CHAN_IDENT]             = { TLV_TYPE_TLV }, 
    56                 [RSL_IE_CHAN_MODE]              = { TLV_TYPE_TLV }, 
    57                 [RSL_IE_ENCR_INFO]              = { TLV_TYPE_TLV }, 
    58                 [RSL_IE_FRAME_NUMBER]           = { TLV_TYPE_FIXED, 2 }, 
    59                 [RSL_IE_HANDO_REF]              = { TLV_TYPE_TV }, 
    60                 [RSL_IE_L1_INFO]                = { TLV_TYPE_FIXED, 2 }, 
    61                 [RSL_IE_L3_INFO]                = { TLV_TYPE_TL16V }, 
    62                 [RSL_IE_MS_IDENTITY]            = { TLV_TYPE_TLV }, 
    63                 [RSL_IE_MS_POWER]               = { TLV_TYPE_TV }, 
    64                 [RSL_IE_PAGING_GROUP]           = { TLV_TYPE_TV }, 
    65                 [RSL_IE_PAGING_LOAD]            = { TLV_TYPE_FIXED, 2 }, 
    66                 [RSL_IE_PYHS_CONTEXT]           = { TLV_TYPE_TLV }, 
    67                 [RSL_IE_ACCESS_DELAY]           = { TLV_TYPE_TV }, 
    68                 [RSL_IE_RACH_LOAD]              = { TLV_TYPE_TLV }, 
    69                 [RSL_IE_REQ_REFERENCE]          = { TLV_TYPE_FIXED, 3 }, 
    70                 [RSL_IE_RELEASE_MODE]           = { TLV_TYPE_TV }, 
    71                 [RSL_IE_RESOURCE_INFO]          = { TLV_TYPE_TLV }, 
    72                 [RSL_IE_RLM_CAUSE]              = { TLV_TYPE_TLV }, 
    73                 [RSL_IE_STARTNG_TIME]           = { TLV_TYPE_FIXED, 2 }, 
    74                 [RSL_IE_TIMING_ADVANCE]         = { TLV_TYPE_TV }, 
    75                 [RSL_IE_UPLINK_MEAS]            = { TLV_TYPE_TLV }, 
    76                 [RSL_IE_CAUSE]                  = { TLV_TYPE_TLV }, 
    77                 [RSL_IE_MEAS_RES_NR]            = { TLV_TYPE_TV }, 
    78                 [RSL_IE_MSG_ID]                 = { TLV_TYPE_TV }, 
    79                 [RSL_IE_SYSINFO_TYPE]           = { TLV_TYPE_TV }, 
    80                 [RSL_IE_MS_POWER_PARAM]         = { TLV_TYPE_TLV }, 
    81                 [RSL_IE_BS_POWER_PARAM]         = { TLV_TYPE_TLV }, 
    82                 [RSL_IE_PREPROC_PARAM]          = { TLV_TYPE_TLV }, 
    83                 [RSL_IE_PREPROC_MEAS]           = { TLV_TYPE_TLV }, 
    84                 [RSL_IE_IMM_ASS_INFO]           = { TLV_TYPE_TLV }, 
    85                 [RSL_IE_SMSCB_INFO]             = { TLV_TYPE_FIXED, 23 }, 
    86                 [RSL_IE_MS_TIMING_OFFSET]       = { TLV_TYPE_TV }, 
    87                 [RSL_IE_ERR_MSG]                = { TLV_TYPE_TLV }, 
    88                 [RSL_IE_FULL_BCCH_INFO]         = { TLV_TYPE_TLV }, 
    89                 [RSL_IE_CHAN_NEEDED]            = { TLV_TYPE_TV }, 
    90                 [RSL_IE_CB_CMD_TYPE]            = { TLV_TYPE_TV }, 
    91                 [RSL_IE_SMSCB_MSG]              = { TLV_TYPE_TLV }, 
    92                 [RSL_IE_FULL_IMM_ASS_INFO]      = { TLV_TYPE_TLV }, 
    93                 [RSL_IE_SACCH_INFO]             = { TLV_TYPE_TLV }, 
    94                 [RSL_IE_CBCH_LOAD_INFO]         = { TLV_TYPE_TV }, 
    95                 [RSL_IE_SMSCB_CHAN_INDICATOR]   = { TLV_TYPE_TV }, 
    96                 [RSL_IE_GROUP_CALL_REF]         = { TLV_TYPE_TLV }, 
    97                 [RSL_IE_CHAN_DESC]              = { TLV_TYPE_TLV }, 
    98                 [RSL_IE_NCH_DRX_INFO]           = { TLV_TYPE_TLV }, 
    99                 [RSL_IE_CMD_INDICATOR]          = { TLV_TYPE_TLV }, 
    100                 [RSL_IE_EMLPP_PRIO]             = { TLV_TYPE_TV }, 
    101                 [RSL_IE_UIC]                    = { TLV_TYPE_TLV }, 
    102                 [RSL_IE_MAIN_CHAN_REF]          = { TLV_TYPE_TV }, 
    103                 [RSL_IE_MR_CONFIG]              = { TLV_TYPE_TLV }, 
    104                 [RSL_IE_MR_CONTROL]             = { TLV_TYPE_TV }, 
    105                 [RSL_IE_SUP_CODEC_TYPES]        = { TLV_TYPE_TLV }, 
    106                 [RSL_IE_CODEC_CONFIG]           = { TLV_TYPE_TLV }, 
    107                 [RSL_IE_RTD]                    = { TLV_TYPE_TV }, 
    108                 [RSL_IE_TFO_STATUS]             = { TLV_TYPE_TV }, 
    109                 [RSL_IE_LLP_APDU]               = { TLV_TYPE_TLV }, 
    110                 [RSL_IE_SIEMENS_MRPCI]          = { TLV_TYPE_TV }, 
    111                 [RSL_IE_IPAC_PROXY_UDP]         = { TLV_TYPE_FIXED, 2 }, 
    112                 [RSL_IE_IPAC_BSCMPL_TOUT]       = { TLV_TYPE_TV }, 
    113                 [RSL_IE_IPAC_REMOTE_IP]         = { TLV_TYPE_FIXED, 4 }, 
    114                 [RSL_IE_IPAC_REMOTE_PORT]       = { TLV_TYPE_FIXED, 2 }, 
    115                 [RSL_IE_IPAC_RTP_PAYLOAD]       = { TLV_TYPE_TV }, 
    116                 [RSL_IE_IPAC_LOCAL_PORT]        = { TLV_TYPE_FIXED, 2 }, 
    117                 [RSL_IE_IPAC_SPEECH_MODE]       = { TLV_TYPE_TV }, 
    118                 [RSL_IE_IPAC_LOCAL_IP]          = { TLV_TYPE_FIXED, 4 }, 
    119                 [RSL_IE_IPAC_CONN_ID]           = { TLV_TYPE_FIXED, 2 }, 
    120                 [RSL_IE_IPAC_RTP_CSD_FMT]       = { TLV_TYPE_TV }, 
    121                 [RSL_IE_IPAC_RTP_JIT_BUF]       = { TLV_TYPE_FIXED, 2 }, 
    122                 [RSL_IE_IPAC_RTP_COMPR]         = { TLV_TYPE_TV }, 
    123                 [RSL_IE_IPAC_RTP_PAYLOAD2]      = { TLV_TYPE_TV }, 
    124                 [RSL_IE_IPAC_RTP_MPLEX]         = { TLV_TYPE_FIXED, 8 }, 
    125                 [RSL_IE_IPAC_RTP_MPLEX_ID]      = { TLV_TYPE_TV }, 
    126         }, 
    127 }; 
    128 #define rsl_tlv_parse(dec, buf, len)     \ 
    129                         tlv_parse(dec, &rsl_att_tlvdef, buf, len, 0, 0) 
    13049 
    13150static u_int8_t mdisc_by_msgtype(u_int8_t msg_type) 
     
    15473        dh->c.msg_type = msg_type; 
    15574        dh->ie_chan = RSL_IE_CHAN_NR; 
    156 } 
    157  
    158 static inline void init_llm_hdr(struct abis_rsl_rll_hdr *dh, 
    159                                   u_int8_t msg_type) 
    160 { 
    161         /* dh->c.msg_discr = mdisc_by_msgtype(msg_type); */ 
    162         dh->c.msg_discr = ABIS_RSL_MDISC_RLL; 
    163         dh->c.msg_type = msg_type; 
    164         dh->ie_chan = RSL_IE_CHAN_NR; 
    165         dh->ie_link_id = RSL_IE_LINK_IDENT; 
    166 } 
    167  
    168  
    169 /* encode channel number as per Section 9.3.1 */ 
    170 u_int8_t rsl_enc_chan_nr(u_int8_t type, u_int8_t subch, u_int8_t timeslot) 
    171 { 
    172         u_int8_t ret; 
    173  
    174         ret = (timeslot & 0x07) | type; 
    175          
    176         switch (type) { 
    177         case RSL_CHAN_Lm_ACCHs: 
    178                 subch &= 0x01; 
    179                 break; 
    180         case RSL_CHAN_SDCCH4_ACCH: 
    181                 subch &= 0x07; 
    182                 break; 
    183         case RSL_CHAN_SDCCH8_ACCH: 
    184                 subch &= 0x07; 
    185                 break; 
    186         default: 
    187                 /* no subchannels allowed */ 
    188                 subch = 0x00; 
    189                 break; 
    190         } 
    191         ret |= (subch << 3); 
    192  
    193         return ret; 
    19475} 
    19576 
     
    336217} 
    337218 
    338  
    339 static const char *rsl_err_vals[0xff] = { 
    340         [RSL_ERR_RADIO_IF_FAIL] =       "Radio Interface Failure", 
    341         [RSL_ERR_RADIO_LINK_FAIL] =     "Radio Link Failure", 
    342         [RSL_ERR_HANDOVER_ACC_FAIL] =   "Handover Access Failure", 
    343         [RSL_ERR_TALKER_ACC_FAIL] =     "Talker Access Failure", 
    344         [RSL_ERR_OM_INTERVENTION] =     "O&M Intervention", 
    345         [RSL_ERR_NORMAL_UNSPEC] =       "Normal event, unspecified", 
    346         [RSL_ERR_T_MSRFPCI_EXP] =       "Siemens: T_MSRFPCI Expired", 
    347         [RSL_ERR_EQUIPMENT_FAIL] =      "Equipment Failure", 
    348         [RSL_ERR_RR_UNAVAIL] =          "Radio Resource not available", 
    349         [RSL_ERR_TERR_CH_FAIL] =        "Terrestrial Channel Failure", 
    350         [RSL_ERR_CCCH_OVERLOAD] =       "CCCH Overload", 
    351         [RSL_ERR_ACCH_OVERLOAD] =       "ACCH Overload", 
    352         [RSL_ERR_PROCESSOR_OVERLOAD] =  "Processor Overload", 
    353         [RSL_ERR_RES_UNAVAIL] =         "Resource not available, unspecified", 
    354         [RSL_ERR_TRANSC_UNAVAIL] =      "Transcoding not available", 
    355         [RSL_ERR_SERV_OPT_UNAVAIL] =    "Service or Option not available", 
    356         [RSL_ERR_ENCR_UNIMPL] =         "Encryption algorithm not implemented", 
    357         [RSL_ERR_SERV_OPT_UNIMPL] =     "Service or Option not implemented", 
    358         [RSL_ERR_RCH_ALR_ACTV_ALLOC] =  "Radio channel already activated", 
    359         [RSL_ERR_INVALID_MESSAGE] =     "Invalid Message, unspecified", 
    360         [RSL_ERR_MSG_DISCR] =           "Message Discriminator Error", 
    361         [RSL_ERR_MSG_TYPE] =            "Message Type Error", 
    362         [RSL_ERR_MSG_SEQ] =             "Message Sequence Error", 
    363         [RSL_ERR_IE_ERROR] =            "General IE error", 
    364         [RSL_ERR_MAND_IE_ERROR] =       "Mandatory IE error", 
    365         [RSL_ERR_OPT_IE_ERROR] =        "Optional IE error", 
    366         [RSL_ERR_IE_NONEXIST] =         "IE non-existent", 
    367         [RSL_ERR_IE_LENGTH] =           "IE length error", 
    368         [RSL_ERR_IE_CONTENT] =          "IE content error", 
    369         [RSL_ERR_PROTO] =               "Protocol error, unspecified", 
    370         [RSL_ERR_INTERWORKING] =        "Interworking error, unspecified", 
    371 }; 
    372  
    373 static const struct value_string rlm_cause_strs[] = { 
    374         { RLL_CAUSE_T200_EXPIRED,       "Timer T200 expired (N200+1) times" }, 
    375         { RLL_CAUSE_REEST_REQ,          "Re-establishment request" }, 
    376         { RLL_CAUSE_UNSOL_UA_RESP,      "Unsolicited UA response" }, 
    377         { RLL_CAUSE_UNSOL_DM_RESP,      "Unsolicited DM response" }, 
    378         { RLL_CAUSE_UNSOL_DM_RESP_MF,   "Unsolicited DM response, multiple frame" }, 
    379         { RLL_CAUSE_UNSOL_SPRV_RESP,    "Unsolicited supervisory response" }, 
    380         { RLL_CAUSE_SEQ_ERR,            "Sequence Error" }, 
    381         { RLL_CAUSE_UFRM_INC_PARAM,     "U-Frame with incorrect parameters" }, 
    382         { RLL_CAUSE_SFRM_INC_PARAM,     "S-Frame with incorrect parameters" }, 
    383         { RLL_CAUSE_IFRM_INC_MBITS,     "I-Frame with incorrect use of M bit" }, 
    384         { RLL_CAUSE_IFRM_INC_LEN,       "I-Frame with incorrect length" }, 
    385         { RLL_CAUSE_FRM_UNIMPL,         "Fraeme not implemented" }, 
    386         { RLL_CAUSE_SABM_MF,            "SABM command, multiple frame established state" }, 
    387         { RLL_CAUSE_SABM_INFO_NOTALL,   "SABM frame with information not allowed in this state" }, 
    388         { 0,                            NULL }, 
    389 }; 
    390  
    391 static const char *rsl_err_name(u_int8_t err) 
    392 { 
    393         if (rsl_err_vals[err]) 
    394                 return rsl_err_vals[err]; 
    395         else 
    396                 return "unknown"; 
    397 } 
    398  
    399219static void print_rsl_cause(int lvl, const u_int8_t *cause_v, u_int8_t cause_len) 
    400220{ 
     
    881701        /* Then push the RSL header */ 
    882702        rh = (struct abis_rsl_rll_hdr *) msgb_push(msg, sizeof(*rh)); 
    883         init_llm_hdr(rh, RSL_MT_DATA_REQ); 
     703        rsl_init_rll_hdr(rh, RSL_MT_DATA_REQ); 
    884704        rh->c.msg_discr |= ABIS_RSL_MDISC_TRANSP; 
    885705        rh->chan_nr = lchan2chan_nr(msg->lchan); 
     
    899719 
    900720        rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh)); 
    901         init_llm_hdr(rh, RSL_MT_EST_REQ); 
     721        rsl_init_rll_hdr(rh, RSL_MT_EST_REQ); 
    902722        //rh->c.msg_discr |= ABIS_RSL_MDISC_TRANSP; 
    903723        rh->chan_nr = lchan2chan_nr(lchan); 
     
    920740 
    921741        rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh)); 
    922         init_llm_hdr(rh, RSL_MT_REL_REQ); 
     742        rsl_init_rll_hdr(rh, RSL_MT_REL_REQ); 
    923743        //rh->c.msg_discr |= ABIS_RSL_MDISC_TRANSP; 
    924744        rh->chan_nr = lchan2chan_nr(lchan); 
     
    14331253        LOGP(DRLL, LOGL_ERROR, "%s ERROR INDICATION cause=%s\n", 
    14341254                gsm_lchan_name(msg->lchan), 
    1435                 get_value_string(rlm_cause_strs, rlm_cause[1])); 
     1255                get_value_string(rsl_rlm_cause_strs, rlm_cause[1])); 
    14361256 
    14371257        rll_indication(msg->lchan, rllh->link_id, BSC_RLLR_IND_ERR_IND); 
     
    18741694} 
    18751695 
    1876  
    1877 /* Section 3.3.2.3 TS 05.02. I think this looks like a table */ 
    1878 int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf) 
    1879 { 
    1880         switch (ccch_conf) { 
    1881         case RSL_BCCH_CCCH_CONF_1_NC: 
    1882                 return 1; 
    1883         case RSL_BCCH_CCCH_CONF_1_C: 
    1884                 return 1; 
    1885         case RSL_BCCH_CCCH_CONF_2_NC: 
    1886                 return 2; 
    1887         case RSL_BCCH_CCCH_CONF_3_NC: 
    1888                 return 3; 
    1889         case RSL_BCCH_CCCH_CONF_4_NC: 
    1890                 return 4; 
    1891         default: 
    1892                 return -1; 
    1893         } 
    1894 } 
    1895  
    1896 /* Section 3.3.2.3 TS 05.02 */ 
    1897 int rsl_ccch_conf_to_bs_ccch_sdcch_comb(int ccch_conf) 
    1898 { 
    1899         switch (ccch_conf) { 
    1900         case RSL_BCCH_CCCH_CONF_1_NC: 
    1901                 return 0; 
    1902         case RSL_BCCH_CCCH_CONF_1_C: 
    1903                 return 1; 
    1904         case RSL_BCCH_CCCH_CONF_2_NC: 
    1905                 return 0; 
    1906         case RSL_BCCH_CCCH_CONF_3_NC: 
    1907                 return 0; 
    1908         case RSL_BCCH_CCCH_CONF_4_NC: 
    1909                 return 0; 
    1910         default: 
    1911                 return -1; 
    1912         } 
    1913 } 
    1914  
    19151696/* From Table 10.5.33 of GSM 04.08 */ 
    19161697int rsl_number_of_paging_subchannels(struct gsm_bts *bts) 
  • openbsc/src/debug.c

    rdfe6c7d r2e411c7  
    3030#include <openbsc/debug.h> 
    3131#include <osmocore/talloc.h> 
     32#include <osmocore/utils.h> 
    3233#include <openbsc/gsm_data.h> 
    3334#include <openbsc/gsm_subscriber.h> 
     
    5758}; 
    5859 
    59 const char *get_value_string(const struct value_string *vs, u_int32_t val) 
    60 { 
    61         int i; 
    62  
    63         for (i = 0;; i++) { 
    64                 if (vs[i].value == 0 && vs[i].str == NULL) 
    65                         break; 
    66                 if (vs[i].value == val) 
    67                         return vs[i].str; 
    68         } 
    69         return "unknown"; 
    70 } 
    71  
    72 int get_string_value(const struct value_string *vs, const char *str) 
    73 { 
    74         int i; 
    75  
    76         for (i = 0;; i++) { 
    77                 if (vs[i].value == 0 && vs[i].str == NULL) 
    78                         break; 
    79                 if (!strcasecmp(vs[i].str, str)) 
    80                         return vs[i].value; 
    81         } 
    82         return -EINVAL; 
    83 } 
    84  
    8560struct debug_info { 
    8661        const char *name;