+/* Remove a queue element */
+void del_queue(packet_queue_t **q, queue_element_t *e)
+{
+cp
+ free(e->packet);
+
+ if(e->next) /* There is a successor, so we are not tail */
+ {
+ if(e->prev) /* There is a predecessor, so we are not head */
+ {
+ e->next->prev = e->prev;
+ e->prev->next = e->next;
+ }
+ else /* We are head */
+ {
+ e->next->prev = NULL;
+ (*q)->head = e->next;
+ }
+ }
+ else /* We are tail (or all alone!) */
+ {
+ if(e->prev) /* We are not alone :) */
+ {
+ e->prev->next = NULL;
+ (*q)->tail = e->prev;
+ }
+ else /* Adieu */
+ {
+ free(*q);
+ *q = NULL;
+ }
+ }
+
+ free(e);
+cp