Import gsm48_construct_ra() from openbsc
authorHarald Welte <laforge@gnumonks.org>
Sat, 1 May 2010 12:25:22 +0000 (14:25 +0200)
committerHarald Welte <laforge@gnumonks.org>
Sat, 1 May 2010 12:25:22 +0000 (14:25 +0200)
include/osmocore/gsm48.h
src/gsm48.c

index a509a09..be9fbbd 100644 (file)
@@ -29,5 +29,6 @@ int gsm48_mi_to_string(char *string, const int str_len,
 
 /* Parse Routeing Area Identifier */
 void gsm48_parse_ra(struct gprs_ra_id *raid, const uint8_t *buf);
+int gsm48_construct_ra(uint8_t *buf, const struct gprs_ra_id *raid);
 
 #endif
index 7e51066..d957aef 100644 (file)
@@ -326,3 +326,28 @@ void gsm48_parse_ra(struct gprs_ra_id *raid, const uint8_t *buf)
        raid->lac = ntohs(*(uint16_t *)(buf + 3));
        raid->rac = buf[5];
 }
+
+int gsm48_construct_ra(uint8_t *buf, const struct gprs_ra_id *raid)
+{
+       uint16_t mcc = raid->mcc;
+       uint16_t mnc = raid->mnc;
+
+       buf[0] = ((mcc / 100) % 10) | (((mcc / 10) % 10) << 4);
+       buf[1] = (mcc % 10);
+
+       /* I wonder who came up with the stupidity of encoding the MNC
+        * differently depending on how many digits its decimal number has! */
+       if (mnc < 100) {
+               buf[1] |= 0xf0;
+               buf[2] = ((mnc / 10) % 10) | ((mnc % 10) << 4);
+       } else {
+               buf[1] |= (mnc % 10) << 4;
+               buf[2] = ((mnc / 100) % 10) | (((mcc / 10) % 10) << 4);
+       }
+
+       *(uint16_t *)(buf+3) = htons(raid->lac);
+
+       buf[5] = raid->rac;
+
+       return 6;
+}