<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26675">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Get rid of libgtp for GTP-U<br><br>It doesn't make much sense to pull whole libgtp to implement only the<br>user plan side of GTP. Let's drop it and add a minimal GTP-U<br>implementation here.<br><br>Related: SYS#5516<br>Change-Id: I53ad4915aaed3bc7574036e963be10514e370fe2<br>---<br>M configure.ac<br>M contrib/jenkins.sh<br>M contrib/osmo-hnodeb.spec.in<br>M debian/control<br>M include/osmocom/hnodeb/gtp.h<br>M include/osmocom/hnodeb/hnodeb.h<br>M src/osmo-hnodeb/Makefile.am<br>M src/osmo-hnodeb/gtp.c<br>M src/osmo-hnodeb/hnb.c<br>M src/osmo-hnodeb/llsk_gtp.c<br>10 files changed, 264 insertions(+), 172 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index 8a34b82..e96a6a1 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -67,7 +67,6 @@</span><br><span> PKG_CHECK_MODULES(LIBOSMORUA, libosmo-rua >= 0.8.0)</span><br><span> PKG_CHECK_MODULES(LIBOSMORANAP, libosmo-ranap >= 0.8.0)</span><br><span> PKG_CHECK_MODULES(LIBOSMOHNBAP, libosmo-hnbap >= 0.8.0)</span><br><span style="color: hsl(0, 100%, 40%);">-PKG_CHECK_MODULES(LIBGTP, libgtp >= 1.8.0)</span><br><span> </span><br><span> </span><br><span> dnl checks for header files</span><br><span>diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh</span><br><span>index 3225de2..7001013 100755</span><br><span>--- a/contrib/jenkins.sh</span><br><span>+++ b/contrib/jenkins.sh</span><br><span>@@ -34,7 +34,6 @@</span><br><span> osmo-build-dep.sh libosmo-netif</span><br><span> osmo-build-dep.sh libosmo-sccp</span><br><span> osmo-build-dep.sh libasn1c</span><br><span style="color: hsl(0, 100%, 40%);">-osmo-build-dep.sh osmo-ggsn</span><br><span> osmo-build-dep.sh osmo-iuh</span><br><span> </span><br><span> # Additional configure options and depends</span><br><span>diff --git a/contrib/osmo-hnodeb.spec.in b/contrib/osmo-hnodeb.spec.in</span><br><span>index afa1816..aa33057 100644</span><br><span>--- a/contrib/osmo-hnodeb.spec.in</span><br><span>+++ b/contrib/osmo-hnodeb.spec.in</span><br><span>@@ -47,7 +47,6 @@</span><br><span> BuildRequires:  pkgconfig(libosmo-rua) >= 0.8.0</span><br><span> BuildRequires:  pkgconfig(talloc)</span><br><span> BuildRequires:  pkgconfig(libasn1c) >= 0.9.30</span><br><span style="color: hsl(0, 100%, 40%);">-BuildRequires:  pkgconfig(libgtp) >= 1.8.0</span><br><span> %{?systemd_requires}</span><br><span> </span><br><span> %description</span><br><span>diff --git a/debian/control b/debian/control</span><br><span>index 503b202..a306e10 100644</span><br><span>--- a/debian/control</span><br><span>+++ b/debian/control</span><br><span>@@ -13,7 +13,6 @@</span><br><span>                python3-minimal,</span><br><span>                libtalloc-dev,</span><br><span>                libasn1c-dev (>= 0.9.30),</span><br><span style="color: hsl(0, 100%, 40%);">-               libgtp-dev (>= 1.8.0),</span><br><span>                libsctp-dev,</span><br><span>                libosmocore-dev (>= 1.6.0),</span><br><span>                libosmo-sigtran-dev (>= 1.5.0),</span><br><span>diff --git a/include/osmocom/hnodeb/gtp.h b/include/osmocom/hnodeb/gtp.h</span><br><span>index 477e82b..5fa47c3 100644</span><br><span>--- a/include/osmocom/hnodeb/gtp.h</span><br><span>+++ b/include/osmocom/hnodeb/gtp.h</span><br><span>@@ -18,9 +18,6 @@</span><br><span>  */</span><br><span> #pragma once</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <gtp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <pdp.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> </span><br><span>@@ -38,11 +35,11 @@</span><br><span>   struct osmo_sockaddr rem_addr;</span><br><span>       uint32_t loc_tei;</span><br><span>    uint32_t rem_tei;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct pdp_t *pdp_lib;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t seq_nr;</span><br><span> };</span><br><span> </span><br><span> struct gtp_conn *gtp_conn_alloc(struct hnb_ue *ue);</span><br><span> void gtp_conn_free(struct gtp_conn *conn);</span><br><span> </span><br><span> int gtp_conn_setup(struct gtp_conn *conn, const struct osmo_sockaddr *rem_addr, uint32_t rem_tei);</span><br><span style="color: hsl(0, 100%, 40%);">-int gtp_conn_tx(struct gtp_conn *conn, void *gtpu_payload, unsigned gtpu_payload_len);</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_conn_tx(struct gtp_conn *conn, const uint8_t *gtpu_payload, unsigned gtpu_payload_len);</span><br><span>diff --git a/include/osmocom/hnodeb/hnodeb.h b/include/osmocom/hnodeb/hnodeb.h</span><br><span>index 82b43c3..924e1ac 100644</span><br><span>--- a/include/osmocom/hnodeb/hnodeb.h</span><br><span>+++ b/include/osmocom/hnodeb/hnodeb.h</span><br><span>@@ -107,8 +107,7 @@</span><br><span>      struct gtp {</span><br><span>                 char *cfg_local_addr;</span><br><span>                struct osmo_sockaddr local_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-                struct gsn_t *gsn;</span><br><span style="color: hsl(0, 100%, 40%);">-              struct osmo_fd fd1u;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct osmo_wqueue wq1u;</span><br><span>     } gtp;</span><br><span> </span><br><span>   uint16_t rnc_id;</span><br><span>diff --git a/src/osmo-hnodeb/Makefile.am b/src/osmo-hnodeb/Makefile.am</span><br><span>index 6edbf88..27987a1 100644</span><br><span>--- a/src/osmo-hnodeb/Makefile.am</span><br><span>+++ b/src/osmo-hnodeb/Makefile.am</span><br><span>@@ -19,7 +19,6 @@</span><br><span>        $(LIBOSMORUA_CFLAGS) \</span><br><span>       $(LIBOSMORANAP_CFLAGS) \</span><br><span>     $(LIBOSMOHNBAP_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-        $(LIBGTP_CFLAGS) \</span><br><span>   $(NULL)</span><br><span> </span><br><span> AM_LDFLAGS = \</span><br><span>@@ -63,5 +62,4 @@</span><br><span>    $(LIBOSMORANAP_LIBS) \</span><br><span>       $(LIBOSMOHNBAP_LIBS) \</span><br><span>       $(LIBSCTP_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(LIBGTP_LIBS) \</span><br><span>     $(NULL)</span><br><span>diff --git a/src/osmo-hnodeb/gtp.c b/src/osmo-hnodeb/gtp.c</span><br><span>index f7d9a14..c22de65 100644</span><br><span>--- a/src/osmo-hnodeb/gtp.c</span><br><span>+++ b/src/osmo-hnodeb/gtp.c</span><br><span>@@ -23,11 +23,27 @@</span><br><span> #include <osmocom/hnodeb/gtp.h></span><br><span> #include <osmocom/hnodeb/hnodeb.h></span><br><span> #include <osmocom/hnodeb/llsk.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/endian.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <gtp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <pdp.h></span><br><span style="color: hsl(120, 100%, 40%);">+/* 3GPP TS 29.281 */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gtp1u_hdr { /* 3GPP TS 29.281 */</span><br><span style="color: hsl(120, 100%, 40%);">+#if OSMO_IS_LITTLE_ENDIAN</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t pn:1, /* N-PDU Number flag */</span><br><span style="color: hsl(120, 100%, 40%);">+         s:1, /* Sequence number flag */</span><br><span style="color: hsl(120, 100%, 40%);">+               e:1, /* Extension header flag */</span><br><span style="color: hsl(120, 100%, 40%);">+              spare:1,</span><br><span style="color: hsl(120, 100%, 40%);">+              pt:1, /* Protocol Type: GTP=1, GTP'=0 */</span><br><span style="color: hsl(120, 100%, 40%);">+          version:3; /* Version: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+#elif OSMO_IS_BIG_ENDIAN</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t version:3, pt:1, spare:1, e:1, s:1, pn:1;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t msg_type;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t length;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t tei;           /* 05 - 08 Tunnel Endpoint ID */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t data[0];</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__((packed));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static uint32_t next_gtp_conn_id = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+static uint32_t next_gtp_conn_id = 1;</span><br><span> </span><br><span> struct gtp_conn *gtp_conn_alloc(struct hnb_ue *ue)</span><br><span> {</span><br><span>@@ -49,14 +65,231 @@</span><br><span>   if (!conn)</span><br><span>           return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (conn->pdp_lib) {</span><br><span style="color: hsl(0, 100%, 40%);">-         pdp_freepdp(conn->pdp_lib);</span><br><span style="color: hsl(0, 100%, 40%);">-          conn->pdp_lib = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span>    llist_del(&conn->list);</span><br><span>       talloc_free(conn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_conn_setup(struct gtp_conn *conn, const struct osmo_sockaddr *rem_addr, uint32_t rem_tei)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct hnb_ue *ue = conn->ue;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct hnb *hnb = ue->hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGUE(ue, DGTP, LOGL_INFO, "Creating PDP context\n");</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%);">+   if (rem_addr->u.sa.sa_family != AF_INET) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGUE(ue, DGTP, LOGL_ERROR, "Failed creating PDP context: unsupported proto family %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 rem_addr->u.sa.sa_family);</span><br><span style="color: hsl(120, 100%, 40%);">+           return -ENOTSUP;</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%);">+   conn->id = next_gtp_conn_id++; /* TODO: validate next one is not already taken due to wrap-around */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     conn->loc_addr = hnb->gtp.local_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+   conn->rem_addr = *rem_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+        conn->rem_tei = rem_tei;</span><br><span style="color: hsl(120, 100%, 40%);">+   conn->loc_tei = conn->id; /* We use conn ID as local TEI */</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_conn_tx(struct gtp_conn *conn, const uint8_t *gtpu_payload, unsigned gtpu_payload_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct hnb_ue *ue;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct hnb *hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gtp1u_hdr *hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_sockaddr *sa;</span><br><span style="color: hsl(120, 100%, 40%);">+     const uint8_t opt_hdr_len = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned msg_len = sizeof(*hdr) + opt_hdr_len + gtpu_payload_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DGTP, LOGL_ERROR, "Tx: GTP-U conn not available\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ue = conn->ue;</span><br><span style="color: hsl(120, 100%, 40%);">+     hnb = ue->hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (hnb->gtp.wq1u.bfd.fd == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DGTP, LOGL_ERROR, "Tx: GTP-U socket not available\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (gtpu_payload_len == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DGTP, LOGL_ERROR, "Tx: GTP-U len=0\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = msgb_alloc_c(hnb, sizeof(*sa) + msg_len, "gtp-ul");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ sa = (struct osmo_sockaddr *)msgb_put(msg, sizeof(*sa));</span><br><span style="color: hsl(120, 100%, 40%);">+      *sa = conn->rem_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    hdr = (struct gtp1u_hdr *)msgb_put(msg,  msg_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    hdr->pn = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       hdr->s = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        hdr->e = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        hdr->spare = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    hdr->pt = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+       hdr->version = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  hdr->msg_type = 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_store16be(gtpu_payload_len + opt_hdr_len, &hdr->length);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_store32be(conn->rem_tei, &hdr->tei);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_store16be(conn->seq_nr, &hdr->data[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        conn->seq_nr++;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* byes 2 and 3 are set to 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(&hdr->data[opt_hdr_len], gtpu_payload, gtpu_payload_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = osmo_wqueue_enqueue(&hnb->gtp.wq1u, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return rc;</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%);">+/* Called whenever we receive a DATA packet */</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnb_gtp_rx_gtp(struct hnb *hnb, struct msgb *msg, const struct osmo_sockaddr *from)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gtp_conn *conn;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct hnb_ue *ue;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gtp1u_hdr *hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t tei;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct hnb_gtp_prim *gtp_prim;</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     hdr = (struct gtp1u_hdr *)msgb_data(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+     tei = osmo_load32be(&hdr->tei);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* The local TEI is the GTP conn_id: */</span><br><span style="color: hsl(120, 100%, 40%);">+       conn = hnb_find_gtp_conn_by_id(hnb, tei);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DGTP, LOGL_NOTICE, "Tx GTP-CONN_DATA.ind len=%u with no conn!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto free_ret;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     ue = conn->ue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (osmo_sockaddr_cmp(from, &conn->rem_addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGUE(ue, DGTP, LOGL_NOTICE, "Rx DL GTP-U loc_tei=0x%08x from unexpected addr=%s!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     tei, osmo_sockaddr_to_str(from));</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto free_ret;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     ue = conn->ue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!ue->conn_ps.active) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGUE(ue, DGTP, LOGL_NOTICE, "Tx GTP-CONN_DATA.ind len=%u but UE conn_ps is not active!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto free_ret;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     hnb = ue->hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGUE(ue, DGTP, LOGL_DEBUG, "Tx GTP-CONN_DATA.ind len=%u\n", msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+      gtp_prim = hnb_gtp_makeprim_conn_data_ind(conn->id, msgb_l3(msg), msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((rc = osmo_prim_srv_send(hnb->llsk, gtp_prim->hdr.msg)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGUE(ue, DGTP, LOGL_ERROR, "Failed Tx GTP-CONN_DATA.ind len=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+free_ret:</span><br><span style="color: hsl(120, 100%, 40%);">+  msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       return rc;</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%);">+static int hnb_gtp_wq_read_cb(struct osmo_fd *fd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct hnb *hnb = (struct hnb *)fd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gtp1u_hdr *hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_sockaddr peer;</span><br><span style="color: hsl(120, 100%, 40%);">+    socklen_t peerlen = sizeof(peer.u.sas);</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int opt_hdr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t pl_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    msg = msgb_alloc_c(hnb, 4096, "gtp-dl");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = recvfrom(hnb->gtp.wq1u.bfd.fd, msgb_data(msg), msg->data_len, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                 &peer.u.sa, &peerlen);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DGTP, LOGL_ERROR, "recvfrom() failed: rc = %d error = %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                rc, rc ? strerror(errno) : "No error");</span><br><span style="color: hsl(120, 100%, 40%);">+                goto free_ret;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_put(msg, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Do some sanity checks: */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (msgb_length(msg) < sizeof(*hdr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DGTP, LOGL_ERROR, "Rx GTP-U packet with size %u < %zu (header)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               msgb_length(msg), sizeof(*hdr));</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto free_ret;</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%);">+   hdr = (struct gtp1u_hdr *)msgb_data(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+     pl_len = osmo_load16be(&hdr->length);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Do some sanity checks: */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (hdr->version != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGTP, LOGL_ERROR, "Rx GTP-U version %u != 1\n", hdr->version);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+                goto free_ret;</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%);">+   if (hdr->e == 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DGTP, LOGL_ERROR, "Rx GTP-U with Extension Header not supported\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+                goto free_ret;</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%);">+   if (hdr->s || hdr->pn || hdr->e)</span><br><span style="color: hsl(120, 100%, 40%);">+             opt_hdr_len = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (hdr->pn)</span><br><span style="color: hsl(120, 100%, 40%);">+               opt_hdr_len = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (msgb_length(msg) < sizeof(*hdr) + opt_hdr_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DGTP, LOGL_ERROR, "Rx GTP-U packet with size %u < %zu (header + opt)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 msgb_length(msg), sizeof(*hdr) + opt_hdr_len);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto free_ret;</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%);">+   msg->l3h = msgb_data(msg) + sizeof(*hdr) + opt_hdr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (pl_len < opt_hdr_len || msgb_l3len(msg) != (pl_len - opt_hdr_len)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGTP, LOGL_ERROR, "Rx GTP-U packet with payload size %u != %u (header)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  msgb_length(msg), pl_len - opt_hdr_len);</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto free_ret;</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%);">+   return hnb_gtp_rx_gtp(hnb, msg, &peer);</span><br><span style="color: hsl(120, 100%, 40%);">+free_ret:</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       return rc;</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%);">+static int hnb_gtp_wq_write_cb(struct osmo_fd *fd, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct hnb *hnb = (struct hnb *)fd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_sockaddr *rem_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rem_addr = (struct osmo_sockaddr *)msgb_data(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_pull(msg, sizeof(*rem_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = sendto(hnb->gtp.wq1u.bfd.fd, msgb_data(msg), msgb_length(msg), 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                 &rem_addr->u.sa, sizeof(*rem_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              int err = errno;</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DGTP, LOGL_ERROR, "GTP1-U sendto(len=%d, to=%s) failed: Error = %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_length(msg), osmo_sockaddr_to_str(rem_addr), strerror(err));</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Get osa of locally bound GTP-U socket */</span><br><span> static int sk_get_bound_addr(int fd, struct osmo_sockaddr *osa)</span><br><span> {</span><br><span>@@ -70,173 +303,43 @@</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Called whenever we receive a DATA packet */</span><br><span style="color: hsl(0, 100%, 40%);">-static int hnb_gtp_cb_data_ind(struct pdp_t *lib, void *packet, unsigned int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct hnb_gtp_prim *gtp_prim;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gtp_conn *conn = lib->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct hnb_ue *ue;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct hnb *hnb;</span><br><span style="color: hsl(0, 100%, 40%);">-        int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!conn) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DGTP, LOGL_NOTICE, "Tx GTP-CONN_DATA.ind data=%p len=%u with no conn!\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                     packet, len);</span><br><span style="color: hsl(0, 100%, 40%);">-              return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       ue = conn->ue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ue->conn_ps.active) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGUE(ue, DGTP, LOGL_NOTICE, "Tx GTP-CONN_DATA.ind data=%p len=%u but UE conn_ps is not active!\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 packet, len);</span><br><span style="color: hsl(0, 100%, 40%);">-             return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       hnb = ue->hnb;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGUE(ue, DGTP, LOGL_DEBUG, "Tx GTP-CONN_DATA.ind data=%p len=%u\n", packet, len);</span><br><span style="color: hsl(0, 100%, 40%);">-    gtp_prim = hnb_gtp_makeprim_conn_data_ind(conn->id, packet, len);</span><br><span style="color: hsl(0, 100%, 40%);">-    if ((rc = osmo_prim_srv_send(hnb->llsk, gtp_prim->hdr.msg)) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGUE(ue, DGTP, LOGL_ERROR, "Failed Tx GTP-CONN_DATA.ind data=%p len=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 packet, len);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* libgtp select loop integration */</span><br><span style="color: hsl(0, 100%, 40%);">-static int hnb_gtp_fd_cb(struct osmo_fd *fd, unsigned int what)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct hnb *hnb = fd->data;</span><br><span style="color: hsl(0, 100%, 40%);">-  int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(what & OSMO_FD_READ))</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       switch (fd->priv_nr) {</span><br><span style="color: hsl(0, 100%, 40%);">-       case 0:</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = gtp_decaps1u(hnb->gtp.gsn);</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> int hnb_gtp_bind(struct hnb *hnb)</span><br><span> {</span><br><span>        int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsn_t *gsn;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct in_addr inaddr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      rc = inet_pton(AF_INET, hnb->gtp.cfg_local_addr, &inaddr);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (rc <= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(hnb->gtp.wq1u.bfd.fd == -1);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: add new mode GTP_MODE_GTPU_ONLY to set up gtpu side only (and ignore statedir) */</span><br><span style="color: hsl(0, 100%, 40%);">-      rc = gtp_new(&gsn, "/tmp", &inaddr, GTP_MODE_SGSN);</span><br><span style="color: hsl(120, 100%, 40%);">+ hnb->gtp.wq1u.read_cb = hnb_gtp_wq_read_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+        hnb->gtp.wq1u.write_cb = hnb_gtp_wq_write_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = osmo_sock_init2_ofd(&hnb->gtp.wq1u.bfd, AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP,</span><br><span style="color: hsl(120, 100%, 40%);">+                            hnb->gtp.cfg_local_addr, 2152, NULL, 0, OSMO_SOCK_F_BIND);</span><br><span>   if (rc < 0) {</span><br><span>             LOGP(DGTP, LOGL_ERROR, "Failed to set up GTP socket: %s\n", strerror(-rc));</span><br><span>                return rc;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rc = sk_get_bound_addr(gsn->fd1u, &hnb->gtp.local_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = sk_get_bound_addr(hnb->gtp.wq1u.bfd.fd, &hnb->gtp.local_addr);</span><br><span>        if (rc < 0) {</span><br><span>             LOGP(DGTP, LOGL_ERROR, "Failed to get GTP-U socket bound address: %s\n", strerror(-rc));</span><br><span>           goto free_ret;</span><br><span>       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_fd_setup(&hnb->gtp.fd1u, gsn->fd1u, OSMO_FD_READ, hnb_gtp_fd_cb, hnb, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((rc = osmo_fd_register(&hnb->gtp.fd1u)) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-              goto free_ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  gtp_set_cb_data_ind(gsn, hnb_gtp_cb_data_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  hnb->gtp.gsn = gsn;</span><br><span>       return 0;</span><br><span> </span><br><span> free_ret:</span><br><span style="color: hsl(0, 100%, 40%);">-      gtp_free(gsn);</span><br><span style="color: hsl(0, 100%, 40%);">-  hnb->gtp.fd1u.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (hnb->gtp.wq1u.bfd.fd != -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          close(hnb->gtp.wq1u.bfd.fd);</span><br><span style="color: hsl(120, 100%, 40%);">+               hnb->gtp.wq1u.bfd.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span>    return rc;</span><br><span> }</span><br><span> </span><br><span> void hnb_gtp_unbind(struct hnb *hnb)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_fd_unregister(&hnb->gtp.fd1u);</span><br><span style="color: hsl(0, 100%, 40%);">-      gtp_free(hnb->gtp.gsn);</span><br><span style="color: hsl(0, 100%, 40%);">-      hnb->gtp.gsn = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- hnb->gtp.fd1u.fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int gtp_conn_setup(struct gtp_conn *conn, const struct osmo_sockaddr *rem_addr, uint32_t rem_tei)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct hnb_ue *ue = conn->ue;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct hnb *hnb = ue->hnb;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct pdp_t *pdp;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct in_addr rem_in;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGUE(ue, DGTP, LOGL_INFO, "Creating PDP context\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (rem_addr->u.sa.sa_family != AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGUE(ue, DGTP, LOGL_ERROR, "Failed creating PDP context: unsupported proto family %u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   rem_addr->u.sa.sa_family);</span><br><span style="color: hsl(0, 100%, 40%);">-             return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (hnb->gtp.wq1u.bfd.fd != -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_wqueue_clear(&hnb->gtp.wq1u);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_fd_unregister(&hnb->gtp.wq1u.bfd);</span><br><span style="color: hsl(120, 100%, 40%);">+                close(hnb->gtp.wq1u.bfd.fd);</span><br><span style="color: hsl(120, 100%, 40%);">+               hnb->gtp.wq1u.bfd.fd = -1;</span><br><span>        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       conn->rem_addr = *rem_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-  conn->rem_tei = rem_tei;</span><br><span style="color: hsl(0, 100%, 40%);">-     rem_in = rem_addr->u.sin.sin_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-   conn->id = next_gtp_conn_id++; /* TODO: validate next one is not already taken due to wrap-around */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = gtp_pdp_newpdp(hnb->gtp.gsn, &pdp, conn->id, 0 /* TODO: NSAPI? */, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGUE(ue, DGTP, LOGL_ERROR, "Failed creating PDP context: %s\n", strerror(-rc));</span><br><span style="color: hsl(0, 100%, 40%);">-              return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       pdp->priv = conn;</span><br><span style="color: hsl(0, 100%, 40%);">-    conn->pdp_lib = pdp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- pdp->teid_gn = rem_tei;</span><br><span style="color: hsl(0, 100%, 40%);">-      pdp->version = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-    pdp->hisaddr0 =      rem_in;</span><br><span style="color: hsl(0, 100%, 40%);">- pdp->hisaddr1 = rem_in;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      pdp->gsnru.l = sizeof(rem_in);</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(pdp->gsnru.v, &rem_in, sizeof(rem_in));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   pdp->gsnlu.l = sizeof(hnb->gtp.local_addr.u.sin.sin_addr);</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(pdp->gsnlu.v, &hnb->gtp.local_addr.u.sin.sin_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-            sizeof(hnb->gtp.local_addr.u.sin.sin_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  conn->loc_addr = hnb->gtp.local_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-     //loc_addr->u.sin.sin_family = AF_INET;</span><br><span style="color: hsl(0, 100%, 40%);">-      //loc_addr->u.sin.sin_addr = hnb->gtp.gsn->gsnu;</span><br><span style="color: hsl(0, 100%, 40%);">-       //loc_addr->u.sin.sin_port = GTP1U_PORT;</span><br><span style="color: hsl(0, 100%, 40%);">-     conn->loc_tei = pdp->teid_own;</span><br><span style="color: hsl(0, 100%, 40%);">-    return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int gtp_conn_tx(struct gtp_conn *conn, void *gtpu_payload, unsigned gtpu_payload_len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct hnb_ue *ue;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct hnb *hnb;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!conn || !conn->pdp_lib) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DGTP, LOGL_ERROR, "Tx: PDP Ctx not available\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ue = conn->ue;</span><br><span style="color: hsl(0, 100%, 40%);">-       hnb = ue->hnb;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!hnb->gtp.gsn) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGUE(ue, DGTP, LOGL_ERROR, "Tx: GTP socket not bound\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       rc = gtp_data_req(hnb->gtp.gsn, conn->pdp_lib, gtpu_payload, gtpu_payload_len);</span><br><span style="color: hsl(0, 100%, 40%);">-   return rc;</span><br><span> }</span><br><span>diff --git a/src/osmo-hnodeb/hnb.c b/src/osmo-hnodeb/hnb.c</span><br><span>index fe2f4f5..18f39b4 100644</span><br><span>--- a/src/osmo-hnodeb/hnb.c</span><br><span>+++ b/src/osmo-hnodeb/hnb.c</span><br><span>@@ -61,7 +61,9 @@</span><br><span>         hnb->rtp.priority = -1;</span><br><span> </span><br><span>       hnb->gtp.cfg_local_addr = talloc_strdup(hnb, "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-   hnb->gtp.fd1u.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_wqueue_init(&hnb->gtp.wq1u, 1024);</span><br><span style="color: hsl(120, 100%, 40%);">+        hnb->gtp.wq1u.bfd.data = hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+      hnb->gtp.wq1u.bfd.fd = -1;</span><br><span> </span><br><span>    hnb->shutdown_fi = osmo_fsm_inst_alloc(&hnb_shutdown_fsm, hnb, hnb,</span><br><span>                                          LOGL_INFO, NULL);</span><br><span>@@ -90,10 +92,7 @@</span><br><span>        osmo_prim_srv_link_free(hnb->llsk_link);</span><br><span>  hnb->llsk_link = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (hnb->gtp.gsn) {</span><br><span style="color: hsl(0, 100%, 40%);">-          gtp_free(hnb->gtp.gsn);</span><br><span style="color: hsl(0, 100%, 40%);">-              hnb->gtp.gsn = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+     hnb_gtp_unbind(hnb);</span><br><span> </span><br><span>     talloc_free(hnb);</span><br><span> }</span><br><span>diff --git a/src/osmo-hnodeb/llsk_gtp.c b/src/osmo-hnodeb/llsk_gtp.c</span><br><span>index a224d56..775df50 100644</span><br><span>--- a/src/osmo-hnodeb/llsk_gtp.c</span><br><span>+++ b/src/osmo-hnodeb/llsk_gtp.c</span><br><span>@@ -138,7 +138,7 @@</span><br><span>    union u_addr loc_uaddr = {0};</span><br><span>        struct gtp_conn *conn = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       rc = ll_addr2osa(ce_req->remote_gtpu_address_type, &ce_req->remote_gtpu_addr, GTP1U_PORT, &rem_osa);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = ll_addr2osa(ce_req->remote_gtpu_address_type, &ce_req->remote_gtpu_addr, 2152, &rem_osa);</span><br><span>         if (rc < 0) {</span><br><span>             LOGP(DLLSK, LOGL_ERROR, "Rx GTP-CONN_ESTABLISH.req: ctx=%u with unexpected address type %u\n",</span><br><span>                  ce_req->context_id, ce_req->remote_gtpu_address_type);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26675">change 26675</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-hnodeb/+/26675"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hnodeb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I53ad4915aaed3bc7574036e963be10514e370fe2 </div>
<div style="display:none"> Gerrit-Change-Number: 26675 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>