pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/32982 )
Change subject: llc: Implement GMMR-PAGE.ind ......................................................................
llc: Implement GMMR-PAGE.ind
Submit an LLGM-TRIGGER.req as described in TS 24.007 C.13.
Change-Id: Iba77b4a5280ce08f099f4e15934fa92d4ba8ba10 --- M include/osmocom/gprs/llc/llc_prim.h M src/gmm/gmm_prim.c 2 files changed, 39 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/82/32982/1
diff --git a/include/osmocom/gprs/llc/llc_prim.h b/include/osmocom/gprs/llc/llc_prim.h index 904e9fa..2542563 100644 --- a/include/osmocom/gprs/llc/llc_prim.h +++ b/include/osmocom/gprs/llc/llc_prim.h @@ -88,6 +88,11 @@ return get_value_string(osmo_gprs_llc_bssgp_prim_type_names, val); }
+/* TS 04.64 Section 7.2.1.3 LLGMM-TRIGGER */ +enum osmo_gprs_llc_llgm_trigger_type { + OSMO_GPRS_LLC_LLGM_TRIGGER_CELL_UPDATE, + OSMO_GPRS_LLC_LLGM_TRIGGER_PAGE_RESP, +};
/* Parameters for OSMO_GPRS_LLC_LLGMM_* prims */ struct osmo_gprs_llc_llgmm_prim { @@ -104,7 +109,7 @@ } assign_req; /* OSMO_GPRS_LLC_LLGMM_TRIGGER | Req */ struct { - uint8_t cause; + uint8_t cause; /* enum osmo_gprs_llc_llgm_trigger_type */ } trigger_req; /* OSMO_GPRS_LLC_LLGMM_SUSPEND | Req */ struct { diff --git a/src/gmm/gmm_prim.c b/src/gmm/gmm_prim.c index 34c9fe9..4b4b6e9 100644 --- a/src/gmm/gmm_prim.c +++ b/src/gmm/gmm_prim.c @@ -603,6 +603,27 @@ return rc; }
+static int gprs_gmm_prim_handle_gmmrr_page_ind(struct osmo_gprs_gmm_prim *gmm_prim) +{ + struct osmo_gprs_llc_prim *llc_prim_tx; + int rc; + struct gprs_gmm_entity *gmme; + + if (!(gmme = gprs_gmm_find_gmme_by_tlli(gmm_prim->gmmrr.tlli))) { + LOGGMM(LOGL_NOTICE, "Rx %s: Unknown TLLI 0x%08x\n", + osmo_gprs_gmm_prim_name(gmm_prim), gmm_prim->gmmrr.tlli); + return -ENOENT; + } + + /* TS 24.007 C.13: restart READY timer, submit LLGM-TRIGGER.req */ + gprs_gmm_gmme_ready_timer_start(gmme); + + llc_prim_tx = osmo_gprs_llc_prim_alloc_llgm_trigger_req(gmme->tlli, OSMO_GPRS_LLC_LLGM_TRIGGER_PAGE_RESP); + + rc = gprs_gmm_prim_call_llc_down_cb(llc_prim_tx); + return rc; +} + static int gprs_gmm_prim_handle_gmmrr_llc_transmitted_ind(struct osmo_gprs_gmm_prim *gmm_prim) { struct gprs_gmm_entity *gmme = gprs_gmm_find_gmme_by_tlli(gmm_prim->gmmrr.tlli); @@ -620,8 +641,7 @@ int rc = 0; switch (OSMO_PRIM_HDR(&gmm_prim->oph)) { case OSMO_PRIM(OSMO_GPRS_GMM_GMMRR_PAGE, PRIM_OP_INDICATION): - rc = gprs_gmm_prim_handle_unsupported(gmm_prim); - rc = 1; + rc = gprs_gmm_prim_handle_gmmrr_page_ind(gmm_prim); break; case OSMO_PRIM(OSMO_GPRS_GMM_GMMRR_LLC_TRANSMITTED, PRIM_OP_INDICATION): rc = gprs_gmm_prim_handle_gmmrr_llc_transmitted_ind(gmm_prim);