aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2018-08-07 11:22:28 +0200
committerHarald Welte <laforge@gnumonks.org>2018-08-10 06:55:43 +0000
commitacc0a070c770eb16aba8ef93780eda5365057b6c (patch)
treeb230ad68709c0a88ec8320153ee26e24946c7c8e
parentd14eccd1a70ad721e01346c8351ae90f038b3570 (diff)
bssgp: introduce flush queue functions
To reset the state of BSSGP allow to flush the BSSGP queues. When testing (with TTCN3) the test object should be resetted between each test. Introduce the functions: bssgp_fc_flush_queue() - flushs a single flow control object bssgp_flush_all_queues() - flushs queues of all BSSGP connections Change-Id: I29b6ad6742ddf9b0b58b4af37d9a1cf18e019325
-rw-r--r--include/osmocom/gprs/gprs_bssgp.h3
-rw-r--r--src/gb/gprs_bssgp.c28
-rw-r--r--src/gb/libosmogb.map2
3 files changed, 33 insertions, 0 deletions
diff --git a/include/osmocom/gprs/gprs_bssgp.h b/include/osmocom/gprs/gprs_bssgp.h
index 2dead69..400c3e0 100644
--- a/include/osmocom/gprs/gprs_bssgp.h
+++ b/include/osmocom/gprs/gprs_bssgp.h
@@ -207,6 +207,9 @@ int bssgp_fc_in(struct bssgp_flow_control *fc, struct msgb *msg,
int bssgp_fc_ms_init(struct bssgp_flow_control *fc_ms, uint16_t bvci,
uint16_t nsei, uint32_t max_queue_depth);
+void bssgp_flush_all_queues();
+void bssgp_fc_flush_queue(struct bssgp_flow_control *fc);
+
/* gprs_bssgp_vty.c */
int bssgp_vty_init(void);
void bssgp_set_log_ss(int ss);
diff --git a/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c
index 5dfce16..3b9fbf9 100644
--- a/src/gb/gprs_bssgp.c
+++ b/src/gb/gprs_bssgp.c
@@ -1263,3 +1263,31 @@ void bssgp_set_log_ss(int ss)
{
DBSSGP = ss;
}
+
+/*!
+ * \brief Flush the queue of the bssgp_flow_control
+ * \param[in] The flow control object which holds the queue.
+ */
+void bssgp_fc_flush_queue(struct bssgp_flow_control *fc)
+{
+ struct bssgp_fc_queue_element *element, *tmp;
+
+ llist_for_each_entry_safe(element, tmp, &fc->queue, list) {
+ msgb_free(element->msg);
+ llist_del(&element->list);
+ talloc_free(element);
+ }
+}
+
+/*!
+ * \brief Flush the queues of all BSSGP contexts.
+ */
+void bssgp_flush_all_queues()
+{
+ struct bssgp_bvc_ctx *bctx;
+
+ llist_for_each_entry(bctx, &bssgp_bvc_ctxts, list) {
+ if (bctx->fc)
+ bssgp_fc_flush_queue(bctx->fc);
+ }
+}
diff --git a/src/gb/libosmogb.map b/src/gb/libosmogb.map
index d56e651..ec69670 100644
--- a/src/gb/libosmogb.map
+++ b/src/gb/libosmogb.map
@@ -6,6 +6,8 @@ bssgp_pdu_str;
bssgp_fc_in;
bssgp_fc_init;
bssgp_fc_ms_init;
+bssgp_fc_flush_queue;
+bssgp_flush_all_queues;
bssgp_msgb_alloc;
bssgp_msgb_copy;
bssgp_msgb_tlli_put;