<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13179">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">slotmap: Introduce the concept of a slotmap state<br><br>... which is required in remsim-server<br><br>Change-Id: I56f5ecd6194ef62c87d87d2965ca0315e3d0fc2d<br>---<br>M src/slotmap.c<br>M src/slotmap.h<br>2 files changed, 80 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-remsim refs/changes/79/13179/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/slotmap.c b/src/slotmap.c</span><br><span>index a3ae792..924452b 100644</span><br><span>--- a/src/slotmap.c</span><br><span>+++ b/src/slotmap.c</span><br><span>@@ -9,9 +9,18 @@</span><br><span> #include <talloc.h></span><br><span> </span><br><span> #include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span> </span><br><span> #include "slotmap.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string slot_map_state_name[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   { SLMAP_S_NEW,                  "NEW" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { SLMAP_S_UNACKNOWLEDGED,       "UNACKNOWLEDGED" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { SLMAP_S_ACTIVE,               "ACTIVE" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { SLMAP_S_DELETING,             "DELETING" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { 0, NULL }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const char *slotmap_name(char *buf, size_t buf_len, const struct slot_mapping *map)</span><br><span> {</span><br><span>        snprintf(buf, buf_len, "B(%u:%u) <-> C(%u:%u)",</span><br><span>@@ -82,11 +91,16 @@</span><br><span>        if (!map)</span><br><span>            return -ENOMEM;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   map->maps = maps;</span><br><span>         map->bank = *bank;</span><br><span>        map->client = *client;</span><br><span> </span><br><span>        pthread_rwlock_wrlock(&maps->rwlock);</span><br><span>         llist_add_tail(&map->list, &maps->mappings);</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef REMSIM_SERVER</span><br><span style="color: hsl(120, 100%, 40%);">+      map->state = SLMAP_S_NEW;</span><br><span style="color: hsl(120, 100%, 40%);">+  INIT_LLIST_HEAD(&map->bank_list); /* to ensure llist_del() always succeeds */</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>         pthread_rwlock_unlock(&maps->rwlock);</span><br><span> </span><br><span>     printf("Slot Map %s added\n", slotmap_name(mapname, sizeof(mapname), map));</span><br><span>@@ -103,6 +117,9 @@</span><br><span> </span><br><span>      pthread_rwlock_wrlock(&maps->rwlock);</span><br><span>         llist_del(&map->list);</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef REMSIM_SERVER</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_del(&map->bank_list);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>   pthread_rwlock_unlock(&maps->rwlock);</span><br><span> </span><br><span>     talloc_free(map);</span><br><span>@@ -117,3 +134,37 @@</span><br><span> </span><br><span>         return sm;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef REMSIM_SERVER</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void _slotmap_state_change(struct slot_mapping *map, enum slot_mapping_state new_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                       struct llist_head *new_bank_list)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       char mapname[64];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("Slot Map %s state change: %s -> %s\n", slotmap_name(mapname, sizeof(mapname), map),</span><br><span style="color: hsl(120, 100%, 40%);">+              get_value_string(slot_map_state_name, map->state),</span><br><span style="color: hsl(120, 100%, 40%);">+         get_value_string(slot_map_state_name, new_state));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  map->state = new_state;</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef REMSIM_SERVER</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_del(&map->bank_list);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+    if (new_bank_list)</span><br><span style="color: hsl(120, 100%, 40%);">+            llist_add_tail(&map->bank_list, new_bank_list);</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef REMSIM_SERVER</span><br><span style="color: hsl(120, 100%, 40%);">+  else</span><br><span style="color: hsl(120, 100%, 40%);">+          INIT_LLIST_HEAD(&map->bank_list);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void slotmap_state_change(struct slot_mapping *map, enum slot_mapping_state new_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                         struct llist_head *new_bank_list)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        pthread_rwlock_wrlock(&map->maps->rwlock);</span><br><span style="color: hsl(120, 100%, 40%);">+  _slotmap_state_change(map, new_state, new_bank_list);</span><br><span style="color: hsl(120, 100%, 40%);">+ pthread_rwlock_unlock(&map->maps->rwlock);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>diff --git a/src/slotmap.h b/src/slotmap.h</span><br><span>index 92eb6f4..27d7e1b 100644</span><br><span>--- a/src/slotmap.h</span><br><span>+++ b/src/slotmap.h</span><br><span>@@ -4,6 +4,8 @@</span><br><span> #include <pthread.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define REMSIM_SERVER 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct bank_slot {</span><br><span>         uint16_t bank_id;</span><br><span>    uint16_t slot_nr;</span><br><span>@@ -30,14 +32,33 @@</span><br><span>              return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum slot_mapping_state {</span><br><span style="color: hsl(120, 100%, 40%);">+     SLMAP_S_NEW,            /* created; not yet sent to bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+  SLMAP_S_UNACKNOWLEDGED, /* created + sent to bankd but not yet acknowledge by bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+        SLMAP_S_ACTIVE,         /* fully active map; acknowledged by bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+ SLMAP_S_DELETING,       /* we were asked to delete it; bankd hasn't confirmed yet */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string slot_map_state_name[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *slotmap_state_name(enum slot_mapping_state st)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return get_value_string(slot_map_state_name, st);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* slot mappings are created / removed by the server */</span><br><span> struct slot_mapping {</span><br><span>   /* global lits of bankd slot mappings */</span><br><span>     struct llist_head list;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct slotmaps *maps;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* slot on bank side */</span><br><span>      struct bank_slot bank;</span><br><span>       /* slot on client side */</span><br><span>    struct client_slot client;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef REMSIM_SERVER</span><br><span style="color: hsl(120, 100%, 40%);">+    struct llist_head bank_list;</span><br><span style="color: hsl(120, 100%, 40%);">+  enum slot_mapping_state state;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> };</span><br><span> </span><br><span> /* collection of slot mappings */</span><br><span>@@ -60,3 +81,11 @@</span><br><span> </span><br><span> /* initialize the entire map collection */</span><br><span> struct slotmaps *slotmap_init(void *ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef REMSIM_SERVER</span><br><span style="color: hsl(120, 100%, 40%);">+void _slotmap_state_change(struct slot_mapping *map, enum slot_mapping_state new_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                       struct llist_head *new_bank_list);</span><br><span style="color: hsl(120, 100%, 40%);">+/* thread-safe way to change the state of given slot map */</span><br><span style="color: hsl(120, 100%, 40%);">+void slotmap_state_change(struct slot_mapping *map, enum slot_mapping_state new_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                      struct llist_head *new_bank_list);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13179">change 13179</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/13179"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-remsim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I56f5ecd6194ef62c87d87d2965ca0315e3d0fc2d </div>
<div style="display:none"> Gerrit-Change-Number: 13179 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>