<p>daniel has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/22447">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP mtu support<br><br>Change-Id: Iaf621da527ace8b3fcaa8f51f5e8b4f26fdae9b7<br>---<br>M include/osmocom/gprs/bssgp_bvc_fsm.h<br>M include/osmocom/gprs/gprs_bssgp2.h<br>M src/gb/bssgp_bvc_fsm.c<br>M src/gb/gprs_bssgp2.c<br>4 files changed, 29 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/47/22447/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gprs/bssgp_bvc_fsm.h b/include/osmocom/gprs/bssgp_bvc_fsm.h</span><br><span>index e69c205..9d37c3d 100644</span><br><span>--- a/include/osmocom/gprs/bssgp_bvc_fsm.h</span><br><span>+++ b/include/osmocom/gprs/bssgp_bvc_fsm.h</span><br><span>@@ -30,6 +30,7 @@</span><br><span>     BSSGP_BVCFSM_E_REQ_UNBLOCK,</span><br><span>  BSSGP_BVCFSM_E_REQ_RESET,       /* data: uint8_t *cause */</span><br><span>   BSSGP_BVCFSM_E_REQ_FC_BVC,      /* data: struct bssgp2_flow_ctrl */</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSGP_BVCFSM_E_REQ_STATUS,      /* data: struct bssgp2_status */</span><br><span> };</span><br><span> </span><br><span> struct bssgp_bvc_fsm_ops {</span><br><span>@@ -64,3 +65,5 @@</span><br><span> uint32_t bssgp_bvc_get_features_advertised(struct osmo_fsm_inst *fi);</span><br><span> uint32_t bssgp_bvc_get_features_received(struct osmo_fsm_inst *fi);</span><br><span> uint32_t bssgp_bvc_get_features_negotiated(struct osmo_fsm_inst *fi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bssgp_bvc_fsm_set_mtu(struct osmo_fsm_inst *fi, uint16_t mtu);</span><br><span>\ No newline at end of file</span><br><span>diff --git a/include/osmocom/gprs/gprs_bssgp2.h b/include/osmocom/gprs/gprs_bssgp2.h</span><br><span>index bf814cb..2396bea 100644</span><br><span>--- a/include/osmocom/gprs/gprs_bssgp2.h</span><br><span>+++ b/include/osmocom/gprs/gprs_bssgp2.h</span><br><span>@@ -4,6 +4,9 @@</span><br><span> #include <osmocom/gprs/protocol/gsm_08_18.h></span><br><span> #include <osmocom/gprs/gprs_ns2.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Set a conservative MTU as default (Ethernet MTU of 1500 - IPv6 Header - UDP Header */</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_BSSGP_MTU (1500 - 40 - 8)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct bssgp2_flow_ctrl;</span><br><span> struct gprs_ns2_inst;</span><br><span> struct gprs_ra_id;</span><br><span>@@ -38,6 +41,12 @@</span><br><span>       } u;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct bssgp2_status {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t cause;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Only used if cause is "BVCI blocked" or "BVCI unknown" */</span><br><span style="color: hsl(120, 100%, 40%);">+      const uint16_t *bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct msgb *orig_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> int bssgp2_nsi_tx_ptp(struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci,</span><br><span>                     struct msgb *msg, uint32_t lsp);</span><br><span>@@ -59,7 +68,7 @@</span><br><span> struct msgb *bssgp2_enc_bvc_reset_ack(uint16_t bvci, const struct gprs_ra_id *ra_id, uint16_t cell_id,</span><br><span>                                       const uint8_t *feat_bm, const uint8_t *ext_feat_bm);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *bssgp2_enc_status(uint8_t cause, const uint16_t *bvci, const struct msgb *orig_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *bssgp2_enc_status(uint8_t cause, const uint16_t *bvci, const struct msgb *orig_msg, uint16_t mtu);</span><br><span> </span><br><span> </span><br><span> int bssgp2_dec_fc_bvc(struct bssgp2_flow_ctrl *fc, const struct tlv_parsed *tp);</span><br><span>diff --git a/src/gb/bssgp_bvc_fsm.c b/src/gb/bssgp_bvc_fsm.c</span><br><span>index 6de0028..8db8866 100644</span><br><span>--- a/src/gb/bssgp_bvc_fsm.c</span><br><span>+++ b/src/gb/bssgp_bvc_fsm.c</span><br><span>@@ -116,6 +116,8 @@</span><br><span> </span><br><span>  /* NSEI of the underlying NS Entity */</span><br><span>       uint16_t nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* MTU of the underlying NS Entity */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t mtu;</span><br><span> </span><br><span>    /* BVCI of this BVC */</span><br><span>       uint16_t bvci;</span><br><span>@@ -236,7 +238,7 @@</span><br><span>         if (cause == BSSGP_CAUSE_UNKNOWN_BVCI || cause == BSSGP_CAUSE_BVCI_BLOCKED)</span><br><span>          bvci = &bfp->bvci;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   tx = bssgp2_enc_status(cause, bvci, rx);</span><br><span style="color: hsl(120, 100%, 40%);">+      tx = bssgp2_enc_status(cause, bvci, rx, bfp->mtu);</span><br><span> </span><br><span>    if (msgb_bvci(rx) == 0)</span><br><span>              fi_tx_sig(fi, tx);</span><br><span>@@ -666,6 +668,7 @@</span><br><span>     bfp->role_sgsn = role_sgsn;</span><br><span>       bfp->nsei = nsei;</span><br><span>         bfp->bvci = bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+  bfp->mtu = DEFAULT_BSSGP_MTU;</span><br><span> </span><br><span>         return fi;</span><br><span> }</span><br><span>diff --git a/src/gb/gprs_bssgp2.c b/src/gb/gprs_bssgp2.c</span><br><span>index 5a8d41f..5ae31e7 100644</span><br><span>--- a/src/gb/gprs_bssgp2.c</span><br><span>+++ b/src/gb/gprs_bssgp2.c</span><br><span>@@ -217,8 +217,9 @@</span><br><span> /*! Encode BSSGP STATUS PDU as per TS 48.018 Section 10.4.14.</span><br><span>  *  \param[in] cause BSSGP Cause value</span><br><span>  *  \param[in] bvci optional BVCI - only encoded if non-NULL</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] msg optional message buffer containing PDU in error - only encoded if non-NULL */</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *bssgp2_enc_status(uint8_t cause, const uint16_t *bvci, const struct msgb *orig_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg optional message buffer containing PDU in error - only encoded if non-NULL</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] mtu Maximum size the NS layer accepts as payload */</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *bssgp2_enc_status(uint8_t cause, const uint16_t *bvci, const struct msgb *orig_msg, uint16_t mtu)</span><br><span> {</span><br><span>        struct msgb *msg = bssgp_msgb_alloc();</span><br><span>       struct bssgp_normal_hdr *bgph;</span><br><span>@@ -229,12 +230,19 @@</span><br><span>       bgph = (struct bssgp_normal_hdr *) msgb_put(msg, sizeof(*bgph));</span><br><span>     bgph->pdu_type = BSSGP_PDUT_STATUS;</span><br><span>       msgb_tvlv_put(msg, BSSGP_IE_CAUSE, 1, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: Require/encode BVCI only if cause is BVCI unknown/blocked</span><br><span style="color: hsl(120, 100%, 40%);">+    * See 3GPP TS 48.018 Ch. 10.4.14 */</span><br><span>         if (bvci) {</span><br><span>          uint16_t _bvci = osmo_htons(*bvci);</span><br><span>          msgb_tvlv_put(msg, BSSGP_IE_BVCI, 2, (uint8_t *) &_bvci);</span><br><span>        }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (orig_msg)</span><br><span style="color: hsl(0, 100%, 40%);">-           msgb_tvlv_put(msg, BSSGP_IE_PDU_IN_ERROR, msgb_bssgp_len(orig_msg), msgb_bssgph(orig_msg));</span><br><span style="color: hsl(120, 100%, 40%);">+   if (orig_msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+               uint16_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Calculate how long the orig_msg may be */</span><br><span style="color: hsl(120, 100%, 40%);">+          mtu = mtu - msgb_length(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+         len = OSMO_MIN(msgb_bssgp_len(orig_msg), mtu);</span><br><span style="color: hsl(120, 100%, 40%);">+                msgb_tvlv_put(msg, BSSGP_IE_PDU_IN_ERROR, len, msgb_bssgph(orig_msg));</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span> </span><br><span>        return msg;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/22447">change 22447</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/libosmocore/+/22447"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iaf621da527ace8b3fcaa8f51f5e8b4f26fdae9b7 </div>
<div style="display:none"> Gerrit-Change-Number: 22447 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>