Change in libosmocore[master]: gprs_ns2: inform the NS user (BSSGP) about the MTU of a NSE

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

lynxis lazus gerrit-no-reply at lists.osmocom.org
Wed Jan 20 18:06:17 UTC 2021


lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/22343 )


Change subject: gprs_ns2: inform the NS user (BSSGP) about the MTU of a NSE
......................................................................

gprs_ns2: inform the NS user (BSSGP) about the MTU of a NSE

The BSSGP need to know the MTU of the BSSGP layer.
The MTU can be 0 if the NSE doesn't contain any NSVC.
Every status indication will contain the mtu value.
The MTU in the status indication contain the maximum transfer
unit of a BSSGP message. From NS side the maximum SDU.

Change-Id: I5016b295db6185ec131d83089cf6c806e34ef1b6
---
M include/osmocom/gprs/gprs_ns2.h
M src/gb/gprs_ns2.c
M src/gb/gprs_ns2_fr.c
M src/gb/gprs_ns2_frgre.c
M src/gb/gprs_ns2_internal.h
M src/gb/gprs_ns2_udp.c
6 files changed, 65 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/43/22343/1

diff --git a/include/osmocom/gprs/gprs_ns2.h b/include/osmocom/gprs/gprs_ns2.h
index 1b20298..cf2f86c 100644
--- a/include/osmocom/gprs/gprs_ns2.h
+++ b/include/osmocom/gprs/gprs_ns2.h
@@ -135,6 +135,8 @@
 			/* Only true on the first time it's available.
 			 * Allow the BSSGP layer to reset persistent NSE */
 			bool first;
+			/* MTU of a BSSGP PDU. It's the lowest MTU of all (alive & dead) NSVCs */
+			int mtu;
 		} status;
 	} u;
 };
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index 0c1d564..87cb0ad 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -474,6 +474,7 @@
 	nsp.u.status.transfer = ns2_count_transfer_cap(nse, bvci);
 	nsp.u.status.first = nse->first;
 	nsp.u.status.persistent = nse->persistent;
+	nsp.u.status.mtu = nse->mtu - 4; /* 1b NS PDU type, 1b NS SDU control, 2b BVCI */
 	if (nsvc)
 		nsp.u.status.nsvc = gprs_ns2_ll_str_buf(nsvc_str, sizeof(nsvc_str), nsvc);
 
@@ -519,6 +520,7 @@
 
 	llist_add(&nsvc->list, &nse->nsvc);
 	llist_add(&nsvc->blist, &bind->nsvc);
+	ns2_nse_update_mtu(nse);
 
 	return nsvc;
 
@@ -717,6 +719,7 @@
 	nse->nsei = nsei;
 	nse->nsi = nsi;
 	nse->first = true;
+	nse->mtu = 0;
 	llist_add(&nse->list, &nsi->nse);
 	INIT_LLIST_HEAD(&nse->nsvc);
 
@@ -1316,6 +1319,26 @@
 	array[i] = bind;
 }
 
