Changeset 61e2bfc5f44267a7a3b0b25ff3ab922fca2a199c
- Timestamp:
- 03/04/10 10:53:03 (6 months ago)
- Parents:
- a73e2f9acb839a1f08d8bc5c7e6074c16f0cf1fe
- Children:
- ecf9dd0d9680882b7c9df5e9bdfdb3dd58a069ac
- git-committer:
- Harald Welte <laforge@gnumonks.org> / 2010-03-04T10:53:03Z+0100
- Files:
-
- 2 modified
-
include/osmocore/gsm48.h (modified) (1 diff)
-
src/gsm48.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
include/osmocore/gsm48.h
r4fb2075 r61e2bfc 2 2 3 3 #include <osmocore/tlv.h> 4 #include <osmocore/protocol/gsm_04_08.h> 4 5 5 6 extern const struct tlv_definition gsm48_att_tlvdef; 6 extern const char *cc_state_names[]; 7 extern const char *cc_state_names[32]; 8 const char *gsm48_cc_msg_names[0x40]; 7 9 const char *rr_cause_name(uint8_t cause); 8 10 11 void gsm48_generate_lai(struct gsm48_loc_area_id *lai48, uint16_t mcc, 12 uint16_t mnc, uint16_t lac); 13 int gsm48_generate_mid_from_tmsi(uint8_t *buf, uint32_t tmsi); 14 int gsm48_generate_mid_from_imsi(uint8_t *buf, const char *imsi); 15 9 16 #endif -
src/gsm48.c
r4fb2075 r61e2bfc 26 26 #include <stdio.h> 27 27 #include <string.h> 28 29 #include <arpa/inet.h> 28 30 29 31 #include <osmocore/utils.h> … … 94 96 }; 95 97 96 const char *cc_state_names[ ] = {98 const char *cc_state_names[32] = { 97 99 "NULL", 98 100 "INITIATED", … … 129 131 }; 130 132 133 const 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 131 200 static char strbuf[64]; 132 201 … … 141 210 } 142 211 143 212 static 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 222 void 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 244 int 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 256 int 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 }
