<p>daniel has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/24904">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gbproxy: Add usage flag to the imsi_cache<br><br>This is only used for the imsi cache entries for now. Further uses will<br>be added in subsequent commits.<br><br>Related: OS#4472<br>Change-Id: I4a4b8c99eb97f6bb5387d0f26aecd861e07d9914<br>---<br>M include/osmocom/gbproxy/gb_proxy.h<br>M src/gb_proxy.c<br>M src/gb_proxy_peer.c<br>3 files changed, 22 insertions(+), 15 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gbproxy refs/changes/04/24904/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gbproxy/gb_proxy.h b/include/osmocom/gbproxy/gb_proxy.h</span><br><span>index afd4b5f..7f35578 100644</span><br><span>--- a/include/osmocom/gbproxy/gb_proxy.h</span><br><span>+++ b/include/osmocom/gbproxy/gb_proxy.h</span><br><span>@@ -192,6 +192,10 @@</span><br><span>        } pool;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum cache_usage {</span><br><span style="color: hsl(120, 100%, 40%);">+ CACHE_USAGE_PAGING,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* TLLI cache */</span><br><span> struct gbproxy_tlli_cache_entry {</span><br><span>   /* linked to gbproxy_config.tlli_cache.entries */</span><br><span>@@ -212,6 +216,8 @@</span><br><span> </span><br><span>  /* IMSI of the entry */</span><br><span>      char imsi[OSMO_IMSI_BUF_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+        enum cache_usage usage;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* When was this entry last seen */</span><br><span>  time_t tstamp;</span><br><span>       /* The SGSN where the request came from */</span><br><span>@@ -286,7 +292,7 @@</span><br><span> struct gbproxy_nse *gbproxy_nse_by_nsei(struct gbproxy_config *cfg, uint16_t nsei, uint32_t flags);</span><br><span> struct gbproxy_nse *gbproxy_nse_by_nsei_or_new(struct gbproxy_config *cfg, uint16_t nsei, bool sgsn_facing);</span><br><span> struct gbproxy_nse *gbproxy_nse_by_tlli(struct gbproxy_config *cfg, uint32_t tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_nse *gbproxy_nse_by_imsi(struct gbproxy_config *cfg, const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_nse *gbproxy_nse_by_imsi(struct gbproxy_config *cfg, const char *imsi, enum cache_usage usage);</span><br><span> </span><br><span> /* TLLI cache */</span><br><span> void gbproxy_tlli_cache_update(struct gbproxy_nse *nse, uint32_t tlli);</span><br><span>@@ -294,8 +300,8 @@</span><br><span> int gbproxy_tlli_cache_cleanup(struct gbproxy_config *cfg);</span><br><span> </span><br><span> /* IMSI cache */</span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_imsi_cache_update(struct gbproxy_nse *nse, const char *imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_imsi_cache_remove(struct gbproxy_config *cfg, const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_imsi_cache_update(struct gbproxy_nse *nse, const char *imsi, enum cache_usage usage);</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_imsi_cache_remove(struct gbproxy_config *cfg, const char *imsi, enum cache_usage usage);</span><br><span> int gbproxy_imsi_cache_cleanup(struct gbproxy_config *cfg);</span><br><span> </span><br><span> /* SGSN handling */</span><br><span>diff --git a/src/gb_proxy.c b/src/gb_proxy.c</span><br><span>index 8c8faf7..e017abe 100644</span><br><span>--- a/src/gb_proxy.c</span><br><span>+++ b/src/gb_proxy.c</span><br><span>@@ -484,7 +484,7 @@</span><br><span>          const uint8_t *mi_data = TLVP_VAL(&tp, BSSGP_IE_IMSI);</span><br><span>           uint8_t mi_len = TLVP_LEN(&tp, BSSGP_IE_IMSI);</span><br><span>           osmo_mobile_identity_decode(&mi, mi_data, mi_len, false);</span><br><span style="color: hsl(0, 100%, 40%);">-           nse = gbproxy_nse_by_imsi(nse->cfg, mi.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+              nse = gbproxy_nse_by_imsi(nse->cfg, mi.imsi, CACHE_USAGE_PAGING);</span><br><span>                 if (nse) {</span><br><span>                   OSMO_ASSERT(nse->sgsn_facing);</span><br><span>                    rc = gbprox_relay2nse(msg, nse, ns_bvci);</span><br><span>@@ -586,7 +586,7 @@</span><br><span>              const uint8_t *mi_data = TLVP_VAL(&tp, BSSGP_IE_IMSI);</span><br><span>           uint8_t mi_len = TLVP_LEN(&tp, BSSGP_IE_IMSI);</span><br><span>           osmo_mobile_identity_decode(&mi, mi_data, mi_len, false);</span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_imsi_cache_update(nse, mi.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+              gbproxy_imsi_cache_update(nse, mi.imsi, CACHE_USAGE_PAGING);</span><br><span>                 break;</span><br><span>       }</span><br><span>    default:</span><br><span>@@ -1106,7 +1106,7 @@</span><br><span>             const uint8_t *mi_data = TLVP_VAL(&tp[0], BSSGP_IE_IMSI);</span><br><span>                uint8_t mi_len = TLVP_LEN(&tp[0], BSSGP_IE_IMSI);</span><br><span>                osmo_mobile_identity_decode(&mi, mi_data, mi_len, false);</span><br><span style="color: hsl(0, 100%, 40%);">-           nse = gbproxy_nse_by_imsi(nse->cfg, mi.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+              nse = gbproxy_nse_by_imsi(nse->cfg, mi.imsi, CACHE_USAGE_PAGING);</span><br><span>                 if (!nse) {</span><br><span>                  return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span>                 }</span><br><span>@@ -1386,7 +1386,7 @@</span><br><span>            const uint8_t *mi_data = TLVP_VAL(&tp[0], BSSGP_IE_IMSI);</span><br><span>                uint8_t mi_len = TLVP_LEN(&tp[0], BSSGP_IE_IMSI);</span><br><span>                osmo_mobile_identity_decode(&mi, mi_data, mi_len, false);</span><br><span style="color: hsl(0, 100%, 40%);">-           gbproxy_imsi_cache_update(nse, mi.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+              gbproxy_imsi_cache_update(nse, mi.imsi, CACHE_USAGE_PAGING);</span><br><span>                 /* fall through */</span><br><span>   }</span><br><span>    case BSSGP_PDUT_PAGING_CS:</span><br><span>diff --git a/src/gb_proxy_peer.c b/src/gb_proxy_peer.c</span><br><span>index 0f15e9d..0b2ab2b 100644</span><br><span>--- a/src/gb_proxy_peer.c</span><br><span>+++ b/src/gb_proxy_peer.c</span><br><span>@@ -347,23 +347,23 @@</span><br><span>  return osmo_crc16(0, (const uint8_t *)imsi, len);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline struct gbproxy_imsi_cache_entry *_get_imsi_entry(struct gbproxy_config *cfg, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+static inline struct gbproxy_imsi_cache_entry *_get_imsi_entry(struct gbproxy_config *cfg, const char *imsi, enum cache_usage usage)</span><br><span> {</span><br><span>    struct gbproxy_imsi_cache_entry *cache_entry;</span><br><span>        uint16_t imsi_hash = _checksum_imsi(imsi);</span><br><span> </span><br><span>       hash_for_each_possible(cfg->imsi_cache.entries, cache_entry, list, imsi_hash) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!strncmp(cache_entry->imsi, imsi, sizeof(cache_entry->imsi)))</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!strncmp(cache_entry->imsi, imsi, sizeof(cache_entry->imsi)) && cache_entry->usage == usage)</span><br><span>                    return cache_entry;</span><br><span>  }</span><br><span>    return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_imsi_cache_update(struct gbproxy_nse *nse, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_imsi_cache_update(struct gbproxy_nse *nse, const char *imsi, enum cache_usage usage)</span><br><span> {</span><br><span>       struct gbproxy_config *cfg = nse->cfg;</span><br><span>    struct timespec now;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gbproxy_imsi_cache_entry *cache_entry = _get_imsi_entry(cfg, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_imsi_cache_entry *cache_entry = _get_imsi_entry(cfg, imsi, usage);</span><br><span>    uint16_t imsi_hash = _checksum_imsi(imsi);</span><br><span> </span><br><span>       osmo_clock_gettime(CLOCK_MONOTONIC, &now);</span><br><span>@@ -378,6 +378,7 @@</span><br><span>         cache_entry = talloc_zero(cfg, struct gbproxy_imsi_cache_entry);</span><br><span>     OSMO_STRLCPY_ARRAY(cache_entry->imsi, imsi);</span><br><span>      cache_entry->nse = nse;</span><br><span style="color: hsl(120, 100%, 40%);">+    cache_entry->usage = usage;</span><br><span>       cache_entry->tstamp = now.tv_sec;</span><br><span>         hash_add(cfg->imsi_cache.entries, &cache_entry->list, imsi_hash);</span><br><span> }</span><br><span>@@ -396,14 +397,14 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gbproxy_imsi_cache_remove(struct gbproxy_config *cfg, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+void gbproxy_imsi_cache_remove(struct gbproxy_config *cfg, const char *imsi, enum cache_usage usage)</span><br><span> {</span><br><span>    struct gbproxy_imsi_cache_entry *imsi_cache;</span><br><span>         struct hlist_node *tmp;</span><br><span>      uint16_t imsi_hash = _checksum_imsi(imsi);</span><br><span> </span><br><span>       hash_for_each_possible_safe(cfg->imsi_cache.entries, imsi_cache, tmp, list, imsi_hash) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!(strncmp(imsi_cache->imsi, imsi, sizeof(imsi_cache->imsi)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!(strncmp(imsi_cache->imsi, imsi, sizeof(imsi_cache->imsi))) && imsi_cache->usage == usage) {</span><br><span>                   hash_del(&imsi_cache->list);</span><br><span>                  talloc_free(imsi_cache);</span><br><span>                     return;</span><br><span>@@ -546,13 +547,13 @@</span><br><span>      return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gbproxy_nse *gbproxy_nse_by_imsi(struct gbproxy_config *cfg, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+struct gbproxy_nse *gbproxy_nse_by_imsi(struct gbproxy_config *cfg, const char *imsi, enum cache_usage usage)</span><br><span> {</span><br><span>       struct gbproxy_imsi_cache_entry *imsi_cache;</span><br><span>         uint16_t imsi_hash = _checksum_imsi(imsi);</span><br><span> </span><br><span>       hash_for_each_possible(cfg->imsi_cache.entries, imsi_cache, list, imsi_hash) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!strncmp(imsi_cache->imsi, imsi, sizeof(imsi_cache->imsi)))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!strncmp(imsi_cache->imsi, imsi, sizeof(imsi_cache->imsi)) && imsi_cache->usage == usage)</span><br><span>                       return imsi_cache->nse;</span><br><span>   }</span><br><span>    return NULL;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/24904">change 24904</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-gbproxy/+/24904"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gbproxy </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I4a4b8c99eb97f6bb5387d0f26aecd861e07d9914 </div>
<div style="display:none"> Gerrit-Change-Number: 24904 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>