llc: Keep track of the number of stored LLC octets

To get the number of LLC octets that are stored in the queue, this
commit adds a m_queue_octets member along with a octets() method.
This value is updated similarly to m_queue_size on each modifying
method call.

Sponsored-by: On-Waves ehf
diff --git a/src/llc.cpp b/src/llc.cpp
index d847c87..3388db1 100644
--- a/src/llc.cpp
+++ b/src/llc.cpp
@@ -100,12 +100,14 @@
 {
 	INIT_LLIST_HEAD(&m_queue);
 	m_queue_size = 0;
+	m_queue_octets = 0;
 	m_avg_queue_delay = 0;
 }
 
 void gprs_llc_queue::enqueue(struct msgb *llc_msg)
 {
 	m_queue_size += 1;
+	m_queue_octets += msgb_length(llc_msg) - 2*sizeof(struct timeval);
 	msgb_enqueue(&m_queue, llc_msg);
 }
 
@@ -120,6 +122,7 @@
 	}
 
 	m_queue_size = 0;
+	m_queue_octets = 0;
 }
 
 #define ALPHA 0.5f
@@ -136,6 +139,7 @@
 		return NULL;
 
 	m_queue_size -= 1;
+	m_queue_octets -= msgb_length(msg) - 2*sizeof(struct timeval);
 
 	/* take the second time */
 	gettimeofday(&tv_now, NULL);
diff --git a/src/llc.h b/src/llc.h
index 80d2f7a..bd71773 100644
--- a/src/llc.h
+++ b/src/llc.h
@@ -73,10 +73,12 @@
 	struct msgb *dequeue();
 	void clear(BTS *bts);
 	size_t size() const;
+	size_t octets() const;
 
 private:
 	uint32_t m_avg_queue_delay; /* Average delay of data going through the queue */
 	size_t m_queue_size;
+	size_t m_queue_octets;
 	struct llist_head m_queue; /* queued LLC DL data */
 
 };
@@ -118,3 +120,8 @@
 {
 	return this ? m_queue_size : 0;
 }
+
+inline size_t gprs_llc_queue::octets() const
+{
+	return this ? m_queue_octets : 0;
+}
diff --git a/tests/llc/LlcTest.cpp b/tests/llc/LlcTest.cpp
index 9e1d35d..5cc6e6e 100644
--- a/tests/llc/LlcTest.cpp
+++ b/tests/llc/LlcTest.cpp
@@ -102,24 +102,31 @@
 
 	queue.init();
 	OSMO_ASSERT(queue.size() == 0);
+	OSMO_ASSERT(queue.octets() == 0);
 
 	enqueue_data(&queue, "LLC message");
 	OSMO_ASSERT(queue.size() == 1);
+	OSMO_ASSERT(queue.octets() == 11);
 
 	enqueue_data(&queue, "other LLC message");
 	OSMO_ASSERT(queue.size() == 2);
+	OSMO_ASSERT(queue.octets() == 28);
 
 	dequeue_and_check(&queue, "LLC message");
 	OSMO_ASSERT(queue.size() == 1);
+	OSMO_ASSERT(queue.octets() == 17);
 
 	dequeue_and_check(&queue, "other LLC message");
 	OSMO_ASSERT(queue.size() == 0);
+	OSMO_ASSERT(queue.octets() == 0);
 
 	enqueue_data(&queue, "LLC");
 	OSMO_ASSERT(queue.size() == 1);
+	OSMO_ASSERT(queue.octets() == 3);
 
 	queue.clear(NULL);
 	OSMO_ASSERT(queue.size() == 0);
+	OSMO_ASSERT(queue.octets() == 0);
 
 	printf("=== end %s ===\n", __func__);
 }