+void ns2_nse_update_mtu(struct gprs_ns2_nse *nse)
+{
+	struct gprs_ns2_vc *nsvc;
+	int mtu = 0;
+
+	if (llist_empty(&nse->nsvc)) {
+		nse->mtu = 0;
+		return;
+	}
+
+	llist_for_each_entry(nsvc, &nse->nsvc, list) {
+		if (mtu == 0)
+			mtu = nsvc->bind->mtu;
+		else if (mtu > nsvc->bind->mtu)
+			mtu = nsvc->bind->mtu;
+	}
+
+	nse->mtu = mtu;
+}
+
 /*! calculate the transfer capabilities for a nse
  *  \param nse the nse to count the transfer capability
  *  \param bvci a bvci - unused
diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c
index 274ed96..00efd8a 100644
--- a/src/gb/gprs_ns2_fr.c
+++ b/src/gb/gprs_ns2_fr.c
@@ -592,6 +592,9 @@
 	bind->free_vc = free_vc;
 	bind->dump_vty = dump_vty;
 	bind->nsi = nsi;
+	/* 48.016 § 6.1.4.2 default maximum information field size of 1600 octets
+	 * FR has 2 byte header */
+	bind->mtu = 1600 - 2;
 	priv = bind->priv = talloc_zero(bind, struct priv_bind);
 	if (!priv) {
 		rc = -ENOSPC;
diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c
index 2812e12..1529b48 100644
--- a/src/gb/gprs_ns2_frgre.c
+++ b/src/gb/gprs_ns2_frgre.c
@@ -568,6 +568,8 @@
 	bind->send_vc = frgre_vc_sendmsg;
 	bind->free_vc = free_vc;
 	bind->nsi = nsi;
+	/* TODO: update mtu similiar to UDP - GRE header */
+	bind->mtu = 1500;
 
 	priv = bind->priv = talloc_zero(bind, struct priv_bind);
 	if (!priv) {
diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h
index af8c5f0..42499db 100644
--- a/src/gb/gprs_ns2_internal.h
+++ b/src/gb/gprs_ns2_internal.h
@@ -167,6 +167,9 @@
 
 	/*! sum of all the signalling weight of _active_ NS-VCs */
 	uint32_t sum_sig_weight;
+
+	/*! MTU of a NS PDU. This is the lowest MTU of all NSVCs */
+	int mtu;
 };
 
 /*! Structure representing a single NS-VC */
@@ -232,6 +235,9 @@
 	/*! transfer capability in mbit */
 	int transfer_capability;
 
+	/*! MTU of a NS PDU on this bind. */
+	int mtu;
+
 	/*! which link-layer are we based on? */
 	enum gprs_ns2_ll ll;
 
@@ -276,6 +282,7 @@
 			 uint16_t bvci,
 			 enum gprs_ns2_affecting_cause cause);
 void ns2_nse_notify_alive(struct gprs_ns2_vc *nsvc, bool alive);
+void ns2_nse_update_mtu(struct gprs_ns2_nse *nse);
 
 /* message */
 int gprs_ns2_validate(struct gprs_ns2_vc *nsvc,
diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c
index 8bfa184..c468015 100644
--- a/src/gb/gprs_ns2_udp.c
+++ b/src/gb/gprs_ns2_udp.c
@@ -111,6 +111,32 @@
 	}
 }
 
+#define SIZE_IPV4_HEADER 20
+#define SIZE_IPV6_HEADER 23
+#define SIZE_UDP_HEADER   8
+
+static void update_mtu(struct gprs_ns2_vc_bind *bind) {
+	struct priv_bind *priv;
+	/* TODO: replace 1500 (default ethernet mtu) with interface mtu */
+	int mtu = 1500;
+
+	OSMO_ASSERT(gprs_ns2_is_ip_bind(bind));
+
+	priv = bind->priv;
+	switch (priv->addr.u.sa.sa_family) {
+	case AF_INET:
+		mtu -= SIZE_IPV4_HEADER + SIZE_UDP_HEADER;
+		break;
+	case AF_INET6:
+		mtu -= SIZE_IPV6_HEADER + SIZE_UDP_HEADER;
+		break;
+	default:
+		break;
+	}
+
+	bind->mtu = mtu;
+}
+
 
 /*! Find a NS-VC by its remote socket address.
  *  \param[in] bind in which to search
@@ -382,6 +408,8 @@
 				dscp, rc, errno);
 	}
 
+	update_mtu(bind);
+
 	llist_add(&bind->list, &nsi->binding);
 	if (result)
 		*result = bind;

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/22343
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I5016b295db6185ec131d83089cf6c806e34ef1b6
Gerrit-Change-Number: 22343
Gerrit-PatchSet: 1
Gerrit-Owner: lynxis lazus <lynxis at fe80.eu>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210120/e2333aa7/attachment.htm>


More information about the gerrit-log mailing list