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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gtp: Support tx/rx RAN Information Relay message<br><br>See 3GPP TS 29.060 sec 7.5.14.1 RAN Information Relay.<br><br>Related: SYS#5314<br>Change-Id: Iea3eb032ccd4aed5187baca7f7719349d76039d4<br>---<br>M TODO-RELEASE<br>M gtp/gtp.c<br>M gtp/gtp.h<br>3 files changed, 73 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>index d0852fc..23c9b6d 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -7,3 +7,4 @@</span><br><span> # If any interfaces have been added since the last public release: c:r:a + 1.</span><br><span> # If any interfaces have been removed or changed since the last public release: c:r:0.</span><br><span> #library  what            description / commit summary line</span><br><span style="color: hsl(120, 100%, 40%);">+libgtp          ADD             gtp_ran_info_relay_req, gtp_set_cb_ran_info_relay_ind</span><br><span>diff --git a/gtp/gtp.c b/gtp/gtp.c</span><br><span>index caee5a6..59fd355 100644</span><br><span>--- a/gtp/gtp.c</span><br><span>+++ b/gtp/gtp.c</span><br><span>@@ -196,6 +196,13 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_set_cb_ran_info_relay_ind(struct gsn_t *gsn,</span><br><span style="color: hsl(120, 100%, 40%);">+                           int (*cb) (struct sockaddr_in * peer, union gtpie_member **ie))</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       gsn->cb_ran_info_relay_ind = cb;</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> /* API: Initialise delete context callback */</span><br><span> /* Called whenever a pdp context is deleted for any reason */</span><br><span> int gtp_set_cb_delete_context(struct gsn_t *gsn, int (*cb) (struct pdp_t * pdp))</span><br><span>@@ -1200,6 +1207,57 @@</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Handle a RAN Information Relay message */</span><br><span style="color: hsl(120, 100%, 40%);">+static int gtp_ran_info_relay_ind(struct gsn_t *gsn, int version, struct sockaddr_in *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+               void *pack, unsigned len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    union gtpie_member *ie[GTPIE_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (version != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DLGTP, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                      "RAN Information Relay expected only on GTPCv1: %u\n", version);</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%);">+   int hlen = get_hlen(pack);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Decode information elements */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             gsn->invalid++;</span><br><span style="color: hsl(120, 100%, 40%);">+            GTP_LOGPKG(LOGL_ERROR, peer, pack, len,</span><br><span style="color: hsl(120, 100%, 40%);">+                           "Invalid message format (AN Information Relay)\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 (gsn->cb_ran_info_relay_ind)</span><br><span style="color: hsl(120, 100%, 40%);">+            gsn->cb_ran_info_relay_ind(peer, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+/* Send off a RAN Information Relay message */</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_ran_info_relay_req(struct gsn_t *gsn, const struct sockaddr_in *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                    const uint8_t *ran_container, size_t ran_container_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                       const uint8_t *rim_route_addr, size_t rim_route_addr_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint8_t rim_route_addr_discr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   union gtp_packet packet;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* GTP 1 is the highest supported protocol */</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int length = get_default_gtp(1, GTP_RAN_INFO_RELAY, &packet);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_RAN_T_CONTAIN, ran_container_len,</span><br><span style="color: hsl(120, 100%, 40%);">+            ran_container);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rim_route_addr) {</span><br><span style="color: hsl(120, 100%, 40%);">+         gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_RIM_ROUT_ADDR,</span><br><span style="color: hsl(120, 100%, 40%);">+                       rim_route_addr_len, rim_route_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+                gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_RIM_RA_DISCR, 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                     &rim_route_addr_discr);</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 gtp_notification(gsn, 1, &packet, length, peer, gsn->fd1c, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* ***********************************************************</span><br><span>  * Session management messages</span><br><span>  * Messages: create, update and delete PDP context</span><br><span>@@ -3202,6 +3260,9 @@</span><br><span>          case GTP_ERROR:</span><br><span>                      gtp_error_ind_conf(gsn, version, &peer, buffer, status);</span><br><span>                         break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case GTP_RAN_INFO_RELAY:</span><br><span style="color: hsl(120, 100%, 40%);">+                      gtp_ran_info_relay_ind(gsn, version, &peer, buffer, status);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span>               default:</span><br><span>                     gsn->unknown++;</span><br><span>                   GTP_LOGPKG(LOGL_ERROR, &peer, buffer, status,</span><br><span>diff --git a/gtp/gtp.h b/gtp/gtp.h</span><br><span>index 45eb285..0583025 100644</span><br><span>--- a/gtp/gtp.h</span><br><span>+++ b/gtp/gtp.h</span><br><span>@@ -16,6 +16,7 @@</span><br><span> #include <osmocom/core/defs.h></span><br><span> #include <osmocom/core/timer.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "gtpie.h"</span><br><span> #include "pdp.h"</span><br><span> </span><br><span> #define GTP_MODE_GGSN 1</span><br><span>@@ -85,6 +86,7 @@</span><br><span> #define GTP_FWD_SRNS         58   /* Forward SRNS Context */</span><br><span> #define GTP_FWD_RELOC_ACK    59   /* Forward Relocation Complete Acknowledge */</span><br><span> #define GTP_FWD_SRNS_ACK     60        /* Forward SRNS Context Acknowledge */</span><br><span style="color: hsl(120, 100%, 40%);">+#define GTP_RAN_INFO_RELAY   70 /* RAN Information Relay */</span><br><span> /* 61-239 For future use. */</span><br><span> #define GTP_DATA_TRAN_REQ   240  /* Data Record Transfer Request */</span><br><span> #define GTP_DATA_TRAN_RSP   241   /* Data Record Transfer Response */</span><br><span>@@ -276,6 +278,7 @@</span><br><span>    int (*cb_create_context_ind) (struct pdp_t *);</span><br><span>       int (*cb_unsup_ind) (struct sockaddr_in * peer);</span><br><span>     int (*cb_extheader_ind) (struct sockaddr_in * peer);</span><br><span style="color: hsl(120, 100%, 40%);">+  int (*cb_ran_info_relay_ind) (struct sockaddr_in *peer, union gtpie_member **ie);</span><br><span>    int (*cb_conf) (int type, int cause, struct pdp_t * pdp, void *cbp);</span><br><span>         int (*cb_data_ind) (struct pdp_t * pdp, void *pack, unsigned len);</span><br><span>   int (*cb_recovery) (struct sockaddr_in * peer, uint8_t recovery);</span><br><span>@@ -343,6 +346,11 @@</span><br><span> extern int gtp_data_req(struct gsn_t *gsn, struct pdp_t *pdp,</span><br><span>                    void *pack, unsigned len);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern int gtp_ran_info_relay_req(struct gsn_t *gsn, const struct sockaddr_in *peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const uint8_t *ran_container, size_t ran_container_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                               const uint8_t *rim_route_addr, size_t rim_route_addr_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                             uint8_t rim_route_addr_discr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> extern int gtp_set_cb_data_ind(struct gsn_t *gsn,</span><br><span>                             int (*cb_data_ind) (struct pdp_t * pdp,</span><br><span>                                                  void *pack, unsigned len));</span><br><span>@@ -366,6 +374,9 @@</span><br><span> extern int gtp_set_cb_extheader_ind(struct gsn_t *gsn,</span><br><span>                                   int (*cb) (struct sockaddr_in * peer));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern int gtp_set_cb_ran_info_relay_ind(struct gsn_t *gsn,</span><br><span style="color: hsl(120, 100%, 40%);">+                              int (*cb) (struct sockaddr_in * peer, union gtpie_member **ie));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> extern int gtp_set_cb_conf(struct gsn_t *gsn,</span><br><span>                         int (*cb) (int type, int cause, struct pdp_t * pdp,</span><br><span>                                     void *cbp));</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ggsn/+/24163">change 24163</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-ggsn/+/24163"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ggsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iea3eb032ccd4aed5187baca7f7719349d76039d4 </div>
<div style="display:none"> Gerrit-Change-Number: 24163 </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: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>