agch/pch: Use PCH for AGCH msgs
This patch extends paging_gen_msg() by adding an output parameter is_empty that is true, if only a paging message with dummy entries has been placed into buffer. This feature is then used by bts_ccch_copy_msg() to insert an AGCH message if is_empty is true. Ticket: SYS#224 Sponsored-by: On-Waves ehf
This commit is contained in:
parent
2d725e77f7
commit
7503540959
|
@ -40,7 +40,8 @@ int paging_add_imm_ass(struct paging_state *ps, const uint8_t *data,
|
||||||
uint8_t len);
|
uint8_t len);
|
||||||
|
|
||||||
/* generate paging message for given gsm time */
|
/* generate paging message for given gsm time */
|
||||||
int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *gt);
|
int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *gt,
|
||||||
|
int *is_empty);
|
||||||
|
|
||||||
|
|
||||||
/* inspection methods below */
|
/* inspection methods below */
|
||||||
|
|
|
@ -326,8 +326,13 @@ int bts_ccch_copy_msg(struct gsm_bts *bts, uint8_t *out_buf, struct gsm_time *gt
|
||||||
struct gsm_bts_role_bts *btsb = bts->role;
|
struct gsm_bts_role_bts *btsb = bts->role;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (!is_ag_res)
|
if (!is_ag_res) {
|
||||||
return paging_gen_msg(btsb->paging_state, out_buf, gt);
|
int is_empty = 1;
|
||||||
|
rc = paging_gen_msg(btsb->paging_state, out_buf, gt, &is_empty);
|
||||||
|
|
||||||
|
if (!is_empty)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/* special queue of messages from IMM ASS CMD */
|
/* special queue of messages from IMM ASS CMD */
|
||||||
msg = bts_agch_dequeue(bts);
|
msg = bts_agch_dequeue(bts);
|
||||||
|
@ -337,7 +342,11 @@ int bts_ccch_copy_msg(struct gsm_bts *bts, uint8_t *out_buf, struct gsm_time *gt
|
||||||
memcpy(out_buf, msgb_l3(msg), msgb_l3len(msg));
|
memcpy(out_buf, msgb_l3(msg), msgb_l3len(msg));
|
||||||
rc = msgb_l3len(msg);
|
rc = msgb_l3len(msg);
|
||||||
msgb_free(msg);
|
msgb_free(msg);
|
||||||
|
|
||||||
|
if (is_ag_res)
|
||||||
btsb->agch_queue_agch_msgs++;
|
btsb->agch_queue_agch_msgs++;
|
||||||
|
else
|
||||||
|
btsb->agch_queue_pch_msgs++;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -377,12 +377,14 @@ static void sort_pr_tmsi_imsi(struct paging_record *pr[], unsigned int n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate paging message for given gsm time */
|
/* generate paging message for given gsm time */
|
||||||
int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *gt)
|
int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *gt,
|
||||||
|
int *is_empty)
|
||||||
{
|
{
|
||||||
struct llist_head *group_q;
|
struct llist_head *group_q;
|
||||||
int group;
|
int group;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
*is_empty = 0;
|
||||||
ps->btsb->load.ccch.pch_total += 1;
|
ps->btsb->load.ccch.pch_total += 1;
|
||||||
|
|
||||||
group = get_pag_subch_nr(ps, gt);
|
group = get_pag_subch_nr(ps, gt);
|
||||||
|
@ -400,6 +402,7 @@ int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *g
|
||||||
//DEBUGP(DPAG, "Tx PAGING TYPE 1 (empty)\n");
|
//DEBUGP(DPAG, "Tx PAGING TYPE 1 (empty)\n");
|
||||||
len = fill_paging_type_1(out_buf, empty_id_lv, 0,
|
len = fill_paging_type_1(out_buf, empty_id_lv, 0,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
|
*is_empty = 1;
|
||||||
} else {
|
} else {
|
||||||
struct paging_record *pr[4];
|
struct paging_record *pr[4];
|
||||||
unsigned int num_pr = 0, imm_ass = 0;
|
unsigned int num_pr = 0, imm_ass = 0;
|
||||||
|
|
|
@ -19,5 +19,5 @@ T BCCH slots
|
||||||
50 28 14 28 28 28
|
50 28 14 28 28 28
|
||||||
Testing AGCH messages queue handling.
|
Testing AGCH messages queue handling.
|
||||||
AGCH filled: count 720, imm.ass 80, imm.ass.rej 640 (refs 640), queue limit 32, occupied 720, dropped 0, merged 0, rejected 0, ag-res 0, non-res 0
|
AGCH filled: count 720, imm.ass 80, imm.ass.rej 640 (refs 640), queue limit 32, occupied 720, dropped 0, merged 0, rejected 0, ag-res 0, non-res 0
|
||||||
AGCH drained: multiframes 721, imm.ass 80, imm.ass.rej 640 (refs 640), queue limit 32, occupied 0, dropped 0, merged 0, rejected 0, ag-res 720, non-res 0
|
AGCH drained: multiframes 241, imm.ass 80, imm.ass.rej 641 (refs 641), queue limit 32, occupied 0, dropped 0, merged 0, rejected 0, ag-res 240, non-res 480
|
||||||
Success
|
Success
|
||||||
|
|
|
@ -47,6 +47,7 @@ static void test_paging_smoke(void)
|
||||||
int rc;
|
int rc;
|
||||||
uint8_t out_buf[GSM_MACBLOCK_LEN];
|
uint8_t out_buf[GSM_MACBLOCK_LEN];
|
||||||
struct gsm_time g_time;
|
struct gsm_time g_time;
|
||||||
|
int is_empty = -1;
|
||||||
printf("Testing that paging messages expire.\n");
|
printf("Testing that paging messages expire.\n");
|
||||||
|
|
||||||
/* add paging entry */
|
/* add paging entry */
|
||||||
|
@ -59,12 +60,22 @@ static void test_paging_smoke(void)
|
||||||
g_time.t1 = 0;
|
g_time.t1 = 0;
|
||||||
g_time.t2 = 0;
|
g_time.t2 = 0;
|
||||||
g_time.t3 = 6;
|
g_time.t3 = 6;
|
||||||
rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time);
|
rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time, &is_empty);
|
||||||
ASSERT_TRUE(rc == 13);
|
ASSERT_TRUE(rc == 13);
|
||||||
|
ASSERT_TRUE(is_empty == 0);
|
||||||
|
|
||||||
ASSERT_TRUE(paging_group_queue_empty(btsb->paging_state, 0));
|
ASSERT_TRUE(paging_group_queue_empty(btsb->paging_state, 0));
|
||||||
ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 0);
|
ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 0);
|
||||||
|
|
||||||
|
/* now test the empty queue */
|
||||||
|
g_time.fn = 0;
|
||||||
|
g_time.t1 = 0;
|
||||||
|
g_time.t2 = 0;
|
||||||
|
g_time.t3 = 6;
|
||||||
|
rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time, &is_empty);
|
||||||
|
ASSERT_TRUE(rc == 6);
|
||||||
|
ASSERT_TRUE(is_empty == 1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: test all the cases of different amount tmsi/imsi and check
|
* TODO: test all the cases of different amount tmsi/imsi and check
|
||||||
* if we fill the slots in a optimal way.
|
* if we fill the slots in a optimal way.
|
||||||
|
@ -76,6 +87,7 @@ static void test_paging_sleep(void)
|
||||||
int rc;
|
int rc;
|
||||||
uint8_t out_buf[GSM_MACBLOCK_LEN];
|
uint8_t out_buf[GSM_MACBLOCK_LEN];
|
||||||
struct gsm_time g_time;
|
struct gsm_time g_time;
|
||||||
|
int is_empty = -1;
|
||||||
printf("Testing that paging messages expire with sleep.\n");
|
printf("Testing that paging messages expire with sleep.\n");
|
||||||
|
|
||||||
/* add paging entry */
|
/* add paging entry */
|
||||||
|
@ -91,8 +103,9 @@ static void test_paging_sleep(void)
|
||||||
g_time.t1 = 0;
|
g_time.t1 = 0;
|
||||||
g_time.t2 = 0;
|
g_time.t2 = 0;
|
||||||
g_time.t3 = 6;
|
g_time.t3 = 6;
|
||||||
rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time);
|
rc = paging_gen_msg(btsb->paging_state, out_buf, &g_time, &is_empty);
|
||||||
ASSERT_TRUE(rc == 13);
|
ASSERT_TRUE(rc == 13);
|
||||||
|
ASSERT_TRUE(is_empty == 0);
|
||||||
|
|
||||||
ASSERT_TRUE(paging_group_queue_empty(btsb->paging_state, 0));
|
ASSERT_TRUE(paging_group_queue_empty(btsb->paging_state, 0));
|
||||||
ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 0);
|
ASSERT_TRUE(paging_queue_length(btsb->paging_state) == 0);
|
||||||
|
|
Loading…
Reference in New Issue