Change in osmo-sgsn[master]: gbproxy: Implement handling of BVC Flow Control

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/.

laforge gerrit-no-reply at lists.osmocom.org
Tue Dec 8 21:58:45 UTC 2020


laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-sgsn/+/21616 )


Change subject: gbproxy: Implement handling of BVC Flow Control
......................................................................

gbproxy: Implement handling of BVC Flow Control

We must locally terminate + acknowledge any inbound BSSGP-FC-BVC,
and ourselves trigger the transmission of BSSGP-FC-BVC to each
SGSN in the pool.

Related: OS#4891
Depends: libosmcoore.git Ie59be6761177c43456898be9148727f15861a622
Change-Id: Ib6495e5de4bfcf748a98e08743d1a8f2565f8b69
---
M src/gbproxy/gb_proxy.c
1 file changed, 50 insertions(+), 4 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/16/21616/1

diff --git a/src/gbproxy/gb_proxy.c b/src/gbproxy/gb_proxy.c
index 8167880..2ffeaca 100644
--- a/src/gbproxy/gb_proxy.c
+++ b/src/gbproxy/gb_proxy.c
@@ -291,6 +291,8 @@
 		rate_ctr_inc(&nse->cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_BSS]);
 		return tx_status_from_tlvp(rc, msg);
 	}
+	/* hack to get both msg + tlv_parsed passed via osmo_fsm_inst_dispatch */
+	msgb_bcid(msg) = (void *)&tp;
 
 	switch (bgph->pdu_type) {
 	case BSSGP_PDUT_UL_UNITDATA:
@@ -331,9 +333,7 @@
 		LOGPBVC(bss_bvc, LOGL_ERROR, "Rx %s: Implementation missing\n", pdut_name);
 		break;
 	case BSSGP_PDUT_FLOW_CONTROL_BVC:
-		/* TODO: Implement via FSM */
-		//rc = osmo_fsm_inst_dispatch(bss_bvc->fi, FIXME, &tp);
-		LOGPBVC(bss_bvc, LOGL_ERROR, "Rx %s: Implementation missing\n", pdut_name);
+		osmo_fsm_inst_dispatch(bss_bvc->fi, BSSGP_BVCFSM_E_RX_FC_BVC, msg);
 		break;
 	case BSSGP_PDUT_STATUS:
 		/* TODO: Implement by inspecting the contained PDU */
@@ -352,7 +352,9 @@
 	struct bssgp_normal_hdr *bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg);
 	const char *pdut_name = osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, bgph->pdu_type);
 	struct gbproxy_bvc *sgsn_bvc, *bss_bvc;
+	struct tlv_parsed tp;
 	char log_pfx[32];
+	int rc;
 
 	snprintf(log_pfx, sizeof(log_pfx), "NSE(%05u/SGSN)-BVC(%05u/??)", nse->nsei, ns_bvci);
 
@@ -386,10 +388,39 @@
 		rate_ctr_inc(&sgsn_bvc->ctrg->ctr[GBPROX_PEER_CTR_DROPPED]);
 		return bssgp_tx_status(BSSGP_CAUSE_BVCI_BLOCKED, &ns_bvci, msg);
 	}
+
+	/* DL_UNITDATA has a different header than all other uplink PDUs */
+	if (bgph->pdu_type == BSSGP_PDUT_DL_UNITDATA) {
+		const struct bssgp_ud_hdr *budh = (struct bssgp_ud_hdr *) msgb_bssgph(msg);
+		if (msgb_bssgp_len(msg) < sizeof(*budh))
+			return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);
+		rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, &tp, 1, bgph->pdu_type, budh->data,
+					 msgb_bssgp_len(msg) - sizeof(*budh), 0, 0, DGPRS, log_pfx);
+		/* populate TLLI from the fixed headser into the TLV-parsed array so later code
+		 * doesn't have to worry where the TLLI came from */
+		tp.lv[BSSGP_IE_TLLI].len = 4;
+		tp.lv[BSSGP_IE_TLLI].val = (const uint8_t *) &budh->tlli;
+	} else {
+		rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, &tp, 1, bgph->pdu_type, bgph->data,
+					 msgb_bssgp_len(msg) - sizeof(*bgph), 0, 0, DGPRS, log_pfx);
+	}
+	if (rc < 0) {
+		rate_ctr_inc(&nse->cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_BSS]);
+		return tx_status_from_tlvp(rc, msg);
+	}
+	/* hack to get both msg + tlv_parsed passed via osmo_fsm_inst_dispatch */
+	msgb_bcid(msg) = (void *)&tp;
+
 	OSMO_ASSERT(sgsn_bvc->cell);
 	bss_bvc = sgsn_bvc->cell->bss_bvc;
 
-	return gbprox_relay2peer(msg, bss_bvc, bss_bvc->bvci);
+	switch (bgph->pdu_type) {
+	case BSSGP_PDUT_FLOW_CONTROL_BVC_ACK:
+		return osmo_fsm_inst_dispatch(sgsn_bvc->fi, BSSGP_BVCFSM_E_RX_FC_BVC_ACK, msg);
+	default:
+		return gbprox_relay2peer(msg, bss_bvc, bss_bvc->bvci);
+	}
+
 }
 
 /***********************************************************************
@@ -532,9 +563,24 @@
 	}
 }
 
+/* BVC FSM informs us about BVC-FC PDU receive */
+static void bss_ptp_bvc_fc_bvc(uint16_t nsei, uint16_t bvci, const struct bssgp2_flow_ctrl *fc, void *priv)
+{
+	struct gbproxy_bvc *bss_bvc = priv;
+	struct gbproxy_cell *cell = bss_bvc->cell;
+
+	if (!cell)
+		return;
+
+	/* FIXME: actually split the bandwidth among the SGSNs! */
+
+	dispatch_to_all_sgsn_bvc(cell, BSSGP_BVCFSM_E_REQ_FC_BVC, (void *) fc);
+}
+
 static const struct bssgp_bvc_fsm_ops bss_ptp_bvc_fsm_ops = {
 	.reset_notification = bss_ptp_bvc_reset_notif,
 	.state_chg_notification = bss_ptp_bvc_state_chg_notif,
+	.rx_fc_bvc = bss_ptp_bvc_fc_bvc,
 };
 
 /* BVC FSM informs us about a SGSN-side reset of a PTP BVC */

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

Gerrit-Project: osmo-sgsn
Gerrit-Branch: master
Gerrit-Change-Id: Ib6495e5de4bfcf748a98e08743d1a8f2565f8b69
Gerrit-Change-Number: 21616
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201208/36ec9398/attachment.htm>


More information about the gerrit-log mailing list