<p>lynxis lazus has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/19236">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP add IPv6 support for the PCU SOCKET<br><br>This is the "old" approach. Not for master.<br><br>Change-Id: Iaa2113644fcb4e6ff38649ca7f3abb6469f33d48<br>---<br>M include/osmocom/pcu/pcuif_proto.h<br>M src/gprs_bssgp_pcu.cpp<br>M src/gprs_bssgp_pcu.h<br>M src/pcu_l1_if.cpp<br>M tests/emu/pcu_emu.cpp<br>5 files changed, 41 insertions(+), 20 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/36/19236/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/pcu/pcuif_proto.h b/include/osmocom/pcu/pcuif_proto.h</span><br><span>index fd989a5..a6714ca 100644</span><br><span>--- a/include/osmocom/pcu/pcuif_proto.h</span><br><span>+++ b/include/osmocom/pcu/pcuif_proto.h</span><br><span>@@ -1,11 +1,12 @@</span><br><span> #ifndef _PCUIF_PROTO_H</span><br><span> #define _PCUIF_PROTO_H</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <arpa/inet.h></span><br><span> #include <osmocom/gsm/l1sap.h></span><br><span> </span><br><span> #define PCU_SOCK_DEFAULT       "/tmp/pcu_bts"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define PCU_IF_VERSION              0x09</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_IF_VERSION            0x10</span><br><span> #define TXT_MAX_LEN     128</span><br><span> </span><br><span> /* msg_type */</span><br><span>@@ -153,7 +154,11 @@</span><br><span>     uint16_t        nsvci[2];</span><br><span>    uint16_t        local_port[2];</span><br><span>       uint16_t        remote_port[2];</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t        remote_ip[2];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t         adress_family;</span><br><span style="color: hsl(120, 100%, 40%);">+        union {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct in_addr ipv4;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct in6_addr ipv6;</span><br><span style="color: hsl(120, 100%, 40%);">+ } remote_ip[2];</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span> struct gsm_pcu_if_act_req {</span><br><span>diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp</span><br><span>index abcb106..d769333 100644</span><br><span>--- a/src/gprs_bssgp_pcu.cpp</span><br><span>+++ b/src/gprs_bssgp_pcu.cpp</span><br><span>@@ -882,13 +882,13 @@</span><br><span> }</span><br><span> </span><br><span> /* create BSSGP/NS layer instances */</span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: use a pointer for sgsn */</span><br><span> struct gprs_bssgp_pcu *gprs_bssgp_create_and_connect(struct gprs_rlcmac_bts *bts,</span><br><span style="color: hsl(0, 100%, 40%);">-       uint16_t local_port, uint32_t sgsn_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-  uint16_t sgsn_port, uint16_t nsei, uint16_t nsvci, uint16_t bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t local_port, struct osmo_sockaddr *sgsn,</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t nsei, uint16_t nsvci, uint16_t bvci,</span><br><span>        uint16_t mcc, uint16_t mnc, bool mnc_3_digits, uint16_t lac, uint16_t rac,</span><br><span>   uint16_t cell_id)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct sockaddr_in dest;</span><br><span>     int rc;</span><br><span> </span><br><span>  /* if already created... return the current address */</span><br><span>@@ -901,10 +901,9 @@</span><br><span>         * issue a connect() on the socket, which prevents us to dynamically communicate</span><br><span>      * with any number of IP-SNS endpoints on the SGSN side */</span><br><span>   if (!bts->gb_dialect_sns) {</span><br><span style="color: hsl(0, 100%, 40%);">-          bssgp_nsi->nsip.remote_port = sgsn_port;</span><br><span style="color: hsl(0, 100%, 40%);">-             bssgp_nsi->nsip.remote_ip = sgsn_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+               bssgp_nsi->nsip.remote = *sgsn;</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       bssgp_nsi->nsip.local_port = local_port;</span><br><span style="color: hsl(120, 100%, 40%);">+   bssgp_nsi->nsip.local.u.sin.sin_port = local_port;</span><br><span>        rc = gprs_ns_nsip_listen(bssgp_nsi);</span><br><span>         if (rc < 0) {</span><br><span>             LOGP(DBSSGP, LOGL_ERROR, "Failed to create socket\n");</span><br><span>@@ -912,14 +911,10 @@</span><br><span>             return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   dest.sin_family = AF_INET;</span><br><span style="color: hsl(0, 100%, 40%);">-      dest.sin_port = htons(sgsn_port);</span><br><span style="color: hsl(0, 100%, 40%);">-       dest.sin_addr.s_addr = htonl(sgsn_ip);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       if (bts->gb_dialect_sns)</span><br><span style="color: hsl(0, 100%, 40%);">-             the_pcu.nsvc = gprs_ns_nsip_connect_sns(bssgp_nsi, &dest, nsei, nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+           the_pcu.nsvc = gprs_ns_nsip_connect_sns(bssgp_nsi, sgsn, nsei, nsvci);</span><br><span>       else</span><br><span style="color: hsl(0, 100%, 40%);">-            the_pcu.nsvc = gprs_ns_nsip_connect(bssgp_nsi, &dest, nsei, nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+               the_pcu.nsvc = gprs_ns_nsip_connect(bssgp_nsi, sgsn, nsei, nsvci);</span><br><span>   if (!the_pcu.nsvc) {</span><br><span>                 LOGP(DBSSGP, LOGL_ERROR, "Failed to create NSVCt\n");</span><br><span>              gprs_ns_close(bssgp_nsi);</span><br><span>diff --git a/src/gprs_bssgp_pcu.h b/src/gprs_bssgp_pcu.h</span><br><span>index f98e719..9b40059 100644</span><br><span>--- a/src/gprs_bssgp_pcu.h</span><br><span>+++ b/src/gprs_bssgp_pcu.h</span><br><span>@@ -75,8 +75,7 @@</span><br><span> };</span><br><span> </span><br><span> struct gprs_bssgp_pcu *gprs_bssgp_create_and_connect(struct gprs_rlcmac_bts *bts,</span><br><span style="color: hsl(0, 100%, 40%);">-               uint16_t local_port,</span><br><span style="color: hsl(0, 100%, 40%);">-            uint32_t sgsn_ip, uint16_t sgsn_port, uint16_t nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+          uint16_t local_port, struct osmo_sockaddr *sgsn, uint16_t nsei,</span><br><span>              uint16_t nsvci, uint16_t bvci, uint16_t mcc, uint16_t mnc, bool mnc_3_digits,</span><br><span>                uint16_t lac, uint16_t rac, uint16_t cell_id);</span><br><span> </span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index 883cb22..e0ff701 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -34,6 +34,8 @@</span><br><span> #include <osmocom/core/gsmtap_util.h></span><br><span> #include <osmocom/core/gsmtap.h></span><br><span> #include <osmocom/core/bitvec.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/sockaddr_str.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/gsm/l1sap.h></span><br><span>@@ -424,6 +426,8 @@</span><br><span>   struct gprs_rlcmac_bts *bts = bts_main_data();</span><br><span>       struct gprs_bssgp_pcu *pcu;</span><br><span>  struct gprs_rlcmac_pdch *pdch;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_sockaddr saddr;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_sockaddr_str addr;</span><br><span>       struct in_addr ia;</span><br><span>   int rc = 0;</span><br><span>  unsigned int trx, ts;</span><br><span>@@ -502,11 +506,25 @@</span><br><span>        LOGP(DL1IF, LOGL_DEBUG, " nsvci=%d\n", info_ind->nsvci[0]);</span><br><span>     LOGP(DL1IF, LOGL_DEBUG, " local_port=%d\n", info_ind->local_port[0]);</span><br><span>   LOGP(DL1IF, LOGL_DEBUG, " remote_port=%d\n", info_ind->remote_port[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-    ia.s_addr = htonl(info_ind->remote_ip[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DL1IF, LOGL_DEBUG, " remote_ip=%s\n", inet_ntoa(ia));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (info_ind->adress_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case IPPROTO_IPIP:</span><br><span style="color: hsl(120, 100%, 40%);">+            saddr.u.sin.sin_addr = info_ind->remote_ip[0].ipv4;</span><br><span style="color: hsl(120, 100%, 40%);">+                saddr.u.sin.sin_port = info_ind->remote_port[0];</span><br><span style="color: hsl(120, 100%, 40%);">+           saddr.u.sin.sin_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case IPPROTO_IPV6:</span><br><span style="color: hsl(120, 100%, 40%);">+            saddr.u.sin6.sin6_addr = info_ind->remote_ip[0].ipv6;</span><br><span style="color: hsl(120, 100%, 40%);">+              saddr.u.sin6.sin6_port = info_ind->remote_port[0];</span><br><span style="color: hsl(120, 100%, 40%);">+         saddr.u.sin6.sin6_family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_sockaddr_str_from_sockaddr(&addr, &saddr.u.sas);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGP(DL1IF, LOGL_DEBUG, " remote_ip=%s\n", addr.ip);</span><br><span> </span><br><span>   pcu = gprs_bssgp_create_and_connect(bts, info_ind->local_port[0],</span><br><span style="color: hsl(0, 100%, 40%);">-            info_ind->remote_ip[0], info_ind->remote_port[0],</span><br><span style="color: hsl(120, 100%, 40%);">+               &saddr,</span><br><span>          info_ind->nsei, info_ind->nsvci[0], info_ind->bvci,</span><br><span>                 info_ind->mcc, info_ind->mnc, info_ind->mnc_3_digits, info_ind->lac, info_ind->rac,</span><br><span>           info_ind->cell_id);</span><br><span>diff --git a/tests/emu/pcu_emu.cpp b/tests/emu/pcu_emu.cpp</span><br><span>index 7f99355..e8d8f05 100644</span><br><span>--- a/tests/emu/pcu_emu.cpp</span><br><span>+++ b/tests/emu/pcu_emu.cpp</span><br><span>@@ -93,8 +93,12 @@</span><br><span>                         uint32_t sgsn_ip, uint16_t sgsn_port)</span><br><span> {</span><br><span>   struct gprs_bssgp_pcu *pcu;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_sockaddr saddr;</span><br><span style="color: hsl(120, 100%, 40%);">+   saddr.u.sin.sin_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+     saddr.u.sin.sin_addr.s_addr = htonl(sgsn_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+ saddr.u.sin.sin_port = htons(sgsn_port);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    pcu = gprs_bssgp_create_and_connect(bts, 0, sgsn_ip, sgsn_port,</span><br><span style="color: hsl(120, 100%, 40%);">+       pcu = gprs_bssgp_create_and_connect(bts, 0, &saddr,</span><br><span>                                      20, 20, 20, 901, 99, false, 1, 0, 0);</span><br><span>        pcu->on_unblock_ack = bvci_unblocked;</span><br><span>     pcu->on_dl_unit_data = bssgp_data;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/19236">change 19236</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-pcu/+/19236"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iaa2113644fcb4e6ff38649ca7f3abb6469f33d48 </div>
<div style="display:none"> Gerrit-Change-Number: 19236 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>