gtphub: add assertion to ensure expiry ordering.

Make 100% sure the user adds expiring_items in chronological order by asserting
that a newly added expiry is >= the last expiry in the queue. Add llist_last()
to facilitate.

Sponsored-by: On-Waves ehi
diff --git a/openbsc/src/gprs/gtphub.c b/openbsc/src/gprs/gtphub.c
index 0550c7f..e339ac6 100644
--- a/openbsc/src/gprs/gtphub.c
+++ b/openbsc/src/gprs/gtphub.c
@@ -62,6 +62,10 @@
 #define llist_first(head, type, entry) \
 	llist_entry(__llist_first(head), type, entry)
 
+#define __llist_last(head) (((head)->next == (head)) ? NULL : (head)->prev)
+#define llist_last(head, type, entry) \
+	llist_entry(__llist_last(head), type, entry)
+
 /* TODO move GTP header stuff to openggsn/gtp/ ? See gtp_decaps*() */
 
 enum gtp_rc {
@@ -564,6 +568,10 @@
 {
 	item->expiry = now + exq->expiry_in_seconds;
 
+	OSMO_ASSERT(llist_empty(&exq->items)
+		    || (item->expiry
+			>= llist_last(&exq->items, struct expiring_item, entry)->expiry));
+
 	/* Add/move to the tail to always sort by expiry, ascending. */
 	llist_del(&item->entry);
 	llist_add_tail(&item->entry, &exq->items);