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