aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bsc/osmo_bsc_filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osmo-bsc/osmo_bsc_filter.c')
-rw-r--r--src/osmo-bsc/osmo_bsc_filter.c205
1 files changed, 0 insertions, 205 deletions
diff --git a/src/osmo-bsc/osmo_bsc_filter.c b/src/osmo-bsc/osmo_bsc_filter.c
index 773a14699..332ba6b83 100644
--- a/src/osmo-bsc/osmo_bsc_filter.c
+++ b/src/osmo-bsc/osmo_bsc_filter.c
@@ -30,203 +30,6 @@
#include <stdlib.h>
-static void handle_lu_request(struct gsm_subscriber_connection *conn,
- struct msgb *msg)
-{
- struct gsm48_hdr *gh;
- struct gsm48_loc_upd_req *lu;
- struct gsm48_loc_area_id lai;
-
- if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*lu)) {
- LOGP(DMSC, LOGL_ERROR, "LU too small to look at: %u\n", msgb_l3len(msg));
- return;
- }
-
- gh = msgb_l3(msg);
- lu = (struct gsm48_loc_upd_req *) gh->data;
-
- gsm48_generate_lai2(&lai, bts_lai(conn_get_bts(conn)));
-
- if (memcmp(&lai, &lu->lai, sizeof(lai)) != 0) {
- LOGP(DMSC, LOGL_DEBUG, "Marking con for welcome USSD.\n");
- conn->new_subscriber = 1;
- }
-}
-
-/* extract a subscriber from the paging response */
-static struct bsc_subscr *extract_sub(struct gsm_subscriber_connection *conn,
- struct msgb *msg)
-{
- uint8_t mi_type;
- char mi_string[GSM48_MI_SIZE];
- struct gsm48_hdr *gh;
- struct gsm48_pag_resp *resp;
- struct bsc_subscr *subscr;
-
- if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*resp)) {
- LOGP(DMSC, LOGL_ERROR, "PagingResponse too small: %u\n", msgb_l3len(msg));
- return NULL;
- }
-
- gh = msgb_l3(msg);
- resp = (struct gsm48_pag_resp *) &gh->data[0];
-
- gsm48_paging_extract_mi(resp, msgb_l3len(msg) - sizeof(*gh),
- mi_string, &mi_type);
- DEBUGP(DRR, "PAGING RESPONSE: MI(%s)=%s\n",
- gsm48_mi_type_name(mi_type), mi_string);
-
- switch (mi_type) {
- case GSM_MI_TYPE_TMSI:
- subscr = bsc_subscr_find_by_tmsi(conn->network->bsc_subscribers,
- tmsi_from_string(mi_string));
- break;
- case GSM_MI_TYPE_IMSI:
- subscr = bsc_subscr_find_by_imsi(conn->network->bsc_subscribers,
- mi_string);
- break;
- default:
- subscr = NULL;
- break;
- }
-
- return subscr;
-}
-
-/* we will need to stop the paging request */
-static int handle_page_resp(struct gsm_subscriber_connection *conn, struct msgb *msg)
-{
- struct bsc_subscr *subscr = extract_sub(conn, msg);
-
- if (!subscr) {
- LOGP(DMSC, LOGL_ERROR, "Non active subscriber got paged.\n");
- return -1;
- }
-
- paging_request_stop(&conn->network->bts_list, conn_get_bts(conn), subscr, conn,
- msg);
- bsc_subscr_put(subscr);
- return 0;
-}
-
-static int is_cm_service_for_emerg(struct msgb *msg)
-{
- struct gsm48_service_request *cm;
- struct gsm48_hdr *gh = msgb_l3(msg);
-
- if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*cm)) {
- LOGP(DMSC, LOGL_ERROR, "CM ServiceRequest does not fit.\n");
- return 0;
- }
-
- cm = (struct gsm48_service_request *) &gh->data[0];
- return cm->cm_service_type == GSM48_CMSERV_EMERGENCY;
-}
-
-struct bsc_msc_data *bsc_find_msc(struct gsm_subscriber_connection *conn,
- struct msgb *msg)
-{
- struct gsm48_hdr *gh;
- int8_t pdisc;
- uint8_t mtype;
- struct osmo_bsc_data *bsc;
- struct bsc_msc_data *msc, *pag_msc;
- struct bsc_subscr *subscr;
- int is_emerg = 0;
-
- bsc = conn->network->bsc_data;
-
- if (msgb_l3len(msg) < sizeof(*gh)) {
- LOGP(DMSC, LOGL_ERROR, "There is no GSM48 header here.\n");
- return NULL;
- }
-
- gh = msgb_l3(msg);
- pdisc = gsm48_hdr_pdisc(gh);
- mtype = gsm48_hdr_msg_type(gh);
-
- /*
- * We are asked to select a MSC here but they are not equal. We
- * want to respond to a paging request on the MSC where we got the
- * request from. This is where we need to decide where this connection
- * will go.
- */
- if (pdisc == GSM48_PDISC_RR && mtype == GSM48_MT_RR_PAG_RESP)
- goto paging;
- else if (pdisc == GSM48_PDISC_MM && mtype == GSM48_MT_MM_CM_SERV_REQ) {
- is_emerg = is_cm_service_for_emerg(msg);
- goto round_robin;
- } else
- goto round_robin;
-
-round_robin:
- llist_for_each_entry(msc, &bsc->mscs, entry) {
- if (!msc->is_authenticated)
- continue;
- if (!is_emerg && msc->type != MSC_CON_TYPE_NORMAL)
- continue;
- if (is_emerg && !msc->allow_emerg)
- continue;
-
- /* force round robin by moving it to the end */
- llist_move_tail(&msc->entry, &bsc->mscs);
- return msc;
- }
-
- return NULL;
-
-paging:
- subscr = extract_sub(conn, msg);
-
- if (!subscr) {
- LOGP(DMSC, LOGL_ERROR, "Got paged but no subscriber found.\n");
- return NULL;
- }
-
- pag_msc = paging_get_msc(conn_get_bts(conn), subscr);
- bsc_subscr_put(subscr);
-
- llist_for_each_entry(msc, &bsc->mscs, entry) {
- if (msc != pag_msc)
- continue;
-
- /*
- * We don't check if the MSC is connected. In case it
- * is not the connection will be dropped.
- */
-
- /* force round robin by moving it to the end */
- llist_move_tail(&msc->entry, &bsc->mscs);
- return msc;
- }
-
- LOGP(DMSC, LOGL_ERROR, "Got paged but no request found.\n");
- return NULL;
-}
-
-
-/**
- * This is used to scan a message for extra functionality of the BSC. This
- * includes scanning for location updating requests/acceptd and then send
- * a welcome USSD message to the subscriber.
- */
-int bsc_scan_bts_msg(struct gsm_subscriber_connection *conn, struct msgb *msg)
-{
- struct gsm48_hdr *gh = msgb_l3(msg);
- uint8_t pdisc = gsm48_hdr_pdisc(gh);
- uint8_t mtype = gsm48_hdr_msg_type(gh);
-
- if (pdisc == GSM48_PDISC_MM) {
- if (mtype == GSM48_MT_MM_LOC_UPD_REQUEST)
- handle_lu_request(conn, msg);
- } else if (pdisc == GSM48_PDISC_RR) {
- if (mtype == GSM48_MT_RR_PAG_RESP)
- handle_page_resp(conn, msg);
- }
-
- return 0;
-}
-
static int send_welcome_ussd(struct gsm_subscriber_connection *conn)
{
if (!conn->sccp.msc->ussd_welcome_txt) {
@@ -237,14 +40,6 @@ static int send_welcome_ussd(struct gsm_subscriber_connection *conn)
return BSS_SEND_USSD;
}
-int bsc_send_welcome_ussd(struct gsm_subscriber_connection *conn)
-{
- bsc_send_ussd_notify(conn, 1, conn->sccp.msc->ussd_welcome_txt);
- bsc_send_ussd_release_complete(conn);
-
- return 0;
-}
-
static int bsc_patch_mm_info(struct gsm_subscriber_connection *conn,
uint8_t *data, unsigned int length)
{