Example #1
0
/** 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;
}
Example #2
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); */
}
Example #3
0
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;
    }
}
Example #4
0
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;
}
Example #5
0
/* 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);
}
Example #6
0
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);
}
Example #7
0
/* 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);
}
Example #8
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 */
}
Example #9
0
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); */
}
Example #10
0
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);
	}
}