pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmocom-bb/+/32022 )
Change subject: layer23: modem: Test GMM layer through VTY ......................................................................
layer23: modem: Test GMM layer through VTY
Recent work on libosmo-gprs-gmm already allows triggering GPRS Attach procedure. Let's add some code to use it so we can already test the entire stack GMM->LLC->RLCMAC (SM layer still missing).
Depends: libosmo-gprs.git Change-Id I212053b3a3f27ef7d63503c3d5ef08453b2d2056 Related: OS#5501 Change-Id: Iba0663075468670a29aceafe5196cae3cab050eb --- M src/host/layer23/src/modem/gmm.c M src/host/layer23/src/modem/llc.c M src/host/layer23/src/modem/vty.c 3 files changed, 63 insertions(+), 10 deletions(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, approved
diff --git a/src/host/layer23/src/modem/gmm.c b/src/host/layer23/src/modem/gmm.c index 3488162..f88226e 100644 --- a/src/host/layer23/src/modem/gmm.c +++ b/src/host/layer23/src/modem/gmm.c @@ -82,6 +82,17 @@ return rc; }
+static int modem_gmm_prim_llc_down_cb(struct osmo_gprs_llc_prim *llc_prim, void *user_data) +{ + int rc; + + rc = osmo_gprs_llc_prim_upper_down(llc_prim); + + /* LLC took ownership of the message, tell GMM layer to not free it: */ + rc = 1; + return rc; +} + int modem_gmm_init(struct osmocom_ms *ms) { int rc; @@ -93,5 +104,8 @@
osmo_gprs_gmm_prim_set_up_cb(modem_gmm_prim_up_cb, ms); osmo_gprs_gmm_prim_set_down_cb(modem_gmm_prim_down_cb, ms); + osmo_gprs_gmm_prim_set_llc_down_cb(modem_gmm_prim_llc_down_cb, ms); + + osmo_gprs_gmm_enable_gprs(true); return rc; } diff --git a/src/host/layer23/src/modem/llc.c b/src/host/layer23/src/modem/llc.c index 8d9d5bd..5352e0f 100644 --- a/src/host/layer23/src/modem/llc.c +++ b/src/host/layer23/src/modem/llc.c @@ -32,6 +32,7 @@ #include <osmocom/gprs/gprs_msgb.h> #include <osmocom/gprs/llc/llc_prim.h> #include <osmocom/gprs/llc/llc.h> +#include <osmocom/gprs/gmm/gmm_prim.h> #include <osmocom/gprs/rlcmac/rlcmac_prim.h> #include <osmocom/gprs/sndcp/sndcp_prim.h>
@@ -41,7 +42,7 @@
static int modem_llc_handle_ll_gmm(struct osmo_gprs_llc_prim *llc_prim) { - struct msgb *msg; + int rc;
switch (llc_prim->oph.primitive) { case OSMO_GPRS_LLC_LL_UNITDATA: @@ -57,15 +58,10 @@ return -EINVAL; }
- msg = msgb_alloc(4096, "gsm0408_rx"); - msgb_tlli(msg) = llc_prim->ll.tlli; - msgb_gmmh(msg) = msgb_put(msg, llc_prim->ll.l3_pdu_len); - if (llc_prim->ll.l3_pdu_len > 0) - memcpy(msgb_gmmh(msg), llc_prim->ll.l3_pdu, llc_prim->ll.l3_pdu_len); - - //TODO: submit to GMM? - //TODO: free msg? - return 0; + /* GMM took ownership of the message, tell LLC layer to not free it: */ + rc = osmo_gprs_gmm_prim_llc_lower_up(llc_prim); + rc = 1; + return rc; }
static int modem_llc_handle_ll_sndcp(struct osmo_gprs_llc_prim *llc_prim) diff --git a/src/host/layer23/src/modem/vty.c b/src/host/layer23/src/modem/vty.c index 4fa8e1d..0d13c93 100644 --- a/src/host/layer23/src/modem/vty.c +++ b/src/host/layer23/src/modem/vty.c @@ -25,6 +25,7 @@
#include <osmocom/gprs/llc/llc.h> #include <osmocom/gprs/llc/llc_prim.h> +#include <osmocom/gprs/gmm/gmm_prim.h>
#include <osmocom/vty/vty.h> #include <osmocom/vty/command.h> @@ -60,6 +61,7 @@ #define TEST_CMD_DESC "Testing commands for developers\n" #define GRR_CMDG_DESC "GPRS RR specific commands\n" #define LLC_CMDG_DESC "GPRS LLC specific commands\n" +#define GMM_CMDG_DESC "GPRS GMM specific commands\n"
/* testing commands */ DEFUN_HIDDEN(test_grr_tx_chan_req, @@ -152,6 +154,31 @@ return CMD_SUCCESS; }
+DEFUN_HIDDEN(test_gmm_reg_attach, + test_gmm_reg_attach_cmd, + "test MS_NAME gmm attach", + TEST_CMD_DESC MS_NAME_DESC GMM_CMDG_DESC + "Enqueue a GMM GMMREG-ATTACH.req for transmission\n") +{ + struct osmo_gprs_gmm_prim *gmm_prim; + const uint32_t tlli = 0xe1c5d364; + struct osmocom_ms *ms; + + if ((ms = l23_vty_get_ms(argv[0], vty)) == NULL) + return CMD_WARNING; + + gmm_prim = osmo_gprs_gmm_prim_alloc_gmmreg_attach_req(); + gmm_prim->gmmreg.attach_req.ptmsi = tlli; + gmm_prim->gmmreg.attach_req.attach_type = OSMO_GPRS_GMM_ATTACH_TYPE_GPRS; + + if (osmo_gprs_gmm_prim_upper_down(gmm_prim) != 0) { + vty_out(vty, "Failed to enqueue an GMM PDU%s", VTY_NEWLINE); + return CMD_WARNING; + } + + return CMD_SUCCESS; +} + /* per APN config */ DEFUN(cfg_ms_apn, cfg_ms_apn_cmd, "apn APN_NAME", "Configure an APN\n" @@ -335,6 +362,7 @@ install_element_ve(&test_grr_tx_chan_req_cmd); install_element_ve(&test_llc_unitdata_req_hexpdu_cmd); install_element_ve(&test_llc_unitdata_req_gmm_attch_cmd); + install_element_ve(&test_gmm_reg_attach_cmd); install_element(CONFIG_NODE, &l23_cfg_ms_cmd);
install_element(MS_NODE, &cfg_ms_apn_cmd);