tbf: Use plain old data structure (PODS) for llist management
The PODS struct has a back pointer to access the actual object.
llist_pods_for_each_entry traverses the list of struct llist_pods and
makes the entry available (through the back pointer).
Ticket: SYS#389
Sponsored-by: On-Waves ehf
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 1201642..2257018 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -286,7 +286,7 @@
#warning "TODO: Could/Should generate bssgp_tx_llc_discarded"
tbf->m_llc.clear(tbf->bts);
tbf_unlink_pdch(tbf);
- llist_del(&tbf->list);
+ llist_del(&tbf->list.list);
if (tbf->direction == GPRS_RLCMAC_UL_TBF)
tbf->bts->tbf_ul_freed();
@@ -491,6 +491,9 @@
if (!tbf)
return -1;
+ /* Back pointer for PODS llist compatibility */
+ tbf->list.back = tbf;
+
tbf->m_created_ts = time(NULL);
tbf->bts = bts->bts;
tbf->m_tfi = tfi;
@@ -548,7 +551,7 @@
return NULL;
}
- llist_add(&tbf->list, &bts->ul_tbfs);
+ llist_add(&tbf->list.list, &bts->ul_tbfs);
tbf->bts->tbf_ul_created();
return tbf;
@@ -581,7 +584,7 @@
return NULL;
}
- llist_add(&tbf->list, &bts->dl_tbfs);
+ llist_add(&tbf->list.list, &bts->dl_tbfs);
tbf->bts->tbf_dl_created();
return tbf;
@@ -1805,11 +1808,11 @@
void gprs_rlcmac_tbf::rotate_in_list()
{
- llist_del(&list);
+ llist_del(&list.list);
if (direction == GPRS_RLCMAC_UL_TBF)
- llist_add(&list, &bts->bts_data()->ul_tbfs);
+ llist_add(&list.list, &bts->bts_data()->ul_tbfs);
else
- llist_add(&list, &bts->bts_data()->dl_tbfs);
+ llist_add(&list.list, &bts->bts_data()->dl_tbfs);
}
uint8_t gprs_rlcmac_tbf::tsc() const
@@ -1819,7 +1822,7 @@
void tbf_print_vty_info(struct vty *vty, llist_head *ltbf)
{
- gprs_rlcmac_tbf *tbf = llist_entry(ltbf, gprs_rlcmac_tbf, list);
+ gprs_rlcmac_tbf *tbf = llist_pods_entry(ltbf, gprs_rlcmac_tbf);
vty_out(vty, "TBF: TFI=%d TLLI=0x%08x (%s) DIR=%s IMSI=%s%s", tbf->tfi(),
tbf->tlli(), tbf->is_tlli_valid() ? "valid" : "invalid",