Changeset 61e2bfc5f44267a7a3b0b25ff3ab922fca2a199c

Show
Ignore:
Timestamp:
03/04/10 10:53:03 (6 months ago)
Author:
Harald Welte <laforge@gnumonks.org>
Parents:
a73e2f9acb839a1f08d8bc5c7e6074c16f0cf1fe
Children:
ecf9dd0d9680882b7c9df5e9bdfdb3dd58a069ac
git-committer:
Harald Welte <laforge@gnumonks.org> / 2010-03-04T10:53:03Z+0100
Message:

import gsm48 utility functions from OpenBSC

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

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • include/osmocore/gsm48.h

    r4fb2075 r61e2bfc  
    22 
    33#include <osmocore/tlv.h> 
     4#include <osmocore/protocol/gsm_04_08.h> 
    45 
    56extern const struct tlv_definition gsm48_att_tlvdef; 
    6 extern const char *cc_state_names[]; 
     7extern const char *cc_state_names[32]; 
     8const char *gsm48_cc_msg_names[0x40]; 
    79const char *rr_cause_name(uint8_t cause); 
    810 
     11void gsm48_generate_lai(struct gsm48_loc_area_id *lai48, uint16_t mcc, 
     12                        uint16_t mnc, uint16_t lac); 
     13int gsm48_generate_mid_from_tmsi(uint8_t *buf, uint32_t tmsi); 
     14int gsm48_generate_mid_from_imsi(uint8_t *buf, const char *imsi); 
     15 
    916#endif 
  • src/gsm48.c

    r4fb2075 r61e2bfc  
    2626#include <stdio.h> 
    2727#include <string.h> 
     28 
     29#include <arpa/inet.h> 
    2830 
    2931#include <osmocore/utils.h> 
     
    9496}; 
    9597 
    96 const char *cc_state_names[] = { 
     98const char *cc_state_names[32] = { 
    9799        "NULL", 
    98100        "INITIATED", 
     
    129131}; 
    130132 
     133const char *gsm48_cc_msg_names[0x40] = { 
     134        "unknown 0x00", 
     135        "ALERTING", 
     136        "CALL_PROC", 
     137        "PROGRESS", 
     138        "ESTAB", 
     139        "SETUP", 
     140        "ESTAB_CONF", 
     141        "CONNECT", 
     142        "CALL_CONF", 
     143        "START_CC", 
     144        "unknown 0x0a", 
     145        "RECALL", 
     146        "unknown 0x0c", 
     147        "unknown 0x0d", 
     148        "EMERG_SETUP", 
     149        "CONNECT_ACK", 
     150        "USER_INFO", 
     151        "unknown 0x11", 
     152        "unknown 0x12", 
     153        "MODIFY_REJECT", 
     154        "unknown 0x14", 
     155        "unknown 0x15", 
     156        "unknown 0x16", 
     157        "MODIFY", 
     158        "HOLD", 
     159        "HOLD_ACK", 
     160        "HOLD_REJ", 
     161        "unknown 0x1b", 
     162        "RETR", 
     163        "RETR_ACK", 
     164        "RETR_REJ", 
     165        "MODIFY_COMPL", 
     166        "unknown 0x20", 
     167        "unknown 0x21", 
     168        "unknown 0x22", 
     169        "unknown 0x23", 
     170        "unknown 0x24", 
     171        "DISCONNECT", 
     172        "unknown 0x26", 
     173        "unknown 0x27", 
     174        "unknown 0x28", 
     175        "unknown 0x29", 
     176        "RELEASE_COMPL", 
     177        "unknown 0x2b", 
     178        "unknown 0x2c", 
     179        "RELEASE", 
     180        "unknown 0x2e", 
     181        "unknown 0x2f", 
     182        "unknown 0x30", 
     183        "STOP_DTMF", 
     184        "STOP_DTMF_ACK", 
     185        "unknown 0x33", 
     186        "STATUS_ENQ", 
     187        "START_DTMF", 
     188        "START_DTMF_ACK", 
     189        "START_DTMF_REJ", 
     190        "unknown 0x38", 
     191        "CONG_CTRL", 
     192        "FACILITY", 
     193        "unknown 0x3b", 
     194        "STATUS", 
     195        "unknown 0x3d", 
     196        "NOTIFY", 
     197        "unknown 0x3f", 
     198}; 
     199 
    131200static char strbuf[64]; 
    132201 
     
    141210} 
    142211 
    143  
     212static void to_bcd(uint8_t *bcd, uint16_t val) 
     213{ 
     214        bcd[2] = val % 10; 
     215        val = val / 10; 
     216        bcd[1] = val % 10; 
     217        val = val / 10; 
     218        bcd[0] = val % 10; 
     219        val = val / 10; 
     220} 
     221 
     222void gsm48_generate_lai(struct gsm48_loc_area_id *lai48, uint16_t mcc, 
     223                        uint16_t mnc, uint16_t lac) 
     224{ 
     225        uint8_t bcd[3]; 
     226 
     227        to_bcd(bcd, mcc); 
     228        lai48->digits[0] = bcd[0] | (bcd[1] << 4); 
     229        lai48->digits[1] = bcd[2]; 
     230 
     231        to_bcd(bcd, mnc); 
     232        /* FIXME: do we need three-digit MNC? See Table 10.5.3 */ 
     233#if 0 
     234        lai48->digits[1] |= bcd[2] << 4; 
     235        lai48->digits[2] = bcd[0] | (bcd[1] << 4); 
     236#else 
     237        lai48->digits[1] |= 0xf << 4; 
     238        lai48->digits[2] = bcd[1] | (bcd[2] << 4); 
     239#endif 
     240 
     241        lai48->lac = htons(lac); 
     242} 
     243 
     244int gsm48_generate_mid_from_tmsi(uint8_t *buf, uint32_t tmsi) 
     245{ 
     246        uint32_t *tptr = (uint32_t *) &buf[3]; 
     247 
     248        buf[0] = GSM48_IE_MOBILE_ID; 
     249        buf[1] = GSM48_TMSI_LEN; 
     250        buf[2] = 0xf0 | GSM_MI_TYPE_TMSI; 
     251        *tptr = htonl(tmsi); 
     252 
     253        return 7; 
     254} 
     255 
     256int gsm48_generate_mid_from_imsi(uint8_t *buf, const char *imsi) 
     257{ 
     258        unsigned int length = strlen(imsi), i, off = 0; 
     259        uint8_t odd = (length & 0x1) == 1; 
     260 
     261        buf[0] = GSM48_IE_MOBILE_ID; 
     262        buf[2] = char2bcd(imsi[0]) << 4 | GSM_MI_TYPE_IMSI | (odd << 3); 
     263 
     264        /* if the length is even we will fill half of the last octet */ 
     265        if (odd) 
     266                buf[1] = (length + 1) >> 1; 
     267        else 
     268                buf[1] = (length + 2) >> 1; 
     269 
     270        for (i = 1; i < buf[1]; ++i) { 
     271                uint8_t lower, upper; 
     272 
     273                lower = char2bcd(imsi[++off]); 
     274                if (!odd && off + 1 == length) 
     275                        upper = 0x0f; 
     276                else 
     277                        upper = char2bcd(imsi[++off]) & 0x0f; 
     278 
     279                buf[2 + i] = (upper << 4) | lower; 
     280        } 
     281 
     282        return 2 + buf[1]; 
     283}