Proposal for a "channel request" interface...
Reuqests for a subscriber a stored within the gsm_subscriber datastructure and it will keep track how many channels are allocated for this user and of which type to decide on policy... e.g. attempt to submit SMS during a phone call and not doing paging but a simple (immediate) assignment of the channel...
This commit is contained in:
parent
fdac4cc176
commit
04866d4279
|
@ -31,6 +31,9 @@ struct gsm_subscriber {
|
|||
u_int8_t classmark2[3];
|
||||
u_int8_t classmark3_len;
|
||||
u_int8_t classmark3[14];
|
||||
|
||||
/* pending requests */
|
||||
struct llist_head requests;
|
||||
};
|
||||
|
||||
enum gsm_subscriber_field {
|
||||
|
@ -51,6 +54,9 @@ struct gsm_subscriber *subscr_get_by_imsi(const char *imsi);
|
|||
struct gsm_subscriber *subscr_get_by_extension(const char *ext);
|
||||
int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
|
||||
void subscr_put_channel(struct gsm_lchan *lchan);
|
||||
void subscr_get_channel(struct gsm_subscriber *subscr,
|
||||
struct gsm_network *network, int type,
|
||||
gsm_cbfn *cbfn, void *param);
|
||||
|
||||
/* internal */
|
||||
struct gsm_subscriber *subscr_alloc(void);
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
void paging_init(struct gsm_bts *bts);
|
||||
|
||||
/* schedule paging request */
|
||||
void paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
|
||||
void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
|
||||
int type, gsm_cbfn *cbfn, void *data);
|
||||
|
||||
/* stop paging requests */
|
||||
|
|
|
@ -1333,7 +1333,7 @@ static int gsm48_cc_rx_setup(struct msgb *msg)
|
|||
call->called_subscr = called_subscr;
|
||||
|
||||
/* Start paging subscriber on all BTS in LAC of subscriber */
|
||||
paging_request(msg->trx->bts, called_subscr, RSL_CHANNEED_TCH_F,
|
||||
subscr_get_channel(called_subscr, msg->trx->bts->network, RSL_CHANNEED_TCH_F,
|
||||
setup_trig_pag_evt, call);
|
||||
|
||||
/* send a CALL PROCEEDING message to the MO */
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <string.h>
|
||||
|
||||
#include <openbsc/gsm_subscriber.h>
|
||||
#include <openbsc/paging.h>
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/db.h>
|
||||
|
||||
|
@ -45,6 +46,8 @@ struct gsm_subscriber *subscr_alloc(void)
|
|||
llist_add_tail(&s->entry, &active_subscribers);
|
||||
s->use_count = 1;
|
||||
|
||||
INIT_LLIST_HEAD(&s->requests);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -131,6 +134,13 @@ struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void subscr_get_channel(struct gsm_subscriber *subscr,
|
||||
struct gsm_network *network, int type,
|
||||
gsm_cbfn *cbfn, void *param)
|
||||
{
|
||||
paging_request(network, subscr, type, cbfn, param);
|
||||
}
|
||||
|
||||
void subscr_put_channel(struct gsm_lchan *lchan)
|
||||
{
|
||||
/*
|
||||
|
@ -141,3 +151,4 @@ void subscr_put_channel(struct gsm_lchan *lchan)
|
|||
*/
|
||||
put_lchan(lchan);
|
||||
}
|
||||
|
||||
|
|
|
@ -237,13 +237,13 @@ static void _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
|
|||
bsc_schedule_timer(&bts_entry->work_timer, 1, 0);
|
||||
}
|
||||
|
||||
void paging_request(struct gsm_bts *_bts, struct gsm_subscriber *subscr,
|
||||
void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
|
||||
int type, gsm_cbfn *cbfn, void *data)
|
||||
{
|
||||
struct gsm_bts *bts = NULL;
|
||||
|
||||
do {
|
||||
bts = gsm_bts_by_lac(_bts->network, subscr->lac, bts);
|
||||
bts = gsm_bts_by_lac(network, subscr->lac, bts);
|
||||
if (!bts)
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue