Beispiel #1
0
/**********************************************************************
 *
 *  Set/get/delete/rehash items  (internal versions)
 *
 **********************************************************************/
static struct pppox_sock *__get_item(unsigned long sid, unsigned char *addr)
{
	int hash = hash_item(sid, addr);
	struct pppox_sock *ret;

	ret = item_hash_table[hash];

	while (ret && !cmp_addr(&ret->pppoe_pa, sid, addr))
		ret = ret->next;

	return ret;
}
Beispiel #2
0
static struct pppox_sock *__get_item(struct pppoe_net *pn, __be16 sid,
				unsigned char *addr, int ifindex)
{
	int hash = hash_item(sid, addr);
	struct pppox_sock *ret;

	ret = pn->hash_table[hash];
	while (ret) {
		if (cmp_addr(&ret->pppoe_pa, sid, addr) &&
		    ret->pppoe_ifindex == ifindex)
			return ret;

		ret = ret->next;
	}

	return NULL;
}
Beispiel #3
0
bool
SelfDrainingQueue::enqueue( ServiceData* data, bool allow_dups )
{
    if( ! allow_dups ) {
        SelfDrainingHashItem hash_item(data);
        if( m_hash.insert(hash_item,true) == -1 ) {
            dprintf( D_FULLDEBUG, "SelfDrainingQueue::enqueue() "
                     "refusing duplicate data\n" );
            return false;
        }
    }
    queue.enqueue(data);
    dprintf( D_FULLDEBUG,
             "Added data to SelfDrainingQueue %s, now has %d element(s)\n",
             name, queue.Length() );
    registerTimer();
    return true;
}
Beispiel #4
0
static int __set_item(struct pppox_sock *po)
{
	int hash = hash_item(po->pppoe_pa.sid, po->pppoe_pa.remote);
	struct pppox_sock *ret;

	ret = item_hash_table[hash];
	while (ret) {
		if (cmp_2_addr(&ret->pppoe_pa, &po->pppoe_pa) && ret->pppoe_ifindex == po->pppoe_ifindex)
			return -EALREADY;

		ret = ret->next;
	}

	po->next = item_hash_table[hash];
	item_hash_table[hash] = po;

	return 0;
}
Beispiel #5
0
static struct pppox_sock *__delete_item(unsigned long sid, char *addr)
{
	int hash = hash_item(sid, addr);
	struct pppox_sock *ret, **src;

	ret = item_hash_table[hash];
	src = &item_hash_table[hash];

	while (ret) {
		if (cmp_addr(&ret->pppoe_pa, sid, addr)) {
			*src = ret->next;
			break;
		}

		src = &ret->next;
		ret = ret->next;
	}

	return ret;
}
Beispiel #6
0
static int __set_item(struct pppox_opt *po)
{
	int hash = hash_item(po->pppoe_pa.sid, po->pppoe_pa.remote);
	struct pppox_opt *ret;

	ret = item_hash_table[hash];
	while (ret) {
		if (cmp_2_addr(&ret->pppoe_pa, &po->pppoe_pa))
			return -EALREADY;

		ret = ret->next;
	}

	if (!ret) {
		po->next = item_hash_table[hash];
		item_hash_table[hash] = po;
	}

	return 0;
}
Beispiel #7
0
void
SelfDrainingQueue::timerHandler( void )
{
    dprintf( D_FULLDEBUG,
             "Inside SelfDrainingQueue::timerHandler() for %s\n", name );

    if( queue.IsEmpty() ) {
        dprintf( D_FULLDEBUG, "SelfDrainingQueue %s is empty, "
                 "timerHandler() has nothing to do\n", name );
        cancelTimer();
        return;
    }
    int count;
    for( count=0; count<m_count_per_interval && !queue.IsEmpty(); count++ ) {
        ServiceData* d = NULL;
        queue.dequeue(d);

        SelfDrainingHashItem hash_item(d);
        m_hash.remove(hash_item);

        if( handler_fn ) {
            handler_fn( d );
        } else if( handlercpp_fn && service_ptr ) {
            (service_ptr->*handlercpp_fn)( d );
        }
    }

    if( queue.IsEmpty() ) {
        dprintf( D_FULLDEBUG,
                 "SelfDrainingQueue %s is empty, not resetting timer\n",
                 name );
        cancelTimer();
    } else {
        // if there's anything left in the queue, reset our timer
        dprintf( D_FULLDEBUG,
                 "SelfDrainingQueue %s still has %d element(s), "
                 "resetting timer\n", name, queue.Length() );
        resetTimer();
    }
}
Beispiel #8
0
static struct pppox_sock *__delete_item(struct pppoe_net *pn, __be16 sid,
					char *addr, int ifindex)
{
	int hash = hash_item(sid, addr);
	struct pppox_sock *ret, **src;

	ret = pn->hash_table[hash];
	src = &pn->hash_table[hash];

	while (ret) {
		if (cmp_addr(&ret->pppoe_pa, sid, addr) &&
		    ret->pppoe_ifindex == ifindex) {
			*src = ret->next;
			break;
		}

		src = &ret->next;
		ret = ret->next;
	}

	return ret;
}