mscsplit: various preparations to separate MSC from BSC
Disable large parts of the code that depend on BSC presence. The code sections disabled by #if BEFORE_MSCSPLIT shall be modified or dropped in the course of adding the A-interface. Don't set msg->lchan nor msg->dst. Don't use lchan in libmsc. Decouple lac from bts. Prepare entry/exit point for MSC -> BSC and MSC -> RNC communication: Add msc_ifaces.[hc], a_iface.c, with a general msc_tx_dtap() to redirect to different interfaces depending on the actual subscriber connection. While iu_tx() is going to be functional fairly soon, the a_tx() is going to be just a dummy for some time (see comment). Add Iu specific fields in gsm_subscriber_connection: the UE connection pointer and an indicator for the Integrity Protection status on Iu (to be fully implemented in later commits). Add lac member to gsm_subscriber_connection, to allow decoupling from bts->location_area_code. The conn->lac will actually be set in iu.c in an upcoming commit ("add iucs.[hc]"). move to libcommon-cs: gsm48_extract_mi(), gsm48_paging_extract_mi(). libmsc: duplicate gsm0808 / gsm48 functions (towards BSC). In osmo-nitb, libmsc would directly call the functions on the BSC level, not always via the bsc_api. When separating libmsc from libbsc, some functions are missing from the linkage. Hence duplicate these functions to libmsc, add an msc_ prefix for clarity, also add a _tx to gsm0808_cipher_mode(): * add msc_gsm0808_tx_cipher_mode() (dummy/stub) * add msc_gsm48_tx_mm_serv_ack() * add msc_gsm48_tx_mm_serv_rej() Call these from libmsc instead of * gsm0808_cipher_mode() * gsm48_tx_mm_serv_ack() * gsm48_tx_mm_serv_rej() Also add a comment related to msc_gsm0808_tx_cipher_mode() in two places. Remove internal RTP streaming code; OsmoNITB supported that, but for OsmoMSC, this will be done with an external MGCP gateway. Remove LCHAN_MODIFY from internal MNCC state machine. Temporarily disable all paging to be able to link libmsc without libbsc. Skip the paging part of channel_test because the paging is now disabled. Employ fake paging shims in order for msc_vlr_tests to still work. msc_compl_l3(): publish in .h, tweak return value. Use new libmsc enum values for return val, to avoid dependency on libbsc headers. Make callable from other scopes: publish in osmo_msc.h and remove 'static' in osmo_msc.c add gsm_encr to subscr_conn move subscr_request to gsm_subscriber.h subscr_request_channel() -> subscr_request_conn() move to libmsc: osmo_stats_vty_add_cmds() gsm_04_08: remove apply_codec_restrictions() gsm0408_test: use NULL for root ctx move to libbsc: gsm_bts_neighbor() move to libbsc: lchan_next_meas_rep() move vty config for t3212 to network level (periodic lu) remove unneccessary linking from some tests remove handle_abisip_signal() abis_rsl.c: don't use libvlr from libbsc gsm_subscriber_connection: put the LAC here, so that it is available without accessing conn->bts. In bsc_api.c, place this lac in conn for the sake of transition: Iu and A will use this new field to pass the LAC around, but in a completely separate OsmoBSC this is not actually needed. It can be removed again from osmo-bsc.git when the time has come. Siemens MRPCI: completely drop sending the MRPCI messages for now, they shall be added in osmo-bsc once the A-Interface code has settled. See OS#2389. Related: OS#1845 OS#2257 OS#2389 Change-Id: Id3705236350d5f69e447046b0a764bbabc3d493c
This commit is contained in:
parent
3b8dc57514
commit
e2f24d53e4
|
@ -54,6 +54,7 @@ noinst_HEADERS = \
|
||||||
misdn.h \
|
misdn.h \
|
||||||
mncc.h \
|
mncc.h \
|
||||||
mncc_int.h \
|
mncc_int.h \
|
||||||
|
msc_ifaces.h \
|
||||||
nat_rewrite_trie.h \
|
nat_rewrite_trie.h \
|
||||||
network_listen.h \
|
network_listen.h \
|
||||||
oap_client.h \
|
oap_client.h \
|
||||||
|
|
|
@ -65,8 +65,6 @@ int decode_bcd_number(char *output, int output_len, const uint8_t *bcd_lv,
|
||||||
int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv);
|
int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv);
|
||||||
int gsm48_extract_mi(uint8_t *classmark2, int length, char *mi_string, uint8_t *mi_type);
|
int gsm48_extract_mi(uint8_t *classmark2, int length, char *mi_string, uint8_t *mi_type);
|
||||||
int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, uint8_t *mi_type);
|
int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, uint8_t *mi_type);
|
||||||
int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn,
|
|
||||||
struct msgb *msg, struct bsc_subscr *bsub);
|
|
||||||
|
|
||||||
int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
|
int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
|
||||||
int gsm48_rx_rr_modif_ack(struct msgb *msg);
|
int gsm48_rx_rr_modif_ack(struct msgb *msg);
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct gsm_subscriber_group;
|
||||||
struct bsc_subscr;
|
struct bsc_subscr;
|
||||||
struct vlr_instance;
|
struct vlr_instance;
|
||||||
struct vlr_subscr;
|
struct vlr_subscr;
|
||||||
|
struct ue_conn_ctx;
|
||||||
|
|
||||||
#define OBSC_LINKID_CB(__msgb) (__msgb)->cb[3]
|
#define OBSC_LINKID_CB(__msgb) (__msgb)->cb[3]
|
||||||
|
|
||||||
|
@ -117,6 +118,12 @@ struct gsm_classmark {
|
||||||
uint8_t classmark3[14]; /* if cm3 gets extended by spec, it will be truncated */
|
uint8_t classmark3[14]; /* if cm3 gets extended by spec, it will be truncated */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum integrity_protection_state {
|
||||||
|
INTEGRITY_PROTECTION_NONE = 0,
|
||||||
|
INTEGRITY_PROTECTION_IK = 1,
|
||||||
|
INTEGRITY_PROTECTION_IK_CK = 2,
|
||||||
|
};
|
||||||
|
|
||||||
/* active radio connection of a mobile subscriber */
|
/* active radio connection of a mobile subscriber */
|
||||||
struct gsm_subscriber_connection {
|
struct gsm_subscriber_connection {
|
||||||
/* global linked list of subscriber_connections */
|
/* global linked list of subscriber_connections */
|
||||||
|
@ -176,6 +183,15 @@ struct gsm_subscriber_connection {
|
||||||
enum ran_type via_ran;
|
enum ran_type via_ran;
|
||||||
|
|
||||||
struct gsm_classmark classmark;
|
struct gsm_classmark classmark;
|
||||||
|
|
||||||
|
uint16_t lac;
|
||||||
|
struct gsm_encr encr;
|
||||||
|
|
||||||
|
/* which Iu-CS connection, if any. */
|
||||||
|
struct {
|
||||||
|
struct ue_conn_ctx *ue_ctx;
|
||||||
|
int integrity_protection;
|
||||||
|
} iu;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -311,6 +327,12 @@ struct gsm_tz {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gsm_network {
|
struct gsm_network {
|
||||||
|
/* TODO MSCSPLIT the gsm_network struct is basically a kitchen sink for
|
||||||
|
* global settings and variables, "madly" mixing BSC and MSC stuff. Split
|
||||||
|
* this in e.g. struct osmo_bsc and struct osmo_msc, with the things
|
||||||
|
* these have in common, like country and network code, put in yet
|
||||||
|
* separate structs and placed as members in osmo_bsc and osmo_msc. */
|
||||||
|
|
||||||
/* global parameters */
|
/* global parameters */
|
||||||
uint16_t country_code;
|
uint16_t country_code;
|
||||||
uint16_t network_code;
|
uint16_t network_code;
|
||||||
|
@ -416,6 +438,9 @@ struct gsm_network {
|
||||||
uint16_t gsup_server_port;
|
uint16_t gsup_server_port;
|
||||||
|
|
||||||
struct vlr_instance *vlr;
|
struct vlr_instance *vlr;
|
||||||
|
|
||||||
|
/* Periodic location update default value */
|
||||||
|
uint8_t t3212;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct osmo_esme;
|
struct osmo_esme;
|
||||||
|
@ -471,10 +496,6 @@ extern void talloc_ctx_init(void *ctx_root);
|
||||||
|
|
||||||
int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);
|
int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);
|
||||||
|
|
||||||
/* Get reference to a neighbor cell on a given BCCH ARFCN */
|
|
||||||
struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
|
|
||||||
uint16_t arfcn, uint8_t bsic);
|
|
||||||
|
|
||||||
enum gsm_bts_type parse_btstype(const char *arg);
|
enum gsm_bts_type parse_btstype(const char *arg);
|
||||||
const char *btstype2str(enum gsm_bts_type type);
|
const char *btstype2str(enum gsm_bts_type type);
|
||||||
struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
|
struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
|
||||||
|
@ -557,7 +578,6 @@ int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode);
|
||||||
|
|
||||||
int gsm48_ra_id_by_bts(uint8_t *buf, struct gsm_bts *bts);
|
int gsm48_ra_id_by_bts(uint8_t *buf, struct gsm_bts *bts);
|
||||||
void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts);
|
void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts);
|
||||||
struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan);
|
|
||||||
|
|
||||||
int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat);
|
int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat);
|
||||||
int gsm_bts_model_register(struct gsm_bts_model *model);
|
int gsm_bts_model_register(struct gsm_bts_model *model);
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
|
|
||||||
#define GSM_SUBSCRIBER_NO_EXPIRATION 0x0
|
#define GSM_SUBSCRIBER_NO_EXPIRATION 0x0
|
||||||
|
|
||||||
struct subscr_request;
|
|
||||||
|
|
||||||
enum gsm_subscriber_field {
|
enum gsm_subscriber_field {
|
||||||
GSM_SUBSCRIBER_IMSI,
|
GSM_SUBSCRIBER_IMSI,
|
||||||
GSM_SUBSCRIBER_TMSI,
|
GSM_SUBSCRIBER_TMSI,
|
||||||
|
@ -34,17 +32,35 @@ enum gsm_subscriber_update_reason {
|
||||||
GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
|
GSM_SUBSCRIBER_UPDATE_EQUIPMENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
int subscr_update(struct vlr_subscr *vsub, struct gsm_bts *bts, int reason);
|
/*
|
||||||
|
* Struct for pending channel requests. This is managed in the
|
||||||
|
* llist_head requests of each subscriber. The reference counting
|
||||||
|
* should work in such a way that a subscriber with a pending request
|
||||||
|
* remains in memory.
|
||||||
|
*/
|
||||||
|
struct subscr_request {
|
||||||
|
struct llist_head entry;
|
||||||
|
|
||||||
|
/* the callback data */
|
||||||
|
gsm_cbfn *cbfn;
|
||||||
|
void *param;
|
||||||
|
};
|
||||||
|
|
||||||
|
int subscr_update(struct vlr_subscr *vsub, int reason);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Paging handling with authentication
|
* Paging handling with authentication
|
||||||
*/
|
*/
|
||||||
struct subscr_request *subscr_request_channel(struct vlr_subscr *vsub,
|
struct subscr_request *subscr_request_conn(struct vlr_subscr *vsub,
|
||||||
int channel_type,
|
int channel_type,
|
||||||
gsm_cbfn *cbfn, void *param);
|
gsm_cbfn *cbfn, void *param);
|
||||||
|
|
||||||
void subscr_remove_request(struct subscr_request *req);
|
void subscr_remove_request(struct subscr_request *req);
|
||||||
|
|
||||||
int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
|
int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
|
||||||
struct msgb *msg, void *data, void *param);
|
struct msgb *msg, void *data, void *param);
|
||||||
|
|
||||||
|
int msc_fake_paging_request(struct vlr_subscr *vsub);
|
||||||
|
void msc_fake_paging_request_stop(struct vlr_subscr *vsub);
|
||||||
|
|
||||||
#endif /* _GSM_SUBSCR_H */
|
#endif /* _GSM_SUBSCR_H */
|
||||||
|
|
|
@ -155,9 +155,6 @@ struct gsm_mncc {
|
||||||
int notify; /* 0..127 */
|
int notify; /* 0..127 */
|
||||||
int emergency;
|
int emergency;
|
||||||
char imsi[16];
|
char imsi[16];
|
||||||
|
|
||||||
unsigned char lchan_type;
|
|
||||||
unsigned char lchan_mode;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gsm_data_frame {
|
struct gsm_data_frame {
|
||||||
|
@ -179,7 +176,6 @@ struct gsm_mncc_hello {
|
||||||
uint32_t called_offset;
|
uint32_t called_offset;
|
||||||
uint32_t signal_offset;
|
uint32_t signal_offset;
|
||||||
uint32_t emergency_offset;
|
uint32_t emergency_offset;
|
||||||
uint32_t lchan_type_offset;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gsm_mncc_rtp {
|
struct gsm_mncc_rtp {
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <osmocom/core/msgb.h>
|
||||||
|
#include <openbsc/gsm_data.h>
|
||||||
|
|
||||||
|
/* These are the interfaces of the MSC layer towards (from?) the BSC and RNC,
|
||||||
|
* i.e. in the direction towards the mobile device (MS aka UE).
|
||||||
|
*
|
||||||
|
* 2G will use the A-interface,
|
||||||
|
* 3G aka UMTS will use the Iu-interface (for the MSC, it's IuCS).
|
||||||
|
*
|
||||||
|
* To allow linking parts of the MSC code without having to include entire
|
||||||
|
* infrastructures of external libraries, the core transmitting and receiving
|
||||||
|
* functions are left unimplemented. For example, a unit test does not need to
|
||||||
|
* link against external ASN1 libraries if it is never going to encode actual
|
||||||
|
* outgoing messages. It is up to each building scope to implement real world
|
||||||
|
* functions or to plug mere dummy implementations.
|
||||||
|
*
|
||||||
|
* For example, msc_tx_dtap(conn, msg), depending on conn->via_iface, will call
|
||||||
|
* either iu_tx() or a_tx() [note: at time of writing, the A-interface is not
|
||||||
|
* yet implemented]. When you try to link against libmsc, you will find that
|
||||||
|
* the compiler complains about an undefined reference to iu_tx(). If you,
|
||||||
|
* however, link against libiu as well as the osmo-iuh libs (etc.), iu_tx() is
|
||||||
|
* available. A unit test may instead simply implement a dummy iu_tx() function
|
||||||
|
* and not link against osmo-iuh.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Each main linkage must implement this function (see comment above). */
|
||||||
|
extern int iu_tx(struct msgb *msg, uint8_t sapi);
|
||||||
|
|
||||||
|
/* So far this is a dummy implemented in libmsc/a_iface.c. When A-interface
|
||||||
|
* gets implemented, it should be in a separate lib (like libiu), this function
|
||||||
|
* should move there, and the following comment should remain here: "
|
||||||
|
* Each main linkage must implement this function (see comment above).
|
||||||
|
* " */
|
||||||
|
extern int a_tx(struct msgb *msg);
|
||||||
|
|
||||||
|
int msc_tx_dtap(struct gsm_subscriber_connection *conn,
|
||||||
|
struct msgb *msg);
|
||||||
|
|
||||||
|
int msc_gsm48_tx_mm_serv_ack(struct gsm_subscriber_connection *conn);
|
||||||
|
int msc_gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn,
|
||||||
|
enum gsm48_reject_value value);
|
||||||
|
|
||||||
|
/* TODO: specific to A interface, move this away */
|
||||||
|
int msc_gsm0808_tx_cipher_mode(struct gsm_subscriber_connection *conn, int cipher,
|
||||||
|
const uint8_t *key, int len, int include_imeisv);
|
|
@ -51,6 +51,11 @@ static inline const char *subscr_conn_from_name(enum subscr_conn_from val)
|
||||||
return get_value_string(subscr_conn_from_names, val);
|
return get_value_string(subscr_conn_from_names, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum msc_compl_l3_rc {
|
||||||
|
MSC_CONN_ACCEPT = 0,
|
||||||
|
MSC_CONN_REJECT = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct bsc_api *msc_bsc_api();
|
struct bsc_api *msc_bsc_api();
|
||||||
|
|
||||||
|
|
|
@ -1423,6 +1423,19 @@ static void print_meas_rep(struct gsm_lchan *lchan, struct gsm_meas_rep *mr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan)
|
||||||
|
{
|
||||||
|
struct gsm_meas_rep *meas_rep;
|
||||||
|
|
||||||
|
meas_rep = &lchan->meas_rep[lchan->meas_rep_idx];
|
||||||
|
memset(meas_rep, 0, sizeof(*meas_rep));
|
||||||
|
meas_rep->lchan = lchan;
|
||||||
|
lchan->meas_rep_idx = (lchan->meas_rep_idx + 1)
|
||||||
|
% ARRAY_SIZE(lchan->meas_rep);
|
||||||
|
|
||||||
|
return meas_rep;
|
||||||
|
}
|
||||||
|
|
||||||
static int rsl_rx_meas_res(struct msgb *msg)
|
static int rsl_rx_meas_res(struct msgb *msg)
|
||||||
{
|
{
|
||||||
struct abis_rsl_dchan_hdr *dh = msgb_l2(msg);
|
struct abis_rsl_dchan_hdr *dh = msgb_l2(msg);
|
||||||
|
|
|
@ -264,6 +264,7 @@ struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_lchan *lcha
|
||||||
conn->lchan = lchan;
|
conn->lchan = lchan;
|
||||||
conn->bts = lchan->ts->trx->bts;
|
conn->bts = lchan->ts->trx->bts;
|
||||||
conn->via_ran = RAN_GERAN_A;
|
conn->via_ran = RAN_GERAN_A;
|
||||||
|
conn->lac = conn->bts->location_area_code;
|
||||||
lchan->conn = conn;
|
lchan->conn = conn;
|
||||||
llist_add_tail(&conn->entry, &net->subscr_conns);
|
llist_add_tail(&conn->entry, &net->subscr_conns);
|
||||||
return conn;
|
return conn;
|
||||||
|
|
|
@ -593,18 +593,12 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
|
||||||
(sp->penalty_time*20)+20, VTY_NEWLINE);
|
(sp->penalty_time*20)+20, VTY_NEWLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is periodic LU enabled or disabled? */
|
|
||||||
if (bts->si_common.chan_desc.t3212 == 0)
|
|
||||||
vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
|
|
||||||
else
|
|
||||||
vty_out(vty, " periodic location update %u%s",
|
|
||||||
bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
|
|
||||||
|
|
||||||
if (gsm_bts_get_radio_link_timeout(bts) < 0)
|
if (gsm_bts_get_radio_link_timeout(bts) < 0)
|
||||||
vty_out(vty, " radio-link-timeout infinite%s", VTY_NEWLINE);
|
vty_out(vty, " radio-link-timeout infinite%s", VTY_NEWLINE);
|
||||||
else
|
else
|
||||||
vty_out(vty, " radio-link-timeout %d%s",
|
vty_out(vty, " radio-link-timeout %d%s",
|
||||||
gsm_bts_get_radio_link_timeout(bts), VTY_NEWLINE);
|
gsm_bts_get_radio_link_timeout(bts), VTY_NEWLINE);
|
||||||
|
|
||||||
vty_out(vty, " channel allocator %s%s",
|
vty_out(vty, " channel allocator %s%s",
|
||||||
bts->chan_alloc_reverse ? "descending" : "ascending",
|
bts->chan_alloc_reverse ? "descending" : "ascending",
|
||||||
VTY_NEWLINE);
|
VTY_NEWLINE);
|
||||||
|
@ -841,6 +835,11 @@ static int config_write_net(struct vty *vty)
|
||||||
vty_out(vty, " timezone %d %d%s",
|
vty_out(vty, " timezone %d %d%s",
|
||||||
gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
|
gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
|
||||||
}
|
}
|
||||||
|
if (gsmnet->t3212 == 0)
|
||||||
|
vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
|
||||||
|
else
|
||||||
|
vty_out(vty, " periodic location update %u%s",
|
||||||
|
gsmnet->t3212 * 6, VTY_NEWLINE);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -2266,34 +2265,6 @@ DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
|
|
||||||
"periodic location update <6-1530>",
|
|
||||||
"Periodic Location Updating Interval\n"
|
|
||||||
"Periodic Location Updating Interval\n"
|
|
||||||
"Periodic Location Updating Interval\n"
|
|
||||||
"Periodic Location Updating Interval in Minutes\n")
|
|
||||||
{
|
|
||||||
struct gsm_bts *bts = vty->index;
|
|
||||||
|
|
||||||
bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
|
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
|
|
||||||
"no periodic location update",
|
|
||||||
NO_STR
|
|
||||||
"Periodic Location Updating Interval\n"
|
|
||||||
"Periodic Location Updating Interval\n"
|
|
||||||
"Periodic Location Updating Interval\n")
|
|
||||||
{
|
|
||||||
struct gsm_bts *bts = vty->index;
|
|
||||||
|
|
||||||
bts->si_common.chan_desc.t3212 = 0;
|
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
|
DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
|
||||||
"radio-link-timeout <4-64>",
|
"radio-link-timeout <4-64>",
|
||||||
"Radio link timeout criterion (BTS side)\n"
|
"Radio link timeout criterion (BTS side)\n"
|
||||||
|
@ -4129,7 +4100,6 @@ int bsc_vty_init(struct gsm_network *network)
|
||||||
install_element_ve(&show_paging_group_cmd);
|
install_element_ve(&show_paging_group_cmd);
|
||||||
|
|
||||||
logging_vty_add_cmds(NULL);
|
logging_vty_add_cmds(NULL);
|
||||||
osmo_stats_vty_add_cmds();
|
|
||||||
|
|
||||||
install_element(GSMNET_NODE, &cfg_net_neci_cmd);
|
install_element(GSMNET_NODE, &cfg_net_neci_cmd);
|
||||||
install_element(GSMNET_NODE, &cfg_net_handover_cmd);
|
install_element(GSMNET_NODE, &cfg_net_handover_cmd);
|
||||||
|
@ -4189,8 +4159,6 @@ int bsc_vty_init(struct gsm_network *network)
|
||||||
install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
|
install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
|
||||||
install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
|
install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
|
||||||
install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
|
install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
|
||||||
install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
|
|
||||||
install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
|
|
||||||
install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
|
install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
|
||||||
install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
|
install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
|
||||||
install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
|
install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
|
||||||
|
|
|
@ -270,61 +270,6 @@ int send_siemens_mrpci(struct gsm_lchan *lchan,
|
||||||
return rsl_siemens_mrpci(lchan, &mrpci);
|
return rsl_siemens_mrpci(lchan, &mrpci);
|
||||||
}
|
}
|
||||||
|
|
||||||
int gsm48_extract_mi(uint8_t *classmark2_lv, int length, char *mi_string, uint8_t *mi_type)
|
|
||||||
{
|
|
||||||
/* Check the size for the classmark */
|
|
||||||
if (length < 1 + *classmark2_lv)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
uint8_t *mi_lv = classmark2_lv + *classmark2_lv + 1;
|
|
||||||
if (length < 2 + *classmark2_lv + mi_lv[0])
|
|
||||||
return -2;
|
|
||||||
|
|
||||||
*mi_type = mi_lv[1] & GSM_MI_TYPE_MASK;
|
|
||||||
return gsm48_mi_to_string(mi_string, GSM48_MI_SIZE, mi_lv+1, *mi_lv);
|
|
||||||
}
|
|
||||||
|
|
||||||
int gsm48_paging_extract_mi(struct gsm48_pag_resp *resp, int length,
|
|
||||||
char *mi_string, uint8_t *mi_type)
|
|
||||||
{
|
|
||||||
static const uint32_t classmark_offset =
|
|
||||||
offsetof(struct gsm48_pag_resp, classmark2);
|
|
||||||
uint8_t *classmark2_lv = (uint8_t *) &resp->classmark2;
|
|
||||||
return gsm48_extract_mi(classmark2_lv, length - classmark_offset,
|
|
||||||
mi_string, mi_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn,
|
|
||||||
struct msgb *msg, struct bsc_subscr *bsub)
|
|
||||||
{
|
|
||||||
struct gsm_bts *bts = msg->lchan->ts->trx->bts;
|
|
||||||
struct gsm48_hdr *gh = msgb_l3(msg);
|
|
||||||
uint8_t *classmark2_lv = gh->data + 1;
|
|
||||||
|
|
||||||
if (is_siemens_bts(bts))
|
|
||||||
send_siemens_mrpci(msg->lchan, classmark2_lv);
|
|
||||||
|
|
||||||
if (!conn->bsub) {
|
|
||||||
conn->bsub = bsub;
|
|
||||||
} else if (conn->bsub != bsub) {
|
|
||||||
LOGP(DRR, LOGL_ERROR,
|
|
||||||
"<- Channel already owned by someone else?\n");
|
|
||||||
bsc_subscr_put(bsub);
|
|
||||||
return -EINVAL;
|
|
||||||
} else {
|
|
||||||
DEBUGP(DRR, "<- Channel already owned by us\n");
|
|
||||||
bsc_subscr_put(bsub);
|
|
||||||
bsub = conn->bsub;
|
|
||||||
}
|
|
||||||
|
|
||||||
rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED]);
|
|
||||||
|
|
||||||
/* Stop paging on the bts we received the paging response */
|
|
||||||
paging_request_stop(&bts->network->bts_list, conn->bts, bsub, conn,
|
|
||||||
msg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Chapter 9.1.9: Ciphering Mode Command */
|
/* Chapter 9.1.9: Ciphering Mode Command */
|
||||||
int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv)
|
int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,6 +33,27 @@
|
||||||
#include <openbsc/handover.h>
|
#include <openbsc/handover.h>
|
||||||
#include <osmocom/gsm/gsm_utils.h>
|
#include <osmocom/gsm/gsm_utils.h>
|
||||||
|
|
||||||
|
/* Get reference to a neighbor cell on a given BCCH ARFCN */
|
||||||
|
static struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
|
||||||
|
uint16_t arfcn, uint8_t bsic)
|
||||||
|
{
|
||||||
|
struct gsm_bts *neigh;
|
||||||
|
/* FIXME: use some better heuristics here to determine which cell
|
||||||
|
* using this ARFCN really is closest to the target cell. For
|
||||||
|
* now we simply assume that each ARFCN will only be used by one
|
||||||
|
* cell */
|
||||||
|
|
||||||
|
llist_for_each_entry(neigh, &bts->network->bts_list, list) {
|
||||||
|
/* FIXME: this is probably returning the same bts again!? */
|
||||||
|
if (neigh->c0->arfcn == arfcn &&
|
||||||
|
neigh->bsic == bsic)
|
||||||
|
return neigh;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* issue handover to a cell identified by ARFCN and BSIC */
|
/* issue handover to a cell identified by ARFCN and BSIC */
|
||||||
static int handover_to_arfcn_bsic(struct gsm_lchan *lchan,
|
static int handover_to_arfcn_bsic(struct gsm_lchan *lchan,
|
||||||
uint16_t arfcn, uint8_t bsic)
|
uint16_t arfcn, uint8_t bsic)
|
||||||
|
|
|
@ -56,6 +56,9 @@ struct gsm_network *gsm_network_init(void *ctx,
|
||||||
net->country_code = country_code;
|
net->country_code = country_code;
|
||||||
net->network_code = network_code;
|
net->network_code = network_code;
|
||||||
|
|
||||||
|
/* Use 30 min periodic update interval as sane default */
|
||||||
|
net->t3212 = 5;
|
||||||
|
|
||||||
INIT_LLIST_HEAD(&net->trans_list);
|
INIT_LLIST_HEAD(&net->trans_list);
|
||||||
INIT_LLIST_HEAD(&net->upqueue);
|
INIT_LLIST_HEAD(&net->upqueue);
|
||||||
INIT_LLIST_HEAD(&net->subscr_conns);
|
INIT_LLIST_HEAD(&net->subscr_conns);
|
||||||
|
@ -107,6 +110,30 @@ struct msgb *gsm48_create_loc_upd_rej(uint8_t cause)
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gsm48_extract_mi(uint8_t *classmark2_lv, int length, char *mi_string, uint8_t *mi_type)
|
||||||
|
{
|
||||||
|
/* Check the size for the classmark */
|
||||||
|
if (length < 1 + *classmark2_lv)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
uint8_t *mi_lv = classmark2_lv + *classmark2_lv + 1;
|
||||||
|
if (length < 2 + *classmark2_lv + mi_lv[0])
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
*mi_type = mi_lv[1] & GSM_MI_TYPE_MASK;
|
||||||
|
return gsm48_mi_to_string(mi_string, GSM48_MI_SIZE, mi_lv+1, *mi_lv);
|
||||||
|
}
|
||||||
|
|
||||||
|
int gsm48_paging_extract_mi(struct gsm48_pag_resp *resp, int length,
|
||||||
|
char *mi_string, uint8_t *mi_type)
|
||||||
|
{
|
||||||
|
static const uint32_t classmark_offset =
|
||||||
|
offsetof(struct gsm48_pag_resp, classmark2);
|
||||||
|
uint8_t *classmark2_lv = (uint8_t *) &resp->classmark2;
|
||||||
|
return gsm48_extract_mi(classmark2_lv, length - classmark_offset,
|
||||||
|
mi_string, mi_type);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t sms_next_rp_msg_ref(uint8_t *next_rp_ref)
|
uint8_t sms_next_rp_msg_ref(uint8_t *next_rp_ref)
|
||||||
{
|
{
|
||||||
const uint8_t rp_msg_ref = *next_rp_ref;
|
const uint8_t rp_msg_ref = *next_rp_ref;
|
||||||
|
|
|
@ -284,6 +284,34 @@ DEFUN(cfg_net_no_timezone,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN(cfg_net_per_loc_upd, cfg_net_per_loc_upd_cmd,
|
||||||
|
"periodic location update <6-1530>",
|
||||||
|
"Periodic Location Updating Interval\n"
|
||||||
|
"Periodic Location Updating Interval\n"
|
||||||
|
"Periodic Location Updating Interval\n"
|
||||||
|
"Periodic Location Updating Interval in Minutes\n")
|
||||||
|
{
|
||||||
|
struct gsm_network *net = vty->index;
|
||||||
|
|
||||||
|
net->t3212 = atoi(argv[0]) / 6;
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFUN(cfg_net_no_per_loc_upd, cfg_net_no_per_loc_upd_cmd,
|
||||||
|
"no periodic location update",
|
||||||
|
NO_STR
|
||||||
|
"Periodic Location Updating Interval\n"
|
||||||
|
"Periodic Location Updating Interval\n"
|
||||||
|
"Periodic Location Updating Interval\n")
|
||||||
|
{
|
||||||
|
struct gsm_network *net = vty->index;
|
||||||
|
|
||||||
|
net->t3212 = 0;
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static struct gsm_network *vty_global_gsm_network = NULL;
|
static struct gsm_network *vty_global_gsm_network = NULL;
|
||||||
|
|
||||||
/* initialize VTY elements used in both BSC and MSC */
|
/* initialize VTY elements used in both BSC and MSC */
|
||||||
|
@ -293,6 +321,8 @@ int common_cs_vty_init(struct gsm_network *network,
|
||||||
OSMO_ASSERT(vty_global_gsm_network == NULL);
|
OSMO_ASSERT(vty_global_gsm_network == NULL);
|
||||||
vty_global_gsm_network = network;
|
vty_global_gsm_network = network;
|
||||||
|
|
||||||
|
osmo_stats_vty_add_cmds();
|
||||||
|
|
||||||
install_element(CONFIG_NODE, &cfg_net_cmd);
|
install_element(CONFIG_NODE, &cfg_net_cmd);
|
||||||
install_node(&net_node, config_write_net);
|
install_node(&net_node, config_write_net);
|
||||||
vty_install_default(GSMNET_NODE);
|
vty_install_default(GSMNET_NODE);
|
||||||
|
@ -310,6 +340,8 @@ int common_cs_vty_init(struct gsm_network *network,
|
||||||
install_element(GSMNET_NODE, &cfg_net_timezone_cmd);
|
install_element(GSMNET_NODE, &cfg_net_timezone_cmd);
|
||||||
install_element(GSMNET_NODE, &cfg_net_timezone_dst_cmd);
|
install_element(GSMNET_NODE, &cfg_net_timezone_dst_cmd);
|
||||||
install_element(GSMNET_NODE, &cfg_net_no_timezone_cmd);
|
install_element(GSMNET_NODE, &cfg_net_no_timezone_cmd);
|
||||||
|
install_element(GSMNET_NODE, &cfg_net_per_loc_upd_cmd);
|
||||||
|
install_element(GSMNET_NODE, &cfg_net_no_per_loc_upd_cmd);
|
||||||
install_element(GSMNET_NODE, &cfg_net_dyn_ts_allow_tch_f_cmd);
|
install_element(GSMNET_NODE, &cfg_net_dyn_ts_allow_tch_f_cmd);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
|
|
@ -71,25 +71,6 @@ int gsm_bts_model_register(struct gsm_bts_model *model)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get reference to a neighbor cell on a given BCCH ARFCN */
|
|
||||||
struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
|
|
||||||
uint16_t arfcn, uint8_t bsic)
|
|
||||||
{
|
|
||||||
struct gsm_bts *neigh;
|
|
||||||
/* FIXME: use some better heuristics here to determine which cell
|
|
||||||
* using this ARFCN really is closest to the target cell. For
|
|
||||||
* now we simply assume that each ARFCN will only be used by one
|
|
||||||
* cell */
|
|
||||||
|
|
||||||
llist_for_each_entry(neigh, &bts->network->bts_list, list) {
|
|
||||||
if (neigh->c0->arfcn == arfcn &&
|
|
||||||
neigh->bsic == bsic)
|
|
||||||
return neigh;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1] = {
|
const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1] = {
|
||||||
{ GSM_BTS_TYPE_UNKNOWN, "Unknown BTS Type" },
|
{ GSM_BTS_TYPE_UNKNOWN, "Unknown BTS Type" },
|
||||||
{ GSM_BTS_TYPE_BS11, "Siemens BTS (BS-11 or compatible)" },
|
{ GSM_BTS_TYPE_BS11, "Siemens BTS (BS-11 or compatible)" },
|
||||||
|
@ -210,19 +191,6 @@ int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan)
|
|
||||||
{
|
|
||||||
struct gsm_meas_rep *meas_rep;
|
|
||||||
|
|
||||||
meas_rep = &lchan->meas_rep[lchan->meas_rep_idx];
|
|
||||||
memset(meas_rep, 0, sizeof(*meas_rep));
|
|
||||||
meas_rep->lchan = lchan;
|
|
||||||
lchan->meas_rep_idx = (lchan->meas_rep_idx + 1)
|
|
||||||
% ARRAY_SIZE(lchan->meas_rep);
|
|
||||||
|
|
||||||
return meas_rep;
|
|
||||||
}
|
|
||||||
|
|
||||||
int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat)
|
int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat)
|
||||||
{
|
{
|
||||||
OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
|
OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
|
||||||
|
@ -322,7 +290,7 @@ struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net, enum gsm_bts_typ
|
||||||
bts->si_common.chan_desc.att = 1; /* attachment required */
|
bts->si_common.chan_desc.att = 1; /* attachment required */
|
||||||
bts->si_common.chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5; /* paging frames */
|
bts->si_common.chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5; /* paging frames */
|
||||||
bts->si_common.chan_desc.bs_ag_blks_res = 1; /* reserved AGCH blocks */
|
bts->si_common.chan_desc.bs_ag_blks_res = 1; /* reserved AGCH blocks */
|
||||||
bts->si_common.chan_desc.t3212 = 5; /* Use 30 min periodic update interval as sane default */
|
bts->si_common.chan_desc.t3212 = net->t3212; /* Use network's current value */
|
||||||
gsm_bts_set_radio_link_timeout(bts, 32); /* Use RADIO LINK TIMEOUT of 32 */
|
gsm_bts_set_radio_link_timeout(bts, 32); /* Use RADIO LINK TIMEOUT of 32 */
|
||||||
|
|
||||||
llist_add_tail(&bts->list, &net->bts_list);
|
llist_add_tail(&bts->list, &net->bts_list);
|
||||||
|
|
|
@ -44,7 +44,6 @@ void talloc_ctx_init(void *ctx_root)
|
||||||
tall_authciphop_ctx = talloc_named_const(ctx_root, 0, "auth_ciph_oper");
|
tall_authciphop_ctx = talloc_named_const(ctx_root, 0, "auth_ciph_oper");
|
||||||
tall_gsms_ctx = talloc_named_const(ctx_root, 0, "sms");
|
tall_gsms_ctx = talloc_named_const(ctx_root, 0, "sms");
|
||||||
tall_subscr_ctx = talloc_named_const(ctx_root, 0, "subscriber");
|
tall_subscr_ctx = talloc_named_const(ctx_root, 0, "subscriber");
|
||||||
tall_sub_req_ctx = talloc_named_const(ctx_root, 0, "subscr_request");
|
|
||||||
tall_call_ctx = talloc_named_const(ctx_root, 0, "gsm_call");
|
tall_call_ctx = talloc_named_const(ctx_root, 0, "gsm_call");
|
||||||
tall_paging_ctx = talloc_named_const(ctx_root, 0, "paging_request");
|
tall_paging_ctx = talloc_named_const(ctx_root, 0, "paging_request");
|
||||||
tall_sigh_ctx = talloc_named_const(ctx_root, 0, "signal_handler");
|
tall_sigh_ctx = talloc_named_const(ctx_root, 0, "signal_handler");
|
||||||
|
|
|
@ -23,6 +23,7 @@ noinst_LIBRARIES = \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
libmsc_a_SOURCES = \
|
libmsc_a_SOURCES = \
|
||||||
|
a_iface.c \
|
||||||
auth.c \
|
auth.c \
|
||||||
db.c \
|
db.c \
|
||||||
gsm_04_08.c \
|
gsm_04_08.c \
|
||||||
|
@ -32,6 +33,7 @@ libmsc_a_SOURCES = \
|
||||||
mncc.c \
|
mncc.c \
|
||||||
mncc_builtin.c \
|
mncc_builtin.c \
|
||||||
mncc_sock.c \
|
mncc_sock.c \
|
||||||
|
msc_ifaces.c \
|
||||||
rrlp.c \
|
rrlp.c \
|
||||||
silent_call.c \
|
silent_call.c \
|
||||||
sms_queue.c \
|
sms_queue.c \
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/* A-interface implementation, from MSC to BSC */
|
||||||
|
|
||||||
|
/* (C) 2016 by sysmocom s.m.f.c GmbH <info@sysmocom.de>
|
||||||
|
*
|
||||||
|
* All Rights Reserved
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <osmocom/core/msgb.h>
|
||||||
|
#include <osmocom/core/logging.h>
|
||||||
|
|
||||||
|
#include <openbsc/debug.h>
|
||||||
|
|
||||||
|
#include <openbsc/gsm_data.h>
|
||||||
|
#include <openbsc/msc_ifaces.h>
|
||||||
|
#include <openbsc/debug.h>
|
||||||
|
|
||||||
|
int a_tx(struct msgb *msg)
|
||||||
|
{
|
||||||
|
LOGP(DMSC, LOGL_ERROR, "message to be sent to BSC, but A-interface"
|
||||||
|
" not implemented.\n%s\n", osmo_hexdump(msg->data, msg->len));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int msc_gsm0808_tx_cipher_mode(struct gsm_subscriber_connection *conn, int cipher,
|
||||||
|
const uint8_t *key, int len, int include_imeisv)
|
||||||
|
{
|
||||||
|
/* TODO generalize for A- and Iu interfaces, don't name after 08.08 */
|
||||||
|
LOGP(DMSC, LOGL_ERROR, "gsm0808_cipher_mode(): message to be sent to"
|
||||||
|
" BSC, but A interface not yet implemented.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -878,7 +878,7 @@ int gsm0411_rcv_sms(struct gsm_subscriber_connection *conn,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Take a SMS in gsm_sms structure and send it through an already
|
/* Take a SMS in gsm_sms structure and send it through an already
|
||||||
* existing lchan. We also assume that the caller ensured this lchan already
|
* existing conn. We also assume that the caller ensured this conn already
|
||||||
* has a SAPI3 RLL connection! */
|
* has a SAPI3 RLL connection! */
|
||||||
int gsm411_send_sms(struct gsm_subscriber_connection *conn, struct gsm_sms *sms)
|
int gsm411_send_sms(struct gsm_subscriber_connection *conn, struct gsm_sms *sms)
|
||||||
{
|
{
|
||||||
|
@ -1004,7 +1004,7 @@ int gsm411_send_sms_subscr(struct vlr_subscr *vsub,
|
||||||
struct gsm_subscriber_connection *conn;
|
struct gsm_subscriber_connection *conn;
|
||||||
void *res;
|
void *res;
|
||||||
|
|
||||||
/* check if we already have an open lchan to the subscriber.
|
/* check if we already have an open conn to the subscriber.
|
||||||
* if yes, send the SMS this way */
|
* if yes, send the SMS this way */
|
||||||
conn = connection_for_subscr(vsub);
|
conn = connection_for_subscr(vsub);
|
||||||
if (conn) {
|
if (conn) {
|
||||||
|
@ -1016,8 +1016,8 @@ int gsm411_send_sms_subscr(struct vlr_subscr *vsub,
|
||||||
/* if not, we have to start paging */
|
/* if not, we have to start paging */
|
||||||
LOGP(DLSMS, LOGL_DEBUG, "Sending SMS: no connection open, start paging %s\n",
|
LOGP(DLSMS, LOGL_DEBUG, "Sending SMS: no connection open, start paging %s\n",
|
||||||
vlr_subscr_name(vsub));
|
vlr_subscr_name(vsub));
|
||||||
res = subscr_request_channel(vsub, RSL_CHANNEED_SDCCH,
|
res = subscr_request_conn(vsub, RSL_CHANNEED_SDCCH, paging_cb_send_sms,
|
||||||
paging_cb_send_sms, sms);
|
sms);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
send_signal(S_SMS_UNKNOWN_ERROR, NULL, sms, GSM_PAGING_BUSY);
|
send_signal(S_SMS_UNKNOWN_ERROR, NULL, sms, GSM_PAGING_BUSY);
|
||||||
sms_free(sms);
|
sms_free(sms);
|
||||||
|
|
|
@ -41,43 +41,6 @@
|
||||||
#include <openbsc/chan_alloc.h>
|
#include <openbsc/chan_alloc.h>
|
||||||
#include <openbsc/vlr.h>
|
#include <openbsc/vlr.h>
|
||||||
|
|
||||||
void *tall_sub_req_ctx;
|
|
||||||
|
|
||||||
int gsm48_secure_channel(struct gsm_subscriber_connection *conn, int key_seq,
|
|
||||||
gsm_cbfn *cb, void *cb_data);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Struct for pending channel requests. This is managed in the
|
|
||||||
* llist_head requests of each subscriber. The reference counting
|
|
||||||
* should work in such a way that a subscriber with a pending request
|
|
||||||
* remains in memory.
|
|
||||||
*/
|
|
||||||
struct subscr_request {
|
|
||||||
struct llist_head entry;
|
|
||||||
|
|
||||||
/* the callback data */
|
|
||||||
gsm_cbfn *cbfn;
|
|
||||||
void *param;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct bsc_subscr *vlr_subscr_to_bsc_sub(struct llist_head *bsc_subscribers,
|
|
||||||
struct vlr_subscr *vsub)
|
|
||||||
{
|
|
||||||
struct bsc_subscr *sub;
|
|
||||||
/* TODO MSC split -- creating a BSC subscriber directly from MSC data
|
|
||||||
* structures in RAM. At some point the MSC will send a message to the
|
|
||||||
* BSC instead. */
|
|
||||||
sub = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, vsub->imsi);
|
|
||||||
sub->tmsi = vsub->tmsi;
|
|
||||||
sub->lac = vsub->lac;
|
|
||||||
return sub;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We got the channel assigned and can now hand this channel
|
|
||||||
* over to one of our callbacks.
|
|
||||||
*/
|
|
||||||
int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
|
int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
|
||||||
struct msgb *msg, void *data, void *param)
|
struct msgb *msg, void *data, void *param)
|
||||||
{
|
{
|
||||||
|
@ -85,22 +48,12 @@ int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
|
||||||
struct gsm_subscriber_connection *conn = data;
|
struct gsm_subscriber_connection *conn = data;
|
||||||
struct vlr_subscr *vsub = param;
|
struct vlr_subscr *vsub = param;
|
||||||
struct paging_signal_data sig_data;
|
struct paging_signal_data sig_data;
|
||||||
struct bsc_subscr *bsub;
|
|
||||||
struct gsm_network *net;
|
|
||||||
|
|
||||||
OSMO_ASSERT(vsub && vsub->cs.is_paging);
|
OSMO_ASSERT(vsub && vsub->cs.is_paging);
|
||||||
net = vsub->vlr->user_ctx;
|
|
||||||
|
|
||||||
/*
|
/* FIXME: implement stop paging in libmsc;
|
||||||
* Stop paging on all other BTS. E.g. if this is
|
* faking it for the unit tests to still work */
|
||||||
* the first timeout on a BTS then the others will
|
msc_fake_paging_request_stop(vsub);
|
||||||
* timeout soon as well. Let's just stop everything
|
|
||||||
* and forget we wanted to page.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bsub = vlr_subscr_to_bsc_sub(conn->network->bsc_subscribers, vsub);
|
|
||||||
paging_request_stop(&net->bts_list, NULL, bsub, NULL, NULL);
|
|
||||||
bsc_subscr_put(bsub);
|
|
||||||
|
|
||||||
/* Inform parts of the system we don't know */
|
/* Inform parts of the system we don't know */
|
||||||
sig_data.vsub = vsub;
|
sig_data.vsub = vsub;
|
||||||
|
@ -126,22 +79,21 @@ int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct subscr_request *subscr_request_channel(struct vlr_subscr *vsub,
|
struct subscr_request *subscr_request_conn(struct vlr_subscr *vsub, int channel_type, gsm_cbfn *cbfn,
|
||||||
int channel_type,
|
void *param)
|
||||||
gsm_cbfn *cbfn, void *param)
|
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct subscr_request *request;
|
struct subscr_request *request;
|
||||||
struct bsc_subscr *bsub;
|
|
||||||
struct gsm_network *net = vsub->vlr->user_ctx;
|
|
||||||
|
|
||||||
/* Start paging.. we know it is async so we can do it before */
|
/* Start paging.. we know it is async so we can do it before */
|
||||||
if (!vsub->cs.is_paging) {
|
if (!vsub->cs.is_paging) {
|
||||||
LOGP(DMM, LOGL_DEBUG, "Subscriber %s not paged yet.\n",
|
LOGP(DMM, LOGL_DEBUG, "Subscriber %s not paged yet.\n",
|
||||||
vlr_subscr_name(vsub));
|
vlr_subscr_name(vsub));
|
||||||
bsub = vlr_subscr_to_bsc_sub(net->bsc_subscribers, vsub);
|
|
||||||
rc = paging_request(net, bsub, channel_type, NULL, NULL);
|
/* FIXME: implement paging in libmsc;
|
||||||
bsc_subscr_put(bsub);
|
* faking it for the unit tests to still work */
|
||||||
|
rc = msc_fake_paging_request(vsub);
|
||||||
|
|
||||||
if (rc <= 0) {
|
if (rc <= 0) {
|
||||||
LOGP(DMM, LOGL_ERROR, "Subscriber %s paging failed: %d\n",
|
LOGP(DMM, LOGL_ERROR, "Subscriber %s paging failed: %d\n",
|
||||||
vlr_subscr_name(vsub), rc);
|
vlr_subscr_name(vsub), rc);
|
||||||
|
|
|
@ -65,21 +65,6 @@ static struct gsm_call *get_call_ref(uint32_t callref)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t mncc_codec_for_mode(int lchan_type)
|
|
||||||
{
|
|
||||||
/* FIXME: check codec capabilities of the phone */
|
|
||||||
|
|
||||||
if (lchan_type != GSM_LCHAN_TCH_H)
|
|
||||||
return mncc_int.def_codec[0];
|
|
||||||
else
|
|
||||||
return mncc_int.def_codec[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t determine_lchan_mode(struct gsm_mncc *setup)
|
|
||||||
{
|
|
||||||
return mncc_codec_for_mode(setup->lchan_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* on incoming call, look up database and send setup to remote subscr. */
|
/* on incoming call, look up database and send setup to remote subscr. */
|
||||||
static int mncc_setup_ind(struct gsm_call *call, int msg_type,
|
static int mncc_setup_ind(struct gsm_call *call, int msg_type,
|
||||||
struct gsm_mncc *setup)
|
struct gsm_mncc *setup)
|
||||||
|
@ -137,9 +122,7 @@ static int mncc_setup_ind(struct gsm_call *call, int msg_type,
|
||||||
/* modify mode */
|
/* modify mode */
|
||||||
memset(&mncc, 0, sizeof(struct gsm_mncc));
|
memset(&mncc, 0, sizeof(struct gsm_mncc));
|
||||||
mncc.callref = call->callref;
|
mncc.callref = call->callref;
|
||||||
mncc.lchan_mode = determine_lchan_mode(setup);
|
DEBUGP(DMNCC, "(call %x) Modify channel mode\n", call->callref);
|
||||||
DEBUGP(DMNCC, "(call %x) Modify channel mode: %s\n", call->callref,
|
|
||||||
get_value_string(gsm48_chan_mode_names, mncc.lchan_mode));
|
|
||||||
mncc_tx_to_cc(call->net, MNCC_LCHAN_MODIFY, &mncc);
|
mncc_tx_to_cc(call->net, MNCC_LCHAN_MODIFY, &mncc);
|
||||||
|
|
||||||
/* send setup to remote */
|
/* send setup to remote */
|
||||||
|
@ -207,10 +190,6 @@ static int mncc_setup_cnf(struct gsm_call *call, int msg_type,
|
||||||
bridge.callref[1] = call->remote_ref;
|
bridge.callref[1] = call->remote_ref;
|
||||||
DEBUGP(DMNCC, "(call %x) Bridging with remote.\n", call->callref);
|
DEBUGP(DMNCC, "(call %x) Bridging with remote.\n", call->callref);
|
||||||
|
|
||||||
/* in direct mode, we always have to bridge the channels */
|
|
||||||
if (ipacc_rtp_direct)
|
|
||||||
return mncc_tx_to_cc(call->net, MNCC_BRIDGE, &bridge);
|
|
||||||
|
|
||||||
/* proxy mode */
|
/* proxy mode */
|
||||||
if (!net->handover.active) {
|
if (!net->handover.active) {
|
||||||
/* in the no-handover case, we can bridge, i.e. use
|
/* in the no-handover case, we can bridge, i.e. use
|
||||||
|
@ -279,28 +258,6 @@ static int mncc_rel_cnf(struct gsm_call *call, int msg_type, struct gsm_mncc *re
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* receiving a (speech) traffic frame from the BSC code */
|
|
||||||
static int mncc_rcv_data(struct gsm_call *call, int msg_type,
|
|
||||||
struct gsm_data_frame *dfr)
|
|
||||||
{
|
|
||||||
struct gsm_trans *remote_trans;
|
|
||||||
|
|
||||||
remote_trans = trans_find_by_callref(call->net, call->remote_ref);
|
|
||||||
|
|
||||||
/* this shouldn't really happen */
|
|
||||||
if (!remote_trans || !remote_trans->conn) {
|
|
||||||
LOGP(DMNCC, LOGL_ERROR, "No transaction or transaction without lchan?!?\n");
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* RTP socket of remote end has meanwhile died */
|
|
||||||
if (!remote_trans->conn->lchan->abis_ip.rtp_socket)
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
return rtp_send_frame(remote_trans->conn->lchan->abis_ip.rtp_socket, dfr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Internal MNCC handler input function (from CC -> MNCC -> here) */
|
/* Internal MNCC handler input function (from CC -> MNCC -> here) */
|
||||||
int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
|
int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
|
||||||
{
|
{
|
||||||
|
@ -346,7 +303,8 @@ int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mncc_is_data_frame(msg_type)) {
|
if (mncc_is_data_frame(msg_type)) {
|
||||||
rc = mncc_rcv_data(call, msg_type, arg);
|
LOGP(DMNCC, LOGL_ERROR, "(call %x) Received data frame, which is not supported.\n",
|
||||||
|
call->callref);
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,7 +322,6 @@ int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
|
||||||
break;
|
break;
|
||||||
case MNCC_CALL_CONF_IND:
|
case MNCC_CALL_CONF_IND:
|
||||||
/* we now need to MODIFY the channel */
|
/* we now need to MODIFY the channel */
|
||||||
data->lchan_mode = determine_lchan_mode(data);
|
|
||||||
mncc_tx_to_cc(call->net, MNCC_LCHAN_MODIFY, data);
|
mncc_tx_to_cc(call->net, MNCC_LCHAN_MODIFY, data);
|
||||||
break;
|
break;
|
||||||
case MNCC_ALERT_IND:
|
case MNCC_ALERT_IND:
|
||||||
|
|
|
@ -224,7 +224,6 @@ static void queue_hello(struct mncc_sock_state *mncc)
|
||||||
hello->called_offset = offsetof(struct gsm_mncc, called);
|
hello->called_offset = offsetof(struct gsm_mncc, called);
|
||||||
hello->signal_offset = offsetof(struct gsm_mncc, signal);
|
hello->signal_offset = offsetof(struct gsm_mncc, signal);
|
||||||
hello->emergency_offset = offsetof(struct gsm_mncc, emergency);
|
hello->emergency_offset = offsetof(struct gsm_mncc, emergency);
|
||||||
hello->lchan_type_offset = offsetof(struct gsm_mncc, lchan_type);
|
|
||||||
|
|
||||||
msgb_enqueue(&mncc->net->upqueue, msg);
|
msgb_enqueue(&mncc->net->upqueue, msg);
|
||||||
mncc->conn_bfd.when |= BSC_FD_WRITE;
|
mncc->conn_bfd.when |= BSC_FD_WRITE;
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
/* Implementation for MSC decisions which interface to send messages out on. */
|
||||||
|
|
||||||
|
/* (C) 2016 by sysmocom s.m.f.c GmbH <info@sysmocom.de>
|
||||||
|
*
|
||||||
|
* All Rights Reserved
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <osmocom/core/logging.h>
|
||||||
|
|
||||||
|
#include <openbsc/debug.h>
|
||||||
|
#include <openbsc/gsm_data.h>
|
||||||
|
#include <openbsc/msc_ifaces.h>
|
||||||
|
|
||||||
|
static int msc_tx(struct gsm_subscriber_connection *conn, struct msgb *msg)
|
||||||
|
{
|
||||||
|
switch (conn->via_ran) {
|
||||||
|
/* FUTURE
|
||||||
|
case RAN_GERAN_A:
|
||||||
|
msg->dst = conn;
|
||||||
|
return a_tx(msg);
|
||||||
|
|
||||||
|
case RAN_UTRAN_IU:
|
||||||
|
msg->dst = conn->iu.ue_ctx;
|
||||||
|
return iu_tx(msg, 0);
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
LOGP(DMSC, LOGL_ERROR,
|
||||||
|
"msc_tx(): conn->via_ran invalid (%d)\n",
|
||||||
|
conn->via_ran);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int msc_tx_dtap(struct gsm_subscriber_connection *conn,
|
||||||
|
struct msgb *msg)
|
||||||
|
{
|
||||||
|
return msc_tx(conn, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 9.2.5 CM service accept */
|
||||||
|
int msc_gsm48_tx_mm_serv_ack(struct gsm_subscriber_connection *conn)
|
||||||
|
{
|
||||||
|
struct msgb *msg = gsm48_msgb_alloc_name("GSM 04.08 SERV ACC");
|
||||||
|
struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));
|
||||||
|
|
||||||
|
gh->proto_discr = GSM48_PDISC_MM;
|
||||||
|
gh->msg_type = GSM48_MT_MM_CM_SERV_ACC;
|
||||||
|
|
||||||
|
DEBUGP(DMM, "-> CM SERVICE ACCEPT\n");
|
||||||
|
|
||||||
|
return msc_tx_dtap(conn, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 9.2.6 CM service reject */
|
||||||
|
int msc_gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn,
|
||||||
|
enum gsm48_reject_value value)
|
||||||
|
{
|
||||||
|
struct msgb *msg;
|
||||||
|
|
||||||
|
msg = gsm48_create_mm_serv_rej(value);
|
||||||
|
if (!msg) {
|
||||||
|
LOGP(DMM, LOGL_ERROR, "Failed to allocate CM Service Reject.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUGP(DMM, "-> CM SERVICE Reject cause: %d\n", value);
|
||||||
|
|
||||||
|
return msc_tx_dtap(conn, msg);
|
||||||
|
}
|
|
@ -21,6 +21,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <openbsc/osmo_msc.h>
|
||||||
#include <openbsc/bsc_api.h>
|
#include <openbsc/bsc_api.h>
|
||||||
#include <openbsc/debug.h>
|
#include <openbsc/debug.h>
|
||||||
#include <openbsc/transaction.h>
|
#include <openbsc/transaction.h>
|
||||||
|
@ -69,9 +70,10 @@ static void subscr_conn_bump(struct gsm_subscriber_connection *conn)
|
||||||
osmo_fsm_inst_dispatch(conn->conn_fsm, SUBSCR_CONN_E_BUMP, NULL);
|
osmo_fsm_inst_dispatch(conn->conn_fsm, SUBSCR_CONN_E_BUMP, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Receive a COMPLETE LAYER3 INFO from BSC */
|
/* receive a Level 3 Complete message and return MSC_CONN_ACCEPT or
|
||||||
static int msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg,
|
* MSC_CONN_REJECT */
|
||||||
uint16_t chosen_channel)
|
static int msc_compl_l3(struct gsm_subscriber_connection *conn,
|
||||||
|
struct msgb *msg, uint16_t chosen_channel)
|
||||||
{
|
{
|
||||||
/* Ownership of the gsm_subscriber_connection is still a bit mucky
|
/* Ownership of the gsm_subscriber_connection is still a bit mucky
|
||||||
* between libbsc and libmsc. In libmsc, we use ref counting, but not
|
* between libbsc and libmsc. In libmsc, we use ref counting, but not
|
||||||
|
@ -87,7 +89,7 @@ static int msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg
|
||||||
/* keep the use_count reserved, libbsc will discard. If we
|
/* keep the use_count reserved, libbsc will discard. If we
|
||||||
* released the ref count and discarded here, libbsc would
|
* released the ref count and discarded here, libbsc would
|
||||||
* double-free. And we will not change bsc_api semantics. */
|
* double-free. And we will not change bsc_api semantics. */
|
||||||
return BSC_API_CONN_POL_REJECT;
|
return MSC_CONN_REJECT;
|
||||||
}
|
}
|
||||||
DEBUGP(DMM, "compl_l3: Keeping conn\n");
|
DEBUGP(DMM, "compl_l3: Keeping conn\n");
|
||||||
|
|
||||||
|
@ -96,7 +98,7 @@ static int msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg
|
||||||
|
|
||||||
/* If this should be kept, the conn->conn_fsm has placed a use_count */
|
/* If this should be kept, the conn->conn_fsm has placed a use_count */
|
||||||
msc_subscr_conn_put(conn);
|
msc_subscr_conn_put(conn);
|
||||||
return BSC_API_CONN_POL_ACCEPT;
|
return MSC_CONN_ACCEPT;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/*
|
/*
|
||||||
|
@ -105,14 +107,14 @@ static int msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg
|
||||||
* pending transaction or ongoing operation.
|
* pending transaction or ongoing operation.
|
||||||
*/
|
*/
|
||||||
if (conn->silent_call)
|
if (conn->silent_call)
|
||||||
return BSC_API_CONN_POL_ACCEPT;
|
return MSC_CONN_ACCEPT;
|
||||||
if (conn->sec_operation || conn->anch_operation)
|
if (conn->loc_operation || conn->sec_operation || conn->anch_operation)
|
||||||
return BSC_API_CONN_POL_ACCEPT;
|
return MSC_CONN_ACCEPT;
|
||||||
if (trans_has_conn(conn))
|
if (trans_has_conn(conn))
|
||||||
return BSC_API_CONN_POL_ACCEPT;
|
return MSC_CONN_ACCEPT;
|
||||||
|
|
||||||
LOGP(DRR, LOGL_INFO, "MSC Complete L3: Rejecting connection.\n");
|
LOGP(DRR, LOGL_INFO, "MSC Complete L3: Rejecting connection.\n");
|
||||||
return BSC_API_CONN_POL_REJECT;
|
return MSC_CONN_REJECT;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,8 +52,12 @@ static int paging_cb_silent(unsigned int hooknum, unsigned int event,
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case GSM_PAGING_SUCCEEDED:
|
case GSM_PAGING_SUCCEEDED:
|
||||||
|
#if BEFORE_MSCSPLIT
|
||||||
|
/* Re-enable this log output once we can obtain this information via
|
||||||
|
* A-interface, see OS#2391. */
|
||||||
DEBUGPC(DLSMS, "success, using Timeslot %u on ARFCN %u\n",
|
DEBUGPC(DLSMS, "success, using Timeslot %u on ARFCN %u\n",
|
||||||
conn->lchan->ts->nr, conn->lchan->ts->trx->arfcn);
|
conn->lchan->ts->nr, conn->lchan->ts->trx->arfcn);
|
||||||
|
#endif
|
||||||
conn->silent_call = 1;
|
conn->silent_call = 1;
|
||||||
msc_subscr_conn_get(conn);
|
msc_subscr_conn_get(conn);
|
||||||
/* increment lchan reference count */
|
/* increment lchan reference count */
|
||||||
|
@ -126,7 +130,10 @@ int gsm_silent_call_start(struct vlr_subscr *vsub, void *data, int type)
|
||||||
{
|
{
|
||||||
struct subscr_request *req;
|
struct subscr_request *req;
|
||||||
|
|
||||||
req = subscr_request_channel(vsub, type, paging_cb_silent, data);
|
/* FIXME the VTY command allows selecting a silent call channel type.
|
||||||
|
* This doesn't apply to the situation after MSCSPLIT with an
|
||||||
|
* A-interface. */
|
||||||
|
req = subscr_request_conn(vsub, type, paging_cb_silent, data);
|
||||||
return req != NULL;
|
return req != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,8 +150,12 @@ int gsm_silent_call_stop(struct vlr_subscr *vsub)
|
||||||
if (!conn->silent_call)
|
if (!conn->silent_call)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
#if BEFORE_MSCSPLIT
|
||||||
|
/* Re-enable this log output once we can obtain this information via
|
||||||
|
* A-interface, see OS#2391. */
|
||||||
DEBUGPC(DLSMS, "Stopping silent call using Timeslot %u on ARFCN %u\n",
|
DEBUGPC(DLSMS, "Stopping silent call using Timeslot %u on ARFCN %u\n",
|
||||||
conn->lchan->ts->nr, conn->lchan->ts->trx->arfcn);
|
conn->lchan->ts->nr, conn->lchan->ts->trx->arfcn);
|
||||||
|
#endif
|
||||||
|
|
||||||
conn->silent_call = 0;
|
conn->silent_call = 0;
|
||||||
msc_subscr_conn_put(conn);
|
msc_subscr_conn_put(conn);
|
||||||
|
|
|
@ -423,6 +423,8 @@ void append_tlv_u16(tlv_t **req_tlv, uint16_t tag, uint16_t val)
|
||||||
build_tlv(req_tlv, &tlv);
|
build_tlv(req_tlv, &tlv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BEFORE_MSCSPLIT
|
||||||
|
/* We currently have no lchan information. Re-add after A-interface, see OS#2390. */
|
||||||
/* Append the Osmocom vendor-specific additional TLVs to a SMPP msg */
|
/* Append the Osmocom vendor-specific additional TLVs to a SMPP msg */
|
||||||
static void append_osmo_tlvs(tlv_t **req_tlv, const struct gsm_lchan *lchan)
|
static void append_osmo_tlvs(tlv_t **req_tlv, const struct gsm_lchan *lchan)
|
||||||
{
|
{
|
||||||
|
@ -461,6 +463,7 @@ static void append_osmo_tlvs(tlv_t **req_tlv, const struct gsm_lchan *lchan)
|
||||||
(uint8_t *)vsub->imei, imei_len+1);
|
(uint8_t *)vsub->imei, imei_len+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint32_t smpp_status_code;
|
uint32_t smpp_status_code;
|
||||||
|
@ -680,8 +683,11 @@ static int deliver_to_esme(struct osmo_esme *esme, struct gsm_sms *sms,
|
||||||
memcpy(deliver.short_message, sms->user_data, deliver.sm_length);
|
memcpy(deliver.short_message, sms->user_data, deliver.sm_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BEFORE_MSCSPLIT
|
||||||
|
/* We currently have no lchan information. Re-add after A-interface, see OS#2390. */
|
||||||
if (esme->acl && esme->acl->osmocom_ext && conn->lchan)
|
if (esme->acl && esme->acl->osmocom_ext && conn->lchan)
|
||||||
append_osmo_tlvs(&deliver.tlv, conn->lchan);
|
append_osmo_tlvs(&deliver.tlv, conn->lchan);
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = smpp_tx_deliver(esme, &deliver);
|
ret = smpp_tx_deliver(esme, &deliver);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|
|
@ -553,57 +553,6 @@ DEFUN(ena_subscr_extension,
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN(ena_subscr_handover,
|
|
||||||
ena_subscr_handover_cmd,
|
|
||||||
"subscriber " SUBSCR_TYPES " ID handover BTS_NR",
|
|
||||||
SUBSCR_HELP "Handover the active connection\n"
|
|
||||||
"Number of the BTS to handover to\n")
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
struct gsm_subscriber_connection *conn;
|
|
||||||
struct gsm_bts *bts;
|
|
||||||
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
|
|
||||||
struct vlr_subscr *vsub =
|
|
||||||
get_vsub_by_argv(gsmnet, argv[0], argv[1]);
|
|
||||||
|
|
||||||
if (!vsub) {
|
|
||||||
vty_out(vty, "%% No subscriber found for %s %s.%s",
|
|
||||||
argv[0], argv[1], VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
conn = connection_for_subscr(vsub);
|
|
||||||
if (!conn) {
|
|
||||||
vty_out(vty, "%% No active connection for subscriber %s %s.%s",
|
|
||||||
argv[0], argv[1], VTY_NEWLINE);
|
|
||||||
vlr_subscr_put(vsub);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
bts = gsm_bts_num(gsmnet, atoi(argv[2]));
|
|
||||||
if (!bts) {
|
|
||||||
vty_out(vty, "%% BTS with number(%d) could not be found.%s",
|
|
||||||
atoi(argv[2]), VTY_NEWLINE);
|
|
||||||
vlr_subscr_put(vsub);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now start the handover */
|
|
||||||
ret = bsc_handover_start(conn->lchan, bts);
|
|
||||||
if (ret != 0) {
|
|
||||||
vty_out(vty, "%% Handover failed with errno %d.%s",
|
|
||||||
ret, VTY_NEWLINE);
|
|
||||||
} else {
|
|
||||||
vty_out(vty, "%% Handover started from %s",
|
|
||||||
gsm_lchan_name(conn->lchan));
|
|
||||||
vty_out(vty, " to %s.%s", gsm_lchan_name(conn->ho_lchan),
|
|
||||||
VTY_NEWLINE);
|
|
||||||
}
|
|
||||||
|
|
||||||
vlr_subscr_put(vsub);
|
|
||||||
return CMD_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
|
#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
|
||||||
#define A3A8_ALG_HELP \
|
#define A3A8_ALG_HELP \
|
||||||
"Use No A3A8 algorithm\n" \
|
"Use No A3A8 algorithm\n" \
|
||||||
|
@ -652,9 +601,7 @@ static int scall_cbfn(unsigned int subsys, unsigned int signal,
|
||||||
|
|
||||||
switch (signal) {
|
switch (signal) {
|
||||||
case S_SCALL_SUCCESS:
|
case S_SCALL_SUCCESS:
|
||||||
vty_out(vty, "%% silent call on ARFCN %u timeslot %u%s",
|
vty_out(vty, "%% silent call success%s", VTY_NEWLINE);
|
||||||
sigdata->conn->lchan->ts->trx->arfcn, sigdata->conn->lchan->ts->nr,
|
|
||||||
VTY_NEWLINE);
|
|
||||||
break;
|
break;
|
||||||
case S_SCALL_EXPIRED:
|
case S_SCALL_EXPIRED:
|
||||||
vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
|
vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
|
||||||
|
@ -670,7 +617,6 @@ DEFUN(show_stats,
|
||||||
{
|
{
|
||||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||||
|
|
||||||
openbsc_vty_print_statistics(vty, net);
|
|
||||||
vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
|
vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
|
||||||
net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
|
net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
|
||||||
net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
|
net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
|
||||||
|
@ -1055,7 +1001,6 @@ int bsc_vty_init_extra(void)
|
||||||
install_element(ENABLE_NODE, &ena_subscr_extension_cmd);
|
install_element(ENABLE_NODE, &ena_subscr_extension_cmd);
|
||||||
install_element(ENABLE_NODE, &ena_subscr_authorized_cmd);
|
install_element(ENABLE_NODE, &ena_subscr_authorized_cmd);
|
||||||
install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
|
install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
|
||||||
install_element(ENABLE_NODE, &ena_subscr_handover_cmd);
|
|
||||||
install_element(ENABLE_NODE, &subscriber_purge_cmd);
|
install_element(ENABLE_NODE, &subscriber_purge_cmd);
|
||||||
install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
|
install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
|
||||||
install_element(ENABLE_NODE, &smsqueue_max_cmd);
|
install_element(ENABLE_NODE, &smsqueue_max_cmd);
|
||||||
|
|
|
@ -32,7 +32,6 @@ bsc_test_SOURCES = \
|
||||||
|
|
||||||
bsc_test_LDADD = \
|
bsc_test_LDADD = \
|
||||||
$(top_builddir)/src/libbsc/libbsc.a \
|
$(top_builddir)/src/libbsc/libbsc.a \
|
||||||
$(top_builddir)/src/libmsc/libmsc.a \
|
|
||||||
$(top_builddir)/src/libcommon-cs/libcommon-cs.a \
|
$(top_builddir)/src/libcommon-cs/libcommon-cs.a \
|
||||||
$(top_builddir)/src/libmgcp/libmgcp.a \
|
$(top_builddir)/src/libmgcp/libmgcp.a \
|
||||||
$(top_builddir)/src/libtrau/libtrau.a \
|
$(top_builddir)/src/libtrau/libtrau.a \
|
||||||
|
|
|
@ -24,7 +24,6 @@ channel_test_SOURCES = \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
channel_test_LDADD = \
|
channel_test_LDADD = \
|
||||||
$(top_builddir)/src/libmsc/libmsc.a \
|
|
||||||
$(top_builddir)/src/libbsc/libbsc.a \
|
$(top_builddir)/src/libbsc/libbsc.a \
|
||||||
$(top_builddir)/src/libvlr/libvlr.a \
|
$(top_builddir)/src/libvlr/libvlr.a \
|
||||||
$(top_builddir)/src/libcommon-cs/libcommon-cs.a \
|
$(top_builddir)/src/libcommon-cs/libcommon-cs.a \
|
||||||
|
|
|
@ -32,9 +32,7 @@ db_test_SOURCES = \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
db_test_LDADD = \
|
db_test_LDADD = \
|
||||||
$(top_builddir)/src/libbsc/libbsc.a \
|
|
||||||
$(top_builddir)/src/libmsc/libmsc.a \
|
$(top_builddir)/src/libmsc/libmsc.a \
|
||||||
$(top_builddir)/src/libbsc/libbsc.a \
|
|
||||||
$(top_builddir)/src/libcommon-cs/libcommon-cs.a \
|
$(top_builddir)/src/libcommon-cs/libcommon-cs.a \
|
||||||
$(top_builddir)/src/libtrau/libtrau.a \
|
$(top_builddir)/src/libtrau/libtrau.a \
|
||||||
$(top_builddir)/src/libcommon/libcommon.a \
|
$(top_builddir)/src/libcommon/libcommon.a \
|
||||||
|
|
|
@ -182,7 +182,7 @@ static inline void test_si2q_mu(void)
|
||||||
static inline void test_si2q_u(void)
|
static inline void test_si2q_u(void)
|
||||||
{
|
{
|
||||||
struct gsm_bts *bts;
|
struct gsm_bts *bts;
|
||||||
struct gsm_network *network = bsc_network_init(tall_bsc_ctx, 1, 1, NULL);
|
struct gsm_network *network = bsc_network_init(NULL, 1, 1, NULL);
|
||||||
printf("Testing SYSINFO_TYPE_2quater UARFCN generation:\n");
|
printf("Testing SYSINFO_TYPE_2quater UARFCN generation:\n");
|
||||||
|
|
||||||
if (!network)
|
if (!network)
|
||||||
|
@ -210,7 +210,7 @@ static inline void test_si2q_u(void)
|
||||||
static inline void test_si2q_e(void)
|
static inline void test_si2q_e(void)
|
||||||
{
|
{
|
||||||
struct gsm_bts *bts;
|
struct gsm_bts *bts;
|
||||||
struct gsm_network *network = bsc_network_init(tall_bsc_ctx, 1, 1, NULL);
|
struct gsm_network *network = bsc_network_init(NULL, 1, 1, NULL);
|
||||||
printf("Testing SYSINFO_TYPE_2quater EARFCN generation:\n");
|
printf("Testing SYSINFO_TYPE_2quater EARFCN generation:\n");
|
||||||
|
|
||||||
if (!network)
|
if (!network)
|
||||||
|
|
|
@ -60,8 +60,8 @@ COMMON_LDFLAGS = \
|
||||||
-Wl,--wrap=gsup_client_create \
|
-Wl,--wrap=gsup_client_create \
|
||||||
-Wl,--wrap=gsup_client_send \
|
-Wl,--wrap=gsup_client_send \
|
||||||
-Wl,--wrap=gsm0808_submit_dtap \
|
-Wl,--wrap=gsm0808_submit_dtap \
|
||||||
-Wl,--wrap=paging_request \
|
-Wl,--wrap=msc_fake_paging_request \
|
||||||
-Wl,--wrap=paging_request_stop \
|
-Wl,--wrap=msc_fake_paging_request_stop \
|
||||||
-Wl,--wrap=gsm340_gen_scts \
|
-Wl,--wrap=gsm340_gen_scts \
|
||||||
-Wl,--wrap=RAND_bytes \
|
-Wl,--wrap=RAND_bytes \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
|
@ -270,9 +270,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -351,7 +350,6 @@ DVLR Process_Access_Request_VLR(901700000004620){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 3
|
DREF MSISDN:46071: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
@ -734,9 +732,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
paging_expecting_tmsi == 0x03020100
|
paging_expecting_tmsi == 0x03020100
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -815,7 +812,6 @@ DVLR Process_Access_Request_VLR(50462976){PR_ARQ_S_DONE}: Process Access Request
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 3
|
DREF MSISDN:46071: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
@ -1762,9 +1758,8 @@ DREF VLR subscr MSISDN:42342 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 3
|
DREF VLR subscr MSISDN:42342 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:42342 not paged yet.
|
DMM Subscriber MSISDN:42342 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000010650 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:42342
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000010650 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 4
|
DREF VLR subscr MSISDN:42342 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:42342 usage decreases to: 3
|
DREF VLR subscr MSISDN:42342 usage decreases to: 3
|
||||||
|
@ -1843,7 +1838,6 @@ DVLR Process_Access_Request_VLR(901700000010650){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000010650 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 5
|
DREF VLR subscr MSISDN:42342 usage increases to: 5
|
||||||
DREF MSISDN:42342: MSC conn use + 1 == 3
|
DREF MSISDN:42342: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005802443f2000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005802443f2000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
|
|
@ -287,9 +287,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -387,7 +386,6 @@ DVLR Process_Access_Request_VLR(901700000004620){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 2
|
DREF MSISDN:46071: MSC conn use + 1 == 2
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
@ -786,9 +784,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
paging_expecting_tmsi == 0x03020100
|
paging_expecting_tmsi == 0x03020100
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -886,7 +883,6 @@ DVLR Process_Access_Request_VLR(50462976){PR_ARQ_S_DONE}: Process Access Request
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
DREF VLR subscr MSISDN:46071 usage increases to: 5
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 2
|
DREF MSISDN:46071: MSC conn use + 1 == 2
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
|
|
@ -186,9 +186,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -227,7 +226,6 @@ DVLR Process_Access_Request_VLR(901700000004620){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 3
|
DREF MSISDN:46071: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
@ -528,9 +526,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
paging_expecting_tmsi == 0x03020100
|
paging_expecting_tmsi == 0x03020100
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -569,7 +566,6 @@ DVLR Process_Access_Request_VLR(50462976){PR_ARQ_S_DONE}: Process Access Request
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(50462976){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 3
|
DREF MSISDN:46071: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
|
|
@ -1188,9 +1188,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -1225,7 +1224,6 @@ DVLR Process_Access_Request_VLR(901700000004620){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 3
|
DREF MSISDN:46071: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
@ -1403,9 +1401,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -1440,7 +1437,6 @@ DVLR Process_Access_Request_VLR(901700000004620){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 3
|
DREF MSISDN:46071: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
@ -1635,9 +1631,8 @@ DREF VLR subscr MSISDN:46071 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
DREF VLR subscr MSISDN:46071 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:46071 not paged yet.
|
DMM Subscriber MSISDN:46071 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000004620 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:46071
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
DREF VLR subscr MSISDN:46071 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
DREF VLR subscr MSISDN:46071 usage decreases to: 3
|
||||||
|
@ -1672,7 +1667,6 @@ DVLR Process_Access_Request_VLR(901700000004620){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000004620 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
DREF VLR subscr MSISDN:46071 usage increases to: 6
|
||||||
DREF MSISDN:46071: MSC conn use + 1 == 3
|
DREF MSISDN:46071: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005806470f1000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
|
|
@ -253,9 +253,8 @@ DREF VLR subscr MSISDN:42342 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 3
|
DREF VLR subscr MSISDN:42342 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:42342 not paged yet.
|
DMM Subscriber MSISDN:42342 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000010650 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:42342
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000010650 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 4
|
DREF VLR subscr MSISDN:42342 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:42342 usage decreases to: 3
|
DREF VLR subscr MSISDN:42342 usage decreases to: 3
|
||||||
|
@ -335,7 +334,6 @@ DVLR Process_Access_Request_VLR(901700000010650){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000010650 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 5
|
DREF VLR subscr MSISDN:42342 usage increases to: 5
|
||||||
DREF MSISDN:42342: MSC conn use + 1 == 3
|
DREF MSISDN:42342: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005802443f2000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005802443f2000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
@ -665,9 +663,8 @@ DREF VLR subscr MSISDN:42342 usage increases to: 2
|
||||||
llist_count(&vsub->cs.requests) == 0
|
llist_count(&vsub->cs.requests) == 0
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 3
|
DREF VLR subscr MSISDN:42342 usage increases to: 3
|
||||||
DMM Subscriber MSISDN:42342 not paged yet.
|
DMM Subscriber MSISDN:42342 not paged yet.
|
||||||
BTS/BSC sends out paging request to IMSI:901700000010650 for channel type 1
|
BTS/BSC sends out paging request to MSISDN:42342
|
||||||
strcmp(paging_expecting_imsi, sub->imsi) == 0
|
strcmp(paging_expecting_imsi, vsub->imsi) == 0
|
||||||
DREF BSC subscr IMSI:901700000010650 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 4
|
DREF VLR subscr MSISDN:42342 usage increases to: 4
|
||||||
llist_count(&vsub->cs.requests) == 1
|
llist_count(&vsub->cs.requests) == 1
|
||||||
DREF VLR subscr MSISDN:42342 usage decreases to: 3
|
DREF VLR subscr MSISDN:42342 usage decreases to: 3
|
||||||
|
@ -747,7 +744,6 @@ DVLR Process_Access_Request_VLR(901700000010650){PR_ARQ_S_DONE}: Process Access
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: SUBSCR_CONN_FROM_PAGING_RESP
|
||||||
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
DVLR Subscr_Conn(901700000010650){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED
|
||||||
DREF BSC subscr IMSI:901700000010650 usage decreases to: 0
|
|
||||||
DREF VLR subscr MSISDN:42342 usage increases to: 5
|
DREF VLR subscr MSISDN:42342 usage increases to: 5
|
||||||
DREF MSISDN:42342: MSC conn use + 1 == 3
|
DREF MSISDN:42342: MSC conn use + 1 == 3
|
||||||
- DTAP --> MS: 09015801000791447758100650004c0005802443f2000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
- DTAP --> MS: 09015801000791447758100650004c0005802443f2000007101000000000445079da1e1ee7416937485e9ea7c965373d1d6683c270383b3d0ed3d36ff71c949e83c22072799e9687c5ec32a81d96afcbf4b4fb0c7ac3e9e9b7db05
|
||||||
|
|
|
@ -252,33 +252,25 @@ void paging_expect_tmsi(uint32_t tmsi)
|
||||||
paging_expecting_imsi = NULL;
|
paging_expecting_imsi = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* override, requires '-Wl,--wrap=paging_request' */
|
/* override, requires '-Wl,--wrap=msc_fake_paging_request' */
|
||||||
int __real_paging_request(struct gsm_network *network, struct bsc_subscr *sub,
|
int __real_msc_fake_paging_request(struct vlr_subscr *vsub);
|
||||||
int type, gsm_cbfn *cbfn, void *data);
|
int __wrap_msc_fake_paging_request(struct vlr_subscr *vsub)
|
||||||
int __wrap_paging_request(struct gsm_network *network, struct bsc_subscr *sub,
|
|
||||||
int type, gsm_cbfn *cbfn, void *data)
|
|
||||||
{
|
{
|
||||||
log("BTS/BSC sends out paging request to %s for channel type %d",
|
log("BTS/BSC sends out paging request to %s",
|
||||||
bsc_subscr_name(sub), type);
|
vlr_subscr_name(vsub));
|
||||||
OSMO_ASSERT(paging_expecting_imsi || (paging_expecting_tmsi != GSM_RESERVED_TMSI));
|
OSMO_ASSERT(paging_expecting_imsi || (paging_expecting_tmsi != GSM_RESERVED_TMSI));
|
||||||
if (paging_expecting_imsi)
|
if (paging_expecting_imsi)
|
||||||
VERBOSE_ASSERT(strcmp(paging_expecting_imsi, sub->imsi), == 0, "%d");
|
VERBOSE_ASSERT(strcmp(paging_expecting_imsi, vsub->imsi), == 0, "%d");
|
||||||
if (paging_expecting_tmsi != GSM_RESERVED_TMSI)
|
if (paging_expecting_tmsi != GSM_RESERVED_TMSI)
|
||||||
VERBOSE_ASSERT(paging_expecting_tmsi, == sub->tmsi, "0x%08x");
|
VERBOSE_ASSERT(paging_expecting_tmsi, == vsub->tmsi, "0x%08x");
|
||||||
paging_sent = true;
|
paging_sent = true;
|
||||||
paging_stopped = false;
|
paging_stopped = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* override, requires '-Wl,--wrap=paging_request_stop' */
|
/* override, requires '-Wl,--wrap=msc_fake_paging_request_stop' */
|
||||||
void __real_paging_request_stop(struct gsm_bts *_bts,
|
void __real_msc_fake_paging_request_stop(struct vlr_subscr *vsub);
|
||||||
struct vlr_subscr *vsub,
|
void __wrap_msc_fake_paging_request_stop(struct vlr_subscr *vsub)
|
||||||
struct gsm_subscriber_connection *conn,
|
|
||||||
struct msgb *msg);
|
|
||||||
void __wrap_paging_request_stop(struct gsm_bts *_bts,
|
|
||||||
struct vlr_subscr *vsub,
|
|
||||||
struct gsm_subscriber_connection *conn,
|
|
||||||
struct msgb *msg)
|
|
||||||
{
|
{
|
||||||
paging_stopped = true;
|
paging_stopped = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue