<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/25962">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sccp: Add minimalistic support for XUDT / XUDTS<br><br>XUDT and XUDTS can be used in two situations:<br><br>a) because the sender wants to use segmentation<br>b) because the sender wants to include a hop counter<br><br>In this patch, we implement support for case "b" only.<br><br>Change-Id: Ic5b9486f1aeb4bb90cfe702a7ce996f5d82ded2c<br>Related: OS#5281, SYS#5674<br>---<br>M include/osmocom/sccp/sccp_types.h<br>M src/sccp2sua.c<br>2 files changed, 110 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sccp/sccp_types.h b/include/osmocom/sccp/sccp_types.h</span><br><span>index 616a7ee..4ad7edf 100644</span><br><span>--- a/include/osmocom/sccp/sccp_types.h</span><br><span>+++ b/include/osmocom/sccp/sccp_types.h</span><br><span>@@ -446,6 +446,9 @@</span><br><span>    data</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* optional */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t                 optional_start;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #if OPTIONAL</span><br><span>    segmentation</span><br><span>         importance</span><br><span>@@ -475,6 +478,9 @@</span><br><span>     data</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* optional */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t                 optional_start;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #if OPTIONAL</span><br><span>    segmentation</span><br><span>         importancd</span><br><span>diff --git a/src/sccp2sua.c b/src/sccp2sua.c</span><br><span>index c937231..51fe00b 100644</span><br><span>--- a/src/sccp2sua.c</span><br><span>+++ b/src/sccp2sua.c</span><br><span>@@ -1200,9 +1200,16 @@</span><br><span> </span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int sua_to_sccp_xudt(struct msgb *msg, struct xua_msg *xua);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int sua_to_sccp_udt(struct msgb *msg, struct xua_msg *xua)</span><br><span> {</span><br><span>       struct sccp_data_unitdata *udt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Use XUDT if we have a hop counter on the SUA side */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (xua_msg_find_tag(xua, SUA_IEI_S7_HOP_CTR))</span><br><span style="color: hsl(120, 100%, 40%);">+                return sua_to_sccp_xudt(msg, xua);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         udt = (struct sccp_data_unitdata *) msgb_put(msg, sizeof(*udt));</span><br><span> </span><br><span>         /* Fixed Part */</span><br><span>@@ -1216,6 +1223,46 @@</span><br><span> }</span><br><span> </span><br><span> /*! \returns \ref xua in case of success, NULL on error (xua not freed!) */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct xua_msg *sccp_to_xua_xudt(struct msgb *msg, struct xua_msg *xua)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct sccp_data_ext_unitdata *xudt = (struct sccp_data_ext_unitdata *)msg->l2h;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Fixed Part */</span><br><span style="color: hsl(120, 100%, 40%);">+      xua_msg_add_u32(xua, SUA_IEI_PROTO_CLASS, xudt->proto_class);</span><br><span style="color: hsl(120, 100%, 40%);">+      xua_msg_add_u32(xua, SUA_IEI_S7_HOP_CTR, xudt->hop_counter);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Variable Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!sccp_ptr_part_consistent(msg, &xudt->variable_called))</span><br><span style="color: hsl(120, 100%, 40%);">+            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp_addr_to_sua_ptr(xua, SUA_IEI_DEST_ADDR, msg, &xudt->variable_called);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!sccp_ptr_part_consistent(msg, &xudt->variable_calling))</span><br><span style="color: hsl(120, 100%, 40%);">+           return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp_addr_to_sua_ptr(xua, SUA_IEI_SRC_ADDR, msg, &xudt->variable_calling);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!sccp_ptr_part_consistent(msg, &xudt->variable_data))</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp_data_to_sua_ptr(xua, SUA_IEI_DATA, msg, &xudt->variable_data);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Optional Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   return sccp_to_xua_opt(msg, &xudt->optional_start, xua);</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%);">+static int sua_to_sccp_xudt(struct msgb *msg, struct xua_msg *xua)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct sccp_data_ext_unitdata *xudt;</span><br><span style="color: hsl(120, 100%, 40%);">+  xudt = (struct sccp_data_ext_unitdata *) msgb_put(msg, sizeof(*xudt));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Fixed Part */</span><br><span style="color: hsl(120, 100%, 40%);">+      xudt->type = SCCP_MSG_TYPE_XUDT;</span><br><span style="color: hsl(120, 100%, 40%);">+   xudt->proto_class = xua_msg_get_u32(xua, SUA_IEI_PROTO_CLASS);</span><br><span style="color: hsl(120, 100%, 40%);">+     xudt->hop_counter = xua_msg_get_u32(xua, SUA_IEI_S7_HOP_CTR);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Variable Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   sccp_add_var_addr(msg, &xudt->variable_called, xua, SUA_IEI_DEST_ADDR);</span><br><span style="color: hsl(120, 100%, 40%);">+        sccp_add_var_addr(msg, &xudt->variable_calling, xua, SUA_IEI_SRC_ADDR);</span><br><span style="color: hsl(120, 100%, 40%);">+        sccp_add_variable_part(msg, &xudt->variable_data, xua, SUA_IEI_DATA);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Optional Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   return xua_ies_to_sccp_opts(msg, &xudt->optional_start, xudt->type, xua);</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%);">+/*! \returns \ref xua in case of success, NULL on error (xua not freed!) */</span><br><span> static struct xua_msg *sccp_to_xua_udts(struct msgb *msg, struct xua_msg *xua)</span><br><span> {</span><br><span>         struct sccp_data_unitdata_service *udts;</span><br><span>@@ -1237,9 +1284,16 @@</span><br><span> </span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int sua_to_sccp_xudts(struct msgb *msg, struct xua_msg *xua);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int sua_to_sccp_udts(struct msgb *msg, struct xua_msg *xua)</span><br><span> {</span><br><span>    struct sccp_data_unitdata_service *udts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Use XUDTS if we have a hop counter */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (xua_msg_find_tag(xua, SUA_IEI_S7_HOP_CTR))</span><br><span style="color: hsl(120, 100%, 40%);">+                return sua_to_sccp_xudts(msg, xua);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        udts = (struct sccp_data_unitdata_service *) msgb_put(msg, sizeof(*udts));</span><br><span> </span><br><span>       /* Fixed Part */</span><br><span>@@ -1253,6 +1307,46 @@</span><br><span> }</span><br><span> </span><br><span> /*! \returns \ref xua in case of success, NULL on error (xua not freed!) */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct xua_msg *sccp_to_xua_xudts(struct msgb *msg, struct xua_msg *xua)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct sccp_data_ext_unitdata_service *xudts;</span><br><span style="color: hsl(120, 100%, 40%);">+ xudts = (struct sccp_data_ext_unitdata_service *)msg->l2h;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Fixed Part */</span><br><span style="color: hsl(120, 100%, 40%);">+      xua_msg_add_u32(xua, SUA_IEI_CAUSE, SUA_CAUSE_T_RETURN | xudts->return_cause);</span><br><span style="color: hsl(120, 100%, 40%);">+     xua_msg_add_u32(xua, SUA_IEI_S7_HOP_CTR, xudts->hop_counter);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Variable Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!sccp_ptr_part_consistent(msg, &xudts->variable_called))</span><br><span style="color: hsl(120, 100%, 40%);">+           return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp_addr_to_sua_ptr(xua, SUA_IEI_DEST_ADDR, msg, &xudts->variable_called);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!sccp_ptr_part_consistent(msg, &xudts->variable_calling))</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp_addr_to_sua_ptr(xua, SUA_IEI_SRC_ADDR, msg, &xudts->variable_calling);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!sccp_ptr_part_consistent(msg, &xudts->variable_data))</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp_data_to_sua_ptr(xua, SUA_IEI_DATA, msg, &xudts->variable_data);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Optional Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   return sccp_to_xua_opt(msg, &xudts->optional_start, xua);</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 sua_to_sccp_xudts(struct msgb *msg, struct xua_msg *xua)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct sccp_data_ext_unitdata_service *xudts;</span><br><span style="color: hsl(120, 100%, 40%);">+ xudts = (struct sccp_data_ext_unitdata_service *) msgb_put(msg, sizeof(*xudts));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Fixed Part */</span><br><span style="color: hsl(120, 100%, 40%);">+      xudts->type = SCCP_MSG_TYPE_XUDTS;</span><br><span style="color: hsl(120, 100%, 40%);">+ xudts->return_cause = xua_msg_get_u32(xua, SUA_IEI_CAUSE) & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+      xudts->hop_counter = xua_msg_get_u32(xua, SUA_IEI_S7_HOP_CTR);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Variable Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   sccp_add_var_addr(msg, &xudts->variable_called, xua, SUA_IEI_DEST_ADDR);</span><br><span style="color: hsl(120, 100%, 40%);">+       sccp_add_var_addr(msg, &xudts->variable_calling, xua, SUA_IEI_SRC_ADDR);</span><br><span style="color: hsl(120, 100%, 40%);">+       sccp_add_variable_part(msg, &xudts->variable_data, xua, SUA_IEI_DATA);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Optional Part */</span><br><span style="color: hsl(120, 100%, 40%);">+   return xua_ies_to_sccp_opts(msg, &xudts->optional_start, xudts->type, xua);</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%);">+/*! \returns \ref xua in case of success, NULL on error (xua not freed!) */</span><br><span> static struct xua_msg *sccp_to_xua_it(struct msgb *msg, struct xua_msg *xua)</span><br><span> {</span><br><span>         struct sccp_data_it *it = (struct sccp_data_it *)msg->l2h;</span><br><span>@@ -1376,6 +1470,16 @@</span><br><span>               if (!sccp_to_xua_err(msg, xua))</span><br><span>                      goto malformed;</span><br><span>              return xua;</span><br><span style="color: hsl(120, 100%, 40%);">+   case SCCP_MSG_TYPE_XUDT:</span><br><span style="color: hsl(120, 100%, 40%);">+              xua->hdr = XUA_HDR(SUA_MSGC_CL, SUA_CL_CLDT);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!sccp_to_xua_xudt(msg, xua))</span><br><span style="color: hsl(120, 100%, 40%);">+                      goto malformed;</span><br><span style="color: hsl(120, 100%, 40%);">+               return xua;</span><br><span style="color: hsl(120, 100%, 40%);">+   case SCCP_MSG_TYPE_XUDTS:</span><br><span style="color: hsl(120, 100%, 40%);">+             xua->hdr = XUA_HDR(SUA_MSGC_CL, SUA_CL_CLDR);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!sccp_to_xua_xudts(msg, xua))</span><br><span style="color: hsl(120, 100%, 40%);">+                     goto malformed;</span><br><span style="color: hsl(120, 100%, 40%);">+               return xua;</span><br><span>  /* Unsupported Message Types */</span><br><span>      case SCCP_MSG_TYPE_DT2:</span><br><span>      case SCCP_MSG_TYPE_AK:</span><br><span>@@ -1383,8 +1487,6 @@</span><br><span>       case SCCP_MSG_TYPE_EA:</span><br><span>       case SCCP_MSG_TYPE_RSR:</span><br><span>      case SCCP_MSG_TYPE_RSC:</span><br><span style="color: hsl(0, 100%, 40%);">- case SCCP_MSG_TYPE_XUDT:</span><br><span style="color: hsl(0, 100%, 40%);">-        case SCCP_MSG_TYPE_XUDTS:</span><br><span>    case SCCP_MSG_TYPE_LUDT:</span><br><span>     case SCCP_MSG_TYPE_LUDTS:</span><br><span>            LOGP(DLSUA, LOGL_ERROR, "Unsupported SCCP message %s\n",</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/25962">change 25962</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/libosmo-sccp/+/25962"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic5b9486f1aeb4bb90cfe702a7ce996f5d82ded2c </div>
<div style="display:none"> Gerrit-Change-Number: 25962 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>