<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>