<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21548">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gb_proxy: Rename gbproxy_peer to gbproxy_bvc<br><br>I cannot really read the code while it contains its historical weird<br>naming.  A "peer" used to be a strange amalgamation of NSE + BVC,<br>while in reality we can have any number of BVC on top of each NSE.<br><br>We recently started to split the peer into a gbproxy_nse_peer + gbproxy_peer.<br>This takes it one step further and renames gbproxy_peer to gbproxy_bvc,<br>as that's really what it is.<br><br>Change-Id: Iae01067282a6401f6af4cab731202872d2cdb080<br>---<br>M include/osmocom/sgsn/gb_proxy.h<br>M src/gbproxy/gb_proxy.c<br>M src/gbproxy/gb_proxy_ctrl.c<br>M src/gbproxy/gb_proxy_patch.c<br>M src/gbproxy/gb_proxy_peer.c<br>M src/gbproxy/gb_proxy_tlli.c<br>M src/gbproxy/gb_proxy_vty.c<br>7 files changed, 545 insertions(+), 541 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/48/21548/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gb_proxy.h b/include/osmocom/sgsn/gb_proxy.h</span><br><span>index b3a9a6c..818ab9d 100644</span><br><span>--- a/include/osmocom/sgsn/gb_proxy.h</span><br><span>+++ b/include/osmocom/sgsn/gb_proxy.h</span><br><span>@@ -37,7 +37,7 @@</span><br><span>       GBPROX_GLOB_CTR_PATCH_PEER_ERR,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum gbproxy_peer_ctr {</span><br><span style="color: hsl(120, 100%, 40%);">+enum gbproxy_bvc_ctr {</span><br><span>     GBPROX_PEER_CTR_BLOCKED,</span><br><span>     GBPROX_PEER_CTR_UNBLOCKED,</span><br><span>   GBPROX_PEER_CTR_DROPPED,</span><br><span>@@ -102,7 +102,7 @@</span><br><span>       struct gprs_ns2_inst *nsi;</span><br><span> </span><br><span>       /* Linked list of all Gb peers (except SGSN) */</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head nse_peers;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct llist_head nses;</span><br><span> </span><br><span>  /* Counter */</span><br><span>        struct rate_ctr_group *ctrg;</span><br><span>@@ -118,7 +118,7 @@</span><br><span>   unsigned int clean_stale_timer_freq;</span><br><span>         /* If !0, Max age to consider a struct gbproxy_link_info as stale */</span><br><span>         int tlli_max_age;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* If !0, Max len of gbproxy_peer->list (list of struct gbproxy_link_info) */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* If !0, Max len of gbproxy_bvc->list (list of struct gbproxy_link_info) */</span><br><span>      int tlli_max_len;</span><br><span>    /* If !0, Max len of gbproxy_link_info->stored_msgs (list of msgb) */</span><br><span>     uint32_t stored_msgs_max_len;</span><br><span>@@ -147,17 +147,17 @@</span><br><span> };</span><br><span> </span><br><span> /* One BVC inside an NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer {</span><br><span style="color: hsl(0, 100%, 40%);">-     /* linked to gbproxy_nse.bts_peers */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* linked to gbproxy_nse.bvcs */</span><br><span>     struct llist_head list;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* The peer this BVC belongs to */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* The NSE this BVC belongs to */</span><br><span>    struct gbproxy_nse *nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /* BVCI used for Point-to-Point to this peer */</span><br><span style="color: hsl(120, 100%, 40%);">+       /* PTP BVCI of this BVC */</span><br><span>   uint16_t bvci;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* Routing Area that this peer is part of (raw 04.08 encoding) */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Routing Area that this BVC is part of (raw 04.08 encoding) */</span><br><span>     uint8_t ra[6];</span><br><span> </span><br><span>   /* true if this BVC is blocked */</span><br><span>@@ -173,19 +173,19 @@</span><br><span>    struct osmo_timer_list clean_stale_timer;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* one peer at NS level that we interact with (BSS/PCU) */</span><br><span style="color: hsl(120, 100%, 40%);">+/* one NS Entity that we interact with (BSS/PCU) */</span><br><span> struct gbproxy_nse {</span><br><span style="color: hsl(0, 100%, 40%);">-      /* linked to gbproxy_config.nse_peers */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* linked to gbproxy_config.nses */</span><br><span>  struct llist_head list;</span><br><span> </span><br><span>  /* point back to the config */</span><br><span>       struct gbproxy_config *cfg;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* NSEI of the peer entity */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* NSEI of the NSE */</span><br><span>        uint16_t nsei;</span><br><span> </span><br><span>   /* List of all BVCs in this NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct llist_head bts_peers;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct llist_head bvcs;</span><br><span> };</span><br><span> </span><br><span> struct gbproxy_tlli_state {</span><br><span>@@ -205,7 +205,7 @@</span><br><span> </span><br><span> /* One TLLI (= UE, = Subscriber) served via this proxy */</span><br><span> struct gbproxy_link_info {</span><br><span style="color: hsl(0, 100%, 40%);">-   /* link to gbproxy_peer.patch_state.logical_links */</span><br><span style="color: hsl(120, 100%, 40%);">+  /* link to gbproxy_bvc.patch_state.logical_links */</span><br><span>  struct llist_head list;</span><br><span> </span><br><span>  /* TLLI on the BSS/PCU side */</span><br><span>@@ -276,40 +276,40 @@</span><br><span> void gbprox_reset(struct gbproxy_config *cfg);</span><br><span> </span><br><span> /* TLLI info handling */</span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_delete_link_infos(struct gbproxy_peer *peer);</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_delete_link_infos(struct gbproxy_bvc *bvc);</span><br><span> struct gbproxy_link_info *gbproxy_update_link_state_ul(</span><br><span style="color: hsl(0, 100%, 40%);">- struct gbproxy_peer *peer, time_t now,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_bvc *bvc, time_t now,</span><br><span>         struct gprs_gb_parse_context *parse_ctx);</span><br><span> struct gbproxy_link_info *gbproxy_update_link_state_dl(</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_peer *peer, time_t now,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_bvc *bvc, time_t now,</span><br><span>         struct gprs_gb_parse_context *parse_ctx);</span><br><span> int gbproxy_update_link_state_after(</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_peer *peer, struct gbproxy_link_info *link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_bvc *bvc, struct gbproxy_link_info *link_info,</span><br><span>        time_t now, struct gprs_gb_parse_context *parse_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-int gbproxy_remove_stale_link_infos(struct gbproxy_peer *peer, time_t now);</span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_delete_link_info(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+int gbproxy_remove_stale_link_infos(struct gbproxy_bvc *bvc, time_t now);</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_delete_link_info(struct gbproxy_bvc *bvc,</span><br><span>                   struct gbproxy_link_info *link_info);</span><br><span> void gbproxy_link_info_discard_messages(struct gbproxy_link_info *link_info);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_attach_link_info(struct gbproxy_peer *peer, time_t now,</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_attach_link_info(struct gbproxy_bvc *bvc, time_t now,</span><br><span>                        struct gbproxy_link_info *link_info);</span><br><span> void gbproxy_update_link_info(struct gbproxy_link_info *link_info,</span><br><span>                          const uint8_t *imsi, size_t imsi_len);</span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_detach_link_info(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_detach_link_info(struct gbproxy_bvc *bvc,</span><br><span>                               struct gbproxy_link_info *link_info);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_link_info *gbproxy_link_info_alloc( struct gbproxy_peer *peer);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_link_info *gbproxy_link_info_alloc( struct gbproxy_bvc *bvc);</span><br><span> </span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_tlli(</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gbproxy_peer *peer, uint32_t tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc, uint32_t tlli);</span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_imsi(</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer, const uint8_t *imsi, size_t imsi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_bvc *bvc, const uint8_t *imsi, size_t imsi_len);</span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_any_sgsn_tlli(</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer, uint32_t tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc, uint32_t tlli);</span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_sgsn_tlli(</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     uint32_t tlli, uint32_t sgsn_nsei);</span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_ptmsi(</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     uint32_t ptmsi);</span><br><span> </span><br><span> int gbproxy_imsi_matches(</span><br><span>@@ -320,9 +320,9 @@</span><br><span>      uint32_t other_tlli, struct gbproxy_link_info *link_info, int to_bss);</span><br><span> </span><br><span> /* needed by gb_proxy_tlli.h */</span><br><span style="color: hsl(0, 100%, 40%);">-uint32_t gbproxy_make_bss_ptmsi(struct gbproxy_peer *peer, uint32_t sgsn_ptmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t gbproxy_make_bss_ptmsi(struct gbproxy_bvc *bvc, uint32_t sgsn_ptmsi);</span><br><span> uint32_t gbproxy_make_sgsn_tlli(</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_peer *peer, struct gbproxy_link_info *link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_bvc *bvc, struct gbproxy_link_info *link_info,</span><br><span>        uint32_t bss_tlli);</span><br><span> void gbproxy_reset_link(struct gbproxy_link_info *link_info);</span><br><span> int gbproxy_check_imsi(</span><br><span>@@ -331,12 +331,12 @@</span><br><span> /* Message patching */</span><br><span> void gbproxy_patch_bssgp(</span><br><span>       struct msgb *msg, uint8_t *bssgp, size_t bssgp_len,</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gbproxy_peer *peer, struct gbproxy_link_info *link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_bvc *bvc, struct gbproxy_link_info *link_info,</span><br><span>        int *len_change, struct gprs_gb_parse_context *parse_ctx);</span><br><span> </span><br><span> int gbproxy_patch_llc(</span><br><span>     struct msgb *msg, uint8_t *llc, size_t llc_len,</span><br><span style="color: hsl(0, 100%, 40%);">- struct gbproxy_peer *peer, struct gbproxy_link_info *link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_bvc *bvc, struct gbproxy_link_info *link_info,</span><br><span>        int *len_change, struct gprs_gb_parse_context *parse_ctx);</span><br><span> </span><br><span> int gbproxy_set_patch_filter(</span><br><span>@@ -344,22 +344,22 @@</span><br><span> void gbproxy_clear_patch_filter(struct gbproxy_match *match);</span><br><span> </span><br><span> /* Peer handling */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_bvci(</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_bvci(</span><br><span>      struct gbproxy_config *cfg, uint16_t bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_nsei(</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_nsei(</span><br><span>      struct gbproxy_config *cfg, uint16_t nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_rai(</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_rai(</span><br><span>        struct gbproxy_config *cfg, const uint8_t *ra);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_lai(</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_lai(</span><br><span>    struct gbproxy_config *cfg, const uint8_t *la);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_lac(</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_lac(</span><br><span>    struct gbproxy_config *cfg, const uint8_t *la);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_bssgp_tlv(</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_bssgp_tlv(</span><br><span>        struct gbproxy_config *cfg, struct tlv_parsed *tp);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_alloc(struct gbproxy_nse *nse, uint16_t bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_peer_free(struct gbproxy_peer *peer);</span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_peer_move(struct gbproxy_peer *peer, struct gbproxy_nse *nse);</span><br><span style="color: hsl(0, 100%, 40%);">-int gbproxy_cleanup_peers(struct gbproxy_config *cfg, uint16_t nsei, uint16_t bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_alloc(struct gbproxy_nse *nse, uint16_t bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_bvc_free(struct gbproxy_bvc *bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_bvc_move(struct gbproxy_bvc *bvc, struct gbproxy_nse *nse);</span><br><span style="color: hsl(120, 100%, 40%);">+int gbproxy_cleanup_bvcs(struct gbproxy_config *cfg, uint16_t nsei, uint16_t bvci);</span><br><span> </span><br><span> /* NSE handling */</span><br><span> struct gbproxy_nse *gbproxy_nse_alloc(struct gbproxy_config *cfg, uint16_t nsei);</span><br><span>diff --git a/src/gbproxy/gb_proxy.c b/src/gbproxy/gb_proxy.c</span><br><span>index c130466..94944f9 100644</span><br><span>--- a/src/gbproxy/gb_proxy.c</span><br><span>+++ b/src/gbproxy/gb_proxy.c</span><br><span>@@ -77,21 +77,21 @@</span><br><span>       .class_id = OSMO_STATS_CLASS_GLOBAL,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int gbprox_relay2peer(struct msgb *old_msg, struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static int gbprox_relay2peer(struct msgb *old_msg, struct gbproxy_bvc *bvc,</span><br><span>                          uint16_t ns_bvci);</span><br><span> static int gbprox_relay2sgsn(struct gbproxy_config *cfg, struct msgb *old_msg,</span><br><span>                         uint16_t ns_bvci, uint16_t sgsn_nsei);</span><br><span> static void gbproxy_reset_imsi_acquisition(struct gbproxy_link_info* link_info);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int check_peer_nsei(struct gbproxy_peer *peer, uint16_t nsei)</span><br><span style="color: hsl(120, 100%, 40%);">+static int check_bvc_nsei(struct gbproxy_bvc *bvc, uint16_t nsei)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (peer->nse->nsei != nsei) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPBVC(peer, LOGL_NOTICE, "Peer entry doesn't match current NSEI "</span><br><span style="color: hsl(120, 100%, 40%);">+     if (bvc->nse->nsei != nsei) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPBVC(bvc, LOGL_NOTICE, "Peer entry doesn't match current NSEI "</span><br><span>                  "via NSE(%05u/BSS)\n", nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_INV_NSEI]);</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_INV_NSEI]);</span><br><span>           return 0;</span><br><span>    }</span><br><span> </span><br><span>@@ -190,16 +190,16 @@</span><br><span>        msgb_tlli(msg) = tlli;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* update peer according to the BSS message */</span><br><span style="color: hsl(120, 100%, 40%);">+/* update bvc according to the BSS message */</span><br><span> static void gbprox_update_current_raid(uint8_t *raid_enc,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    struct gbproxy_bvc *bvc,</span><br><span>                                     const char *log_text)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span>        const struct osmo_plmn_id old_plmn = state->local_plmn;</span><br><span>   struct gprs_ra_id raid;</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        if (!raid_enc)</span><br><span>@@ -225,7 +225,7 @@</span><br><span>         }</span><br><span> </span><br><span>        if (osmo_plmn_cmp(&old_plmn, &state->local_plmn))</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPBVC(peer, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPBVC(bvc, LOGL_NOTICE,</span><br><span>                 "Patching RAID %sactivated, msg: %s, "</span><br><span>                     "local: %s, core: %s\n",</span><br><span>                   state->local_plmn.mcc || state->local_plmn.mnc ?</span><br><span>@@ -235,12 +235,12 @@</span><br><span>               osmo_plmn_name2(&cfg->core_plmn));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-uint32_t gbproxy_make_bss_ptmsi(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t gbproxy_make_bss_ptmsi(struct gbproxy_bvc *bvc,</span><br><span>                          uint32_t sgsn_ptmsi)</span><br><span> {</span><br><span>    uint32_t bss_ptmsi;</span><br><span>  int max_retries = 23, rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!peer->nse->cfg->patch_ptmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!bvc->nse->cfg->patch_ptmsi) {</span><br><span>          bss_ptmsi = sgsn_ptmsi;</span><br><span>      } else {</span><br><span>             do {</span><br><span>@@ -252,24 +252,24 @@</span><br><span> </span><br><span>                     bss_ptmsi = bss_ptmsi | GSM23003_TMSI_SGSN_MASK;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                    if (gbproxy_link_info_by_ptmsi(peer, bss_ptmsi))</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (gbproxy_link_info_by_ptmsi(bvc, bss_ptmsi))</span><br><span>                              bss_ptmsi = GSM_RESERVED_TMSI;</span><br><span>               } while (bss_ptmsi == GSM_RESERVED_TMSI && max_retries--);</span><br><span>   }</span><br><span> </span><br><span>        if (bss_ptmsi == GSM_RESERVED_TMSI)</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPBVC(peer, LOGL_ERROR, "Failed to allocate a BSS P-TMSI: %d (%s)\n", rc, strerror(-rc));</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPBVC(bvc, LOGL_ERROR, "Failed to allocate a BSS P-TMSI: %d (%s)\n", rc, strerror(-rc));</span><br><span> </span><br><span>     return bss_ptmsi;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-uint32_t gbproxy_make_sgsn_tlli(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t gbproxy_make_sgsn_tlli(struct gbproxy_bvc *bvc,</span><br><span>                               struct gbproxy_link_info *link_info,</span><br><span>                                 uint32_t bss_tlli)</span><br><span> {</span><br><span>      uint32_t sgsn_tlli;</span><br><span>  int max_retries = 23, rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!peer->nse->cfg->patch_ptmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!bvc->nse->cfg->patch_ptmsi) {</span><br><span>          sgsn_tlli = bss_tlli;</span><br><span>        } else if (link_info->sgsn_tlli.ptmsi != GSM_RESERVED_TMSI &&</span><br><span>                gprs_tlli_type(bss_tlli) == TLLI_FOREIGN) {</span><br><span>@@ -290,13 +290,13 @@</span><br><span> </span><br><span>                   sgsn_tlli = (sgsn_tlli & 0x7fffffff) | 0x78000000;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                      if (gbproxy_link_info_by_any_sgsn_tlli(peer, sgsn_tlli))</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (gbproxy_link_info_by_any_sgsn_tlli(bvc, sgsn_tlli))</span><br><span>                              sgsn_tlli = 0;</span><br><span>               } while (!sgsn_tlli && max_retries--);</span><br><span>       }</span><br><span> </span><br><span>        if (!sgsn_tlli)</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGPBVC(peer, LOGL_ERROR, "Failed to allocate an SGSN TLLI: %d (%s)\n", rc, strerror(-rc));</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPBVC(bvc, LOGL_ERROR, "Failed to allocate an SGSN TLLI: %d (%s)\n", rc, strerror(-rc));</span><br><span> </span><br><span>     return sgsn_tlli;</span><br><span> }</span><br><span>@@ -330,15 +330,15 @@</span><br><span> </span><br><span> /* Got identity response with IMSI, assuming the request had</span><br><span>  * been generated by the gbproxy */</span><br><span style="color: hsl(0, 100%, 40%);">-static int gbproxy_flush_stored_messages(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static int gbproxy_flush_stored_messages(struct gbproxy_bvc *bvc,</span><br><span>                                        time_t now,</span><br><span>                                          struct gbproxy_link_info* link_info)</span><br><span> {</span><br><span>  int rc;</span><br><span>      struct msgb *stored_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        /* Patch and flush stored messages towards the SGSN */</span><br><span>@@ -354,13 +354,13 @@</span><br><span>                                   &tmp_parse_ctx);</span><br><span>             gbproxy_patch_bssgp(stored_msg, msgb_bssgph(stored_msg),</span><br><span>                                 msgb_bssgp_len(stored_msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                             peer, link_info, &len_change,</span><br><span style="color: hsl(120, 100%, 40%);">+                             bvc, link_info, &len_change,</span><br><span>                                     &tmp_parse_ctx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            rc = gbproxy_update_link_state_after(peer, link_info, now,</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = gbproxy_update_link_state_after(bvc, link_info, now,</span><br><span>                            &tmp_parse_ctx);</span><br><span>                 if (rc == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPBVC_CAT(peer, DLLC, LOGL_NOTICE, "link_info deleted while flushing stored messages\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGPBVC_CAT(bvc, DLLC, LOGL_NOTICE, "link_info deleted while flushing stored messages\n");</span><br><span>                         msgb_free(stored_msg);</span><br><span>                       return -1;</span><br><span>           }</span><br><span>@@ -369,7 +369,7 @@</span><br><span>                                     msgb_bvci(stored_msg), link_info->sgsn_nsei);</span><br><span> </span><br><span>          if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPBVC_CAT(peer, DLLC, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGPBVC_CAT(bvc, DLLC, LOGL_ERROR,</span><br><span>                        "failed to send stored message "</span><br><span>                           "(%s)\n",</span><br><span>                          tmp_parse_ctx.llc_msg_name ?</span><br><span>@@ -380,7 +380,7 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int gbproxy_gsm48_to_peer(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static int gbproxy_gsm48_to_bvc(struct gbproxy_bvc *bvc,</span><br><span>                               struct gbproxy_link_info* link_info,</span><br><span>                                 uint16_t bvci,</span><br><span>                               struct msgb *msg /* Takes msg ownership */)</span><br><span>@@ -397,12 +397,12 @@</span><br><span>         gprs_push_bssgp_dl_unitdata(msg, link_info->tlli.current);</span><br><span>        msg->l3h = msg->data;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- rc = gbprox_relay2peer(msg, peer, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = gbprox_relay2peer(msg, bvc, bvci);</span><br><span>      msgb_free(msg);</span><br><span>      return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gbproxy_acquire_imsi(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static void gbproxy_acquire_imsi(struct gbproxy_bvc *bvc,</span><br><span>                             struct gbproxy_link_info* link_info,</span><br><span>                                 uint16_t bvci)</span><br><span> {</span><br><span>@@ -411,10 +411,10 @@</span><br><span>         /* Send IDENT REQ */</span><br><span>         idreq_msg = gsm48_msgb_alloc_name("GSM 04.08 ACQ IMSI");</span><br><span>   gprs_put_identity_req(idreq_msg, GSM_MI_TYPE_IMSI);</span><br><span style="color: hsl(0, 100%, 40%);">-     gbproxy_gsm48_to_peer(peer, link_info, bvci, idreq_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      gbproxy_gsm48_to_bvc(bvc, link_info, bvci, idreq_msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gbproxy_tx_detach_acc(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static void gbproxy_tx_detach_acc(struct gbproxy_bvc *bvc,</span><br><span>                                struct gbproxy_link_info* link_info,</span><br><span>                                 uint16_t bvci)</span><br><span> {</span><br><span>@@ -423,20 +423,20 @@</span><br><span>        /* Send DETACH ACC */</span><br><span>        detacc_msg = gsm48_msgb_alloc_name("GSM 04.08 DET ACC");</span><br><span>   gprs_put_mo_detach_acc(detacc_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-     gbproxy_gsm48_to_peer(peer, link_info, bvci, detacc_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+     gbproxy_gsm48_to_bvc(bvc, link_info, bvci, detacc_msg);</span><br><span> }</span><br><span> </span><br><span> /* Return != 0 iff msg still needs to be processed */</span><br><span style="color: hsl(0, 100%, 40%);">-static int gbproxy_imsi_acquisition(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static int gbproxy_imsi_acquisition(struct gbproxy_bvc *bvc,</span><br><span>                                    struct msgb *msg,</span><br><span>                                    time_t now,</span><br><span>                                  struct gbproxy_link_info* link_info,</span><br><span>                                 struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>    struct msgb *stored_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        if (!link_info)</span><br><span>@@ -451,7 +451,7 @@</span><br><span>                case GSM48_MT_GMM_RA_UPD_REQ:</span><br><span>                case GSM48_MT_GMM_ATTACH_REQ:</span><br><span>                        if (gbproxy_restart_imsi_acquisition(link_info)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              LOGPBVC_CAT(peer, DLLC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGPBVC_CAT(bvc, DLLC, LOGL_INFO,</span><br><span>                                 " IMSI acquisition was in progress "</span><br><span>                               "when receiving an %s.\n",</span><br><span>                                 parse_ctx->llc_msg_name);</span><br><span>@@ -460,19 +460,19 @@</span><br><span>            case GSM48_MT_GMM_DETACH_REQ:</span><br><span>                        /* Nothing has been sent to the SGSN yet */</span><br><span>                  if (link_info->imsi_acq_pending) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGPBVC_CAT(peer, DLLC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGPBVC_CAT(bvc, DLLC, LOGL_INFO,</span><br><span>                                 "IMSI acquisition was in progress "</span><br><span>                                "when receiving a DETACH_REQ.\n");</span><br><span>                    }</span><br><span>                    if (!parse_ctx->invalidate_tlli) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGPBVC_CAT(peer, DLLC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGPBVC_CAT(bvc, DLLC, LOGL_INFO,</span><br><span>                                 "IMSI not yet acquired, "</span><br><span>                                  "faking a DETACH_ACC.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                               gbproxy_tx_detach_acc(peer, link_info, msgb_bvci(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                               gbproxy_tx_detach_acc(bvc, link_info, msgb_bvci(msg));</span><br><span>                               parse_ctx->invalidate_tlli = 1;</span><br><span>                   }</span><br><span>                    gbproxy_reset_imsi_acquisition(link_info);</span><br><span style="color: hsl(0, 100%, 40%);">-                      gbproxy_update_link_state_after(peer, link_info, now,</span><br><span style="color: hsl(120, 100%, 40%);">+                 gbproxy_update_link_state_after(bvc, link_info, now,</span><br><span>                                                         parse_ctx);</span><br><span>                  return 0;</span><br><span>            }</span><br><span>@@ -483,13 +483,13 @@</span><br><span>                    gsm48_hdr_pdisc(parse_ctx->g48_hdr) == GSM48_PDISC_MM_GPRS &&</span><br><span>                     gsm48_hdr_msg_type(parse_ctx->g48_hdr) == GSM48_MT_GMM_ID_RESP;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPBVC_CAT(peer, DLLC, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPBVC_CAT(bvc, DLLC, LOGL_DEBUG,</span><br><span>                "IMSI acquisition succeeded, "</span><br><span>                     "flushing stored messages\n");</span><br><span>                /* The IMSI is now available. If flushing the messages fails,</span><br><span>                 * then link_info has been deleted and we should return</span><br><span>               * immediately. */</span><br><span style="color: hsl(0, 100%, 40%);">-              if (gbproxy_flush_stored_messages(peer, now, link_info) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+               if (gbproxy_flush_stored_messages(bvc, now, link_info) < 0)</span><br><span>                       return 0;</span><br><span> </span><br><span>                gbproxy_reset_imsi_acquisition(link_info);</span><br><span>@@ -511,7 +511,7 @@</span><br><span>                     struct msgb *msgb_drop;</span><br><span>                      msgb_drop = msgb_dequeue_count(&link_info->stored_msgs,</span><br><span>                                                      &link_info->stored_msgs_len);</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGPBVC_CAT(peer, DLLC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGPBVC_CAT(bvc, DLLC, LOGL_INFO,</span><br><span>                         "Dropping stored msgb from list "</span><br><span>                          "(!acq imsi, length %d, max_len exceeded)\n",</span><br><span>                              link_info->stored_msgs_len);</span><br><span>@@ -521,7 +521,7 @@</span><br><span>   }</span><br><span> </span><br><span>        /* Enqueue unpatched messages */</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPBVC_CAT(peer, DLLC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGPBVC_CAT(bvc, DLLC, LOGL_INFO,</span><br><span>         "IMSI acquisition in progress, "</span><br><span>           "storing message (%s)\n",</span><br><span>          parse_ctx->llc_msg_name ? parse_ctx->llc_msg_name : "BSSGP");</span><br><span>@@ -531,12 +531,12 @@</span><br><span>                      &link_info->stored_msgs_len);</span><br><span> </span><br><span>  if (!link_info->imsi_acq_pending) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPBVC_CAT(peer, DLLC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPBVC_CAT(bvc, DLLC, LOGL_INFO,</span><br><span>                 "IMSI is required but not available, "</span><br><span>                     "initiating identification procedure (%s)\n",</span><br><span>                      parse_ctx->llc_msg_name ? parse_ctx->llc_msg_name : "BSSGP");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          gbproxy_acquire_imsi(peer, link_info, msgb_bvci(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                gbproxy_acquire_imsi(bvc, link_info, msgb_bvci(msg));</span><br><span> </span><br><span>            /* There is no explicit retransmission handling, the</span><br><span>                  * implementation relies on the MS doing proper retransmissions</span><br><span>@@ -548,37 +548,37 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_find_peer(struct gbproxy_config *cfg,</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_find_bvc(struct gbproxy_config *cfg,</span><br><span>                                      struct msgb *msg,</span><br><span>                                    struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_peer *peer = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_bvc *bvc = NULL;</span><br><span> </span><br><span>  if (msgb_bvci(msg) >= 2)</span><br><span style="color: hsl(0, 100%, 40%);">-             peer = gbproxy_peer_by_bvci(cfg, msgb_bvci(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+             bvc = gbproxy_bvc_by_bvci(cfg, msgb_bvci(msg));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (!peer && !parse_ctx->to_bss)</span><br><span style="color: hsl(0, 100%, 40%);">-             peer = gbproxy_peer_by_nsei(cfg, msgb_nsei(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bvc && !parse_ctx->to_bss)</span><br><span style="color: hsl(120, 100%, 40%);">+            bvc = gbproxy_bvc_by_nsei(cfg, msgb_nsei(msg));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (!peer)</span><br><span style="color: hsl(0, 100%, 40%);">-              peer = gbproxy_peer_by_bssgp_tlv(cfg, &parse_ctx->bssgp_tp);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!bvc)</span><br><span style="color: hsl(120, 100%, 40%);">+             bvc = gbproxy_bvc_by_bssgp_tlv(cfg, &parse_ctx->bssgp_tp);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!peer) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!bvc) {</span><br><span>          LOGP(DLLC, LOGL_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">-                "NSE(%05u/%s) patching: didn't find peer for message, "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "NSE(%05u/%s) patching: didn't find bvc for message, "</span><br><span>                 "PDU %d\n",</span><br><span>                msgb_nsei(msg), parse_ctx->to_bss ? "BSS" : "SGSN",</span><br><span>                   parse_ctx->pdu_type);</span><br><span>                /* Increment counter */</span><br><span>              rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_PATCH_PEER_ERR]);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       return peer;</span><br><span style="color: hsl(120, 100%, 40%);">+  return bvc;</span><br><span> }</span><br><span> </span><br><span> /* patch BSSGP message */</span><br><span> static int gbprox_process_bssgp_ul(struct gbproxy_config *cfg,</span><br><span>                             struct msgb *msg,</span><br><span style="color: hsl(0, 100%, 40%);">-                               struct gbproxy_peer *peer)</span><br><span style="color: hsl(120, 100%, 40%);">+                            struct gbproxy_bvc *bvc)</span><br><span> {</span><br><span>     struct gprs_gb_parse_context parse_ctx = {0};</span><br><span>        int rc;</span><br><span>@@ -610,49 +610,49 @@</span><br><span>              return 0;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Get peer */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!peer)</span><br><span style="color: hsl(0, 100%, 40%);">-              peer = gbproxy_find_peer(cfg, msg, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Get bvc */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bvc)</span><br><span style="color: hsl(120, 100%, 40%);">+             bvc = gbproxy_find_bvc(cfg, msg, &parse_ctx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!peer)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bvc)</span><br><span>            return 0;</span><br><span> </span><br><span> </span><br><span>    osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span>        now = ts.tv_sec;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    gbprox_update_current_raid(parse_ctx.bssgp_raid_enc, peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    gbprox_update_current_raid(parse_ctx.bssgp_raid_enc, bvc,</span><br><span>                               parse_ctx.llc_msg_name);</span><br><span> </span><br><span>      gprs_gb_log_parse_context(LOGL_DEBUG, &parse_ctx, "NS_UNITDATA");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     link_info = gbproxy_update_link_state_ul(peer, now, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+  link_info = gbproxy_update_link_state_ul(bvc, now, &parse_ctx);</span><br><span> </span><br><span>      if (parse_ctx.g48_hdr) {</span><br><span>             switch (parse_ctx.g48_hdr->msg_type) {</span><br><span>            case GSM48_MT_GMM_ATTACH_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_REQS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_REQS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_DETACH_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_DETACH_REQS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_DETACH_REQS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_ATTACH_COMPL:</span><br><span style="color: hsl(0, 100%, 40%);">-                 rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_COMPLS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_COMPLS]);</span><br><span>                      break;</span><br><span>               case GSM48_MT_GMM_RA_UPD_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_REQS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_REQS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_RA_UPD_COMPL:</span><br><span style="color: hsl(0, 100%, 40%);">-                 rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_COMPLS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_COMPLS]);</span><br><span>                      break;</span><br><span>               case GSM48_MT_GMM_STATUS:</span><br><span style="color: hsl(0, 100%, 40%);">-                       rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_GMM_STATUS_BSS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_GMM_STATUS_BSS]);</span><br><span>                     break;</span><br><span>               case GSM48_MT_GSM_ACT_PDP_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-                  rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_PDP_ACT_REQS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_PDP_ACT_REQS]);</span><br><span>                       break;</span><br><span>               case GSM48_MT_GSM_DEACT_PDP_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_PDP_DEACT_REQS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_PDP_DEACT_REQS]);</span><br><span>                     break;</span><br><span> </span><br><span>           default:</span><br><span>@@ -673,16 +673,16 @@</span><br><span> </span><br><span>         /* Handle IMSI acquisition */</span><br><span>        if (cfg->acquire_imsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-             rc = gbproxy_imsi_acquisition(peer, msg, now, link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = gbproxy_imsi_acquisition(bvc, msg, now, link_info,</span><br><span>                                            &parse_ctx);</span><br><span>               if (rc <= 0)</span><br><span>                      return rc;</span><br><span>   }</span><br><span> </span><br><span>        gbproxy_patch_bssgp(msg, msgb_bssgph(msg), msgb_bssgp_len(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                     peer, link_info, &len_change, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+                            bvc, link_info, &len_change, &parse_ctx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       gbproxy_update_link_state_after(peer, link_info, now, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+        gbproxy_update_link_state_after(bvc, link_info, now, &parse_ctx);</span><br><span> </span><br><span>    if (sgsn_nsei != cfg->nsip_sgsn_nsei) {</span><br><span>           /* Send message directly to the selected SGSN */</span><br><span>@@ -697,7 +697,7 @@</span><br><span> /* patch BSSGP message to use core_plmn.mcc/mnc on the SGSN side */</span><br><span> static void gbprox_process_bssgp_dl(struct gbproxy_config *cfg,</span><br><span>                                 struct msgb *msg,</span><br><span style="color: hsl(0, 100%, 40%);">-                               struct gbproxy_peer *peer)</span><br><span style="color: hsl(120, 100%, 40%);">+                                    struct gbproxy_bvc *bvc)</span><br><span> {</span><br><span>    struct gprs_gb_parse_context parse_ctx = {0};</span><br><span>        int rc;</span><br><span>@@ -727,11 +727,11 @@</span><br><span>              return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Get peer */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!peer)</span><br><span style="color: hsl(0, 100%, 40%);">-              peer = gbproxy_find_peer(cfg, msg, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Get bvc */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bvc)</span><br><span style="color: hsl(120, 100%, 40%);">+             bvc = gbproxy_find_bvc(cfg, msg, &parse_ctx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!peer)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bvc)</span><br><span>            return;</span><br><span> </span><br><span>  osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span>@@ -740,31 +740,31 @@</span><br><span>        if (parse_ctx.g48_hdr) {</span><br><span>             switch (parse_ctx.g48_hdr->msg_type) {</span><br><span>            case GSM48_MT_GMM_ATTACH_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_ACKS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_ACKS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_ATTACH_REJ:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_REJS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_ATTACH_REJS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_DETACH_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_DETACH_ACKS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_DETACH_ACKS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_RA_UPD_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_ACKS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_ACKS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_RA_UPD_REJ:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_REJS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_RA_UPD_REJS]);</span><br><span>                        break;</span><br><span>               case GSM48_MT_GMM_STATUS:</span><br><span style="color: hsl(0, 100%, 40%);">-                       rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_GMM_STATUS_SGSN]);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_GMM_STATUS_SGSN]);</span><br><span>                    break;</span><br><span>               case GSM48_MT_GSM_ACT_PDP_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-                  rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_PDP_ACT_ACKS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_PDP_ACT_ACKS]);</span><br><span>                       break;</span><br><span>               case GSM48_MT_GSM_ACT_PDP_REJ:</span><br><span style="color: hsl(0, 100%, 40%);">-                  rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_PDP_ACT_REJS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_PDP_ACT_REJS]);</span><br><span>                       break;</span><br><span>               case GSM48_MT_GSM_DEACT_PDP_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_PDP_DEACT_ACKS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_PDP_DEACT_ACKS]);</span><br><span>                     break;</span><br><span> </span><br><span>           default:</span><br><span>@@ -774,17 +774,17 @@</span><br><span> </span><br><span>         gprs_gb_log_parse_context(LOGL_DEBUG, &parse_ctx, "NS_UNITDATA");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     link_info = gbproxy_update_link_state_dl(peer, now, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+  link_info = gbproxy_update_link_state_dl(bvc, now, &parse_ctx);</span><br><span> </span><br><span>      gbproxy_patch_bssgp(msg, msgb_bssgph(msg), msgb_bssgp_len(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                     peer, link_info, &len_change, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+                            bvc, link_info, &len_change, &parse_ctx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       gbproxy_update_link_state_after(peer, link_info, now, &parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+        gbproxy_update_link_state_after(bvc, link_info, now, &parse_ctx);</span><br><span> </span><br><span>    return;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* feed a message down the NS-VC associated with the specified peer */</span><br><span style="color: hsl(120, 100%, 40%);">+/* feed a message down the NS-VC associated with the specified bvc */</span><br><span> static int gbprox_relay2sgsn(struct gbproxy_config *cfg, struct msgb *old_msg,</span><br><span>                           uint16_t ns_bvci, uint16_t sgsn_nsei)</span><br><span> {</span><br><span>@@ -847,32 +847,32 @@</span><br><span>      rc = gprs_ns2_recv_prim(nsi, &nsp.oph);</span><br><span>  /* FIXME: We need a counter group for gbproxy_nse */</span><br><span>         //if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        //      rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_TX_ERR]);</span><br><span style="color: hsl(120, 100%, 40%);">+     //      rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_TX_ERR]);</span><br><span> </span><br><span>         return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* feed a message down the NS-VC associated with the specified peer */</span><br><span style="color: hsl(0, 100%, 40%);">-static int gbprox_relay2peer(struct msgb *old_msg, struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+/* feed a message down the NS-VC associated with the specified bvc */</span><br><span style="color: hsl(120, 100%, 40%);">+static int gbprox_relay2peer(struct msgb *old_msg, struct gbproxy_bvc *bvc,</span><br><span>                        uint16_t ns_bvci)</span><br><span> {</span><br><span>  int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gbproxy_nse *nse = peer->nse;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_nse *nse = bvc->nse;</span><br><span>       OSMO_ASSERT(nse);</span><br><span> </span><br><span>        rc = gbprox_relay2nse(old_msg, nse, ns_bvci);</span><br><span>        if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_TX_ERR]);</span><br><span style="color: hsl(120, 100%, 40%);">+             rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_TX_ERR]);</span><br><span> </span><br><span>         return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int block_unblock_peer(struct gbproxy_config *cfg, uint16_t ptp_bvci, uint8_t pdu_type)</span><br><span style="color: hsl(120, 100%, 40%);">+static int block_unblock_bvc(struct gbproxy_config *cfg, uint16_t ptp_bvci, uint8_t pdu_type)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    peer = gbproxy_peer_by_bvci(cfg, ptp_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!peer) {</span><br><span style="color: hsl(120, 100%, 40%);">+  bvc = gbproxy_bvc_by_bvci(cfg, ptp_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bvc) {</span><br><span>          LOGP(DGPRS, LOGL_ERROR, "BVC(%05u/??) Cannot find BSS\n",</span><br><span>                  ptp_bvci);</span><br><span>           rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_INV_BVCI]);</span><br><span>@@ -881,12 +881,12 @@</span><br><span> </span><br><span>       switch (pdu_type) {</span><br><span>  case BSSGP_PDUT_BVC_BLOCK_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-          peer->blocked = true;</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_BLOCKED]);</span><br><span style="color: hsl(120, 100%, 40%);">+            bvc->blocked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_BLOCKED]);</span><br><span>            break;</span><br><span>       case BSSGP_PDUT_BVC_UNBLOCK_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-                peer->blocked = false;</span><br><span style="color: hsl(0, 100%, 40%);">-               rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_UNBLOCKED]);</span><br><span style="color: hsl(120, 100%, 40%);">+          bvc->blocked = false;</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_UNBLOCKED]);</span><br><span>          break;</span><br><span>       default:</span><br><span>             break;</span><br><span>@@ -894,22 +894,22 @@</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Send a message to a peer identified by ptp_bvci but using ns_bvci</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send a message to a bvc identified by ptp_bvci but using ns_bvci</span><br><span>  * in the NS hdr */</span><br><span> static int gbprox_relay2bvci(struct gbproxy_config *cfg, struct msgb *msg, uint16_t ptp_bvci,</span><br><span>                    uint16_t ns_bvci)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    peer = gbproxy_peer_by_bvci(cfg, ptp_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!peer) {</span><br><span style="color: hsl(120, 100%, 40%);">+  bvc = gbproxy_bvc_by_bvci(cfg, ptp_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bvc) {</span><br><span>          LOGP(DGPRS, LOGL_ERROR, "BVC(%05u/??) Cannot find BSS\n",</span><br><span>                  ptp_bvci);</span><br><span>           rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_INV_BVCI]);</span><br><span>           return -ENOENT;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return gbprox_relay2peer(msg, peer, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+ return gbprox_relay2peer(msg, bvc, ns_bvci);</span><br><span> }</span><br><span> </span><br><span> int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span>@@ -922,14 +922,14 @@</span><br><span>                               struct msgb *msg, uint16_t nsei,</span><br><span>                             uint16_t ns_bvci)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span>     struct bssgp_normal_hdr *bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg);</span><br><span>        uint8_t pdu_type = bgph->pdu_type;</span><br><span>        int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     peer = gbproxy_peer_by_bvci(cfg, ns_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!peer) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DGPRS, LOGL_NOTICE, "BVC(%05u/??) Didn't find peer "</span><br><span style="color: hsl(120, 100%, 40%);">+       bvc = gbproxy_bvc_by_bvci(cfg, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!bvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGPRS, LOGL_NOTICE, "BVC(%05u/??) Didn't find bvc "</span><br><span>                    "for PTP message from NSE(%05u/BSS), "</span><br><span>                     "discarding message\n",</span><br><span>                    ns_bvci, nsei);</span><br><span>@@ -938,9 +938,9 @@</span><br><span>   }</span><br><span> </span><br><span>        /* TODO: Should we discard this message if the check fails */</span><br><span style="color: hsl(0, 100%, 40%);">-   check_peer_nsei(peer, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+  check_bvc_nsei(bvc, nsei);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  rc = gbprox_process_bssgp_ul(cfg, msg, peer);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gbprox_process_bssgp_ul(cfg, msg, bvc);</span><br><span>         if (!rc)</span><br><span>             return 0;</span><br><span> </span><br><span>@@ -965,16 +965,16 @@</span><br><span>                                   struct msgb *msg, uint16_t nsei,</span><br><span>                             uint16_t ns_bvci)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span>     struct bssgp_normal_hdr *bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg);</span><br><span>        uint8_t pdu_type = bgph->pdu_type;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       peer = gbproxy_peer_by_bvci(cfg, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+    bvc = gbproxy_bvc_by_bvci(cfg, ns_bvci);</span><br><span> </span><br><span>         /* Send status messages before patching */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (!peer) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DGPRS, LOGL_INFO, "BVC(%05u/??) Didn't find peer for "</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGPRS, LOGL_INFO, "BVC(%05u/??) Didn't find bvc for "</span><br><span>                  "for message from NSE(%05u/SGSN)\n",</span><br><span>               ns_bvci, nsei);</span><br><span>                 rate_ctr_inc(&cfg->ctrg-></span><br><span>@@ -983,10 +983,10 @@</span><br><span>                                 &ns_bvci, msg);</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (peer->blocked) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGPBVC(peer, LOGL_NOTICE, "Dropping PDU for "</span><br><span style="color: hsl(120, 100%, 40%);">+      if (bvc->blocked) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPBVC(bvc, LOGL_NOTICE, "Dropping PDU for "</span><br><span>                   "blocked BVC via NSE(%05u/SGSN)\n", nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-               rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_DROPPED]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_DROPPED]);</span><br><span>            return bssgp_tx_status(BSSGP_CAUSE_BVCI_BLOCKED, &ns_bvci, msg);</span><br><span>         }</span><br><span> </span><br><span>@@ -1004,9 +1004,9 @@</span><br><span>        }</span><br><span> </span><br><span>        /* Optionally patch the message */</span><br><span style="color: hsl(0, 100%, 40%);">-      gbprox_process_bssgp_dl(cfg, msg, peer);</span><br><span style="color: hsl(120, 100%, 40%);">+      gbprox_process_bssgp_dl(cfg, msg, bvc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     return gbprox_relay2peer(msg, peer, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+ return gbprox_relay2peer(msg, bvc, ns_bvci);</span><br><span> }</span><br><span> </span><br><span> /* process a BVC-RESET message from the BSS side */</span><br><span>@@ -1014,7 +1014,7 @@</span><br><span>                                         uint16_t nsei, struct tlv_parsed *tp,</span><br><span>                                        int *copy_to_sgsn2)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *from_peer = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_bvc *from_bvc = NULL;</span><br><span>         uint16_t bvci;</span><br><span> </span><br><span>   if (!TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2) || !TLVP_PRES_LEN(tp, BSSGP_IE_CAUSE, 1)) {</span><br><span>@@ -1029,7 +1029,7 @@</span><br><span>                  * don't want the SGSN to reset, as the signalling endpoint</span><br><span>               * is common for all point-to-point BVCs (and thus all BTS) */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              /* Ensure the NSE peer is there and clear all PtP BVCs */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Ensure the NSE bvc is there and clear all PtP BVCs */</span><br><span>             struct gbproxy_nse *nse = gbproxy_nse_by_nsei_or_new(cfg, nsei);</span><br><span>             if (!nse) {</span><br><span>                  LOGP(DGPRS, LOGL_ERROR, "Could not create NSE(%05u)\n", nsei);</span><br><span>@@ -1037,15 +1037,15 @@</span><br><span>                   return 0;</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_cleanup_peers(cfg, nsei, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+          gbproxy_cleanup_bvcs(cfg, nsei, 0);</span><br><span> </span><br><span>              /* FIXME: only do this if SGSN is alive! */</span><br><span>          LOGPNSE(nse, LOGL_INFO, "Tx fake BVC RESET ACK of BVCI=0\n");</span><br><span>              bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_RESET_ACK, nsei, 0, 0);</span><br><span>          return 0;</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                from_peer = gbproxy_peer_by_bvci(cfg, bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!from_peer) {</span><br><span style="color: hsl(120, 100%, 40%);">+             from_bvc = gbproxy_bvc_by_bvci(cfg, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!from_bvc) {</span><br><span>                     struct gbproxy_nse *nse = gbproxy_nse_by_nsei(cfg, nsei);</span><br><span>                    if (!nse) {</span><br><span>                          LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u) Got PtP BVC reset before signalling reset for "</span><br><span>@@ -1054,15 +1054,15 @@</span><br><span>                              return 0;</span><br><span>                    }</span><br><span>                    /* if a PTP-BVC is reset, and we don't know that</span><br><span style="color: hsl(0, 100%, 40%);">-                     * PTP-BVCI yet, we should allocate a new peer */</span><br><span style="color: hsl(0, 100%, 40%);">-                       from_peer = gbproxy_peer_alloc(nse, bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-                      OSMO_ASSERT(from_peer);</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGPBVC(from_peer, LOGL_INFO, "Allocated new peer\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       * PTP-BVCI yet, we should allocate a new bvc */</span><br><span style="color: hsl(120, 100%, 40%);">+                      from_bvc = gbproxy_bvc_alloc(nse, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+                      OSMO_ASSERT(from_bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPBVC(from_bvc, LOGL_INFO, "Allocated new bvc\n");</span><br><span>               }</span><br><span> </span><br><span>                /* Could have moved to a different NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!check_peer_nsei(from_peer, nsei)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGPBVC(from_peer, LOGL_NOTICE, "moving peer to NSE(%05u)\n", nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!check_bvc_nsei(from_bvc, nsei)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPBVC(from_bvc, LOGL_NOTICE, "moving bvc to NSE(%05u)\n", nsei);</span><br><span> </span><br><span>                     struct gbproxy_nse *nse_new = gbproxy_nse_by_nsei(cfg, nsei);</span><br><span>                        if (!nse_new) {</span><br><span>@@ -1072,8 +1072,8 @@</span><br><span>                              return 0;</span><br><span>                    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Move peer to different NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-                        gbproxy_peer_move(from_peer, nse_new);</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* Move bvc to different NSE */</span><br><span style="color: hsl(120, 100%, 40%);">+                       gbproxy_bvc_move(from_bvc, nse_new);</span><br><span>                 }</span><br><span> </span><br><span>                if (TLVP_PRES_LEN(tp, BSSGP_IE_CELL_ID, 8)) {</span><br><span>@@ -1082,9 +1082,9 @@</span><br><span>                         * PDU, this means we can extend our local</span><br><span>                    * state information about this particular cell</span><br><span>                       * */</span><br><span style="color: hsl(0, 100%, 40%);">-                   memcpy(from_peer->ra, TLVP_VAL(tp, BSSGP_IE_CELL_ID), sizeof(from_peer->ra));</span><br><span style="color: hsl(0, 100%, 40%);">-                     gsm48_parse_ra(&raid, from_peer->ra);</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGPBVC(from_peer, LOGL_INFO, "Cell ID %s\n", osmo_rai_name(&raid));</span><br><span style="color: hsl(120, 100%, 40%);">+                    memcpy(from_bvc->ra, TLVP_VAL(tp, BSSGP_IE_CELL_ID), sizeof(from_bvc->ra));</span><br><span style="color: hsl(120, 100%, 40%);">+                     gsm48_parse_ra(&raid, from_bvc->ra);</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGPBVC(from_bvc, LOGL_INFO, "Cell ID %s\n", osmo_rai_name(&raid));</span><br><span>            }</span><br><span>            if (cfg->route_to_sgsn2)</span><br><span>                  *copy_to_sgsn2 = 1;</span><br><span>@@ -1102,7 +1102,7 @@</span><br><span>  struct tlv_parsed tp;</span><br><span>        uint8_t pdu_type = bgph->pdu_type;</span><br><span>        int data_len = msgb_bssgp_len(msg) - sizeof(*bgph);</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gbproxy_peer *from_peer = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_bvc *from_bvc = NULL;</span><br><span>         struct gprs_ra_id raid;</span><br><span>      int copy_to_sgsn2 = 0;</span><br><span>       int rc;</span><br><span>@@ -1128,19 +1128,19 @@</span><br><span>    case BSSGP_PDUT_SUSPEND:</span><br><span>     case BSSGP_PDUT_RESUME:</span><br><span>              /* We implement RAI snooping during SUSPEND/RESUME, since it</span><br><span style="color: hsl(0, 100%, 40%);">-             * establishes a relationsip between BVCI/peer and the routeing</span><br><span style="color: hsl(120, 100%, 40%);">+                * establishes a relationsip between BVCI/bvc and the routeing</span><br><span>                * area identification.  The snooped information is then used</span><br><span>                 * for routing the {SUSPEND,RESUME}_[N]ACK back to the correct</span><br><span>                * BSSGP */</span><br><span>          if (!TLVP_PRES_LEN(&tp, BSSGP_IE_ROUTEING_AREA, 6))</span><br><span>                      goto err_mand_ie;</span><br><span style="color: hsl(0, 100%, 40%);">-               from_peer = gbproxy_peer_by_nsei(cfg, nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!from_peer)</span><br><span style="color: hsl(0, 100%, 40%);">-                 goto err_no_peer;</span><br><span style="color: hsl(0, 100%, 40%);">-               memcpy(from_peer->ra, TLVP_VAL(&tp, BSSGP_IE_ROUTEING_AREA),</span><br><span style="color: hsl(0, 100%, 40%);">-                     sizeof(from_peer->ra));</span><br><span style="color: hsl(0, 100%, 40%);">-              gsm48_parse_ra(&raid, from_peer->ra);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPBVC(from_peer, LOGL_INFO, "BSSGP SUSPEND/RESUME "</span><br><span style="color: hsl(120, 100%, 40%);">+               from_bvc = gbproxy_bvc_by_nsei(cfg, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!from_bvc)</span><br><span style="color: hsl(120, 100%, 40%);">+                        goto err_no_bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              memcpy(from_bvc->ra, TLVP_VAL(&tp, BSSGP_IE_ROUTEING_AREA),</span><br><span style="color: hsl(120, 100%, 40%);">+                    sizeof(from_bvc->ra));</span><br><span style="color: hsl(120, 100%, 40%);">+             gsm48_parse_ra(&raid, from_bvc->ra);</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPBVC(from_bvc, LOGL_INFO, "BSSGP SUSPEND/RESUME "</span><br><span>                       "RAI snooping: RAI %s\n",</span><br><span>                  osmo_rai_name(&raid));</span><br><span>           /* FIXME: This only supports one BSS per RA */</span><br><span>@@ -1155,7 +1155,7 @@</span><br><span> </span><br><span>   /* Normally, we can simply pass on all signalling messages from BSS to</span><br><span>        * SGSN */</span><br><span style="color: hsl(0, 100%, 40%);">-      rc = gbprox_process_bssgp_ul(cfg, msg, from_peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = gbprox_process_bssgp_ul(cfg, msg, from_bvc);</span><br><span>    if (!rc)</span><br><span>             return 0;</span><br><span> </span><br><span>@@ -1163,8 +1163,8 @@</span><br><span>                gbprox_relay2sgsn(cfg, msg, ns_bvci, cfg->nsip_sgsn2_nsei);</span><br><span> </span><br><span>   return gbprox_relay2sgsn(cfg, msg, ns_bvci, cfg->nsip_sgsn_nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-err_no_peer:</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGP(DGPRS, LOGL_ERROR, "NSE(%05u/BSS) cannot find peer based on NSEI\n",</span><br><span style="color: hsl(120, 100%, 40%);">+err_no_bvc:</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DGPRS, LOGL_ERROR, "NSE(%05u/BSS) cannot find bvc based on NSEI\n",</span><br><span>           nsei);</span><br><span>       rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_INV_NSEI]);</span><br><span>   return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span>@@ -1180,7 +1180,7 @@</span><br><span>                             uint32_t nsei, uint16_t ns_bvci)</span><br><span> {</span><br><span>    struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span>     unsigned int n_nses = 0;</span><br><span>     int errctr = GBPROX_GLOB_CTR_PROTO_ERR_SGSN;</span><br><span> </span><br><span>@@ -1191,21 +1191,21 @@</span><br><span>   if (TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2)) {</span><br><span>           uint16_t bvci = ntohs(tlvp_val16_unal(tp, BSSGP_IE_BVCI));</span><br><span>           errctr = GBPROX_GLOB_CTR_OTHER_ERR;</span><br><span style="color: hsl(0, 100%, 40%);">-             peer = gbproxy_peer_by_bvci(cfg, bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!peer) {</span><br><span style="color: hsl(120, 100%, 40%);">+          bvc = gbproxy_bvc_by_bvci(cfg, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!bvc) {</span><br><span>                  LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u/SGSN) BSSGP PAGING: "</span><br><span>                           "unable to route: BVCI=%05u unknown\n", nsei, bvci);</span><br><span>                       rate_ctr_inc(&cfg->ctrg->ctr[errctr]);</span><br><span>                     return -EINVAL;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGPBVC(peer, LOGL_INFO, "routing by BVCI\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                return gbprox_relay2peer(msg, peer, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPBVC(bvc, LOGL_INFO, "routing by BVCI\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return gbprox_relay2peer(msg, bvc, ns_bvci);</span><br><span>         } else if (TLVP_PRES_LEN(tp, BSSGP_IE_ROUTEING_AREA, 6)) {</span><br><span>           errctr = GBPROX_GLOB_CTR_INV_RAI;</span><br><span style="color: hsl(0, 100%, 40%);">-               /* iterate over all peers and dispatch the paging to each matching one */</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              if (!memcmp(peer->ra, TLVP_VAL(tp, BSSGP_IE_ROUTEING_AREA), 6)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* iterate over all bvcs and dispatch the paging to each matching one */</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          if (!memcmp(bvc->ra, TLVP_VAL(tp, BSSGP_IE_ROUTEING_AREA), 6)) {</span><br><span>                                  LOGPNSE(nse, LOGL_INFO, "routing to NSE (RAI match)\n");</span><br><span>                                   gbprox_relay2nse(msg, nse, ns_bvci);</span><br><span>                                         n_nses++;</span><br><span>@@ -1216,10 +1216,10 @@</span><br><span>          }</span><br><span>    } else if (TLVP_PRES_LEN(tp, BSSGP_IE_LOCATION_AREA, 5)) {</span><br><span>           errctr = GBPROX_GLOB_CTR_INV_LAI;</span><br><span style="color: hsl(0, 100%, 40%);">-               /* iterate over all peers and dispatch the paging to each matching one */</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              if (!memcmp(peer->ra, TLVP_VAL(tp, BSSGP_IE_LOCATION_AREA), 5)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* iterate over all bvcs and dispatch the paging to each matching one */</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          if (!memcmp(bvc->ra, TLVP_VAL(tp, BSSGP_IE_LOCATION_AREA), 5)) {</span><br><span>                                  LOGPNSE(nse, LOGL_INFO, "routing to NSE (LAI match)\n");</span><br><span>                                   gbprox_relay2nse(msg, nse, ns_bvci);</span><br><span>                                         n_nses++;</span><br><span>@@ -1229,9 +1229,9 @@</span><br><span>                    }</span><br><span>            }</span><br><span>    } else if (TLVP_PRES_LEN(tp, BSSGP_IE_BSS_AREA_ID, 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* iterate over all peers and dispatch the paging to each matching one */</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* iterate over all bvcs and dispatch the paging to each matching one */</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span>                                 LOGPNSE(nse, LOGL_INFO, "routing to NSE (broadcast)\n");</span><br><span>                           gbprox_relay2nse(msg, nse, ns_bvci);</span><br><span>                                 n_nses++;</span><br><span>@@ -1261,7 +1261,7 @@</span><br><span>                    uint32_t nsei, uint16_t ns_bvci)</span><br><span> {</span><br><span>        struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span>     uint16_t ptp_bvci;</span><br><span> </span><br><span>       if (!TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2)) {</span><br><span>@@ -1274,9 +1274,9 @@</span><br><span> </span><br><span>      if (ptp_bvci >= 2) {</span><br><span>              /* A reset for a PTP BVC was received, forward it to its</span><br><span style="color: hsl(0, 100%, 40%);">-                 * respective peer */</span><br><span style="color: hsl(0, 100%, 40%);">-           peer = gbproxy_peer_by_bvci(cfg, ptp_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!peer) {</span><br><span style="color: hsl(120, 100%, 40%);">+           * respective bvc */</span><br><span style="color: hsl(120, 100%, 40%);">+          bvc = gbproxy_bvc_by_bvci(cfg, ptp_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!bvc) {</span><br><span>                  LOGP(DGPRS, LOGL_ERROR, "NSE(%05u/SGSN) BVCI=%05u: Cannot find BSS\n",</span><br><span>                             nsei, ptp_bvci);</span><br><span>                     rate_ctr_inc(&cfg->ctrg-></span><br><span>@@ -1284,16 +1284,16 @@</span><br><span>                        return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI,</span><br><span>                                            &ptp_bvci, orig_msg);</span><br><span>             }</span><br><span style="color: hsl(0, 100%, 40%);">-               return gbprox_relay2peer(msg, peer, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+         return gbprox_relay2peer(msg, bvc, ns_bvci);</span><br><span>         }</span><br><span> </span><br><span>        /* A reset for the Signalling entity has been received</span><br><span>        * from the SGSN.  As the signalling BVCI is shared</span><br><span>   * among all the BSS's that we multiplex, it needs to</span><br><span>     * be relayed  */</span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry(peer, &nse->bts_peers, list)</span><br><span style="color: hsl(0, 100%, 40%);">-                        gbprox_relay2peer(msg, peer, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+        llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          llist_for_each_entry(bvc, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                    gbprox_relay2peer(msg, bvc, ns_bvci);</span><br><span>        }</span><br><span> </span><br><span>        return 0;</span><br><span>@@ -1310,7 +1310,7 @@</span><br><span>    uint8_t pdu_type = bgph->pdu_type;</span><br><span>        int data_len;</span><br><span>        struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span>     uint16_t bvci;</span><br><span>       struct msgb *msg;</span><br><span>    int rc = 0;</span><br><span>@@ -1397,10 +1397,10 @@</span><br><span>                /* RAI IE is mandatory */</span><br><span>            if (!TLVP_PRES_LEN(&tp, BSSGP_IE_ROUTEING_AREA, 6))</span><br><span>                      goto err_mand_ie;</span><br><span style="color: hsl(0, 100%, 40%);">-               peer = gbproxy_peer_by_rai(cfg, TLVP_VAL(&tp, BSSGP_IE_ROUTEING_AREA));</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!peer)</span><br><span style="color: hsl(0, 100%, 40%);">-                      goto err_no_peer;</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = gbprox_relay2peer(msg, peer, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+           bvc = gbproxy_bvc_by_rai(cfg, TLVP_VAL(&tp, BSSGP_IE_ROUTEING_AREA));</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!bvc)</span><br><span style="color: hsl(120, 100%, 40%);">+                     goto err_no_bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = gbprox_relay2peer(msg, bvc, ns_bvci);</span><br><span>           break;</span><br><span>       case BSSGP_PDUT_BVC_BLOCK_ACK:</span><br><span>       case BSSGP_PDUT_BVC_UNBLOCK_ACK:</span><br><span>@@ -1416,7 +1416,7 @@</span><br><span>                                  ctr[GBPROX_GLOB_CTR_INV_BVCI]);</span><br><span>                 } else {</span><br><span>                     /* Mark BVC as (un)blocked */</span><br><span style="color: hsl(0, 100%, 40%);">-                   block_unblock_peer(cfg, bvci, pdu_type);</span><br><span style="color: hsl(120, 100%, 40%);">+                      block_unblock_bvc(cfg, bvci, pdu_type);</span><br><span>              }</span><br><span>            rc = gbprox_relay2bvci(cfg, msg, bvci, ns_bvci);</span><br><span>             break;</span><br><span>@@ -1424,8 +1424,8 @@</span><br><span>       case BSSGP_PDUT_OVERLOAD:</span><br><span>            LOGP(DGPRS, LOGL_DEBUG,</span><br><span>                      "NSE(%05u/SGSN) BSSGP %s: broadcasting\n", nsei, bssgp_pdu_str(pdu_type));</span><br><span style="color: hsl(0, 100%, 40%);">-            /* broadcast to all BSS-side peers */</span><br><span style="color: hsl(0, 100%, 40%);">-           llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* broadcast to all BSS-side bvcs */</span><br><span style="color: hsl(120, 100%, 40%);">+          llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span>                         gbprox_relay2nse(msg, nse, 0);</span><br><span>               }</span><br><span>            break;</span><br><span>@@ -1448,8 +1448,8 @@</span><br><span>                    ctr[GBPROX_GLOB_CTR_PROTO_ERR_SGSN]);</span><br><span>   msgb_free(msg);</span><br><span>      return bssgp_tx_status(BSSGP_CAUSE_MISSING_MAND_IE, NULL, orig_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-err_no_peer:</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGP(DGPRS, LOGL_ERROR, "NSE(%05u/SGSN) cannot find peer based on RAI\n",</span><br><span style="color: hsl(120, 100%, 40%);">+err_no_bvc:</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DGPRS, LOGL_ERROR, "NSE(%05u/SGSN) cannot find bvc based on RAI\n",</span><br><span>           nsei);</span><br><span>       rate_ctr_inc(&cfg->ctrg-> ctr[GBPROX_GLOB_CTR_INV_RAI]);</span><br><span>   msgb_free(msg);</span><br><span>@@ -1519,10 +1519,10 @@</span><br><span> </span><br><span> void gprs_ns_prim_status_cb(struct gbproxy_config *cfg, struct osmo_gprs_ns2_prim *nsp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   /* TODO: bss nsei available/unavailable  bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_BLOCK, nsvc->nsei, peer->bvci, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: bss nsei available/unavailable  bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_BLOCK, nsvc->nsei, bvc->bvci, 0);</span><br><span>          * TODO: sgsn nsei available/unavailable</span><br><span>      */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span> </span><br><span>         switch (nsp->u.status.cause) {</span><br><span>    case NS_AFF_CAUSE_SNS_FAILURE:</span><br><span>@@ -1549,18 +1549,18 @@</span><br><span>             } else {</span><br><span>                     /* bss became unavailable</span><br><span>                     * TODO: Block all BVC belonging to that NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-                 peer = gbproxy_peer_by_nsei(cfg, nsp->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!peer) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  bvc = gbproxy_bvc_by_nsei(cfg, nsp->nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (!bvc) {</span><br><span>                          /* TODO: use primitive name + status cause name */</span><br><span style="color: hsl(0, 100%, 40%);">-                              LOGP(DGPRS, LOGL_NOTICE, "Received ns2 primitive %d for unknown peer NSEI=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGP(DGPRS, LOGL_NOTICE, "Received ns2 primitive %d for unknown bvc NSEI=%u\n",</span><br><span>                                 nsp->u.status.cause, nsp->nsei);</span><br><span>                          break;</span><br><span>                       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   if (!peer->blocked)</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (!bvc->blocked)</span><br><span>                                break;</span><br><span>                       bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_BLOCK, cfg->nsip_sgsn_nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           peer->bvci, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                                            bvc->bvci, 0);</span><br><span>               }</span><br><span>            LOGP(DPCU, LOGL_NOTICE, "NS-NSE %d became unavailable\n", nsp->nsei);</span><br><span>           break;</span><br><span>@@ -1620,10 +1620,10 @@</span><br><span> {</span><br><span>        struct gbproxy_nse *nse, *ntmp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry_safe(nse, ntmp, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct gbproxy_peer *peer, *tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry_safe(peer, tmp, &nse->bts_peers, list)</span><br><span style="color: hsl(0, 100%, 40%);">-                      gbproxy_peer_free(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry_safe(nse, ntmp, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct gbproxy_bvc *bvc, *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+                llist_for_each_entry_safe(bvc, tmp, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                  gbproxy_bvc_free(bvc);</span><br><span> </span><br><span>           gbproxy_nse_free(nse);</span><br><span>       }</span><br><span>@@ -1636,7 +1636,7 @@</span><br><span> {</span><br><span>       struct timespec tp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- INIT_LLIST_HEAD(&cfg->nse_peers);</span><br><span style="color: hsl(120, 100%, 40%);">+      INIT_LLIST_HEAD(&cfg->nses);</span><br><span>  cfg->ctrg = rate_ctr_group_alloc(tall_sgsn_ctx, &global_ctrg_desc, 0);</span><br><span>        if (!cfg->ctrg) {</span><br><span>                 LOGP(DGPRS, LOGL_ERROR, "Cannot allocate global counter group!\n");</span><br><span>diff --git a/src/gbproxy/gb_proxy_ctrl.c b/src/gbproxy/gb_proxy_ctrl.c</span><br><span>index 482bca0..097a29e 100644</span><br><span>--- a/src/gbproxy/gb_proxy_ctrl.c</span><br><span>+++ b/src/gbproxy/gb_proxy_ctrl.c</span><br><span>@@ -69,7 +69,7 @@</span><br><span>           gprs_ns2_nse_foreach_nsvc(nse, &ctrl_nsvc_state_cb, cmd);</span><br><span> </span><br><span>    /* NS-VCs for BSS peers */</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_for_each_entry(nse_peer, &cfg->nse_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+        llist_for_each_entry(nse_peer, &cfg->nses, list) {</span><br><span>            nse = gprs_ns2_nse_by_nsei(nsi, nse_peer->nsei);</span><br><span>          if (nse)</span><br><span>                     gprs_ns2_nse_foreach_nsvc(nse, &ctrl_nsvc_state_cb, cmd);</span><br><span>@@ -87,17 +87,17 @@</span><br><span> </span><br><span>      cmd->reply = talloc_strdup(cmd, "");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   llist_for_each_entry(nse_peer, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-          struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse_peer->bts_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+       llist_for_each_entry(nse_peer, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+             struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse_peer->bvcs, list) {</span><br><span>                    struct gprs_ra_id raid;</span><br><span style="color: hsl(0, 100%, 40%);">-                 gsm48_parse_ra(&raid, peer->ra);</span><br><span style="color: hsl(120, 100%, 40%);">+                       gsm48_parse_ra(&raid, bvc->ra);</span><br><span> </span><br><span>                   cmd->reply = talloc_asprintf_append(cmd->reply, "%u,%u,%u,%u,%u,%u,%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                       nse_peer->nsei, peer->bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     nse_peer->nsei, bvc->bvci,</span><br><span>                                     raid.mcc, raid.mnc,</span><br><span>                                  raid.lac, raid.rac,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     peer->blocked ? "BLOCKED" : "UNBLOCKED");</span><br><span style="color: hsl(120, 100%, 40%);">+                                      bvc->blocked ? "BLOCKED" : "UNBLOCKED");</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span>@@ -112,8 +112,8 @@</span><br><span>  struct gbproxy_nse *nse_peer;</span><br><span>        uint32_t count = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(nse_peer, &cfg->nse_peers, list)</span><br><span style="color: hsl(0, 100%, 40%);">-            count += llist_count(&nse_peer->bts_peers);</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(nse_peer, &cfg->nses, list)</span><br><span style="color: hsl(120, 100%, 40%);">+               count += llist_count(&nse_peer->bvcs);</span><br><span> </span><br><span>    cmd->reply = talloc_strdup(cmd, "");</span><br><span>    cmd->reply = talloc_asprintf_append(cmd->reply, "%u", count);</span><br><span>diff --git a/src/gbproxy/gb_proxy_patch.c b/src/gbproxy/gb_proxy_patch.c</span><br><span>index 5915722..e78d31b 100644</span><br><span>--- a/src/gbproxy/gb_proxy_patch.c</span><br><span>+++ b/src/gbproxy/gb_proxy_patch.c</span><br><span>@@ -33,20 +33,20 @@</span><br><span> extern void *tall_sgsn_ctx;</span><br><span> </span><br><span> /* patch RA identifier in place */</span><br><span style="color: hsl(0, 100%, 40%);">-static void gbproxy_patch_raid(struct gsm48_ra_id *raid_enc, struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static void gbproxy_patch_raid(struct gsm48_ra_id *raid_enc, struct gbproxy_bvc *bvc,</span><br><span>                             int to_bss, const char *log_text)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span>        struct osmo_plmn_id old_plmn;</span><br><span>        struct gprs_ra_id raid;</span><br><span style="color: hsl(0, 100%, 40%);">- enum gbproxy_peer_ctr counter =</span><br><span style="color: hsl(120, 100%, 40%);">+       enum gbproxy_bvc_ctr counter =</span><br><span>               to_bss ?</span><br><span>             GBPROX_PEER_CTR_RAID_PATCHED_SGSN :</span><br><span>          GBPROX_PEER_CTR_RAID_PATCHED_BSS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        if (!state->local_plmn.mcc || !state->local_plmn.mnc)</span><br><span>@@ -80,7 +80,7 @@</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGPBVC(peer, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPBVC(bvc, LOGL_DEBUG,</span><br><span>          "Patching %s to %s: "</span><br><span>              "%s-%d-%d -> %s\n",</span><br><span>             log_text,</span><br><span>@@ -89,12 +89,12 @@</span><br><span>              osmo_rai_name(&raid));</span><br><span> </span><br><span>  gsm48_encode_ra(raid_enc, &raid);</span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&peer->ctrg->ctr[counter]);</span><br><span style="color: hsl(120, 100%, 40%);">+    rate_ctr_inc(&bvc->ctrg->ctr[counter]);</span><br><span> }</span><br><span> </span><br><span> static void gbproxy_patch_apn_ie(struct msgb *msg,</span><br><span>                              uint8_t *apn_ie, size_t apn_ie_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                             struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                            struct gbproxy_bvc *bvc,</span><br><span>                             size_t *new_apn_ie_len, const char *log_text)</span><br><span> {</span><br><span>  struct apn_ie_hdr {</span><br><span>@@ -105,9 +105,9 @@</span><br><span> </span><br><span>        size_t apn_len = hdr->apn_len;</span><br><span>    uint8_t *apn = hdr->apn;</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        OSMO_ASSERT(apn_ie_len == apn_len + sizeof(struct apn_ie_hdr));</span><br><span>@@ -116,7 +116,7 @@</span><br><span>        if (cfg->core_apn_size == 0) {</span><br><span>            char str1[110];</span><br><span>              /* Remove the IE */</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPBVC(peer, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPBVC(bvc, LOGL_DEBUG,</span><br><span>                  "Patching %s to SGSN: Removing APN '%s'\n",</span><br><span>                log_text,</span><br><span>                    osmo_apn_to_str(str1, apn, apn_len));</span><br><span>@@ -130,7 +130,7 @@</span><br><span> </span><br><span>                 OSMO_ASSERT(cfg->core_apn_size <= 100);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               LOGPBVC(peer, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPBVC(bvc, LOGL_DEBUG,</span><br><span>                  "Patching %s to SGSN: "</span><br><span>                    "Replacing APN '%s' -> '%s'\n",</span><br><span>                 log_text,</span><br><span>@@ -144,21 +144,21 @@</span><br><span>               hdr->apn_len = cfg->core_apn_size;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&peer->ctrg->ctr[GBPROX_PEER_CTR_APN_PATCHED]);</span><br><span style="color: hsl(120, 100%, 40%);">+        rate_ctr_inc(&bvc->ctrg->ctr[GBPROX_PEER_CTR_APN_PATCHED]);</span><br><span> }</span><br><span> </span><br><span> static int gbproxy_patch_tlli(uint8_t *tlli_enc,</span><br><span style="color: hsl(0, 100%, 40%);">-                            struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                            struct gbproxy_bvc *bvc,</span><br><span>                             uint32_t new_tlli,</span><br><span>                           int to_bss, const char *log_text)</span><br><span> {</span><br><span>         uint32_t tlli_be;</span><br><span>    uint32_t tlli;</span><br><span style="color: hsl(0, 100%, 40%);">-  enum gbproxy_peer_ctr counter =</span><br><span style="color: hsl(120, 100%, 40%);">+       enum gbproxy_bvc_ctr counter =</span><br><span>               to_bss ?</span><br><span>             GBPROX_PEER_CTR_TLLI_PATCHED_SGSN :</span><br><span>          GBPROX_PEER_CTR_TLLI_PATCHED_BSS;</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span> </span><br><span>        memcpy(&tlli_be, tlli_enc, sizeof(tlli_be));</span><br><span>     tlli = ntohl(tlli_be);</span><br><span>@@ -166,7 +166,7 @@</span><br><span>         if (tlli == new_tlli)</span><br><span>                return 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGPBVC(peer, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPBVC(bvc, LOGL_DEBUG,</span><br><span>          "Patching %ss: "</span><br><span>           "Replacing %08x -> %08x\n",</span><br><span>             log_text, tlli, new_tlli);</span><br><span>@@ -174,23 +174,23 @@</span><br><span>      tlli_be = htonl(new_tlli);</span><br><span>   memcpy(tlli_enc, &tlli_be, sizeof(tlli_be));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    rate_ctr_inc(&peer->ctrg->ctr[counter]);</span><br><span style="color: hsl(120, 100%, 40%);">+    rate_ctr_inc(&bvc->ctrg->ctr[counter]);</span><br><span> </span><br><span>        return 1;</span><br><span> }</span><br><span> </span><br><span> static int gbproxy_patch_ptmsi(uint8_t *ptmsi_enc,</span><br><span style="color: hsl(0, 100%, 40%);">-                               struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                            struct gbproxy_bvc *bvc,</span><br><span>                             uint32_t new_ptmsi,</span><br><span>                          int to_bss, const char *log_text)</span><br><span> {</span><br><span>        uint32_t ptmsi_be;</span><br><span>   uint32_t ptmsi;</span><br><span style="color: hsl(0, 100%, 40%);">- enum gbproxy_peer_ctr counter =</span><br><span style="color: hsl(120, 100%, 40%);">+       enum gbproxy_bvc_ctr counter =</span><br><span>               to_bss ?</span><br><span>             GBPROX_PEER_CTR_PTMSI_PATCHED_SGSN :</span><br><span>                 GBPROX_PEER_CTR_PTMSI_PATCHED_BSS;</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span> </span><br><span>        memcpy(&ptmsi_be, ptmsi_enc, sizeof(ptmsi_be));</span><br><span>  ptmsi = ntohl(ptmsi_be);</span><br><span>@@ -198,7 +198,7 @@</span><br><span>       if (ptmsi == new_ptmsi)</span><br><span>              return 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGPBVC(peer, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPBVC(bvc, LOGL_DEBUG,</span><br><span>          "Patching %ss: "</span><br><span>           "Replacing %08x -> %08x\n",</span><br><span>             log_text, ptmsi, new_ptmsi);</span><br><span>@@ -206,22 +206,22 @@</span><br><span>    ptmsi_be = htonl(new_ptmsi);</span><br><span>         memcpy(ptmsi_enc, &ptmsi_be, sizeof(ptmsi_be));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&peer->ctrg->ctr[counter]);</span><br><span style="color: hsl(120, 100%, 40%);">+    rate_ctr_inc(&bvc->ctrg->ctr[counter]);</span><br><span> </span><br><span>        return 1;</span><br><span> }</span><br><span> </span><br><span> int gbproxy_patch_llc(struct msgb *msg, uint8_t *llc, size_t llc_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                  struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                    struct gbproxy_bvc *bvc,</span><br><span>                     struct gbproxy_link_info *link_info, int *len_change,</span><br><span>                struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>   struct gprs_llc_hdr_parsed *ghp = &parse_ctx->llc_hdr_parsed;</span><br><span>         int have_patched = 0;</span><br><span>        int fcs;</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        if (parse_ctx->ptmsi_enc && link_info &&</span><br><span>@@ -233,7 +233,7 @@</span><br><span>                    ptmsi = link_info->sgsn_tlli.ptmsi;</span><br><span> </span><br><span>           if (ptmsi != GSM_RESERVED_TMSI) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (gbproxy_patch_ptmsi(parse_ctx->ptmsi_enc, peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (gbproxy_patch_ptmsi(parse_ctx->ptmsi_enc, bvc,</span><br><span>                                                ptmsi, parse_ctx->to_bss, "P-TMSI"))</span><br><span>                            have_patched = 1;</span><br><span>            } else {</span><br><span>@@ -249,20 +249,20 @@</span><br><span>                     ptmsi = link_info->sgsn_tlli.ptmsi;</span><br><span> </span><br><span>           OSMO_ASSERT(ptmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (gbproxy_patch_ptmsi(parse_ctx->new_ptmsi_enc, peer,</span><br><span style="color: hsl(120, 100%, 40%);">+            if (gbproxy_patch_ptmsi(parse_ctx->new_ptmsi_enc, bvc,</span><br><span>                                    ptmsi, parse_ctx->to_bss, "new P-TMSI"))</span><br><span>                        have_patched = 1;</span><br><span>    }</span><br><span> </span><br><span>        if (parse_ctx->raid_enc) {</span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_patch_raid((struct gsm48_ra_id *)parse_ctx->raid_enc, peer, parse_ctx->to_bss,</span><br><span style="color: hsl(120, 100%, 40%);">+          gbproxy_patch_raid((struct gsm48_ra_id *)parse_ctx->raid_enc, bvc, parse_ctx->to_bss,</span><br><span>                             parse_ctx->llc_msg_name);</span><br><span>              have_patched = 1;</span><br><span>    }</span><br><span> </span><br><span>        if (parse_ctx->old_raid_enc && !parse_ctx->old_raid_is_foreign) {</span><br><span>              /* TODO: Patch to invalid if P-TMSI unknown. */</span><br><span style="color: hsl(0, 100%, 40%);">-         gbproxy_patch_raid((struct gsm48_ra_id *)parse_ctx->old_raid_enc, peer, parse_ctx->to_bss,</span><br><span style="color: hsl(120, 100%, 40%);">+              gbproxy_patch_raid((struct gsm48_ra_id *)parse_ctx->old_raid_enc, bvc, parse_ctx->to_bss,</span><br><span>                                 parse_ctx->llc_msg_name);</span><br><span>              have_patched = 1;</span><br><span>    }</span><br><span>@@ -275,7 +275,7 @@</span><br><span>              size_t new_len;</span><br><span>              gbproxy_patch_apn_ie(msg,</span><br><span>                                 parse_ctx->apn_ie, parse_ctx->apn_ie_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 peer, &new_len, parse_ctx->llc_msg_name);</span><br><span style="color: hsl(120, 100%, 40%);">+                              bvc, &new_len, parse_ctx->llc_msg_name);</span><br><span>                 *len_change += (int)new_len - (int)parse_ctx->apn_ie_len;</span><br><span> </span><br><span>             have_patched = 1;</span><br><span>@@ -287,7 +287,7 @@</span><br><span> </span><br><span>          /* Fix FCS */</span><br><span>                fcs = gprs_llc_fcs(llc, ghp->crc_length);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPBVC_CAT(peer, DLLC, LOGL_DEBUG, "Updated LLC message, CRC: %06x -> %06x\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPBVC_CAT(bvc, DLLC, LOGL_DEBUG, "Updated LLC message, CRC: %06x -> %06x\n",</span><br><span>               ghp->fcs, fcs);</span><br><span> </span><br><span>          llc[llc_len - 3] = fcs & 0xff;</span><br><span>@@ -300,18 +300,18 @@</span><br><span> </span><br><span> /* patch BSSGP message to use core_plmn.mcc/mnc on the SGSN side */</span><br><span> void gbproxy_patch_bssgp(struct msgb *msg, uint8_t *bssgp, size_t bssgp_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                    struct gbproxy_bvc *bvc,</span><br><span>                     struct gbproxy_link_info *link_info, int *len_change,</span><br><span>                        struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>       const char *err_info = NULL;</span><br><span>         int err_ctr = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        if (parse_ctx->bssgp_raid_enc)</span><br><span style="color: hsl(0, 100%, 40%);">-               gbproxy_patch_raid((struct gsm48_ra_id *)parse_ctx->bssgp_raid_enc, peer,</span><br><span style="color: hsl(120, 100%, 40%);">+          gbproxy_patch_raid((struct gsm48_ra_id *)parse_ctx->bssgp_raid_enc, bvc,</span><br><span>                             parse_ctx->to_bss, "BSSGP");</span><br><span> </span><br><span>     if (parse_ctx->need_decryption &&</span><br><span>@@ -342,7 +342,7 @@</span><br><span>                                            link_info, parse_ctx->to_bss);</span><br><span> </span><br><span>               if (tlli) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     gbproxy_patch_tlli(parse_ctx->tlli_enc, peer, tlli,</span><br><span style="color: hsl(120, 100%, 40%);">+                        gbproxy_patch_tlli(parse_ctx->tlli_enc, bvc, tlli,</span><br><span>                                           parse_ctx->to_bss, "TLLI");</span><br><span>                  parse_ctx->tlli = tlli;</span><br><span>           } else {</span><br><span>@@ -362,7 +362,7 @@</span><br><span> </span><br><span>           if (ptmsi != GSM_RESERVED_TMSI)</span><br><span>                      gbproxy_patch_ptmsi(</span><br><span style="color: hsl(0, 100%, 40%);">-                            parse_ctx->bssgp_ptmsi_enc, peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                          parse_ctx->bssgp_ptmsi_enc, bvc,</span><br><span>                          ptmsi, parse_ctx->to_bss, "BSSGP P-TMSI");</span><br><span>      }</span><br><span> </span><br><span>@@ -371,7 +371,7 @@</span><br><span>          size_t llc_len = parse_ctx->llc_len;</span><br><span>              int llc_len_change = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             gbproxy_patch_llc(msg, llc, llc_len, peer, link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+         gbproxy_patch_llc(msg, llc, llc_len, bvc, link_info,</span><br><span>                                   &llc_len_change, parse_ctx);</span><br><span>           /* Note that the APN might have been resized here, but no</span><br><span>             * pointer int the parse_ctx will refer to an adress after the</span><br><span>@@ -406,8 +406,8 @@</span><br><span> </span><br><span> patch_error:</span><br><span>     OSMO_ASSERT(err_ctr >= 0);</span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&peer->ctrg->ctr[err_ctr]);</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGPBVC(peer, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(&bvc->ctrg->ctr[err_ctr]);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPBVC(bvc, LOGL_ERROR,</span><br><span>          "NSE(%05u/%s) failed to patch BSSGP message as requested: %s.\n",</span><br><span>          msgb_nsei(msg), parse_ctx->to_bss ? "SGSN" : "BSS",</span><br><span>           err_info);</span><br><span>diff --git a/src/gbproxy/gb_proxy_peer.c b/src/gbproxy/gb_proxy_peer.c</span><br><span>index 79ea8e3..a5b93ee 100644</span><br><span>--- a/src/gbproxy/gb_proxy_peer.c</span><br><span>+++ b/src/gbproxy/gb_proxy_peer.c</span><br><span>@@ -35,7 +35,7 @@</span><br><span> </span><br><span> extern void *tall_sgsn_ctx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_desc peer_ctr_description[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_desc bvc_ctr_description[] = {</span><br><span>         { "blocked",     "BVC Block                       " },</span><br><span>   { "unblocked",           "BVC Unblock                     " },</span><br><span>   { "dropped",     "BVC blocked, dropped packet     " },</span><br><span>@@ -71,98 +71,98 @@</span><br><span>     { "tlli-cache",    "TLLI cache size                 " },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-osmo_static_assert(ARRAY_SIZE(peer_ctr_description) == GBPROX_PEER_CTR_LAST, everything_described);</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_static_assert(ARRAY_SIZE(bvc_ctr_description) == GBPROX_PEER_CTR_LAST, everything_described);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_group_desc peer_ctrg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_group_desc bvc_ctrg_desc = {</span><br><span>       .group_name_prefix = "gbproxy:peer",</span><br><span>       .group_description = "GBProxy Peer Statistics",</span><br><span style="color: hsl(0, 100%, 40%);">-       .num_ctr = ARRAY_SIZE(peer_ctr_description),</span><br><span style="color: hsl(0, 100%, 40%);">-    .ctr_desc = peer_ctr_description,</span><br><span style="color: hsl(120, 100%, 40%);">+     .num_ctr = ARRAY_SIZE(bvc_ctr_description),</span><br><span style="color: hsl(120, 100%, 40%);">+   .ctr_desc = bvc_ctr_description,</span><br><span>     .class_id = OSMO_STATS_CLASS_PEER,</span><br><span> };</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Find the gbproxy_peer by its BVCI. There can only be one match */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_bvci(struct gbproxy_config *cfg, uint16_t bvci)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Find the gbproxy_bvc by its BVCI. There can only be one match */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_bvci(struct gbproxy_config *cfg, uint16_t bvci)</span><br><span> {</span><br><span>       struct gbproxy_nse *nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (peer->bvci == bvci)</span><br><span style="color: hsl(0, 100%, 40%);">-                              return peer;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (bvc->bvci == bvci)</span><br><span style="color: hsl(120, 100%, 40%);">+                             return bvc;</span><br><span>          }</span><br><span>    }</span><br><span>    return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Find the gbproxy_peer by its NSEI */</span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: Only returns the first peer, but we could have multiple on this nsei */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_nsei(struct gbproxy_config *cfg,</span><br><span style="color: hsl(120, 100%, 40%);">+/* Find the gbproxy_bvc by its NSEI */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: Only returns the first bvc, but we could have multiple on this nsei */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_nsei(struct gbproxy_config *cfg,</span><br><span>                                      uint16_t nsei)</span><br><span> {</span><br><span>        struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (nse->nsei == nsei && !llist_empty(&nse->bts_peers))</span><br><span style="color: hsl(0, 100%, 40%);">-                       return llist_first_entry(&nse->bts_peers, struct gbproxy_peer, list);</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (nse->nsei == nsei && !llist_empty(&nse->bvcs))</span><br><span style="color: hsl(120, 100%, 40%);">+                  return llist_first_entry(&nse->bvcs, struct gbproxy_bvc, list);</span><br><span>       }</span><br><span>    return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* look-up a peer by its Routeing Area Identification (RAI) */</span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: this doesn't make sense, as RA can span multiple peers! */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_rai(struct gbproxy_config *cfg,</span><br><span style="color: hsl(120, 100%, 40%);">+/* look-up a bvc by its Routeing Area Identification (RAI) */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: this doesn't make sense, as RA can span multiple bvcs! */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_rai(struct gbproxy_config *cfg,</span><br><span>                                   const uint8_t *ra)</span><br><span> {</span><br><span>     struct gbproxy_nse *nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (!memcmp(peer->ra, ra, 6))</span><br><span style="color: hsl(0, 100%, 40%);">-                                return peer;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (!memcmp(bvc->ra, ra, 6))</span><br><span style="color: hsl(120, 100%, 40%);">+                               return bvc;</span><br><span>          }</span><br><span>    }</span><br><span> </span><br><span>        return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* look-up a peer by its Location Area Identification (LAI) */</span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: this doesn't make sense, as LA can span multiple peers! */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_lai(struct gbproxy_config *cfg,</span><br><span style="color: hsl(120, 100%, 40%);">+/* look-up a bvc by its Location Area Identification (LAI) */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: this doesn't make sense, as LA can span multiple bvcs! */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_lai(struct gbproxy_config *cfg,</span><br><span>                                   const uint8_t *la)</span><br><span> {</span><br><span>     struct gbproxy_nse *nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (!memcmp(peer->ra, la, 5))</span><br><span style="color: hsl(0, 100%, 40%);">-                                return peer;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (!memcmp(bvc->ra, la, 5))</span><br><span style="color: hsl(120, 100%, 40%);">+                               return bvc;</span><br><span>          }</span><br><span>    }</span><br><span>    return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* look-up a peer by its Location Area Code (LAC) */</span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: this doesn't make sense, as LAC can span multiple peers! */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_lac(struct gbproxy_config *cfg,</span><br><span style="color: hsl(120, 100%, 40%);">+/* look-up a bvc by its Location Area Code (LAC) */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: this doesn't make sense, as LAC can span multiple bvcs! */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_lac(struct gbproxy_config *cfg,</span><br><span>                                     const uint8_t *la)</span><br><span> {</span><br><span>     struct gbproxy_nse *nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (!memcmp(peer->ra + 3, la + 3, 2))</span><br><span style="color: hsl(0, 100%, 40%);">-                                return peer;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (!memcmp(bvc->ra + 3, la + 3, 2))</span><br><span style="color: hsl(120, 100%, 40%);">+                               return bvc;</span><br><span>          }</span><br><span>    }</span><br><span>    return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_by_bssgp_tlv(struct gbproxy_config *cfg,</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_by_bssgp_tlv(struct gbproxy_config *cfg,</span><br><span>                                           struct tlv_parsed *tp)</span><br><span> {</span><br><span>   if (TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2)) {</span><br><span>@@ -170,22 +170,22 @@</span><br><span> </span><br><span>               bvci = ntohs(tlvp_val16_unal(tp, BSSGP_IE_BVCI));</span><br><span>            if (bvci >= 2)</span><br><span style="color: hsl(0, 100%, 40%);">-                       return gbproxy_peer_by_bvci(cfg, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return gbproxy_bvc_by_bvci(cfg, bvci);</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* FIXME: this doesn't make sense, as RA can span multiple peers! */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: this doesn't make sense, as RA can span multiple bvcs! */</span><br><span>      if (TLVP_PRES_LEN(tp, BSSGP_IE_ROUTEING_AREA, 6)) {</span><br><span>          uint8_t *rai = (uint8_t *)TLVP_VAL(tp, BSSGP_IE_ROUTEING_AREA);</span><br><span>              /* Only compare LAC part, since MCC/MNC are possibly patched.</span><br><span>                 * Since the LAC of different BSS must be different when</span><br><span>              * MCC/MNC are patched, collisions shouldn't happen. */</span><br><span style="color: hsl(0, 100%, 40%);">-             return gbproxy_peer_by_lac(cfg, rai);</span><br><span style="color: hsl(120, 100%, 40%);">+         return gbproxy_bvc_by_lac(cfg, rai);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* FIXME: this doesn't make sense, as LA can span multiple peers! */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: this doesn't make sense, as LA can span multiple bvcs! */</span><br><span>      if (TLVP_PRES_LEN(tp, BSSGP_IE_LOCATION_AREA, 5)) {</span><br><span>          uint8_t *lai = (uint8_t *)TLVP_VAL(tp, BSSGP_IE_LOCATION_AREA);</span><br><span style="color: hsl(0, 100%, 40%);">-         return gbproxy_peer_by_lac(cfg, lai);</span><br><span style="color: hsl(120, 100%, 40%);">+         return gbproxy_bvc_by_lac(cfg, lai);</span><br><span>         }</span><br><span> </span><br><span>        return NULL;</span><br><span>@@ -195,88 +195,92 @@</span><br><span> {</span><br><span>    time_t now;</span><br><span>  struct timespec ts = {0,};</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_peer *peer = (struct gbproxy_peer *) data;</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc = (struct gbproxy_bvc *) data;</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span>        now = ts.tv_sec;</span><br><span style="color: hsl(0, 100%, 40%);">-        gbproxy_remove_stale_link_infos(peer, now);</span><br><span style="color: hsl(120, 100%, 40%);">+   gbproxy_remove_stale_link_infos(bvc, now);</span><br><span>   if (cfg->clean_stale_timer_freq != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_timer_schedule(&peer->clean_stale_timer,</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_timer_schedule(&bvc->clean_stale_timer,</span><br><span>                                  cfg->clean_stale_timer_freq, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_peer *gbproxy_peer_alloc(struct gbproxy_nse *nse, uint16_t bvci)</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_bvc *gbproxy_bvc_alloc(struct gbproxy_nse *nse, uint16_t bvci)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc;</span><br><span>     OSMO_ASSERT(nse);</span><br><span>    struct gbproxy_config *cfg = nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   peer = talloc_zero(tall_sgsn_ctx, struct gbproxy_peer);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!peer)</span><br><span style="color: hsl(120, 100%, 40%);">+    bvc = talloc_zero(tall_sgsn_ctx, struct gbproxy_bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bvc)</span><br><span>            return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        peer->bvci = bvci;</span><br><span style="color: hsl(0, 100%, 40%);">-   peer->ctrg = rate_ctr_group_alloc(peer, &peer_ctrg_desc, bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!peer->ctrg) {</span><br><span style="color: hsl(0, 100%, 40%);">-           talloc_free(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    bvc->bvci = bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+  bvc->ctrg = rate_ctr_group_alloc(bvc, &bvc_ctrg_desc, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!bvc->ctrg) {</span><br><span style="color: hsl(120, 100%, 40%);">+          talloc_free(bvc);</span><br><span>            return NULL;</span><br><span>         }</span><br><span style="color: hsl(0, 100%, 40%);">-       peer->nse = nse;</span><br><span style="color: hsl(120, 100%, 40%);">+   bvc->nse = nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  llist_add(&peer->list, &nse->bts_peers);</span><br><span style="color: hsl(120, 100%, 40%);">+        llist_add(&bvc->list, &nse->bvcs);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    INIT_LLIST_HEAD(&peer->patch_state.logical_links);</span><br><span style="color: hsl(120, 100%, 40%);">+     INIT_LLIST_HEAD(&bvc->patch_state.logical_links);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_timer_setup(&peer->clean_stale_timer, clean_stale_timer_cb, peer);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_timer_setup(&bvc->clean_stale_timer, clean_stale_timer_cb, bvc);</span><br><span>         if (cfg->clean_stale_timer_freq != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_timer_schedule(&peer->clean_stale_timer,</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_timer_schedule(&bvc->clean_stale_timer,</span><br><span>                                  cfg->clean_stale_timer_freq, 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return peer;</span><br><span style="color: hsl(120, 100%, 40%);">+  return bvc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_peer_free(struct gbproxy_peer *peer)</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_bvc_free(struct gbproxy_bvc *bvc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!peer)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bvc)</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     llist_del(&peer->list);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_timer_del(&peer->clean_stale_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-        gbproxy_delete_link_infos(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_del(&bvc->list);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_del(&bvc->clean_stale_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+       gbproxy_delete_link_infos(bvc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rate_ctr_group_free(peer->ctrg);</span><br><span style="color: hsl(0, 100%, 40%);">-     peer->ctrg = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_group_free(bvc->ctrg);</span><br><span style="color: hsl(120, 100%, 40%);">+    bvc->ctrg = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        talloc_free(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_free(bvc);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_peer_move(struct gbproxy_peer *peer, struct gbproxy_nse *nse)</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_bvc_move(struct gbproxy_bvc *bvc, struct gbproxy_nse *nse)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_del(&peer->list);</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_add(&peer->list, &nse->bts_peers);</span><br><span style="color: hsl(0, 100%, 40%);">-  peer->nse = nse;</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_del(&bvc->list);</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_add(&bvc->list, &nse->bvcs);</span><br><span style="color: hsl(120, 100%, 40%);">+      bvc->nse = nse;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gbproxy_cleanup_peers(struct gbproxy_config *cfg, uint16_t nsei, uint16_t bvci)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! remove bvcs (BVCs) on NSE specified by NSEI.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] cfg proxy in which we operate</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] nsei NS entity in which we should clean up</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] bvci if 0: remove all BVCs; if != 0: BVCI of the single BVC to clean up */</span><br><span style="color: hsl(120, 100%, 40%);">+int gbproxy_cleanup_bvcs(struct gbproxy_config *cfg, uint16_t nsei, uint16_t bvci)</span><br><span> {</span><br><span>        int counter = 0;</span><br><span>     struct gbproxy_nse *nse, *ntmp;</span><br><span>      OSMO_ASSERT(cfg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   llist_for_each_entry_safe(nse, ntmp, &cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct gbproxy_peer *peer, *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry_safe(nse, ntmp, &cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct gbproxy_bvc *bvc, *tmp;</span><br><span>               if (nse->nsei != nsei)</span><br><span>                    continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry_safe(peer, tmp, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (bvci && peer->bvci != bvci)</span><br><span style="color: hsl(120, 100%, 40%);">+            llist_for_each_entry_safe(bvc, tmp, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (bvci && bvc->bvci != bvci)</span><br><span>                            continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   gbproxy_peer_free(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+                      gbproxy_bvc_free(bvc);</span><br><span>                       counter += 1;</span><br><span>                }</span><br><span>    }</span><br><span>@@ -296,23 +300,23 @@</span><br><span>    nse->nsei = nsei;</span><br><span>         nse->cfg = cfg;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  llist_add(&nse->list, &cfg->nse_peers);</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_add(&nse->list, &cfg->nses);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    INIT_LLIST_HEAD(&nse->bts_peers);</span><br><span style="color: hsl(120, 100%, 40%);">+      INIT_LLIST_HEAD(&nse->bvcs);</span><br><span> </span><br><span>      return nse;</span><br><span> }</span><br><span> </span><br><span> void gbproxy_nse_free(struct gbproxy_nse *nse)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gbproxy_peer *peer, *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gbproxy_bvc *bvc, *tmp;</span><br><span>       if (!nse)</span><br><span>            return;</span><br><span> </span><br><span>  llist_del(&nse->list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry_safe(peer, tmp, &nse->bts_peers, list)</span><br><span style="color: hsl(0, 100%, 40%);">-              gbproxy_peer_free(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry_safe(bvc, tmp, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+          gbproxy_bvc_free(bvc);</span><br><span> </span><br><span>   talloc_free(nse);</span><br><span> }</span><br><span>@@ -322,7 +326,7 @@</span><br><span>         struct gbproxy_nse *nse;</span><br><span>     OSMO_ASSERT(cfg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   llist_for_each_entry(nse, &cfg->nse_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+     llist_for_each_entry(nse, &cfg->nses, list) {</span><br><span>                 if (nse->nsei == nsei)</span><br><span>                    return nse;</span><br><span>  }</span><br><span>@@ -340,4 +344,4 @@</span><br><span>              nse = gbproxy_nse_alloc(cfg, nsei);</span><br><span> </span><br><span>      return nse;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>\ No newline at end of file</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/gbproxy/gb_proxy_tlli.c b/src/gbproxy/gb_proxy_tlli.c</span><br><span>index b84d1ea..0ea3a93 100644</span><br><span>--- a/src/gbproxy/gb_proxy_tlli.c</span><br><span>+++ b/src/gbproxy/gb_proxy_tlli.c</span><br><span>@@ -32,11 +32,11 @@</span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_link_info *gbproxy_link_info_by_tlli(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_link_info *gbproxy_link_info_by_tlli(struct gbproxy_bvc *bvc,</span><br><span>                                       uint32_t tlli)</span><br><span> {</span><br><span>      struct gbproxy_link_info *link_info;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    if (!tlli)</span><br><span>           return NULL;</span><br><span>@@ -50,11 +50,11 @@</span><br><span> }</span><br><span> </span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_ptmsi(</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     uint32_t ptmsi)</span><br><span> {</span><br><span>         struct gbproxy_link_info *link_info;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    if (ptmsi == GSM_RESERVED_TMSI)</span><br><span>              return NULL;</span><br><span>@@ -67,11 +67,11 @@</span><br><span> }</span><br><span> </span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_any_sgsn_tlli(</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     uint32_t tlli)</span><br><span> {</span><br><span>  struct gbproxy_link_info *link_info;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    if (!tlli)</span><br><span>           return NULL;</span><br><span>@@ -86,11 +86,11 @@</span><br><span> }</span><br><span> </span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_sgsn_tlli(</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     uint32_t tlli, uint32_t sgsn_nsei)</span><br><span> {</span><br><span>      struct gbproxy_link_info *link_info;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    if (!tlli)</span><br><span>           return NULL;</span><br><span>@@ -105,12 +105,12 @@</span><br><span> }</span><br><span> </span><br><span> struct gbproxy_link_info *gbproxy_link_info_by_imsi(</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     const uint8_t *imsi,</span><br><span>         size_t imsi_len)</span><br><span> {</span><br><span>        struct gbproxy_link_info *link_info;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    if (!gprs_is_mi_imsi(imsi, imsi_len))</span><br><span>                return NULL;</span><br><span>@@ -137,10 +137,10 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_delete_link_info(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_delete_link_info(struct gbproxy_bvc *bvc,</span><br><span>                    struct gbproxy_link_info *link_info)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    gbproxy_link_info_discard_messages(link_info);</span><br><span> </span><br><span>@@ -148,44 +148,44 @@</span><br><span>   talloc_free(link_info);</span><br><span>      state->logical_link_count -= 1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  peer->ctrg->ctr[GBPROX_PEER_CTR_TLLI_CACHE_SIZE].current =</span><br><span style="color: hsl(120, 100%, 40%);">+      bvc->ctrg->ctr[GBPROX_PEER_CTR_TLLI_CACHE_SIZE].current =</span><br><span>              state->logical_link_count;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_delete_link_infos(struct gbproxy_peer *peer)</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_delete_link_infos(struct gbproxy_bvc *bvc)</span><br><span> {</span><br><span>        struct gbproxy_link_info *link_info, *nxt;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    llist_for_each_entry_safe(link_info, nxt, &state->logical_links, list)</span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_delete_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+            gbproxy_delete_link_info(bvc, link_info);</span><br><span> </span><br><span>        OSMO_ASSERT(state->logical_link_count == 0);</span><br><span>      OSMO_ASSERT(llist_empty(&state->logical_links));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_attach_link_info(struct gbproxy_peer *peer, time_t now,</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_attach_link_info(struct gbproxy_bvc *bvc, time_t now,</span><br><span>                           struct gbproxy_link_info *link_info)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    link_info->timestamp = now;</span><br><span>       llist_add(&link_info->list, &state->logical_links);</span><br><span>    state->logical_link_count += 1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  peer->ctrg->ctr[GBPROX_PEER_CTR_TLLI_CACHE_SIZE].current =</span><br><span style="color: hsl(120, 100%, 40%);">+      bvc->ctrg->ctr[GBPROX_PEER_CTR_TLLI_CACHE_SIZE].current =</span><br><span>              state->logical_link_count;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gbproxy_remove_stale_link_infos(struct gbproxy_peer *peer, time_t now)</span><br><span style="color: hsl(120, 100%, 40%);">+int gbproxy_remove_stale_link_infos(struct gbproxy_bvc *bvc, time_t now)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span>        int exceeded_max_len = 0;</span><br><span>    int deleted_count = 0;</span><br><span>       int check_for_age;</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        if (cfg->tlli_max_len > 0)</span><br><span>@@ -200,12 +200,12 @@</span><br><span>             link_info = llist_entry(state->logical_links.prev,</span><br><span>                                        struct gbproxy_link_info,</span><br><span>                                    list);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Removing TLLI %08x from list "</span><br><span>                    "(stale, length %d, max_len exceeded)\n",</span><br><span>                  link_info->tlli.current, state->logical_link_count);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             gbproxy_delete_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+            gbproxy_delete_link_info(bvc, link_info);</span><br><span>            deleted_count += 1;</span><br><span>  }</span><br><span> </span><br><span>@@ -222,23 +222,23 @@</span><br><span>                        continue;</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Removing TLLI %08x from list "</span><br><span>                    "(stale, age %d, max_age exceeded)\n",</span><br><span>                     link_info->tlli.current, (int)age);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         gbproxy_delete_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+            gbproxy_delete_link_info(bvc, link_info);</span><br><span>            deleted_count += 1;</span><br><span>  }</span><br><span> </span><br><span>        return deleted_count;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_link_info *gbproxy_link_info_alloc( struct gbproxy_peer *peer)</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_link_info *gbproxy_link_info_alloc( struct gbproxy_bvc *bvc)</span><br><span> {</span><br><span>        struct gbproxy_link_info *link_info;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        link_info = talloc_zero(peer, struct gbproxy_link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+      link_info = talloc_zero(bvc, struct gbproxy_link_info);</span><br><span>      link_info->tlli.ptmsi = GSM_RESERVED_TMSI;</span><br><span>        link_info->sgsn_tlli.ptmsi = GSM_RESERVED_TMSI;</span><br><span> </span><br><span>@@ -250,16 +250,16 @@</span><br><span> }</span><br><span> </span><br><span> void gbproxy_detach_link_info(</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     struct gbproxy_link_info *link_info)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    llist_del(&link_info->list);</span><br><span>  OSMO_ASSERT(state->logical_link_count > 0);</span><br><span>    state->logical_link_count -= 1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  peer->ctrg->ctr[GBPROX_PEER_CTR_TLLI_CACHE_SIZE].current =</span><br><span style="color: hsl(120, 100%, 40%);">+      bvc->ctrg->ctr[GBPROX_PEER_CTR_TLLI_CACHE_SIZE].current =</span><br><span>              state->logical_link_count;</span><br><span> }</span><br><span> </span><br><span>@@ -277,13 +277,13 @@</span><br><span> }</span><br><span> </span><br><span> void gbproxy_reassign_tlli(struct gbproxy_tlli_state *tlli_state,</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct gbproxy_peer *peer, uint32_t new_tlli)</span><br><span style="color: hsl(120, 100%, 40%);">+                         struct gbproxy_bvc *bvc, uint32_t new_tlli)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span>    if (new_tlli == tlli_state->current)</span><br><span>              return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGPBVC(bvc, LOGL_INFO,</span><br><span>           "The TLLI has been reassigned from %08x to %08x\n",</span><br><span>        tlli_state->current, new_tlli);</span><br><span> </span><br><span>@@ -345,26 +345,26 @@</span><br><span>  tlli_state->assigned = 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gbproxy_touch_link_info(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static void gbproxy_touch_link_info(struct gbproxy_bvc *bvc,</span><br><span>                                struct gbproxy_link_info *link_info,</span><br><span>                                 time_t now)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    gbproxy_detach_link_info(peer, link_info);</span><br><span style="color: hsl(0, 100%, 40%);">-      gbproxy_attach_link_info(peer, now, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+       gbproxy_detach_link_info(bvc, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+     gbproxy_attach_link_info(bvc, now, link_info);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int gbproxy_unregister_link_info(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static int gbproxy_unregister_link_info(struct gbproxy_bvc *bvc,</span><br><span>                                   struct gbproxy_link_info *link_info)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span>    if (!link_info)</span><br><span>              return 1;</span><br><span> </span><br><span>        if (link_info->tlli.ptmsi == GSM_RESERVED_TMSI && !link_info->imsi_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Removing TLLI %08x from list (P-TMSI or IMSI are not set)\n",</span><br><span>                     link_info->tlli.current);</span><br><span style="color: hsl(0, 100%, 40%);">-               gbproxy_delete_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+            gbproxy_delete_link_info(bvc, link_info);</span><br><span>            return 1;</span><br><span>    }</span><br><span> </span><br><span>@@ -394,32 +394,32 @@</span><br><span>        return link_info != NULL && link_info->is_matching[match_id];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gbproxy_assign_imsi(struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+static void gbproxy_assign_imsi(struct gbproxy_bvc *bvc,</span><br><span>                         struct gbproxy_link_info *link_info,</span><br><span>                         struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>       int imsi_matches;</span><br><span>    struct gbproxy_link_info *other_link_info;</span><br><span>   enum gbproxy_match_id match_id;</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        /* Make sure that there is a second entry with the same IMSI */</span><br><span>      other_link_info = gbproxy_link_info_by_imsi(</span><br><span style="color: hsl(0, 100%, 40%);">-            peer, parse_ctx->imsi, parse_ctx->imsi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+            bvc, parse_ctx->imsi, parse_ctx->imsi_len);</span><br><span> </span><br><span>        if (other_link_info && other_link_info != link_info) {</span><br><span>               struct osmo_mobile_identity mi;</span><br><span>              if (osmo_mobile_identity_decode(&mi, parse_ctx->imsi, parse_ctx->imsi_len, false)</span><br><span>              || mi.type != GSM_MI_TYPE_IMSI) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGPBVC(peer, LOGL_ERROR, "Failed to decode Mobile Identity\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGPBVC(bvc, LOGL_ERROR, "Failed to decode Mobile Identity\n");</span><br><span>            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPBVC(bvc, LOGL_INFO,</span><br><span>                           "Removing TLLI %08x from list (IMSI %s re-used)\n",</span><br><span>                        other_link_info->tlli.current, mi.imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-                        gbproxy_delete_link_info(peer, other_link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+                      gbproxy_delete_link_info(bvc, other_link_info);</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span>@@ -456,11 +456,11 @@</span><br><span> }</span><br><span> </span><br><span> static void gbproxy_remove_matching_link_infos(</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_peer *peer, struct gbproxy_link_info *link_info)</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_bvc *bvc, struct gbproxy_link_info *link_info)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span>    struct gbproxy_link_info *info, *nxt;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>    /* Make sure that there is no second entry with the same P-TMSI or TLLI */</span><br><span>   llist_for_each_entry_safe(info, nxt, &state->logical_links, list) {</span><br><span>@@ -472,22 +472,22 @@</span><br><span>                !gbproxy_tlli_match(&link_info->sgsn_tlli, &info->sgsn_tlli)))</span><br><span>                    continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Removing TLLI %08x from list (P-TMSI/TLLI re-used)\n",</span><br><span>                    info->tlli.current);</span><br><span style="color: hsl(0, 100%, 40%);">-            gbproxy_delete_link_info(peer, info);</span><br><span style="color: hsl(120, 100%, 40%);">+         gbproxy_delete_link_info(bvc, info);</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span> static struct gbproxy_link_info *gbproxy_get_link_info_ul(</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     int *tlli_is_valid,</span><br><span>  struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>        struct gbproxy_link_info *link_info = NULL;</span><br><span> </span><br><span>      if (parse_ctx->tlli_enc) {</span><br><span style="color: hsl(0, 100%, 40%);">-           link_info = gbproxy_link_info_by_tlli(peer, parse_ctx->tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+              link_info = gbproxy_link_info_by_tlli(bvc, parse_ctx->tlli);</span><br><span> </span><br><span>          if (link_info) {</span><br><span>                     *tlli_is_valid = 1;</span><br><span>@@ -499,13 +499,13 @@</span><br><span> </span><br><span>      if (!link_info && parse_ctx->imsi) {</span><br><span>              link_info = gbproxy_link_info_by_imsi(</span><br><span style="color: hsl(0, 100%, 40%);">-                  peer, parse_ctx->imsi, parse_ctx->imsi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                    bvc, parse_ctx->imsi, parse_ctx->imsi_len);</span><br><span>    }</span><br><span> </span><br><span>        if (!link_info && parse_ctx->ptmsi_enc && !parse_ctx->old_raid_is_foreign) {</span><br><span>           uint32_t bss_ptmsi;</span><br><span>          gprs_parse_tmsi(parse_ctx->ptmsi_enc, &bss_ptmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-               link_info = gbproxy_link_info_by_ptmsi(peer, bss_ptmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+              link_info = gbproxy_link_info_by_ptmsi(bvc, bss_ptmsi);</span><br><span>      }</span><br><span> </span><br><span>        if (!link_info)</span><br><span>@@ -517,27 +517,27 @@</span><br><span> }</span><br><span> </span><br><span> struct gbproxy_link_info *gbproxy_update_link_state_ul(</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     time_t now,</span><br><span>  struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>        struct gbproxy_link_info *link_info;</span><br><span>         int tlli_is_valid;</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   link_info = gbproxy_get_link_info_ul(peer, &tlli_is_valid, parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+    link_info = gbproxy_get_link_info_ul(bvc, &tlli_is_valid, parse_ctx);</span><br><span> </span><br><span>        if (parse_ctx->tlli_enc && parse_ctx->llc) {</span><br><span>           uint32_t sgsn_tlli;</span><br><span> </span><br><span>              if (!link_info) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGPBVC(peer, LOGL_INFO, "Adding TLLI %08x to list\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPBVC(bvc, LOGL_INFO, "Adding TLLI %08x to list\n",</span><br><span>                          parse_ctx->tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-                        link_info = gbproxy_link_info_alloc(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-                      gbproxy_attach_link_info(peer, now, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+                       link_info = gbproxy_link_info_alloc(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+                     gbproxy_attach_link_info(bvc, now, link_info);</span><br><span> </span><br><span>                   /* Setup TLLIs */</span><br><span style="color: hsl(0, 100%, 40%);">-                       sgsn_tlli = gbproxy_make_sgsn_tlli(peer, link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                   sgsn_tlli = gbproxy_make_sgsn_tlli(bvc, link_info,</span><br><span>                                                      parse_ctx->tlli);</span><br><span>                      link_info->sgsn_tlli.current = sgsn_tlli;</span><br><span>                         link_info->tlli.current = parse_ctx->tlli;</span><br><span>@@ -546,34 +546,34 @@</span><br><span>                     link_info->tlli.current = parse_ctx->tlli;</span><br><span>                     link_info->tlli.assigned = 0;</span><br><span>                     link_info->sgsn_tlli.current =</span><br><span style="color: hsl(0, 100%, 40%);">-                               gbproxy_make_sgsn_tlli(peer, link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                               gbproxy_make_sgsn_tlli(bvc, link_info,</span><br><span>                                                      parse_ctx->tlli);</span><br><span>                  link_info->sgsn_tlli.assigned = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                   gbproxy_touch_link_info(peer, link_info, now);</span><br><span style="color: hsl(120, 100%, 40%);">+                        gbproxy_touch_link_info(bvc, link_info, now);</span><br><span>                } else {</span><br><span>                     sgsn_tlli = gbproxy_map_tlli(parse_ctx->tlli, link_info, 0);</span><br><span>                      if (!sgsn_tlli)</span><br><span style="color: hsl(0, 100%, 40%);">-                         sgsn_tlli = gbproxy_make_sgsn_tlli(peer, link_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                           sgsn_tlli = gbproxy_make_sgsn_tlli(bvc, link_info,</span><br><span>                                                              parse_ctx->tlli);</span><br><span> </span><br><span>                  gbproxy_validate_tlli(&link_info->tlli,</span><br><span>                                             parse_ctx->tlli, 0);</span><br><span>                        gbproxy_validate_tlli(&link_info->sgsn_tlli,</span><br><span>                                        sgsn_tlli, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                    gbproxy_touch_link_info(peer, link_info, now);</span><br><span style="color: hsl(120, 100%, 40%);">+                        gbproxy_touch_link_info(bvc, link_info, now);</span><br><span>                }</span><br><span>    } else if (link_info) {</span><br><span style="color: hsl(0, 100%, 40%);">-         gbproxy_touch_link_info(peer, link_info, now);</span><br><span style="color: hsl(120, 100%, 40%);">+                gbproxy_touch_link_info(bvc, link_info, now);</span><br><span>        }</span><br><span> </span><br><span>        if (parse_ctx->imsi && link_info && link_info->imsi_len == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             gbproxy_assign_imsi(peer, link_info, parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+              gbproxy_assign_imsi(bvc, link_info, parse_ctx);</span><br><span> </span><br><span>  return link_info;</span><br><span> }</span><br><span> </span><br><span> static struct gbproxy_link_info *gbproxy_get_link_info_dl(</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>        struct gbproxy_link_info *link_info = NULL;</span><br><span>@@ -581,14 +581,14 @@</span><br><span>  /* Which key to use depends on its availability only, if that fails, do</span><br><span>       * not retry it with another key (e.g. IMSI). */</span><br><span>     if (parse_ctx->tlli_enc)</span><br><span style="color: hsl(0, 100%, 40%);">-             link_info = gbproxy_link_info_by_sgsn_tlli(peer, parse_ctx->tlli,</span><br><span style="color: hsl(120, 100%, 40%);">+          link_info = gbproxy_link_info_by_sgsn_tlli(bvc, parse_ctx->tlli,</span><br><span>                                                     parse_ctx->peer_nsei);</span><br><span> </span><br><span>     /* TODO: Get link_info by (SGSN) P-TMSI if that is available (see</span><br><span>     * GSM 08.18, 7.2) instead of using the IMSI as key. */</span><br><span>      else if (parse_ctx->imsi)</span><br><span>                 link_info = gbproxy_link_info_by_imsi(</span><br><span style="color: hsl(0, 100%, 40%);">-                  peer, parse_ctx->imsi, parse_ctx->imsi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                    bvc, parse_ctx->imsi, parse_ctx->imsi_len);</span><br><span> </span><br><span>        if (link_info)</span><br><span>               link_info->is_deregistered = false;</span><br><span>@@ -597,17 +597,17 @@</span><br><span> }</span><br><span> </span><br><span> struct gbproxy_link_info *gbproxy_update_link_state_dl(</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     time_t now,</span><br><span>  struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>        struct gbproxy_link_info *link_info = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   link_info = gbproxy_get_link_info_dl(peer, parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+        link_info = gbproxy_get_link_info_dl(bvc, parse_ctx);</span><br><span> </span><br><span>    if (parse_ctx->tlli_enc && parse_ctx->new_ptmsi_enc && link_info) {</span><br><span>            /* A new P-TMSI has been signalled in the message,</span><br><span>@@ -620,9 +620,9 @@</span><br><span>                     new_bss_ptmsi = link_info->tlli.ptmsi;</span><br><span> </span><br><span>                if (new_bss_ptmsi == GSM_RESERVED_TMSI)</span><br><span style="color: hsl(0, 100%, 40%);">-                 new_bss_ptmsi = gbproxy_make_bss_ptmsi(peer, new_sgsn_ptmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                 new_bss_ptmsi = gbproxy_make_bss_ptmsi(bvc, new_sgsn_ptmsi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Got new PTMSI %08x from SGSN, using %08x for BSS\n",</span><br><span>                      new_sgsn_ptmsi, new_bss_ptmsi);</span><br><span>                 /* Setup PTMSIs */</span><br><span>@@ -636,25 +636,25 @@</span><br><span>           uint32_t new_ptmsi;</span><br><span>          gprs_parse_tmsi(parse_ctx->new_ptmsi_enc, &new_ptmsi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Adding TLLI %08x to list (SGSN, new P-TMSI is %08x)\n",</span><br><span>                   parse_ctx->tlli, new_ptmsi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                link_info = gbproxy_link_info_alloc(peer);</span><br><span style="color: hsl(120, 100%, 40%);">+            link_info = gbproxy_link_info_alloc(bvc);</span><br><span>            link_info->sgsn_tlli.current = parse_ctx->tlli;</span><br><span>                link_info->tlli.current = parse_ctx->tlli;</span><br><span>             link_info->sgsn_tlli.ptmsi = new_ptmsi;</span><br><span>           link_info->tlli.ptmsi = new_ptmsi;</span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_attach_link_info(peer, now, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+               gbproxy_attach_link_info(bvc, now, link_info);</span><br><span>       } else if (parse_ctx->tlli_enc && parse_ctx->llc && !link_info &&</span><br><span>                 !cfg->patch_ptmsi) {</span><br><span>           /* Unknown SGSN TLLI, create a new link_info */</span><br><span>              uint32_t new_ptmsi;</span><br><span style="color: hsl(0, 100%, 40%);">-             link_info = gbproxy_link_info_alloc(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPBVC(peer, LOGL_INFO, "Adding TLLI %08x to list (SGSN)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               link_info = gbproxy_link_info_alloc(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPBVC(bvc, LOGL_INFO, "Adding TLLI %08x to list (SGSN)\n",</span><br><span>                    parse_ctx->tlli);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_attach_link_info(peer, now, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+               gbproxy_attach_link_info(bvc, now, link_info);</span><br><span> </span><br><span>           /* Setup TLLIs */</span><br><span>            link_info->sgsn_tlli.current = parse_ctx->tlli;</span><br><span>@@ -665,7 +665,7 @@</span><br><span>          /* A new P-TMSI has been signalled in the message */</span><br><span> </span><br><span>             gprs_parse_tmsi(parse_ctx->new_ptmsi_enc, &new_ptmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Assigning new P-TMSI %08x\n", new_ptmsi);</span><br><span>            /* Setup P-TMSIs */</span><br><span>          link_info->sgsn_tlli.ptmsi = new_ptmsi;</span><br><span>@@ -675,27 +675,27 @@</span><br><span>                                                link_info, 1);</span><br><span>          gbproxy_validate_tlli(&link_info->sgsn_tlli, parse_ctx->tlli, 1);</span><br><span>          gbproxy_validate_tlli(&link_info->tlli, bss_tlli, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-            gbproxy_touch_link_info(peer, link_info, now);</span><br><span style="color: hsl(120, 100%, 40%);">+                gbproxy_touch_link_info(bvc, link_info, now);</span><br><span>        } else if (link_info) {</span><br><span style="color: hsl(0, 100%, 40%);">-         gbproxy_touch_link_info(peer, link_info, now);</span><br><span style="color: hsl(120, 100%, 40%);">+                gbproxy_touch_link_info(bvc, link_info, now);</span><br><span>        }</span><br><span> </span><br><span>        if (parse_ctx->imsi && link_info && link_info->imsi_len == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             gbproxy_assign_imsi(peer, link_info, parse_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+              gbproxy_assign_imsi(bvc, link_info, parse_ctx);</span><br><span> </span><br><span>  return link_info;</span><br><span> }</span><br><span> </span><br><span> int gbproxy_update_link_state_after(</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_peer *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_bvc *bvc,</span><br><span>     struct gbproxy_link_info *link_info,</span><br><span>         time_t now,</span><br><span>  struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span>        int rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(peer);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(peer->nse);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gbproxy_config *cfg = peer->nse->cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_config *cfg = bvc->nse->cfg;</span><br><span>    OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        if (parse_ctx->invalidate_tlli && link_info) {</span><br><span>@@ -706,13 +706,13 @@</span><br><span>                    (cfg->keep_link_infos == GBPROX_KEEP_IDENTIFIED &&</span><br><span>                         link_info->imsi_len > 0);</span><br><span>             if (keep_info) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGPBVC(peer, LOGL_INFO, "Unregistering TLLI %08x\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGPBVC(bvc, LOGL_INFO, "Unregistering TLLI %08x\n",</span><br><span>                            link_info->tlli.current);</span><br><span style="color: hsl(0, 100%, 40%);">-                       rc = gbproxy_unregister_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+                   rc = gbproxy_unregister_link_info(bvc, link_info);</span><br><span>           } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGPBVC(peer, LOGL_INFO, "Removing TLLI %08x from list\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPBVC(bvc, LOGL_INFO, "Removing TLLI %08x from list\n",</span><br><span>                       link_info->tlli.current);</span><br><span style="color: hsl(0, 100%, 40%);">-                       gbproxy_delete_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+                    gbproxy_delete_link_info(bvc, link_info);</span><br><span>                    rc = 1;</span><br><span>              }</span><br><span>    } else if (parse_ctx->to_bss && parse_ctx->tlli_enc &&</span><br><span>@@ -727,18 +727,18 @@</span><br><span>                 new_sgsn_tlli = gprs_tmsi2tlli(new_sgsn_ptmsi, TLLI_LOCAL);</span><br><span>          if (new_bss_ptmsi != GSM_RESERVED_TMSI)</span><br><span>                      new_bss_tlli = gprs_tmsi2tlli(new_bss_ptmsi, TLLI_LOCAL);</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGPBVC(peer, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPBVC(bvc, LOGL_INFO,</span><br><span>                   "Assigning new TLLI %08x to SGSN, %08x to BSS\n",</span><br><span>                  new_sgsn_tlli, new_bss_tlli);</span><br><span> </span><br><span>               gbproxy_reassign_tlli(&link_info->sgsn_tlli,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   peer, new_sgsn_tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+                                 bvc, new_sgsn_tlli);</span><br><span>           gbproxy_reassign_tlli(&link_info->tlli,</span><br><span style="color: hsl(0, 100%, 40%);">-                                peer, new_bss_tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-              gbproxy_remove_matching_link_infos(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+                                bvc, new_bss_tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+             gbproxy_remove_matching_link_infos(bvc, link_info);</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   gbproxy_remove_stale_link_infos(peer, now);</span><br><span style="color: hsl(120, 100%, 40%);">+   gbproxy_remove_stale_link_infos(bvc, now);</span><br><span> </span><br><span>       return rc;</span><br><span> }</span><br><span>diff --git a/src/gbproxy/gb_proxy_vty.c b/src/gbproxy/gb_proxy_vty.c</span><br><span>index bf1c4e0..3ef8ccc 100644</span><br><span>--- a/src/gbproxy/gb_proxy_vty.c</span><br><span>+++ b/src/gbproxy/gb_proxy_vty.c</span><br><span>@@ -68,14 +68,14 @@</span><br><span>   {0, NULL}</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gbprox_vty_print_peer(struct vty *vty, struct gbproxy_peer *peer)</span><br><span style="color: hsl(120, 100%, 40%);">+static void gbprox_vty_print_bvc(struct vty *vty, struct gbproxy_bvc *bvc)</span><br><span> {</span><br><span>    struct gprs_ra_id raid;</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_parse_ra(&raid, peer->ra);</span><br><span style="color: hsl(120, 100%, 40%);">+       gsm48_parse_ra(&raid, bvc->ra);</span><br><span> </span><br><span>   vty_out(vty, "NSEI %5u, PTP-BVCI %5u, "</span><br><span style="color: hsl(0, 100%, 40%);">-               "RAI %s", peer->nse->nsei, peer->bvci, osmo_rai_name(&raid));</span><br><span style="color: hsl(0, 100%, 40%);">-    if (peer->blocked)</span><br><span style="color: hsl(120, 100%, 40%);">+         "RAI %s", bvc->nse->nsei, bvc->bvci, osmo_rai_name(&raid));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bvc->blocked)</span><br><span>                 vty_out(vty, " [BVC-BLOCKED]");</span><br><span> </span><br><span>        vty_out(vty, "%s", VTY_NEWLINE);</span><br><span>@@ -426,12 +426,12 @@</span><br><span> </span><br><span>       /* Re-schedule running timers soon in case prev frequency was really big</span><br><span>        and new frequency is desired to be lower. After initial run, periodic</span><br><span style="color: hsl(0, 100%, 40%);">-           time is used. Use random() to avoid firing timers for all peers at</span><br><span style="color: hsl(120, 100%, 40%);">+    time is used. Use random() to avoid firing timers for all bvcs at</span><br><span>            the same time */</span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry(nse, &g_cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list)</span><br><span style="color: hsl(0, 100%, 40%);">-                        osmo_timer_schedule(&peer->clean_stale_timer,</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(nse, &g_cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_timer_schedule(&bvc->clean_stale_timer,</span><br><span>                                          random() % 5, random() % 1000000);</span><br><span>   }</span><br><span> </span><br><span>@@ -447,10 +447,10 @@</span><br><span>        struct gbproxy_nse *nse;</span><br><span>     g_cfg->clean_stale_timer_freq = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry(nse, &g_cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list)</span><br><span style="color: hsl(0, 100%, 40%);">-                        osmo_timer_del(&peer->clean_stale_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry(nse, &g_cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_timer_del(&bvc->clean_stale_timer);</span><br><span>      }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span>@@ -584,13 +584,13 @@</span><br><span>  if (show_stats)</span><br><span>              vty_out_rate_ctr_group(vty, "", g_cfg->ctrg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  llist_for_each_entry(nse, &g_cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      gbprox_vty_print_peer(vty, peer);</span><br><span style="color: hsl(120, 100%, 40%);">+     llist_for_each_entry(nse, &g_cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  gbprox_vty_print_bvc(vty, bvc);</span><br><span> </span><br><span>                  if (show_stats)</span><br><span style="color: hsl(0, 100%, 40%);">-                         vty_out_rate_ctr_group(vty, "  ", peer->ctrg);</span><br><span style="color: hsl(120, 100%, 40%);">+                           vty_out_rate_ctr_group(vty, "  ", bvc->ctrg);</span><br><span>           }</span><br><span>    }</span><br><span>    return CMD_SUCCESS;</span><br><span>@@ -606,13 +606,13 @@</span><br><span>  osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span>        now = ts.tv_sec;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(nse, &g_cfg->nse_peers, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct gbproxy_peer *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-              llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(nse, &g_cfg->nses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span>                         struct gbproxy_link_info *link_info;</span><br><span style="color: hsl(0, 100%, 40%);">-                    struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+                        struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                       gbprox_vty_print_peer(vty, peer);</span><br><span style="color: hsl(120, 100%, 40%);">+                     gbprox_vty_print_bvc(vty, bvc);</span><br><span> </span><br><span>                  llist_for_each_entry(link_info, &state->logical_links, list) {</span><br><span>                                time_t age = now - link_info->timestamp;</span><br><span>@@ -652,16 +652,16 @@</span><br><span> </span><br><span> DEFUN(delete_gb_bvci, delete_gb_bvci_cmd,</span><br><span>         "delete-gbproxy-peer <0-65534> bvci <2-65534>",</span><br><span style="color: hsl(0, 100%, 40%);">-   "Delete a GBProxy peer by NSEI and optionally BVCI\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Delete a GBProxy bvc by NSEI and optionally BVCI\n"</span><br><span>       "NSEI number\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "Only delete peer with a matching BVCI\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "Only delete bvc with a matching BVCI\n"</span><br><span>   "BVCI number\n")</span><br><span> {</span><br><span>      const uint16_t nsei = atoi(argv[0]);</span><br><span>         const uint16_t bvci = atoi(argv[1]);</span><br><span>         int counter;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        counter = gbproxy_cleanup_peers(g_cfg, nsei, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+   counter = gbproxy_cleanup_bvcs(g_cfg, nsei, bvci);</span><br><span> </span><br><span>       if (counter == 0) {</span><br><span>          vty_out(vty, "BVC not found%s", VTY_NEWLINE);</span><br><span>@@ -673,7 +673,7 @@</span><br><span> </span><br><span> DEFUN(delete_gb_nsei, delete_gb_nsei_cmd,</span><br><span>       "delete-gbproxy-peer <0-65534> (only-bvc|only-nsvc|all) [dry-run]",</span><br><span style="color: hsl(0, 100%, 40%);">-     "Delete a GBProxy peer by NSEI and optionally BVCI\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Delete a GBProxy bvc by NSEI and optionally BVCI\n"</span><br><span>       "NSEI number\n"</span><br><span>    "Only delete BSSGP connections (BVC)\n"</span><br><span>    "Only delete dynamic NS connections (NS-VC)\n"</span><br><span>@@ -698,18 +698,18 @@</span><br><span>     if (delete_bvc) {</span><br><span>            if (!dry_run) {</span><br><span>                      struct gbproxy_nse *nse = gbproxy_nse_by_nsei(g_cfg, nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-                     counter = gbproxy_cleanup_peers(g_cfg, nsei, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      counter = gbproxy_cleanup_bvcs(g_cfg, nsei, 0);</span><br><span>                      gbproxy_nse_free(nse);</span><br><span>               } else {</span><br><span>                     struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+                    struct gbproxy_bvc *bvc;</span><br><span>                     counter = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                    llist_for_each_entry(nse, &g_cfg->nse_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   llist_for_each_entry(nse, &g_cfg->nses, list) {</span><br><span>                               if (nse->nsei != nsei)</span><br><span>                                    continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                               llist_for_each_entry(peer, &nse->bts_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span>                                         vty_out(vty, "BVC: ");</span><br><span style="color: hsl(0, 100%, 40%);">-                                        gbprox_vty_print_peer(vty, peer);</span><br><span style="color: hsl(120, 100%, 40%);">+                                     gbprox_vty_print_bvc(vty, bvc);</span><br><span>                                      counter += 1;</span><br><span>                                }</span><br><span>                    }</span><br><span>@@ -754,7 +754,7 @@</span><br><span>      enum {MATCH_TLLI = 't', MATCH_IMSI = 'i', MATCH_SGSN = 's'} match;</span><br><span>   uint32_t ident = 0;</span><br><span>  const char *imsi = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gbproxy_peer *peer = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_bvc *bvc = 0;</span><br><span>         struct gbproxy_link_info *link_info, *nxt;</span><br><span>   struct gbproxy_patch_state *state;</span><br><span>   int found = 0;</span><br><span>@@ -767,14 +767,14 @@</span><br><span>       case MATCH_SGSN: ident = strtoll(argv[2], NULL, 0); break;</span><br><span>   };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  peer = gbproxy_peer_by_nsei(g_cfg, nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!peer) {</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "Didn't find peer with NSEI %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ bvc = gbproxy_bvc_by_nsei(g_cfg, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!bvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "Didn't find bvc with NSEI %d%s",</span><br><span>                         nsei, VTY_NEWLINE);</span><br><span>          return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+    state = &bvc->patch_state;</span><br><span> </span><br><span>        llist_for_each_entry_safe(link_info, nxt, &state->logical_links, list) {</span><br><span>              struct osmo_mobile_identity mi;</span><br><span>@@ -801,7 +801,7 @@</span><br><span> </span><br><span>            vty_out(vty, "Deleting link with TLLI %08x%s", link_info->tlli.current,</span><br><span>                         VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_delete_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+            gbproxy_delete_link_info(bvc, link_info);</span><br><span>            found += 1;</span><br><span>  }</span><br><span> </span><br><span>@@ -821,7 +821,7 @@</span><br><span> {</span><br><span>     const uint16_t nsei = atoi(argv[0]);</span><br><span>         enum {MATCH_STALE = 's', MATCH_DEREGISTERED = 'd'} match;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gbproxy_peer *peer = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_bvc *bvc = 0;</span><br><span>         struct gbproxy_link_info *link_info, *nxt;</span><br><span>   struct gbproxy_patch_state *state;</span><br><span>   time_t now;</span><br><span>@@ -831,20 +831,20 @@</span><br><span> </span><br><span>      match = argv[1][0];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- peer = gbproxy_peer_by_nsei(g_cfg, nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!peer) {</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "Didn't find peer with NSEI %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ bvc = gbproxy_bvc_by_nsei(g_cfg, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!bvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "Didn't find bvc with NSEI %d%s",</span><br><span>                         nsei, VTY_NEWLINE);</span><br><span>          return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   state = &peer->patch_state;</span><br><span style="color: hsl(120, 100%, 40%);">+    state = &bvc->patch_state;</span><br><span> </span><br><span>        osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span>        now = ts.tv_sec;</span><br><span> </span><br><span>         if (match == MATCH_STALE) {</span><br><span style="color: hsl(0, 100%, 40%);">-             found = gbproxy_remove_stale_link_infos(peer, now);</span><br><span style="color: hsl(120, 100%, 40%);">+           found = gbproxy_remove_stale_link_infos(bvc, now);</span><br><span>           if (found)</span><br><span>                   vty_out(vty, "Deleted %d stale logical link%s%s",</span><br><span>                          found, found == 1 ? "" : "s", VTY_NEWLINE);</span><br><span>@@ -854,7 +854,7 @@</span><br><span>                        if (!link_info->is_deregistered)</span><br><span>                          continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   gbproxy_delete_link_info(peer, link_info);</span><br><span style="color: hsl(120, 100%, 40%);">+                    gbproxy_delete_link_info(bvc, link_info);</span><br><span>                    found += 1;</span><br><span>          }</span><br><span>    }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21548">change 21548</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-sgsn/+/21548"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iae01067282a6401f6af4cab731202872d2cdb080 </div>
<div style="display:none"> Gerrit-Change-Number: 21548 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>