aboutsummaryrefslogtreecommitdiffstats
path: root/src/bsc_hack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bsc_hack.c')
-rw-r--r--src/bsc_hack.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/bsc_hack.c b/src/bsc_hack.c
index b9b9f8beb..2838ff8bc 100644
--- a/src/bsc_hack.c
+++ b/src/bsc_hack.c
@@ -30,7 +30,10 @@
#define _GNU_SOURCE
#include <getopt.h>
+#include <openbsc/db.h>
+#include <openbsc/timer.h>
#include <openbsc/gsm_data.h>
+#include <openbsc/gsm_04_08.h>
#include <openbsc/select.h>
#include <openbsc/abis_rsl.h>
#include <openbsc/abis_nm.h>
@@ -631,6 +634,74 @@ static void handle_options(int argc, char** argv)
}
}
+static struct timer_list pag_timer;
+
+/* handles uppercase decimal and hexadecimal */
+static u_int8_t char2bcd(char c)
+{
+ if (c <= '9')
+ return c - '0';
+ else
+ return c - 'A';
+}
+
+static int string_to_mi(u_int8_t *mi, const char *string,
+ u_int8_t type)
+{
+ u_int8_t *cur = mi+3;
+
+ mi[0] = GSM48_IE_MOBILE_ID;
+ //mi[1] = TMSI_LEN;
+ mi[2] = type & GSM_MI_TYPE_MASK;
+
+ if (strlen(string) & 0x01)
+ mi[2] |= char2bcd(*string++) << 4;
+ else
+ mi[2] |= 0xf0;
+
+ while (*string && *(string+1))
+ *cur++ = char2bcd(*string++) | (char2bcd(*string++) << 4);
+
+ mi[1] = cur - mi;
+
+ return cur - mi;
+}
+
+static const char *nokia_imsi = "7240311131388";
+static const char *rokr_imsi = "4660198001300";
+
+void pag_timer_cb(void *data)
+{
+ struct gsm_bts *bts = &gsmnet->bts[0];
+ u_int8_t mi[128];
+ struct gsm_subscriber _subscr, *subscr = &_subscr;
+ unsigned int paging_group, mi_len;
+ u_int64_t num_imsi;
+ const char *imsi = nokia_imsi;
+
+ printf("FEUER\n");
+
+#if 1
+ memset(subscr, 0, sizeof(*subscr));
+ strcpy(subscr->imsi, imsi);
+ db_get_subscriber(GSM_SUBSCRIBER_IMSI, subscr);
+ if (!subscr)
+ return;
+
+ mi_len = generate_mid_from_tmsi(mi, strtoul(subscr->tmsi, NULL, 10));
+#else
+ mi_len = string_to_mi(mi, imsi, GSM_MI_TYPE_IMSI);
+#endif
+
+ num_imsi = strtoull(imsi, NULL, 10);
+ paging_group = get_paging_group(num_imsi, 1, 3);
+
+ for (paging_group = 0; paging_group < 3; paging_group++)
+ rsl_paging_cmd(bts, paging_group, mi_len, mi, RSL_CHANNEED_TCH_F);
+
+ schedule_timer(&pag_timer, 10, 0);
+}
+
int main(int argc, char **argv)
{
/* parse options */
@@ -650,6 +721,9 @@ int main(int argc, char **argv)
bootstrap_network();
+ pag_timer.cb = pag_timer_cb;
+ schedule_timer(&pag_timer, 10, 0);
+
while (1) {
bsc_select_main();
}