[PATCH libosmo-netif 02/18] osmux: add osmux_input_state structure

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/OpenBSC@lists.osmocom.org/.

pablo at gnumonks.org pablo at gnumonks.org
Tue Jul 21 14:23:17 UTC 2015


From: Pablo Neira Ayuso <pablo at soleta.eu>

This new structure serves as container of the internal osmux state during
transformation from RTP AMR to the compressed osmux format.

This reduces the footprint of several functions and it makes them easier to
extend if we need to pass new information between functions.
---
 src/osmux.c |   77 +++++++++++++++++++++++++++++++----------------------------
 1 file changed, 40 insertions(+), 37 deletions(-)

diff --git a/src/osmux.c b/src/osmux.c
index a3eccaa..938b9a6 100644
--- a/src/osmux.c
+++ b/src/osmux.c
@@ -221,63 +221,65 @@ static void osmux_batch_dequeue(struct msgb *msg, struct batch_list_node *node)
 	node->nmsgs--;
 }
 
-static int
-osmux_batch_put(struct osmux_in_handle *h, struct msgb *out_msg,
-		struct msgb *msg, struct rtp_hdr *rtph,
-		struct amr_hdr *amrh, uint32_t amr_payload_len,
-		int ccid, int add_osmux_header)
+struct osmux_input_state {
+	struct msgb	*out_msg;
+	struct msgb	*msg;
+	struct rtp_hdr	*rtph;
+	struct amr_hdr	*amrh;
+	uint32_t	amr_payload_len;
+	int		ccid;
+	int		add_osmux_hdr;
+};
+
+static int osmux_batch_put(struct osmux_in_handle *h,
+			   struct osmux_input_state *state)
 {
 	struct osmux_batch *batch = (struct osmux_batch *)h->internal_data;
 	struct osmux_hdr *osmuxh;
 
-	if (add_osmux_header) {
-		osmuxh = (struct osmux_hdr *)out_msg->tail;
+	if (state->add_osmux_hdr) {
+		osmuxh = (struct osmux_hdr *)state->out_msg->tail;
 		osmuxh->ft = OSMUX_FT_VOICE_AMR;
 		osmuxh->ctr = 0;
-		osmuxh->amr_f = amrh->f;
-		osmuxh->amr_q= amrh->q;
+		osmuxh->amr_f = state->amrh->f;
+		osmuxh->amr_q= state->amrh->q;
 		osmuxh->seq = batch->seq++;
-		osmuxh->circuit_id = ccid;
-		osmuxh->amr_cmr = amrh->cmr;
-		osmuxh->amr_ft = amrh->ft;
-		msgb_put(out_msg, sizeof(struct osmux_hdr));
+		osmuxh->circuit_id = state->ccid;
+		osmuxh->amr_cmr = state->amrh->cmr;
+		osmuxh->amr_ft = state->amrh->ft;
+		msgb_put(state->out_msg, sizeof(struct osmux_hdr));
 
 		/* annotate current osmux header */
 		batch->osmuxh = osmuxh;
 	} else {
 		if (batch->osmuxh->ctr == 0x7) {
 			LOGP(DLMIB, LOGL_ERROR, "cannot add msg=%p, "
-				"too many messages for this RTP ssrc=%u\n",
-				msg, rtph->ssrc);
+			     "too many messages for this RTP ssrc=%u\n",
+			     state->msg, state->rtph->ssrc);
 			return 0;
 		}
 		batch->osmuxh->ctr++;
 	}
 
-	memcpy(out_msg->tail, osmo_amr_get_payload(amrh), amr_payload_len);
-	msgb_put(out_msg, amr_payload_len);
+	memcpy(state->out_msg->tail, osmo_amr_get_payload(state->amrh),
+	       state->amr_payload_len);
+	msgb_put(state->out_msg, state->amr_payload_len);
 
 	return 0;
 }
 
-static int
-osmux_xfrm_encode_amr(struct osmux_in_handle *h,
-		      struct msgb *out_msg,
-		      struct rtp_hdr *rtph, struct msgb *msg,
-		      int ccid, int add_osmux_header)
+static int osmux_xfrm_encode_amr(struct osmux_in_handle *h,
+				 struct osmux_input_state *state)
 {
-	struct amr_hdr *amrh;
 	uint32_t amr_len;
-	uint32_t amr_payload_len;
 
-	amrh = osmo_rtp_get_payload(rtph, msg, &amr_len);
-	if (amrh == NULL)
+	state->amrh = osmo_rtp_get_payload(state->rtph, state->msg, &amr_len);
+	if (state->amrh == NULL)
 		return -1;
 
-	amr_payload_len = amr_len - sizeof(struct amr_hdr);
+	state->amr_payload_len = amr_len - sizeof(struct amr_hdr);
 
-	if (osmux_batch_put(h, out_msg, msg, rtph, amrh, amr_payload_len,
-			    ccid, add_osmux_header) < 0)
+	if (osmux_batch_put(h, state) < 0)
 		return -1;
 
 	return 0;
@@ -304,9 +306,11 @@ static struct msgb *osmux_build_batch(struct osmux_in_handle *h)
 		int ctr = 0;
 
 		llist_for_each_entry_safe(cur, tmp, &node->list, list) {
-			struct rtp_hdr *rtph;
-			int add_osmux_hdr = 0;
-
+			struct osmux_input_state state = {
+				.msg		= cur,
+				.out_msg	= batch_msg,
+				.ccid		= node->ccid,
+			};
 #ifdef DEBUG_MSG
 			char buf[4096];
 
@@ -315,19 +319,18 @@ static struct msgb *osmux_build_batch(struct osmux_in_handle *h)
 			LOGP(DLMIB, LOGL_DEBUG, "to BSC-NAT: %s\n", buf);
 #endif
 
-			rtph = osmo_rtp_get_hdr(cur);
-			if (rtph == NULL)
+			state.rtph = osmo_rtp_get_hdr(cur);
+			if (state.rtph == NULL)
 				return NULL;
 
 			if (ctr == 0) {
 #ifdef DEBUG_MSG
 				LOGP(DLMIB, LOGL_DEBUG, "add osmux header\n");
 #endif
-				add_osmux_hdr = 1;
+				state.add_osmux_hdr = 1;
 			}
 
-			osmux_xfrm_encode_amr(h, batch_msg, rtph, cur,
-						node->ccid, add_osmux_hdr);
+			osmux_xfrm_encode_amr(h, &state);
 			osmux_batch_dequeue(cur, node);
 			msgb_free(cur);
 			ctr++;
-- 
1.7.10.4




More information about the OpenBSC mailing list