Changeset afedeabd919972dcc3968b0d9743dc0b1a80774c

Show
Ignore:
Timestamp:
03/04/10 10:55:40 (5 months ago)
Author:
Harald Welte <laforge@gnumonks.org>
Parents:
fbc5ca080beedf8ca032cdd409db30838843f79b
Children:
52617919c8bc0f7ace3baebf1b6d9638d5c8466a, fbda4e1fb03ab80347647d355617a4c7c7f19cc7
git-committer:
Harald Welte <laforge@gnumonks.org> / 2010-03-04T10:55:40Z+0100
Message:

move some gsm48 utility functions to libosmocore

* gsm48_generate_lai() gsm48_generate_mid_from_tmsi() gsm48_generate_mid_from_imsi()
* gsm48_cc_msg_names[]

Location:
openbsc
Files:
6 modified

Legend:

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

    r474d19f rafedeab  
    1717 
    1818int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id); 
    19 void gsm0408_generate_lai(struct gsm48_loc_area_id *lai48, u_int16_t mcc,  
    20                 u_int16_t mnc, u_int16_t lac); 
    2119enum gsm_chan_t get_ctype_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci); 
    2220enum gsm_chreq_reason_t get_reason_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci); 
     
    2725struct msgb *gsm48_msgb_alloc(void); 
    2826int gsm48_sendmsg(struct msgb *msg, struct gsm_trans *trans); 
    29 int gsm48_generate_mid_from_tmsi(u_int8_t *buf, u_int32_t tmsi); 
    30 int gsm48_generate_mid_from_imsi(u_int8_t *buf, const char* imsi); 
    3127int gsm48_mi_to_string(char *string, const int str_len, const u_int8_t *mi, const int mi_len); 
    3228 
     
    4945                      int h_len); 
    5046 
    51 extern const char *gsm0408_cc_msg_names[]; 
    52  
    5347int send_siemens_mrpci(struct gsm_lchan *lchan, u_int8_t *classmark2_lv); 
    5448int gsm48_paging_extract_mi(struct msgb *msg, char *mi_string, u_int8_t *mi_type); 
  • openbsc/include/openbsc/gsm_data.h

    r2e411c7 rafedeab  
    647647                                struct gsm_bts *start_bts); 
    648648 
    649 char *gsm_band_name(enum gsm_band band); 
    650 enum gsm_band gsm_band_parse(const char *mhz); 
    651  
    652649extern void *tall_bsc_ctx; 
    653650extern int ipacc_rtp_direct; 
  • openbsc/src/gsm_04_08.c

    r474d19f rafedeab  
    749749 
    750750        lai = (struct gsm48_loc_area_id *) msgb_put(msg, sizeof(*lai)); 
    751         gsm0408_generate_lai(lai, bts->network->country_code, 
     751        gsm48_generate_lai(lai, bts->network->country_code, 
    752752                     bts->network->network_code, bts->location_area_code); 
    753753 
     
    33503350                lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr, 
    33513351                transaction_id, (lchan->subscr)?(lchan->subscr->extension):"-", 
    3352                 gsm0408_cc_msg_names[msg_type], trans?(trans->cc.state):0, 
     3352                gsm48_cc_msg_names[msg_type], trans?(trans->cc.state):0, 
    33533353                cc_state_names[trans?(trans->cc.state):0]); 
    33543354 
  • openbsc/src/gsm_04_08_utils.c

    rdfe6c7d rafedeab  
    3030 
    3131#include <osmocore/msgb.h> 
     32#include <osmocore/gsm48.h> 
    3233#include <openbsc/debug.h> 
    3334#include <openbsc/gsm_04_08.h> 
     
    4344int ipacc_rtp_direct = 1; 
    4445 
    45  
    46 const char *gsm0408_cc_msg_names[] = { 
    47         "unknown 0x00", 
    48         "ALERTING", 
    49         "CALL_PROC", 
    50         "PROGRESS", 
    51         "ESTAB", 
    52         "SETUP", 
    53         "ESTAB_CONF", 
    54         "CONNECT", 
    55         "CALL_CONF", 
    56         "START_CC", 
    57         "unknown 0x0a", 
    58         "RECALL", 
    59         "unknown 0x0c", 
    60         "unknown 0x0d", 
    61         "EMERG_SETUP", 
    62         "CONNECT_ACK", 
    63         "USER_INFO", 
    64         "unknown 0x11", 
    65         "unknown 0x12", 
    66         "MODIFY_REJECT", 
    67         "unknown 0x14", 
    68         "unknown 0x15", 
    69         "unknown 0x16", 
    70         "MODIFY", 
    71         "HOLD", 
    72         "HOLD_ACK", 
    73         "HOLD_REJ", 
    74         "unknown 0x1b", 
    75         "RETR", 
    76         "RETR_ACK", 
    77         "RETR_REJ", 
    78         "MODIFY_COMPL", 
    79         "unknown 0x20", 
    80         "unknown 0x21", 
    81         "unknown 0x22", 
    82         "unknown 0x23", 
    83         "unknown 0x24", 
    84         "DISCONNECT", 
    85         "unknown 0x26", 
    86         "unknown 0x27", 
    87         "unknown 0x28", 
    88         "unknown 0x29", 
    89         "RELEASE_COMPL", 
    90         "unknown 0x2b", 
    91         "unknown 0x2c", 
    92         "RELEASE", 
    93         "unknown 0x2e", 
    94         "unknown 0x2f", 
    95         "unknown 0x30", 
    96         "STOP_DTMF", 
    97         "STOP_DTMF_ACK", 
    98         "unknown 0x33", 
    99         "STATUS_ENQ", 
    100         "START_DTMF", 
    101         "START_DTMF_ACK", 
    102         "START_DTMF_REJ", 
    103         "unknown 0x38", 
    104         "CONG_CTRL", 
    105         "FACILITY", 
    106         "unknown 0x3b", 
    107         "STATUS", 
    108         "unknown 0x3c", 
    109         "NOTIFY", 
    110         "unknown 0x3f", 
    111 }; 
    112  
    113  
    11446struct msgb *gsm48_msgb_alloc(void) 
    11547{ 
     
    13769                                msg->trx->nr, msg->lchan->ts->nr, 
    13870                                gh->proto_discr & 0xf0, 
    139                                 gsm0408_cc_msg_names[gh->msg_type & 0x3f]); 
     71                                gsm48_cc_msg_names[gh->msg_type & 0x3f]); 
    14072                else 
    14173                        DEBUGP(DCC, "(bts %d trx %d ts %d pd %02x) " 
     
    14880 
    14981        return rsl_data_request(msg, 0); 
    150 } 
    151  
    152 static void to_bcd(u_int8_t *bcd, u_int16_t val) 
    153 { 
    154         bcd[2] = val % 10; 
    155         val = val / 10; 
    156         bcd[1] = val % 10; 
    157         val = val / 10; 
    158         bcd[0] = val % 10; 
    159         val = val / 10; 
    160 } 
    161  
    162 static char bcd2char(u_int8_t bcd) 
    163 { 
    164         if (bcd < 0xa) 
    165                 return '0' + bcd; 
    166         else 
    167                 return 'A' + (bcd - 0xa); 
    168 } 
    169  
    170 /* only works for numbers in ascci */ 
    171 static u_int8_t char2bcd(char c) 
    172 { 
    173         return c - 0x30; 
    174 } 
    175  
    176  
    177 void gsm0408_generate_lai(struct gsm48_loc_area_id *lai48, u_int16_t mcc, 
    178                          u_int16_t mnc, u_int16_t lac) 
    179 { 
    180         u_int8_t bcd[3]; 
    181  
    182         to_bcd(bcd, mcc); 
    183         lai48->digits[0] = bcd[0] | (bcd[1] << 4); 
    184         lai48->digits[1] = bcd[2]; 
    185  
    186         to_bcd(bcd, mnc); 
    187         /* FIXME: do we need three-digit MNC? See Table 10.5.3 */ 
    188 #if 0 
    189         lai48->digits[1] |= bcd[2] << 4; 
    190         lai48->digits[2] = bcd[0] | (bcd[1] << 4); 
    191 #else 
    192         lai48->digits[1] |= 0xf << 4; 
    193         lai48->digits[2] = bcd[1] | (bcd[2] << 4); 
    194 #endif 
    195  
    196         lai48->lac = htons(lac); 
    197 } 
    198  
    199 int gsm48_generate_mid_from_tmsi(u_int8_t *buf, u_int32_t tmsi) 
    200 { 
    201         u_int32_t *tptr = (u_int32_t *) &buf[3]; 
    202  
    203         buf[0] = GSM48_IE_MOBILE_ID; 
    204         buf[1] = GSM48_TMSI_LEN; 
    205         buf[2] = 0xf0 | GSM_MI_TYPE_TMSI; 
    206         *tptr = htonl(tmsi); 
    207  
    208         return 7; 
    209 } 
    210  
    211 int gsm48_generate_mid_from_imsi(u_int8_t *buf, const char *imsi) 
    212 { 
    213         unsigned int length = strlen(imsi), i, off = 0; 
    214         u_int8_t odd = (length & 0x1) == 1; 
    215  
    216         buf[0] = GSM48_IE_MOBILE_ID; 
    217         buf[2] = char2bcd(imsi[0]) << 4 | GSM_MI_TYPE_IMSI | (odd << 3); 
    218  
    219         /* if the length is even we will fill half of the last octet */ 
    220         if (odd) 
    221                 buf[1] = (length + 1) >> 1; 
    222         else 
    223                 buf[1] = (length + 2) >> 1; 
    224  
    225         for (i = 1; i < buf[1]; ++i) { 
    226                 u_int8_t lower, upper; 
    227  
    228                 lower = char2bcd(imsi[++off]); 
    229                 if (!odd && off + 1 == length) 
    230                         upper = 0x0f; 
    231                 else 
    232                         upper = char2bcd(imsi[++off]) & 0x0f; 
    233  
    234                 buf[2 + i] = (upper << 4) | lower; 
    235         } 
    236  
    237         return 2 + buf[1]; 
    23882} 
    23983 
  • openbsc/src/system_information.c

    rdfe6c7d rafedeab  
    288288 
    289289        si3->cell_identity = htons(bts->cell_identity); 
    290         gsm0408_generate_lai(&si3->lai, bts->network->country_code, 
    291                              bts->network->network_code, 
    292                              bts->location_area_code); 
     290        gsm48_generate_lai(&si3->lai, bts->network->country_code, 
     291                           bts->network->network_code, 
     292                           bts->location_area_code); 
    293293        si3->control_channel_desc = bts->si_common.chan_desc; 
    294294        si3->cell_options = bts->si_common.cell_options; 
     
    320320        si4->header.system_information = GSM48_MT_RR_SYSINFO_4; 
    321321 
    322         gsm0408_generate_lai(&si4->lai, bts->network->country_code, 
    323                              bts->network->network_code, 
    324                              bts->location_area_code); 
     322        gsm48_generate_lai(&si4->lai, bts->network->country_code, 
     323                           bts->network->network_code, 
     324                           bts->location_area_code); 
    325325        si4->cell_sel_par = bts->si_common.cell_sel_par; 
    326326        si4->rach_control = bts->si_common.rach_control; 
     
    385385        si6->system_information = GSM48_MT_RR_SYSINFO_6; 
    386386        si6->cell_identity = htons(bts->cell_identity); 
    387         gsm0408_generate_lai(&si6->lai, bts->network->country_code, 
    388                              bts->network->network_code, 
    389                              bts->location_area_code); 
     387        gsm48_generate_lai(&si6->lai, bts->network->country_code, 
     388                           bts->network->network_code, 
     389                           bts->location_area_code); 
    390390        si6->cell_options = bts->si_common.cell_options; 
    391391        si6->ncc_permitted = bts->si_common.ncc_permitted; 
  • openbsc/tests/gsm0408/gsm0408_test.c

    r5d0e56f rafedeab  
    2323#include <stdio.h> 
    2424#include <stdlib.h> 
     25 
     26#include <arpa/inet.h> 
    2527 
    2628#include <openbsc/gsm_04_08.h> 
     
    5355     * bsc_hack.c dumps 
    5456     */ 
    55     gsm0408_generate_lai(&lai48, 1, 1, 1); 
     57    gsm48_generate_lai(&lai48, 1, 1, 1); 
    5658    COMPARE(lai48.digits[0], ==, 0x00); 
    5759    COMPARE(lai48.digits[1], ==, 0xF1); 
     
    5961    COMPARE(lai48.lac, ==, htons(0x0001)); 
    6062 
    61     gsm0408_generate_lai(&lai48, 602, 1, 15); 
     63    gsm48_generate_lai(&lai48, 602, 1, 15); 
    6264    COMPARE(lai48.digits[0], ==, 0x06); 
    6365    COMPARE(lai48.digits[1], ==, 0xF2); 
     
    98100        test_location_area_identifier(); 
    99101        test_mi_functionality(); 
     102 
     103        exit(0); 
    100104} 
    101105