laforge has submitted this change. (
https://gerrit.osmocom.org/c/osmo-sgsn/+/40811?usp=email )
Change subject: routing area: prefix GERAN functions with geran
......................................................................
routing area: prefix GERAN functions with geran
Make it easier to understand the purpose
of the functions.
Change-Id: Ic616bd8f9afe6cd3702cd4af08706b7b36987f42
---
M include/osmocom/sgsn/gprs_routing_area.h
M src/sgsn/gprs_bssgp.c
M src/sgsn/gprs_ns.c
M src/sgsn/gprs_routing_area.c
M tests/gprs_routing_area/gprs_routing_area_test.c
5 files changed, 60 insertions(+), 61 deletions(-)
Approvals:
pespin: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/include/osmocom/sgsn/gprs_routing_area.h
b/include/osmocom/sgsn/gprs_routing_area.h
index 2626216..a807227 100644
--- a/include/osmocom/sgsn/gprs_routing_area.h
+++ b/include/osmocom/sgsn/gprs_routing_area.h
@@ -88,27 +88,29 @@
struct sgsn_ra *sgsn_ra_alloc(const struct osmo_routing_area_id *rai, enum
sgsn_ra_ran_type ran_type);
struct sgsn_ra *sgsn_ra_find_or_create(const struct osmo_routing_area_id *rai, enum
sgsn_ra_ran_type ran_type);
+struct sgsn_ra *sgsn_ra_get_ra(const struct osmo_routing_area_id *rai);
void sgsn_ra_free(struct sgsn_ra *ra);
struct sgsn_ra_cell *sgsn_ra_cell_alloc_geran(struct sgsn_ra *ra, uint16_t cell_id,
uint16_t nsei, uint16_t bvci);
void sgsn_ra_cell_free(struct sgsn_ra_cell *cell);
/* GERAN */
/* Called by BSSGP layer to inform about a reset on a PtP BVCI */
-int sgsn_ra_bvc_cell_reset_ind(uint16_t nsei, uint16_t bvci, struct
osmo_cell_global_id_ps *cgi_ps);
+int sgsn_ra_geran_bvc_cell_reset_ind(uint16_t nsei, uint16_t bvci, struct
osmo_cell_global_id_ps *cgi_ps);
/* Called by BSSGP layer to inform about a reset on a Signal BVCI */
-void sgsn_ra_bvc_sign_reset_ind(uint16_t nsei);
+void sgsn_ra_geran_bvc_sign_reset_ind(uint16_t nsei);
/* FIXME: handle BVC BLOCK/UNBLOCK/UNAVAILABLE */
/* Called by NS-VC layer to inform about an unavailable NSEI (and all BVCI on them) */
-int sgsn_ra_nsei_failure_ind(uint16_t nsei);
+int sgsn_ra_geran_nsei_failure_ind(uint16_t nsei);
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_cgi_ps(const struct osmo_cell_global_id_ps
*cgi_ps);
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_lai(const struct osmo_location_area_id *lai,
uint16_t cell_id);
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_cgi(const struct osmo_cell_global_id *cgi);
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_ra(const struct sgsn_ra *ra, uint16_t cell_id);
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_gb(uint16_t nsei, uint16_t bvci);
-struct sgsn_ra *sgsn_ra_get_ra(const struct osmo_routing_area_id *rai);
-struct sgsn_ra *sgsn_ra_get_ra_geran(const struct osmo_routing_area_id *rai);
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_cgi_ps(const struct osmo_cell_global_id_ps
*cgi_ps);
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_lai(const struct osmo_location_area_id
*lai, uint16_t cell_id);
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_cgi(const struct osmo_cell_global_id
*cgi);
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_ra(const struct sgsn_ra *ra, uint16_t
cell_id);
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_gb(uint16_t nsei, uint16_t bvci);
+struct sgsn_ra *sgsn_ra_geran_get_ra(const struct osmo_routing_area_id *rai);
+/* Page the whole routing area for this mmctx */
+int sgsn_ra_geran_page_ra(const struct osmo_routing_area_id *rai, struct sgsn_mm_ctx
*mmctx);
/*
* return value for callbacks.
@@ -123,6 +125,3 @@
typedef int (sgsn_ra_cb_t)(struct sgsn_ra_cell *ra_cell, void *cb_data);
int sgsn_ra_foreach_cell(struct sgsn_ra *ra, sgsn_ra_cb_t *cb, void *cb_data);
int sgsn_ra_foreach_cell2(struct osmo_routing_area_id *rai, sgsn_ra_cb_t *cb, void
*cb_data);
-
-/* Page the whole routing area for this mmctx */
-int sgsn_ra_geran_page_ra(const struct osmo_routing_area_id *rai, struct sgsn_mm_ctx
*mmctx);
diff --git a/src/sgsn/gprs_bssgp.c b/src/sgsn/gprs_bssgp.c
index 42cd073..c64e790 100644
--- a/src/sgsn/gprs_bssgp.c
+++ b/src/sgsn/gprs_bssgp.c
@@ -44,7 +44,7 @@
* PtP BVCI: BVCI != 0, CGI-PS */
if (bp->bvci == 0) {
- sgsn_ra_bvc_sign_reset_ind(bp->nsei);
+ sgsn_ra_geran_bvc_sign_reset_ind(bp->nsei);
return 0;
}
@@ -55,7 +55,7 @@
return -EINVAL;
bssgp_parse_cell_id2(&cgi_ps.rai, &cgi_ps.cell_identity, TLVP_VAL(bp->tp,
BSSGP_IE_CELL_ID), 8);
- return sgsn_ra_bvc_cell_reset_ind(bp->nsei, bp->bvci, &cgi_ps);
+ return sgsn_ra_geran_bvc_cell_reset_ind(bp->nsei, bp->bvci, &cgi_ps);
}
/* call-back function for the BSSGP protocol */
diff --git a/src/sgsn/gprs_ns.c b/src/sgsn/gprs_ns.c
index 3968128..d38de37 100644
--- a/src/sgsn/gprs_ns.c
+++ b/src/sgsn/gprs_ns.c
@@ -53,7 +53,7 @@
break;
case GPRS_NS2_AFF_CAUSE_FAILURE:
LOGP(DGPRS, LOGL_NOTICE, "NS-E %d became unavailable\n", nsp->nsei);
- sgsn_ra_nsei_failure_ind(nsp->nsei);
+ sgsn_ra_geran_nsei_failure_ind(nsp->nsei);
break;
default:
LOGP(DGPRS, LOGL_NOTICE, "NS: %s Unknown prim %d from NS\n",
diff --git a/src/sgsn/gprs_routing_area.c b/src/sgsn/gprs_routing_area.c
index dae18cd..721f0c9 100644
--- a/src/sgsn/gprs_routing_area.c
+++ b/src/sgsn/gprs_routing_area.c
@@ -143,7 +143,7 @@
return NULL;
}
-struct sgsn_ra *sgsn_ra_get_ra_geran(const struct osmo_routing_area_id *rai)
+struct sgsn_ra *sgsn_ra_geran_get_ra(const struct osmo_routing_area_id *rai)
{
struct sgsn_ra *ra = sgsn_ra_get_ra(rai);
@@ -156,7 +156,7 @@
return NULL;
}
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_gb(uint16_t nsei, uint16_t bvci)
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_gb(uint16_t nsei, uint16_t bvci)
{
struct sgsn_ra *ra;
struct sgsn_ra_cell *cell;
@@ -219,7 +219,7 @@
}
/* valid for GERAN */
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_ra(const struct sgsn_ra *ra, uint16_t cell_id)
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_ra(const struct sgsn_ra *ra, uint16_t
cell_id)
{
struct sgsn_ra_cell *cell;
@@ -238,7 +238,7 @@
}
/* valid for GERAN */
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_lai(const struct osmo_location_area_id *lai,
uint16_t cell_id)
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_lai(const struct osmo_location_area_id
*lai, uint16_t cell_id)
{
struct sgsn_ra *ra;
struct sgsn_ra_cell *cell;
@@ -269,24 +269,24 @@
* \param cgi_ps
* \return the cell or NULL if not found
*/
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_cgi_ps(const struct osmo_cell_global_id_ps
*cgi_ps)
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_cgi_ps(const struct osmo_cell_global_id_ps
*cgi_ps)
{
struct sgsn_ra *ra;
OSMO_ASSERT(cgi_ps);
- ra = sgsn_ra_get_ra_geran(&cgi_ps->rai);
+ ra = sgsn_ra_geran_get_ra(&cgi_ps->rai);
if (!ra)
return NULL;
- return sgsn_ra_get_cell_by_ra(ra, cgi_ps->cell_identity);
+ return sgsn_ra_geran_get_cell_by_ra(ra, cgi_ps->cell_identity);
}
-struct sgsn_ra_cell *sgsn_ra_get_cell_by_cgi(const struct osmo_cell_global_id *cgi)
+struct sgsn_ra_cell *sgsn_ra_geran_get_cell_by_cgi(const struct osmo_cell_global_id
*cgi)
{
OSMO_ASSERT(cgi);
- return sgsn_ra_get_cell_by_lai(&cgi->lai, cgi->cell_identity);
+ return sgsn_ra_geran_get_cell_by_lai(&cgi->lai, cgi->cell_identity);
}
/*! Callback from the BSSGP layer on NM RESET IND for a cell (PtP BVCI).
@@ -296,7 +296,7 @@
* \param cgi_ps
* \return 0 on success or -ENOMEM
*/
-int sgsn_ra_bvc_cell_reset_ind(uint16_t nsei, uint16_t bvci, struct
osmo_cell_global_id_ps *cgi_ps)
+int sgsn_ra_geran_bvc_cell_reset_ind(uint16_t nsei, uint16_t bvci, struct
osmo_cell_global_id_ps *cgi_ps)
{
struct sgsn_ra *ra;
struct sgsn_ra_cell *cell;
@@ -304,7 +304,7 @@
OSMO_ASSERT(cgi_ps);
/* TODO: do we have to move all MS to GMM IDLE state when this happens for a alive cell
which got reseted? */
- ra = sgsn_ra_get_ra_geran(&cgi_ps->rai);
+ ra = sgsn_ra_geran_get_ra(&cgi_ps->rai);
if (!ra) {
/* TODO: check for UTRAN rai when introducing UTRAN support */
ra = sgsn_ra_find_or_create(&cgi_ps->rai, RA_TYPE_GERAN_Gb);
@@ -314,7 +314,7 @@
}
if (!ra_created) {
- cell = sgsn_ra_get_cell_by_ra(ra, cgi_ps->cell_identity);
+ cell = sgsn_ra_geran_get_cell_by_ra(ra, cgi_ps->cell_identity);
if (cell && cell->ran_type == RA_TYPE_GERAN_Gb) {
/* Cell already exist, update NSEI/BVCI */
if (cell->u.geran.bvci != bvci || cell->u.geran.nsei != nsei) {
@@ -338,7 +338,7 @@
char new_ra[32];
/* check for the same cell id within the location area. The cell id is also unique for
the cell within the LAC
* This should only happen when a Cell is changing routing areas */
- cell = sgsn_ra_get_cell_by_lai(&cgi_ps->rai.lac, cgi_ps->cell_identity);
+ cell = sgsn_ra_geran_get_cell_by_lai(&cgi_ps->rai.lac,
cgi_ps->cell_identity);
if (cell) {
LOGRAI(LOGL_INFO, &cgi_ps->rai, "CGI %s: changed Routing Area. Old: %s,
New: %s\n",
osmo_cgi_ps_name(cgi_ps),
@@ -364,7 +364,7 @@
}
/* FIXME: call it on BSSGP BLOCK + unavailable with BVCI */
-int sgsn_ra_nsei_failure_ind(uint16_t nsei)
+int sgsn_ra_geran_nsei_failure_ind(uint16_t nsei)
{
struct sgsn_ra *ra, *ra2;
struct sgsn_ra_cell *cell, *cell2;
@@ -391,9 +391,9 @@
return found ? 0 : -ENOENT;
}
-void sgsn_ra_bvc_sign_reset_ind(uint16_t nsei)
+void sgsn_ra_geran_bvc_sign_reset_ind(uint16_t nsei)
{
- sgsn_ra_nsei_failure_ind(nsei);
+ sgsn_ra_geran_nsei_failure_ind(nsei);
}
int sgsn_ra_geran_page_ra(const struct osmo_routing_area_id *rai, struct sgsn_mm_ctx
*mmctx)
@@ -404,7 +404,7 @@
rate_ctr_inc(rate_ctr_group_get_ctr(mmctx->ctrg, GMM_CTR_PAGING_PS));
- ra = sgsn_ra_get_ra_geran(rai);
+ ra = sgsn_ra_geran_get_ra(rai);
if (!ra)
return -ENOENT;
diff --git a/tests/gprs_routing_area/gprs_routing_area_test.c
b/tests/gprs_routing_area/gprs_routing_area_test.c
index d8ff07f..b9840b9 100644
--- a/tests/gprs_routing_area/gprs_routing_area_test.c
+++ b/tests/gprs_routing_area/gprs_routing_area_test.c
@@ -171,19 +171,19 @@
OSMO_ASSERT(cell_a);
OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
- cell_b = sgsn_ra_get_cell_by_cgi_ps(&cgi_ps);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi_ps(&cgi_ps);
OSMO_ASSERT(cell_b);
OSMO_ASSERT(cell_b == cell_a);
- cell_b = sgsn_ra_get_cell_by_ra(ra_a, cgi.cell_identity);
+ cell_b = sgsn_ra_geran_get_cell_by_ra(ra_a, cgi.cell_identity);
OSMO_ASSERT(cell_b);
OSMO_ASSERT(cell_b == cell_a);
- cell_b = sgsn_ra_get_cell_by_cgi(&cgi);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi(&cgi);
OSMO_ASSERT(cell_b);
OSMO_ASSERT(cell_b == cell_a);
- cell_b = sgsn_ra_get_cell_by_lai(&cgi.lai, cgi.cell_identity);
+ cell_b = sgsn_ra_geran_get_cell_by_lai(&cgi.lai, cgi.cell_identity);
OSMO_ASSERT(cell_b);
OSMO_ASSERT(cell_b == cell_a);
@@ -202,23 +202,23 @@
OSMO_ASSERT(cell_a);
OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
- cell_b = sgsn_ra_get_cell_by_cgi_ps(&cgi_ps);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi_ps(&cgi_ps);
OSMO_ASSERT(!cell_b);
- cell_b = sgsn_ra_get_cell_by_ra(ra_a, cgi_ps.cell_identity);
+ cell_b = sgsn_ra_geran_get_cell_by_ra(ra_a, cgi_ps.cell_identity);
OSMO_ASSERT(!cell_b);
- cell_b = sgsn_ra_get_cell_by_cgi(&cgi);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi(&cgi);
OSMO_ASSERT(!cell_b);
- cell_b = sgsn_ra_get_cell_by_lai(&cgi.lai, cgi.cell_identity);
+ cell_b = sgsn_ra_geran_get_cell_by_lai(&cgi.lai, cgi.cell_identity);
OSMO_ASSERT(!cell_b);
/* try to find for a different RAC */
cgi_ps.rai.rac = 45;
rai.rac = 46;
- cell_b = sgsn_ra_get_cell_by_cgi_ps(&cgi_ps);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi_ps(&cgi_ps);
OSMO_ASSERT(!cell_b);
ra_b = sgsn_ra_get_ra(&rai);
@@ -226,7 +226,7 @@
/* try to find for different LAC */
cgi.lai.lac = 46;
- cell_b = sgsn_ra_get_cell_by_cgi(&cgi);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi(&cgi);
OSMO_ASSERT(!cell_b);
sgsn_ra_free(ra_a);
@@ -268,24 +268,24 @@
OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
OSMO_ASSERT(llist_count(&ra_a->cells_alive_list) == 0);
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
OSMO_ASSERT(rc == 0);
OSMO_ASSERT(llist_count(&ra_a->cells_alive_list) == 1);
- cell_a = sgsn_ra_get_cell_by_cgi(&cgi);
+ cell_a = sgsn_ra_geran_get_cell_by_cgi(&cgi);
OSMO_ASSERT(cell_a);
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
OSMO_ASSERT(rc == 0);
- cell_b = sgsn_ra_get_cell_by_cgi(&cgi);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi(&cgi);
OSMO_ASSERT(cell_b);
OSMO_ASSERT(cell_a == cell_b);
sgsn_ra_free(ra_a);
OSMO_ASSERT(llist_empty(&sgsn->routing_area->ra_list));
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
OSMO_ASSERT(rc == 0);
OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
@@ -320,17 +320,17 @@
sgsn = sgsn_instance_alloc(tall_sgsn_ctx);
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
OSMO_ASSERT(rc == 0);
ra_a = sgsn_ra_get_ra(&cgi_ps.rai);
OSMO_ASSERT(llist_count(&ra_a->cells_alive_list) == 1);
- rc = sgsn_ra_nsei_failure_ind(nsei);
+ rc = sgsn_ra_geran_nsei_failure_ind(nsei);
OSMO_ASSERT(rc == 0);
OSMO_ASSERT(llist_empty(&sgsn->routing_area->ra_list));
- rc = sgsn_ra_nsei_failure_ind(nsei);
+ rc = sgsn_ra_geran_nsei_failure_ind(nsei);
OSMO_ASSERT(rc == -ENOENT);
OSMO_ASSERT(llist_empty(&sgsn->routing_area->ra_list));
@@ -402,11 +402,11 @@
g_paging[0].valid = true;
g_paging[0].paged = false;
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
OSMO_ASSERT(rc == 0);
cgi_ps.cell_identity++;
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci+1, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci+1, &cgi_ps);
OSMO_ASSERT(rc == 0);
g_paging[1].bvci = bvci+1;
@@ -450,13 +450,13 @@
printf("Testing Routing Area GERAN BVCI Signalling Reset Ind\n");
printf(" Registering GERAN RA/cell via BVCI 5/BVC Reset Ind\n");
- sgsn_ra_bvc_sign_reset_ind(nsei);
+ sgsn_ra_geran_bvc_sign_reset_ind(nsei);
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci, &cgi_ps);
OSMO_ASSERT(rc == 0);
printf(" Checking cell on BVCI 5\n");
- cell = sgsn_ra_get_cell_by_cgi_ps(&cgi_ps);
+ cell = sgsn_ra_geran_get_cell_by_cgi_ps(&cgi_ps);
OSMO_ASSERT(cell);
OSMO_ASSERT(cell->ran_type == RA_TYPE_GERAN_Gb);
OSMO_ASSERT(cell->u.geran.bvci == bvci);
@@ -468,7 +468,7 @@
OSMO_ASSERT(llist_count(&cell->ra->cells_alive_list) == 1);
printf(" Drop all cells via BVC Reset Ind on Signalling BVCI\n");
- sgsn_ra_bvc_sign_reset_ind(nsei);
+ sgsn_ra_geran_bvc_sign_reset_ind(nsei);
printf(" Ensure only 0 RAs are present\n");
OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 0);
@@ -503,11 +503,11 @@
printf("Testing Routing Area GERAN to GERAN (BVCI change)\n");
printf(" Registering GERAN RA/cell via BVCI A/BVC Reset Ind\n");
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci_a, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci_a, &cgi_ps);
OSMO_ASSERT(rc == 0);
printf(" Checking cell on BVCI A\n");
- cell_a = sgsn_ra_get_cell_by_cgi_ps(&cgi_ps);
+ cell_a = sgsn_ra_geran_get_cell_by_cgi_ps(&cgi_ps);
OSMO_ASSERT(cell_a);
OSMO_ASSERT(cell_a->ran_type == RA_TYPE_GERAN_Gb);
OSMO_ASSERT(cell_a->u.geran.bvci == bvci_a);
@@ -519,11 +519,11 @@
OSMO_ASSERT(llist_count(&cell_a->ra->cells_alive_list) == 1);
printf(" Registering GERAN RA/cell via BVCI B/BVC Reset Ind\n");
- rc = sgsn_ra_bvc_cell_reset_ind(nsei, bvci_b, &cgi_ps);
+ rc = sgsn_ra_geran_bvc_cell_reset_ind(nsei, bvci_b, &cgi_ps);
OSMO_ASSERT(rc == 0);
printf(" Checking cell on BVCI B\n");
- cell_b = sgsn_ra_get_cell_by_cgi_ps(&cgi_ps);
+ cell_b = sgsn_ra_geran_get_cell_by_cgi_ps(&cgi_ps);
OSMO_ASSERT(cell_b);
OSMO_ASSERT(cell_b->ran_type == RA_TYPE_GERAN_Gb);
OSMO_ASSERT(cell_b->u.geran.bvci == bvci_b);
--
To view, visit
https://gerrit.osmocom.org/c/osmo-sgsn/+/40811?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: osmo-sgsn
Gerrit-Branch: master
Gerrit-Change-Id: Ic616bd8f9afe6cd3702cd4af08706b7b36987f42
Gerrit-Change-Number: 40811
Gerrit-PatchSet: 2
Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>