/** assign the call to the l2tpd */ int l2tpd_assign_call(l2tpd *_this, l2tp_call *call) { int shuffle_cnt; u_int session_id; shuffle_cnt = 0; do { session_id = (uintptr_t)slist_remove_first( &_this->free_session_id_list); if (session_id != L2TP_SESSION_ID_SHUFFLE_MARK) break; L2TPD_ASSERT(shuffle_cnt == 0); if (shuffle_cnt++ > 0) { l2tpd_log(_this, LOG_ERR, "unexpected errror in %s(): free_session_id_list " "full", __func__); slist_add(&_this->free_session_id_list, (void *)L2TP_SESSION_ID_SHUFFLE_MARK); return 1; } slist_shuffle(&_this->free_session_id_list); slist_add(&_this->free_session_id_list, (void *)L2TP_SESSION_ID_SHUFFLE_MARK); } while (1); call->id = session_id; return 0; }
static void test_01() { int i; slist sl; slist *l = &sl; slist_init(&sl); for (i = 0; i < 255; i++) { slist_add(&sl, (void *)i); } for (i = 0; i < 128; i++) { slist_remove_first(&sl); } for (i = 0; i < 128; i++) { slist_add(&sl, (void *)(i + 255)); } ASSERT((int)slist_get(&sl, 127) == 255); ASSERT((int)slist_get(&sl, 254) == 129 + 253); ASSERT((int)slist_length(&sl) == 255); /* dump(&sl); */ /* printf("==\n"); */ slist_add(&sl, (void *)(128 + 255)); ASSERT((int)slist_get(&sl, 127) == 255); /* ASSERT((int)slist_get(&sl, 255) == 128 + 255); */ ASSERT((int)slist_length(&sl) == 256); /* dump(&sl); */ }
bool slist_remove_last(SList *plist, char *pdata, size_t isize) { if (plist->icount < 0) return false; else if (plist->icount == 1) return slist_remove_first(plist, pdata, isize); else { ListNode *pnext = plist->pfirst; ListNode *pbflast = pnext; while (pnext != plist->plast) { pbflast = pnext; pnext = pnext->pnext; } ListNode *plast = plist->plast; plist->plast = pbflast; plist->plast->pnext = NULL; int iminsize = isize > plast->isize ? plast->isize : isize; memcpy(pdata, plast->pdata, iminsize); slistnode_free(plast); plist->icount--; return true; } }
bool slist_remove(SList *plist, unsigned int ipos, char *pdata, size_t isize) { if (ipos >= plist->icount) return false; else if (ipos == 0) return slist_remove_first(plist, pdata, isize); else if (ipos == plist->icount - 1) return slist_remove_last(plist, pdata, isize); else { ListNode *pbefore = plist->pfirst; for (int i = 1; i < ipos; i++) pbefore = pbefore->pnext; ListNode *pcur = pbefore->pnext; ListNode *pafter = pcur->pnext; if (pdata != NULL && isize > 0) { int iminsize = isize > pcur->isize ? pcur->isize : isize; memcpy(pdata, pcur->pdata, iminsize); } slistnode_free(pcur); plist->icount--; pbefore->pnext = pafter; } return true; }
/* free all calls */ static void l2tp_ctrl_destroy_all_calls(l2tp_ctrl *_this) { l2tp_call *call; L2TP_CTRL_ASSERT(_this != NULL); while ((call = slist_remove_first(&_this->call_list)) != NULL) l2tp_call_destroy(call, 1); }
static void test_itr_subr_01(slist *l) { int i; for (i = 0; i < slist_length(l); i++) slist_set(l, i, (void *)(i + 1)); slist_itr_first(l); ASSERT((int)slist_itr_next(l) == 1); /* normal iterate */ ASSERT((int)slist_itr_next(l) == 2); /* normal iterate */ slist_remove(l, 2); /* remove next. "3" is removed */ ASSERT((int)slist_itr_next(l) == 4); /* removed item is skipped */ slist_remove(l, 1); /* remove past item. "2" is removed */ ASSERT((int)slist_itr_next(l) == 5); /* no influence */ ASSERT((int)slist_get(l, 0) == 1); /* checking for removing */ ASSERT((int)slist_get(l, 1) == 4); /* checking for removing */ ASSERT((int)slist_get(l, 2) == 5); /* checking for removing */ /* * Total number was 255. We removed 2 items and iterated 4 times. * 1 removing was past item, so the remaining is 250. */ for (i = 0; i < 249; i++) ASSERT(slist_itr_next(l) != NULL); ASSERT(slist_itr_next(l) != NULL); ASSERT(slist_itr_next(l) == NULL); /* * Same as above except removing before getting the last item. */ /* Reset (253 items) */ for (i = 0; i < slist_length(l); i++) slist_set(l, i, (void *)(i + 1)); slist_itr_first(l); ASSERT(slist_length(l) == 253); for (i = 0; i < 252; i++) ASSERT(slist_itr_next(l) != NULL); slist_remove(l, 252); ASSERT(slist_itr_next(l) == NULL); /* The last item is NULL */ slist_itr_first(l); while (slist_length(l) > 0) slist_remove_first(l); ASSERT(slist_length(l) == 0); ASSERT(slist_itr_next(l) == NULL); }
/* Verify removing the last item on the physical location */ static void test_05() { int i; slist sl; slist *l = &sl; slist_init(&sl); /* Fill */ for (i = 0; i < 255; i++) { slist_add(&sl, (void *)i); } /* Remove 254 items */ for (i = 0; i < 254; i++) { slist_remove_first(&sl); } slist_set(l, 0, (void *)0); /* Add 7 items */ for (i = 0; i < 8; i++) { slist_add(&sl, (void *)i + 1); } ASSERT(sl.first_idx == 254); ASSERT(sl.last_idx == 7); slist_remove(l, 0); ASSERT((int)slist_get(l, 0) == 1); ASSERT((int)slist_get(l, 1) == 2); ASSERT((int)slist_get(l, 2) == 3); ASSERT((int)slist_get(l, 3) == 4); ASSERT((int)slist_get(l, 4) == 5); ASSERT((int)slist_get(l, 5) == 6); ASSERT((int)slist_get(l, 6) == 7); ASSERT((int)slist_get(l, 7) == 8); ASSERT(l->first_idx == 255); slist_remove(l, 0); ASSERT((int)slist_get(l, 0) == 2); ASSERT((int)slist_get(l, 1) == 3); ASSERT((int)slist_get(l, 2) == 4); ASSERT((int)slist_get(l, 3) == 5); ASSERT((int)slist_get(l, 4) == 6); ASSERT((int)slist_get(l, 5) == 7); ASSERT((int)slist_get(l, 6) == 8); ASSERT(l->first_idx == 0); }
static void test_02() { int i; slist sl; slist *l = &sl; slist_init(&sl); /* Place 300 items for left side and 211 items for right side. */ for (i = 0; i < 511; i++) slist_add(&sl, (void *)i); for (i = 0; i <= 300; i++) slist_remove_first(&sl); for (i = 0; i <= 300; i++) slist_add(&sl, (void *)i); /* Set values to make index number and value the same. */ for (i = 0; i < slist_length(&sl); i++) slist_set(&sl, i, (void *)(i + 1)); ASSERT(slist_length(&sl) == 511); /* The logical length is 511. */ ASSERT((int)sl.list[511] == 211); /* The most right is 211th. */ ASSERT((int)sl.list[0] == 212); /* The most left is 212th. */ ASSERT(sl.list_size == 512); /* The physical size is 512. */ slist_add(&sl, (void *)512); /* Add 512th item. */ ASSERT(sl.list_size == 768); /* The physical size is extended. */ ASSERT(slist_length(&sl) == 512); /* The logical length is 512. */ ASSERT((int)sl.list[511] == 211); /* boundary */ ASSERT((int)sl.list[512] == 212); /* boundary */ ASSERT((int)sl.list[767] == 467); /* The most right is 467th. */ ASSERT((int)sl.list[0] == 468); /* The most left is 468th. */ /* Check all items */ for (i = 0; i < slist_length(&sl); i++) ASSERT((int)slist_get(&sl, i) == i + 1); /* check */ }
static void test_03() { int i; slist sl; slist *l = &sl; slist_init(&sl); slist_add(&sl, (void *)1); for (i = 0; i < 255; i++) { slist_add(&sl, (void *)1); ASSERT(sl.last_idx >= 0 && sl.last_idx < sl.list_size); slist_remove_first(&sl); ASSERT(sl.last_idx >= 0 && sl.last_idx < sl.list_size); } slist_remove(&sl, 0); ASSERT(slist_length(&sl) == 0); /* dump(&sl); */ /* TEST(test_02); */ }
static void test_07() { int i; slist sl; slist *l = &sl; slist_init(l); slist_add(l, (void *)1); slist_remove_first(l); l->first_idx = 120; l->last_idx = 120; for (i = 0; i < 255; i++) slist_add(l, (void *)i); for (i = 0, slist_itr_first(l); slist_itr_has_next(l); i++) { ASSERT((int)slist_itr_next(l) == i); if (i > 200) ASSERT((int)slist_itr_remove(l) == i); } }