Changeset afedeabd919972dcc3968b0d9743dc0b1a80774c
- Timestamp:
- 03/04/10 10:55:40 (5 months ago)
- Parents:
- fbc5ca080beedf8ca032cdd409db30838843f79b
- Children:
- 52617919c8bc0f7ace3baebf1b6d9638d5c8466a, fbda4e1fb03ab80347647d355617a4c7c7f19cc7
- git-committer:
- Harald Welte <laforge@gnumonks.org> / 2010-03-04T10:55:40Z+0100
- Location:
- openbsc
- Files:
-
- 6 modified
-
include/openbsc/gsm_04_08.h (modified) (3 diffs)
-
include/openbsc/gsm_data.h (modified) (1 diff)
-
src/gsm_04_08.c (modified) (2 diffs)
-
src/gsm_04_08_utils.c (modified) (4 diffs)
-
src/system_information.c (modified) (3 diffs)
-
tests/gsm0408/gsm0408_test.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
openbsc/include/openbsc/gsm_04_08.h
r474d19f rafedeab 17 17 18 18 int 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);21 19 enum gsm_chan_t get_ctype_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci); 22 20 enum gsm_chreq_reason_t get_reason_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci); … … 27 25 struct msgb *gsm48_msgb_alloc(void); 28 26 int 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);31 27 int gsm48_mi_to_string(char *string, const int str_len, const u_int8_t *mi, const int mi_len); 32 28 … … 49 45 int h_len); 50 46 51 extern const char *gsm0408_cc_msg_names[];52 53 47 int send_siemens_mrpci(struct gsm_lchan *lchan, u_int8_t *classmark2_lv); 54 48 int gsm48_paging_extract_mi(struct msgb *msg, char *mi_string, u_int8_t *mi_type); -
openbsc/include/openbsc/gsm_data.h
r2e411c7 rafedeab 647 647 struct gsm_bts *start_bts); 648 648 649 char *gsm_band_name(enum gsm_band band);650 enum gsm_band gsm_band_parse(const char *mhz);651 652 649 extern void *tall_bsc_ctx; 653 650 extern int ipacc_rtp_direct; -
openbsc/src/gsm_04_08.c
r474d19f rafedeab 749 749 750 750 lai = (struct gsm48_loc_area_id *) msgb_put(msg, sizeof(*lai)); 751 gsm 0408_generate_lai(lai, bts->network->country_code,751 gsm48_generate_lai(lai, bts->network->country_code, 752 752 bts->network->network_code, bts->location_area_code); 753 753 … … 3350 3350 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr, 3351 3351 transaction_id, (lchan->subscr)?(lchan->subscr->extension):"-", 3352 gsm 0408_cc_msg_names[msg_type], trans?(trans->cc.state):0,3352 gsm48_cc_msg_names[msg_type], trans?(trans->cc.state):0, 3353 3353 cc_state_names[trans?(trans->cc.state):0]); 3354 3354 -
openbsc/src/gsm_04_08_utils.c
rdfe6c7d rafedeab 30 30 31 31 #include <osmocore/msgb.h> 32 #include <osmocore/gsm48.h> 32 33 #include <openbsc/debug.h> 33 34 #include <openbsc/gsm_04_08.h> … … 43 44 int ipacc_rtp_direct = 1; 44 45 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 114 46 struct msgb *gsm48_msgb_alloc(void) 115 47 { … … 137 69 msg->trx->nr, msg->lchan->ts->nr, 138 70 gh->proto_discr & 0xf0, 139 gsm 0408_cc_msg_names[gh->msg_type & 0x3f]);71 gsm48_cc_msg_names[gh->msg_type & 0x3f]); 140 72 else 141 73 DEBUGP(DCC, "(bts %d trx %d ts %d pd %02x) " … … 148 80 149 81 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 else167 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 0189 lai48->digits[1] |= bcd[2] << 4;190 lai48->digits[2] = bcd[0] | (bcd[1] << 4);191 #else192 lai48->digits[1] |= 0xf << 4;193 lai48->digits[2] = bcd[1] | (bcd[2] << 4);194 #endif195 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 else223 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 else232 upper = char2bcd(imsi[++off]) & 0x0f;233 234 buf[2 + i] = (upper << 4) | lower;235 }236 237 return 2 + buf[1];238 82 } 239 83 -
openbsc/src/system_information.c
rdfe6c7d rafedeab 288 288 289 289 si3->cell_identity = htons(bts->cell_identity); 290 gsm 0408_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); 293 293 si3->control_channel_desc = bts->si_common.chan_desc; 294 294 si3->cell_options = bts->si_common.cell_options; … … 320 320 si4->header.system_information = GSM48_MT_RR_SYSINFO_4; 321 321 322 gsm 0408_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); 325 325 si4->cell_sel_par = bts->si_common.cell_sel_par; 326 326 si4->rach_control = bts->si_common.rach_control; … … 385 385 si6->system_information = GSM48_MT_RR_SYSINFO_6; 386 386 si6->cell_identity = htons(bts->cell_identity); 387 gsm 0408_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); 390 390 si6->cell_options = bts->si_common.cell_options; 391 391 si6->ncc_permitted = bts->si_common.ncc_permitted; -
openbsc/tests/gsm0408/gsm0408_test.c
r5d0e56f rafedeab 23 23 #include <stdio.h> 24 24 #include <stdlib.h> 25 26 #include <arpa/inet.h> 25 27 26 28 #include <openbsc/gsm_04_08.h> … … 53 55 * bsc_hack.c dumps 54 56 */ 55 gsm 0408_generate_lai(&lai48, 1, 1, 1);57 gsm48_generate_lai(&lai48, 1, 1, 1); 56 58 COMPARE(lai48.digits[0], ==, 0x00); 57 59 COMPARE(lai48.digits[1], ==, 0xF1); … … 59 61 COMPARE(lai48.lac, ==, htons(0x0001)); 60 62 61 gsm 0408_generate_lai(&lai48, 602, 1, 15);63 gsm48_generate_lai(&lai48, 602, 1, 15); 62 64 COMPARE(lai48.digits[0], ==, 0x06); 63 65 COMPARE(lai48.digits[1], ==, 0xF2); … … 98 100 test_location_area_identifier(); 99 101 test_mi_functionality(); 102 103 exit(0); 100 104 } 101 105
