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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce the new OML NM_ATT_OSMO_NS_LINK_CFG to configure IPv6 NSVC for PCU<br><br>With PCU interface version 10 it supports IPv6 NSVC. The new OML IE<br>NM_ATT_OSMO_NS_LINK_CFG allows to configure IPv6 NSVC.<br><br>Change-Id: I310699fabbfec4255f0474f31717f215c1201eca<br>---<br>M include/osmo-bts/bts.h<br>M src/common/oml.c<br>M src/common/pcu_sock.c<br>3 files changed, 65 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index ccbcf9a..4e496b5 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -2,6 +2,7 @@</span><br><span> #define _BTS_H</span><br><span> </span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span> #include <osmo-bts/gsm_data.h></span><br><span> #include <osmo-bts/bts_trx.h></span><br><span> </span><br><span>@@ -69,9 +70,8 @@</span><br><span>          * via OML from BSC */</span><br><span>       int id;</span><br><span>      uint16_t nsvci;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t local_port;    /* on the BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint16_t remote_port;   /* on the SGSN */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t remote_ip;     /* on the SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_sockaddr local;     /* on the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_sockaddr remote;    /* on the SGSN */</span><br><span> </span><br><span>        struct gsm_abis_mo mo;</span><br><span> };</span><br><span>diff --git a/src/common/oml.c b/src/common/oml.c</span><br><span>index 9fca008..1f74cac 100644</span><br><span>--- a/src/common/oml.c</span><br><span>+++ b/src/common/oml.c</span><br><span>@@ -1259,16 +1259,59 @@</span><br><span>          uint16_t _cur_s;</span><br><span>             uint32_t _cur_l;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+          memset(&nsvc->local, 0, sizeof(nsvc->local));</span><br><span style="color: hsl(120, 100%, 40%);">+               memset(&nsvc->remote, 0, sizeof(nsvc->remote));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc->local.u.sin.sin_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+            nsvc->remote.u.sin.sin_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                memcpy(&_cur_s, cur, 2);</span><br><span style="color: hsl(0, 100%, 40%);">-            nsvc->remote_port = ntohs(_cur_s);</span><br><span style="color: hsl(120, 100%, 40%);">+         nsvc->remote.u.sin.sin_port = _cur_s;</span><br><span>             cur += 2;</span><br><span>            memcpy(&_cur_l, cur, 4);</span><br><span style="color: hsl(0, 100%, 40%);">-            nsvc->remote_ip = ntohl(_cur_l);</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc->remote.u.sin.sin_addr.s_addr = _cur_l;</span><br><span>              cur += 4;</span><br><span>            memcpy(&_cur_s, cur, 2);</span><br><span style="color: hsl(0, 100%, 40%);">-            nsvc->local_port = ntohs(_cur_s);</span><br><span style="color: hsl(120, 100%, 40%);">+          nsvc->local.u.sin.sin_port = ntohs(_cur_s);</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRES_LEN(tp, NM_ATT_OSMO_NS_LINK_CFG, 10)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         const uint8_t *cur = TLVP_VAL(tp, NM_ATT_OSMO_NS_LINK_CFG);</span><br><span style="color: hsl(120, 100%, 40%);">+           uint16_t address_family;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            memset(&nsvc->local, 0, sizeof(nsvc->local));</span><br><span style="color: hsl(120, 100%, 40%);">+               memset(&nsvc->remote, 0, sizeof(nsvc->remote));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           address_family = osmo_load16be(cur);</span><br><span style="color: hsl(120, 100%, 40%);">+          cur += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           memcpy(&nsvc->local.u.sin.sin_port, cur, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+           cur += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           memcpy(&nsvc->remote.u.sin.sin_port, cur, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+          cur += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           switch (address_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+             case OSMO_NSVC_ADDR_IPV4:</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* we already checked for 10 bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+                 nsvc->remote.u.sas.ss_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+                    nsvc->local.u.sas.ss_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+                     memcpy(&nsvc->remote.u.sin.sin_addr.s_addr, cur, sizeof(in_addr_t));</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case OSMO_NSVC_ADDR_IPV6:</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (TLVP_LEN(tp, NM_ATT_OSMO_NS_LINK_CFG) < 22) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+                     nsvc->remote.u.sas.ss_family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+                   nsvc->local.u.sas.ss_family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+                    memcpy(&nsvc->remote.u.sin6.sin6_addr, cur, sizeof(struct in6_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      return -1;</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%);">+</span><br><span>        osmo_signal_dispatch(SS_GLOBAL, S_NEW_NSVC_ATTR, nsvc);</span><br><span> </span><br><span>  return 0;</span><br><span>@@ -1505,6 +1548,7 @@</span><br><span>    DEBUGP(DOML, "Initializing OML attribute definitions\n");</span><br><span>  tlv_def_patch(&abis_nm_att_tlvdef_ipa_local, &abis_nm_att_tlvdef_ipa);</span><br><span>       tlv_def_patch(&abis_nm_att_tlvdef_ipa_local, &abis_nm_att_tlvdef);</span><br><span style="color: hsl(120, 100%, 40%);">+    tlv_def_patch(&abis_nm_att_tlvdef_ipa_local, &abis_nm_osmo_att_tlvdef);</span><br><span> </span><br><span>  return 0;</span><br><span> }</span><br><span>diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c</span><br><span>index c922584..68cd039 100644</span><br><span>--- a/src/common/pcu_sock.c</span><br><span>+++ b/src/common/pcu_sock.c</span><br><span>@@ -330,10 +330,21 @@</span><br><span>      for (i = 0; i < 2; i++) {</span><br><span>                 nsvc = &bts->gprs.nsvc[i];</span><br><span>            info_ind->nsvci[i] = nsvc->nsvci;</span><br><span style="color: hsl(0, 100%, 40%);">-         info_ind->local_port[i] = nsvc->local_port;</span><br><span style="color: hsl(0, 100%, 40%);">-               info_ind->remote_port[i] = nsvc->remote_port;</span><br><span style="color: hsl(0, 100%, 40%);">-             info_ind->remote_ip[i].v4.s_addr = htonl(nsvc->remote_ip);</span><br><span style="color: hsl(0, 100%, 40%);">-                info_ind->address_type[i] = PCU_IF_ADDR_TYPE_IPV4;</span><br><span style="color: hsl(120, 100%, 40%);">+         info_ind->local_port[i] = nsvc->local.u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+           info_ind->remote_port[i] = nsvc->remote.u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+         switch (nsvc->remote.u.sas.ss_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_ind->address_type[i] = PCU_IF_ADDR_TYPE_IPV4;</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_ind->remote_ip[i].v4 = nsvc->remote.u.sin.sin_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                        info_ind->address_type[i] = PCU_IF_ADDR_TYPE_IPV6;</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_ind->remote_ip[i].v6 = nsvc->remote.u.sin6.sin6_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      info_ind->address_type[i] = PCU_IF_ADDR_TYPE_UNSPEC;</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>    }</span><br><span> </span><br><span>        llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/20272">change 20272</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-bts/+/20272"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I310699fabbfec4255f0474f31717f215c1201eca </div>
<div style="display:none"> Gerrit-Change-Number: 20272 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </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-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>