<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20351">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
neels: Looks good to me, approved
laforge: Looks good to me, but someone else must approve
pespin: Looks good to me, but someone else must approve
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">introduce osmo_use_count for bsc_subscr<br><br>During LCS development, I'm getting use count bugs and would like to see use<br>token strings to figure it out.<br><br>Change-Id: I29bf60059d4cf7bb99a00753e6cdc149baf95f94<br>---<br>M include/osmocom/bsc/bsc_subscr_conn_fsm.h<br>M include/osmocom/bsc/bsc_subscriber.h<br>M include/osmocom/bsc/paging.h<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>M src/osmo-bsc/bsc_subscriber.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/gsm_08_08.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M src/osmo-bsc/paging.c<br>M tests/handover/handover_test.c<br>M tests/subscr/bsc_subscr_test.c<br>M tests/subscr/bsc_subscr_test.err<br>12 files changed, 155 insertions(+), 106 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bsc_subscr_conn_fsm.h b/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>index 354c5ee..9b6398a 100644</span><br><span>--- a/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>+++ b/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>@@ -3,6 +3,8 @@</span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span> #include <osmocom/core/fsm.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define BSUB_USE_CONN "conn"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum gscon_fsm_event {</span><br><span> /* local SCCP stack tells us incoming conn from MSC */</span><br><span> GSCON_EV_A_CONN_IND,</span><br><span>diff --git a/include/osmocom/bsc/bsc_subscriber.h b/include/osmocom/bsc/bsc_subscriber.h</span><br><span>index a602a9e..6fffafd 100644</span><br><span>--- a/include/osmocom/bsc/bsc_subscriber.h</span><br><span>+++ b/include/osmocom/bsc/bsc_subscriber.h</span><br><span>@@ -5,6 +5,7 @@</span><br><span> #include <stdint.h></span><br><span> </span><br><span> #include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/use_count.h></span><br><span> #include <osmocom/gsm/protocol/gsm_23_003.h></span><br><span> #include <osmocom/gsm/gsm48.h></span><br><span> </span><br><span>@@ -12,7 +13,7 @@</span><br><span> </span><br><span> struct bsc_subscr {</span><br><span> struct llist_head entry;</span><br><span style="color: hsl(0, 100%, 40%);">- int use_count;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_use_count use_count;</span><br><span> </span><br><span> char imsi[GSM23003_IMSI_MAX_DIGITS+1];</span><br><span> uint32_t tmsi;</span><br><span>@@ -22,25 +23,29 @@</span><br><span> const char *bsc_subscr_id(struct bsc_subscr *bsub);</span><br><span> </span><br><span> struct bsc_subscr *bsc_subscr_find_or_create_by_imsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token);</span><br><span> struct bsc_subscr *bsc_subscr_find_or_create_by_tmsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t tmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *bsc_subscr_find_or_create_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi);</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t tmsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token);</span><br><span style="color: hsl(120, 100%, 40%);">+struct bsc_subscr *bsc_subscr_find_or_create_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token);</span><br><span> </span><br><span> struct bsc_subscr *bsc_subscr_find_by_imsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token);</span><br><span> struct bsc_subscr *bsc_subscr_find_by_tmsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t tmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *bsc_subscr_find_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi);</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t tmsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token);</span><br><span style="color: hsl(120, 100%, 40%);">+struct bsc_subscr *bsc_subscr_find_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token);</span><br><span> </span><br><span> void bsc_subscr_set_imsi(struct bsc_subscr *bsub, const char *imsi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *_bsc_subscr_get(struct bsc_subscr *bsub,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *file, int line);</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *_bsc_subscr_put(struct bsc_subscr *bsub,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *file, int line);</span><br><span style="color: hsl(0, 100%, 40%);">-#define bsc_subscr_get(bsub) _bsc_subscr_get(bsub, __FILE__, __LINE__)</span><br><span style="color: hsl(0, 100%, 40%);">-#define bsc_subscr_put(bsub) _bsc_subscr_put(bsub, __FILE__, __LINE__)</span><br><span style="color: hsl(120, 100%, 40%);">+#define bsc_subscr_get(bsc_subscr, use) \</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(osmo_use_count_get_put(&(bsc_subscr)->use_count, use, 1) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define bsc_subscr_put(bsc_subscr, use) \</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(osmo_use_count_get_put(&(bsc_subscr)->use_count, use, -1) == 0)</span><br><span> </span><br><span> void log_set_filter_bsc_subscr(struct log_target *target,</span><br><span> struct bsc_subscr *bsub);</span><br><span>diff --git a/include/osmocom/bsc/paging.h b/include/osmocom/bsc/paging.h</span><br><span>index c6eb9df..cd351cb 100644</span><br><span>--- a/include/osmocom/bsc/paging.h</span><br><span>+++ b/include/osmocom/bsc/paging.h</span><br><span>@@ -42,6 +42,9 @@</span><br><span> #define LOG_PAGING_BTS(PARAMS, BTS, SUBSYS, LEVEL, fmt, args...) \</span><br><span> LOG_PAGING(PARAMS, SUBSYS, LEVEL, "(bts%u) " fmt, (BTS) ? (BTS)->nr : 255, ##args)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define BSUB_USE_PAGING_START "paging-start"</span><br><span style="color: hsl(120, 100%, 40%);">+#define BSUB_USE_PAGING_REQUEST "paging-req"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Bitmask of reasons for Paging. Each individual Paging via bsc_paging_start() typically has only one of these reasons</span><br><span> * set, but when a subscriber responds, we need to aggregate all pending Paging reasons (by bitwise-OR). */</span><br><span> enum bsc_paging_reason {</span><br><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index 95bbb12..de73a2a 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -823,7 +823,8 @@</span><br><span> OSMO_ASSERT(data);</span><br><span> mi_imsi = data;</span><br><span> if (!conn->bsub)</span><br><span style="color: hsl(0, 100%, 40%);">- conn->bsub = bsc_subscr_find_or_create_by_imsi(conn->network->bsc_subscribers, mi_imsi->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ conn->bsub = bsc_subscr_find_or_create_by_imsi(conn->network->bsc_subscribers, mi_imsi->imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSUB_USE_CONN);</span><br><span> else {</span><br><span> /* we already have a bsc_subscr associated; maybe that subscriber has no IMSI yet? */</span><br><span> if (!conn->bsub->imsi[0])</span><br><span>@@ -855,7 +856,7 @@</span><br><span> </span><br><span> if (conn->bsub) {</span><br><span> LOGPFSML(fi, LOGL_DEBUG, "Putting bsc_subscr\n");</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(conn->bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(conn->bsub, BSUB_USE_CONN);</span><br><span> conn->bsub = NULL;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bsc_subscriber.c b/src/osmo-bsc/bsc_subscriber.c</span><br><span>index 9ddfcaa..79d0c85 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscriber.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscriber.c</span><br><span>@@ -32,6 +32,38 @@</span><br><span> #include <osmocom/bsc/bsc_subscriber.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void bsc_subscr_free(struct bsc_subscr *bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int bsub_use_cb(struct osmo_use_count_entry *e, int32_t old_use_count, const char *file, int line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_subscr *bsub = e->use_count->talloc_object;</span><br><span style="color: hsl(120, 100%, 40%);">+ int32_t total;</span><br><span style="color: hsl(120, 100%, 40%);">+ int level;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!e->use)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ total = osmo_use_count_total(&bsub->use_count);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (total == 0</span><br><span style="color: hsl(120, 100%, 40%);">+ || (total == 1 && old_use_count == 0 && e->count == 1))</span><br><span style="color: hsl(120, 100%, 40%);">+ level = LOGL_INFO;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ level = LOGL_DEBUG;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPSRC(DREF, level, file, line, "BSC subscr %s: %s %s: now used by %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_name(bsub),</span><br><span style="color: hsl(120, 100%, 40%);">+ (e->count - old_use_count) > 0? "+" : "-", e->use,</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_use_count_to_str_c(OTC_SELECT, &bsub->use_count));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (e->count < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ERANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (total == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_free(bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static struct bsc_subscr *bsc_subscr_alloc(struct llist_head *list)</span><br><span> {</span><br><span> struct bsc_subscr *bsub;</span><br><span>@@ -40,13 +72,20 @@</span><br><span> if (!bsub)</span><br><span> return NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ bsub->tmsi = GSM_RESERVED_TMSI;</span><br><span style="color: hsl(120, 100%, 40%);">+ bsub->use_count = (struct osmo_use_count){</span><br><span style="color: hsl(120, 100%, 40%);">+ .talloc_object = bsub,</span><br><span style="color: hsl(120, 100%, 40%);">+ .use_cb = bsub_use_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> llist_add_tail(&bsub->entry, list);</span><br><span> </span><br><span> return bsub;</span><br><span> }</span><br><span> </span><br><span> struct bsc_subscr *bsc_subscr_find_by_imsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token)</span><br><span> {</span><br><span> struct bsc_subscr *bsub;</span><br><span> </span><br><span>@@ -54,14 +93,17 @@</span><br><span> return NULL;</span><br><span> </span><br><span> llist_for_each_entry(bsub, list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!strcmp(bsub->imsi, imsi))</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_get(bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!strcmp(bsub->imsi, imsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_get(bsub, use_token);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsub;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span> struct bsc_subscr *bsc_subscr_find_by_tmsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t tmsi)</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t tmsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token)</span><br><span> {</span><br><span> struct bsc_subscr *bsub;</span><br><span> </span><br><span>@@ -69,21 +111,24 @@</span><br><span> return NULL;</span><br><span> </span><br><span> llist_for_each_entry(bsub, list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsub->tmsi == tmsi)</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_get(bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bsub->tmsi == tmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_get(bsub, use_token);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsub;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *bsc_subscr_find_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi)</span><br><span style="color: hsl(120, 100%, 40%);">+struct bsc_subscr *bsc_subscr_find_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token)</span><br><span> {</span><br><span> if (!mi)</span><br><span> return NULL;</span><br><span> switch (mi->type) {</span><br><span> case GSM_MI_TYPE_IMSI:</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_find_by_imsi(list, mi->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsc_subscr_find_by_imsi(list, mi->imsi, use_token);</span><br><span> case GSM_MI_TYPE_TMSI:</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_find_by_tmsi(list, mi->tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsc_subscr_find_by_tmsi(list, mi->tmsi, use_token);</span><br><span> default:</span><br><span> return NULL;</span><br><span> }</span><br><span>@@ -97,42 +142,47 @@</span><br><span> }</span><br><span> </span><br><span> struct bsc_subscr *bsc_subscr_find_or_create_by_imsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token)</span><br><span> {</span><br><span> struct bsc_subscr *bsub;</span><br><span style="color: hsl(0, 100%, 40%);">- bsub = bsc_subscr_find_by_imsi(list, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsub = bsc_subscr_find_by_imsi(list, imsi, use_token);</span><br><span> if (bsub)</span><br><span> return bsub;</span><br><span> bsub = bsc_subscr_alloc(list);</span><br><span> if (!bsub)</span><br><span> return NULL;</span><br><span> bsc_subscr_set_imsi(bsub, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_get(bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_get(bsub, use_token);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsub;</span><br><span> }</span><br><span> </span><br><span> struct bsc_subscr *bsc_subscr_find_or_create_by_tmsi(struct llist_head *list,</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t tmsi)</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t tmsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token)</span><br><span> {</span><br><span> struct bsc_subscr *bsub;</span><br><span style="color: hsl(0, 100%, 40%);">- bsub = bsc_subscr_find_by_tmsi(list, tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsub = bsc_subscr_find_by_tmsi(list, tmsi, use_token);</span><br><span> if (bsub)</span><br><span> return bsub;</span><br><span> bsub = bsc_subscr_alloc(list);</span><br><span> if (!bsub)</span><br><span> return NULL;</span><br><span> bsub->tmsi = tmsi;</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_get(bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_get(bsub, use_token);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsub;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *bsc_subscr_find_or_create_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi)</span><br><span style="color: hsl(120, 100%, 40%);">+struct bsc_subscr *bsc_subscr_find_or_create_by_mi(struct llist_head *list, const struct osmo_mobile_identity *mi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *use_token)</span><br><span> {</span><br><span> if (!mi)</span><br><span> return NULL;</span><br><span> switch (mi->type) {</span><br><span> case GSM_MI_TYPE_IMSI:</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_find_or_create_by_imsi(list, mi->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsc_subscr_find_or_create_by_imsi(list, mi->imsi, use_token);</span><br><span> case GSM_MI_TYPE_TMSI:</span><br><span style="color: hsl(0, 100%, 40%);">- return bsc_subscr_find_or_create_by_tmsi(list, mi->tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bsc_subscr_find_or_create_by_tmsi(list, mi->tmsi, use_token);</span><br><span> default:</span><br><span> return NULL;</span><br><span> }</span><br><span>@@ -170,29 +220,7 @@</span><br><span> talloc_free(bsub);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *_bsc_subscr_get(struct bsc_subscr *bsub,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *file, int line)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsub->use_count < INT_MAX);</span><br><span style="color: hsl(0, 100%, 40%);">- bsub->use_count++;</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPSRC(DREF, LOGL_DEBUG, file, line,</span><br><span style="color: hsl(0, 100%, 40%);">- "BSC subscr %s usage increases to: %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_name(bsub), bsub->use_count);</span><br><span style="color: hsl(0, 100%, 40%);">- return bsub;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_subscr *_bsc_subscr_put(struct bsc_subscr *bsub,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *file, int line)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- bsub->use_count--;</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPSRC(DREF, bsub->use_count >= 0? LOGL_DEBUG : LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- file, line,</span><br><span style="color: hsl(0, 100%, 40%);">- "BSC subscr %s usage decreases to: %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_name(bsub), bsub->use_count);</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsub->use_count <= 0)</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_free(bsub);</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+#define BSUB_USE_LOG_FILTER "log_filter"</span><br><span> </span><br><span> void log_set_filter_bsc_subscr(struct log_target *target,</span><br><span> struct bsc_subscr *bsc_subscr)</span><br><span>@@ -201,13 +229,14 @@</span><br><span> </span><br><span> /* free the old data */</span><br><span> if (*fsub) {</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(*fsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(*fsub, BSUB_USE_LOG_FILTER);</span><br><span> *fsub = NULL;</span><br><span> }</span><br><span> </span><br><span> if (bsc_subscr) {</span><br><span> target->filter_map |= (1 << LOG_FLT_BSC_SUBSCR);</span><br><span style="color: hsl(0, 100%, 40%);">- *fsub = bsc_subscr_get(bsc_subscr);</span><br><span style="color: hsl(120, 100%, 40%);">+ *fsub = bsc_subscr;</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_get(*fsub, BSUB_USE_LOG_FILTER);</span><br><span> } else</span><br><span> target->filter_map &= ~(1 << LOG_FLT_BSC_SUBSCR);</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 7be6aeb..cd7d0e0 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -1415,7 +1415,7 @@</span><br><span> if (bsub->tmsi != GSM_RESERVED_TMSI)</span><br><span> vty_out(vty, " TMSI: 0x%08x%s", bsub->tmsi,</span><br><span> VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Use count: %d%s", bsub->use_count, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " Use count: %s%s", osmo_use_count_to_str_c(OTC_SELECT, &bsub->use_count), VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span> static void meas_rep_dump_uni_vty(struct vty *vty,</span><br><span>@@ -6350,7 +6350,7 @@</span><br><span> if (!tgt)</span><br><span> return CMD_WARNING;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr = bsc_subscr_find_or_create_by_imsi(bsc_gsmnet->bsc_subscribers, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr = bsc_subscr_find_or_create_by_imsi(bsc_gsmnet->bsc_subscribers, imsi, __func__);</span><br><span> </span><br><span> if (!bsc_subscr) {</span><br><span> vty_out(vty, "%% failed to enable logging for subscriber with IMSI(%s)%s",</span><br><span>@@ -6360,14 +6360,14 @@</span><br><span> </span><br><span> log_set_filter_bsc_subscr(tgt, bsc_subscr);</span><br><span> /* log_set_filter has grabbed its own reference */</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(bsc_subscr);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(bsc_subscr, __func__);</span><br><span> </span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> static void dump_one_sub(struct vty *vty, struct bsc_subscr *bsub)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " %15s %08x %d%s", bsub->imsi, bsub->tmsi, bsub->use_count,</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " %15s %08x %s%s", bsub->imsi, bsub->tmsi, osmo_use_count_to_str_c(OTC_SELECT, &bsub->use_count),</span><br><span> VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c</span><br><span>index e5a2774..01d9d0e 100644</span><br><span>--- a/src/osmo-bsc/gsm_08_08.c</span><br><span>+++ b/src/osmo-bsc/gsm_08_08.c</span><br><span>@@ -402,7 +402,7 @@</span><br><span> * See e.g. BSC_Tests.TC_chan_rel_rll_rel_ind: "dt := * f_est_dchan('23'O, 23, '00010203040506'O);"</span><br><span> */</span><br><span> } else {</span><br><span style="color: hsl(0, 100%, 40%);">- bsub = bsc_subscr_find_or_create_by_mi(bsc_gsmnet->bsc_subscribers, &mi);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsub = bsc_subscr_find_or_create_by_mi(bsc_gsmnet->bsc_subscribers, &mi, __func__);</span><br><span> }</span><br><span> </span><br><span> /* allocate a new connection */</span><br><span>@@ -412,8 +412,13 @@</span><br><span> goto early_fail;</span><br><span> }</span><br><span> if (bsub) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* pass bsub use count to conn */</span><br><span style="color: hsl(0, 100%, 40%);">- conn->bsub = bsub;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We got the conn either from new allocation, or by searching for it by bsub. So: */</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT((!conn->bsub) || (conn->bsub == bsub));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!conn->bsub) {</span><br><span style="color: hsl(120, 100%, 40%);">+ conn->bsub = bsub;</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_get(conn->bsub, BSUB_USE_CONN);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(bsub, __func__);</span><br><span> }</span><br><span> gscon_change_primary_lchan(conn, lchan);</span><br><span> gscon_update_id(conn);</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index 023929c..124f613 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -347,7 +347,8 @@</span><br><span> rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED]);</span><br><span> </span><br><span> if (!params->bsub) {</span><br><span style="color: hsl(0, 100%, 40%);">- params->bsub = bsc_subscr_find_or_create_by_imsi(bsc_gsmnet->bsc_subscribers, params->imsi.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ params->bsub = bsc_subscr_find_or_create_by_imsi(bsc_gsmnet->bsc_subscribers, params->imsi.imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSUB_USE_PAGING_START);</span><br><span> if (!params->bsub) {</span><br><span> LOG_PAGING(params, DMSC, LOGL_ERROR, "Paging request failed: Could not allocate subscriber\n");</span><br><span> return -EINVAL;</span><br><span>@@ -394,7 +395,7 @@</span><br><span> break;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(params->bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(params->bsub, BSUB_USE_PAGING_START);</span><br><span> log_set_context(LOG_CTX_BSC_SUBSCR, NULL);</span><br><span> return 0;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/paging.c b/src/osmo-bsc/paging.c</span><br><span>index 54a5fd7..a4a5a1e 100644</span><br><span>--- a/src/osmo-bsc/paging.c</span><br><span>+++ b/src/osmo-bsc/paging.c</span><br><span>@@ -67,7 +67,7 @@</span><br><span> {</span><br><span> osmo_timer_del(&to_be_deleted->T3113);</span><br><span> llist_del(&to_be_deleted->entry);</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(to_be_deleted->bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(to_be_deleted->bsub, BSUB_USE_PAGING_REQUEST);</span><br><span> talloc_free(to_be_deleted);</span><br><span> }</span><br><span> </span><br><span>@@ -343,7 +343,8 @@</span><br><span> req = talloc_zero(tall_paging_ctx, struct gsm_paging_request);</span><br><span> OSMO_ASSERT(req);</span><br><span> req->reason = params->reason;</span><br><span style="color: hsl(0, 100%, 40%);">- req->bsub = bsc_subscr_get(params->bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ req->bsub = params->bsub;</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_get(req->bsub, BSUB_USE_PAGING_REQUEST);</span><br><span> req->bts = bts;</span><br><span> req->chan_type = params->chan_needed;</span><br><span> req->msc = params->msc;</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index bdf926d..8fa8fe8 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -244,7 +244,7 @@</span><br><span> /* Make up a new IMSI for this test, for logging the subscriber */</span><br><span> next_imsi ++;</span><br><span> snprintf(imsi, sizeof(imsi), "%06u", next_imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->conn->bsub = bsc_subscr_find_or_create_by_imsi(net->bsc_subscribers, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan->conn->bsub = bsc_subscr_find_or_create_by_imsi(net->bsc_subscribers, imsi, BSUB_USE_CONN);</span><br><span> </span><br><span> /* kick the FSM from INIT through to the ACTIVE state */</span><br><span> osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CONN_REQ, NULL);</span><br><span>diff --git a/tests/subscr/bsc_subscr_test.c b/tests/subscr/bsc_subscr_test.c</span><br><span>index 3c94b86..fcaea63 100644</span><br><span>--- a/tests/subscr/bsc_subscr_test.c</span><br><span>+++ b/tests/subscr/bsc_subscr_test.c</span><br><span>@@ -37,16 +37,18 @@</span><br><span> OSMO_ASSERT((val) expect_op); \</span><br><span> } while (0);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define BSUB_USE "test"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void assert_bsc_subscr(const struct bsc_subscr *bsub, const char *imsi)</span><br><span> {</span><br><span> struct bsc_subscr *sfound;</span><br><span> OSMO_ASSERT(bsub);</span><br><span> OSMO_ASSERT(strcmp(bsub->imsi, imsi) == 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- sfound = bsc_subscr_find_by_imsi(bsc_subscribers, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ sfound = bsc_subscr_find_by_imsi(bsc_subscribers, imsi, BSUB_USE);</span><br><span> OSMO_ASSERT(sfound == bsub);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(sfound);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(sfound, BSUB_USE);</span><br><span> }</span><br><span> </span><br><span> static void test_bsc_subscr(void)</span><br><span>@@ -60,23 +62,23 @@</span><br><span> </span><br><span> /* Check for emptiness */</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 0, "%d");</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1) == NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2) == NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi3) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1, BSUB_USE) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2, BSUB_USE) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi3, BSUB_USE) == NULL);</span><br><span> </span><br><span> /* Allocate entry 1 */</span><br><span style="color: hsl(0, 100%, 40%);">- s1 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi1);</span><br><span style="color: hsl(120, 100%, 40%);">+ s1 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi1, BSUB_USE);</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 1, "%d");</span><br><span> assert_bsc_subscr(s1, imsi1);</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 1, "%d");</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2, BSUB_USE) == NULL);</span><br><span> </span><br><span> /* Allocate entry 2 */</span><br><span style="color: hsl(0, 100%, 40%);">- s2 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi2);</span><br><span style="color: hsl(120, 100%, 40%);">+ s2 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi2, BSUB_USE);</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 2, "%d");</span><br><span> </span><br><span> /* Allocate entry 3 */</span><br><span style="color: hsl(0, 100%, 40%);">- s3 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi3);</span><br><span style="color: hsl(120, 100%, 40%);">+ s3 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi3, BSUB_USE);</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 3, "%d");</span><br><span> </span><br><span> /* Check entries */</span><br><span>@@ -85,27 +87,27 @@</span><br><span> assert_bsc_subscr(s3, imsi3);</span><br><span> </span><br><span> /* Free entry 1 */</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(s1);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(s1, BSUB_USE);</span><br><span> s1 = NULL;</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 2, "%d");</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1, BSUB_USE) == NULL);</span><br><span> </span><br><span> assert_bsc_subscr(s2, imsi2);</span><br><span> assert_bsc_subscr(s3, imsi3);</span><br><span> </span><br><span> /* Free entry 2 */</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(s2);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(s2, BSUB_USE);</span><br><span> s2 = NULL;</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 1, "%d");</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1) == NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1, BSUB_USE) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2, BSUB_USE) == NULL);</span><br><span> assert_bsc_subscr(s3, imsi3);</span><br><span> </span><br><span> /* Free entry 3 */</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_put(s3);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_put(s3, BSUB_USE);</span><br><span> s3 = NULL;</span><br><span> VERBOSE_ASSERT(llist_count(bsc_subscribers), == 0, "%d");</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi3) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi3, BSUB_USE) == NULL);</span><br><span> </span><br><span> OSMO_ASSERT(llist_empty(bsc_subscribers));</span><br><span> }</span><br><span>diff --git a/tests/subscr/bsc_subscr_test.err b/tests/subscr/bsc_subscr_test.err</span><br><span>index afc8bf7..a78e757 100644</span><br><span>--- a/tests/subscr/bsc_subscr_test.err</span><br><span>+++ b/tests/subscr/bsc_subscr_test.err</span><br><span>@@ -1,20 +1,20 @@</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:1234567890 usage increases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:1234567890 usage increases to: 2</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:1234567890 usage decreases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:9876543210 usage increases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage increases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:1234567890 usage increases to: 2</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:1234567890 usage decreases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:9876543210 usage increases to: 2</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:9876543210 usage decreases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage increases to: 2</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage decreases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:1234567890 usage decreases to: 0</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:9876543210 usage increases to: 2</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:9876543210 usage decreases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage increases to: 2</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage decreases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:9876543210 usage decreases to: 0</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage increases to: 2</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage decreases to: 1</span><br><span style="color: hsl(0, 100%, 40%);">-DREF BSC subscr IMSI:5656565656 usage decreases to: 0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:1234567890: + test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:1234567890: + test: now used by 2 (2*test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:1234567890: - test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:9876543210: + test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: + test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:1234567890: + test: now used by 2 (2*test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:1234567890: - test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:9876543210: + test: now used by 2 (2*test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:9876543210: - test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: + test: now used by 2 (2*test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: - test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:1234567890: - test: now used by 0 (-)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:9876543210: + test: now used by 2 (2*test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:9876543210: - test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: + test: now used by 2 (2*test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: - test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:9876543210: - test: now used by 0 (-)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: + test: now used by 2 (2*test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: - test: now used by 1 (test)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF BSC subscr IMSI:5656565656: - test: now used by 0 (-)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20351">change 20351</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bsc/+/20351"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I29bf60059d4cf7bb99a00753e6cdc149baf95f94 </div>
<div style="display:none"> Gerrit-Change-Number: 20351 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>