<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20056">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: mncc: Support IPv6 addresses (new version mncc 7)<br><br>Apparently commit 06b859ca314f53a902329ed95848dbafef1d4f87 forgot to<br>bump the MNCC_SOCK_VERSION field from 5  to 6 in<br><br>TODO: check what about MNCC_Emulation.mp_mncc_version<br><br>TODO: Add IPv6 tests for sip/SIP_Tests<br><br>Change-Id: I5448ff931ec33f24f4837a51376f1703fe97683b<br>---<br>M library/MNCC_Emulation.ttcn<br>M library/MNCC_EncDec.cc<br>M library/MNCC_Types.ttcn<br>M library/mncc.h<br>4 files changed, 47 insertions(+), 14 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/56/20056/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/MNCC_Emulation.ttcn b/library/MNCC_Emulation.ttcn</span><br><span>index be087ec..13a842b 100644</span><br><span>--- a/library/MNCC_Emulation.ttcn</span><br><span>+++ b/library/MNCC_Emulation.ttcn</span><br><span>@@ -38,7 +38,7 @@</span><br><span> import from UD_Types all;</span><br><span> </span><br><span> modulepar {</span><br><span style="color: hsl(0, 100%, 40%);">-       int mp_mncc_version := 6;</span><br><span style="color: hsl(120, 100%, 40%);">+     int mp_mncc_version := 7;</span><br><span> }</span><br><span> </span><br><span> /* General "base class" component definition, of which specific implementations</span><br><span>diff --git a/library/MNCC_EncDec.cc b/library/MNCC_EncDec.cc</span><br><span>index f2692d7..d9529ee 100644</span><br><span>--- a/library/MNCC_EncDec.cc</span><br><span>+++ b/library/MNCC_EncDec.cc</span><br><span>@@ -188,8 +188,20 @@</span><br><span>          memset(&rtp, 0, sizeof(rtp));</span><br><span>            rtp.msg_type = in.msg__type();</span><br><span>               rtp.callref = in.u().rtp().callref();</span><br><span style="color: hsl(0, 100%, 40%);">-           rtp.ip = in.u().rtp().ip();</span><br><span style="color: hsl(0, 100%, 40%);">-             rtp.port = in.u().rtp().rtp__port();</span><br><span style="color: hsl(120, 100%, 40%);">+          if (in.u().rtp().is__ipv6()) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        rtp.addr.ss_family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+                        ((struct sockaddr_in6*)&rtp.addr)->sin6_port = in.u().rtp().rtp__port();</span><br><span style="color: hsl(120, 100%, 40%);">+                       //TODO: verify octetstring len</span><br><span style="color: hsl(120, 100%, 40%);">+                        memcpy(((struct sockaddr_in6*)&rtp.addr)->sin6_addr, in.u().rtp().ip().data(),</span><br><span style="color: hsl(120, 100%, 40%);">+                        sizeof(struct in6_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+              } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rtp.addr.ss_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+                 ((struct sockaddr_in*)&rtp.addr)->sin_port = in.u().rtp().rtp__port();</span><br><span style="color: hsl(120, 100%, 40%);">+                 //TODO: verify octetstring len</span><br><span style="color: hsl(120, 100%, 40%);">+                        memcpy(((struct sockaddr_in*)&rtp.addr)->sin_addr, in.u().rtp().ip().data(),</span><br><span style="color: hsl(120, 100%, 40%);">+                          sizeof(struct in_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+                       //rtp.ip = in.u().rtp().ip();</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span>            rtp.payload_type = in.u().rtp().payload__type();</span><br><span>             rtp.payload_msg_type = in.u().rtp().payload__msg__type();</span><br><span>            ret_val = OCTETSTRING(sizeof(rtp), (uint8_t *) &rtp);</span><br><span>@@ -224,6 +236,9 @@</span><br><span>      const struct gsm_mncc_rtp *in_rtp;</span><br><span>   MNCC__PDU__Rtp rtp;</span><br><span>  MNCC__MsgUnion u;</span><br><span style="color: hsl(120, 100%, 40%);">+     bool is_ipv6;</span><br><span style="color: hsl(120, 100%, 40%);">+ OCTETSTRING ip;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t port;</span><br><span> </span><br><span>   in_mncc = (struct gsm_mncc *) ttcn_buffer.get_read_data();</span><br><span> </span><br><span>@@ -258,7 +273,20 @@</span><br><span>        case MNCC_RTP_CONNECT:</span><br><span>       case MNCC_RTP_FREE:</span><br><span>          in_rtp = (const struct gsm_mncc_rtp *) in_mncc;</span><br><span style="color: hsl(0, 100%, 40%);">-         rtp = MNCC__PDU__Rtp(in_rtp->callref, in_rtp->ip, in_rtp->port, in_rtp->payload_type,</span><br><span style="color: hsl(120, 100%, 40%);">+             switch (in_rtp->addr.ss_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                 is_ipv6 = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                      port = ((struct sockaddr_in*)&in_rtp->addr)->sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+                      ip = OCTETSTRING(sizeof(struct in_addr), &(struct sockaddr_in*)&in_rtp->addr)->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%);">+                        is_ipv6 = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                       port = ((struct sockaddr_in6*)&in_rtp->addr)->sin6_port;</span><br><span style="color: hsl(120, 100%, 40%);">+                    ip = OCTETSTRING(sizeof(struct in6_addr), &(struct sockaddr_in6*)&in_rtp->addr)->sin6_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+             rtp = MNCC__PDU__Rtp(in_rtp->callref, is_ipv6, ip, port, in_rtp->payload_type,</span><br><span>                                      in_rtp->payload_msg_type, in_rtp->sdp);</span><br><span>           u.rtp() = rtp;</span><br><span>               break;</span><br><span>diff --git a/library/MNCC_Types.ttcn b/library/MNCC_Types.ttcn</span><br><span>index 0a8e7d9..fa4fc3e 100644</span><br><span>--- a/library/MNCC_Types.ttcn</span><br><span>+++ b/library/MNCC_Types.ttcn</span><br><span>@@ -373,7 +373,8 @@</span><br><span> </span><br><span> type record MNCC_PDU_Rtp {</span><br><span>      uint32_t        callref,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t        ip,</span><br><span style="color: hsl(120, 100%, 40%);">+   boolean         is_ipv6,</span><br><span style="color: hsl(120, 100%, 40%);">+      octetstring     ip, //TODO: define size of octetstring based on is_ipv6 using CROSSTAGS?</span><br><span>     uint16_t        rtp_port,</span><br><span>    uint32_t        payload_type,</span><br><span>        uint32_t        payload_msg_type,</span><br><span>@@ -1921,7 +1922,8 @@</span><br><span>    u := {</span><br><span>               rtp := {</span><br><span>                     callref := call_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                     ip := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                      is_ipv6 := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                     ip := '00000000'O,</span><br><span>                   rtp_port := 0,</span><br><span>                       payload_type := 0,</span><br><span>                   payload_msg_type := 0,</span><br><span>@@ -1935,13 +1937,14 @@</span><br><span> </span><br><span> /* MSC -> MNCC: RTP_CREATE.rsp; acknowledge creation of RTP (stating MSC side IP/Port) */</span><br><span> template MNCC_PDU tr_MNCC_RTP_CREATE(template uint32_t call_id := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 template uint32_t ip := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                              template uint32_t rtp_port := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                              template octetstring ip := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 template uint16_t rtp_port := ?,</span><br><span>                                     template uint32_t payload_type := ?) := {</span><br><span>       msg_type := MNCC_RTP_CREATE,</span><br><span>         u := {</span><br><span>               rtp := {</span><br><span>                     callref := call_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                   is_ipv6 := false,</span><br><span>                    ip := ip,</span><br><span>                    rtp_port := rtp_port,</span><br><span>                        payload_type := payload_type,</span><br><span>@@ -1952,11 +1955,12 @@</span><br><span> }</span><br><span> </span><br><span> /* MSC <- MNCC: RTP_CONNECT.req; request connect of RTP */</span><br><span style="color: hsl(0, 100%, 40%);">-template MNCC_PDU ts_MNCC_RTP_CONNECT(uint32_t call_id, uint32_t ip, uint32_t rtp_port, uint32_t pt) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template MNCC_PDU ts_MNCC_RTP_CONNECT(uint32_t call_id, octetstring ip, uint16_t rtp_port, uint32_t pt) := {</span><br><span>     msg_type := MNCC_RTP_CONNECT,</span><br><span>        u := {</span><br><span>               rtp := {</span><br><span>                     callref := call_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                   is_ipv6 := false,</span><br><span>                    ip := ip,</span><br><span>                    rtp_port := rtp_port,</span><br><span>                        payload_type := pt,</span><br><span>@@ -1966,13 +1970,14 @@</span><br><span>        }</span><br><span> }</span><br><span> template MNCC_PDU tr_MNCC_RTP_CONNECT(template uint32_t call_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    template uint32_t ip := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      template uint32_t rtp_port := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template octetstring ip := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 template uint16_t rtp_port := ?,</span><br><span>                                     template uint32_t pt := ?) := {</span><br><span>        msg_type := MNCC_RTP_CONNECT,</span><br><span>        u := {</span><br><span>               rtp := {</span><br><span>                     callref := call_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                   is_ipv6 := false,</span><br><span>                    ip := ip,</span><br><span>                    rtp_port := rtp_port,</span><br><span>                        payload_type := pt,</span><br><span>diff --git a/library/mncc.h b/library/mncc.h</span><br><span>index 9aff948..1e45c37 100644</span><br><span>--- a/library/mncc.h</span><br><span>+++ b/library/mncc.h</span><br><span>@@ -5,6 +5,7 @@</span><br><span>  */</span><br><span> </span><br><span> #include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span> </span><br><span> /* GSM 04.08 Bearer Capability: Rate Adaption */</span><br><span> enum gsm48_bcap_ra {</span><br><span>@@ -275,7 +276,7 @@</span><br><span>      unsigned char   data[0];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MNCC_SOCK_VERSION     5</span><br><span style="color: hsl(120, 100%, 40%);">+#define MNCC_SOCK_VERSION    7</span><br><span> struct gsm_mncc_hello {</span><br><span>         uint32_t        msg_type;</span><br><span>    uint32_t        version;</span><br><span>@@ -294,8 +295,7 @@</span><br><span> struct gsm_mncc_rtp {</span><br><span>      uint32_t        msg_type;</span><br><span>    uint32_t        callref;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t        ip;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t        port;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct sockaddr_storage addr;</span><br><span>        uint32_t        payload_type;</span><br><span>        uint32_t        payload_msg_type;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20056">change 20056</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-ttcn3-hacks/+/20056"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I5448ff931ec33f24f4837a51376f1703fe97683b </div>
<div style="display:none"> Gerrit-Change-Number: 20056 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>