Ejemplo n.º 1
0
void update_arp_queue(struct sr_instance* sr, arp_hdr* arp_header, const char* interface) {
	router_state* rs = get_router_state(sr);
	node* n = rs->arp_queue;
	node* next = NULL;

	while (n) {
		next = n->next;
		arp_queue_entry* aqe = (arp_queue_entry*)n->data;

		/* Does this arp reply match an entry waiting for it? */
		if (arp_header->arp_sip.s_addr == aqe->next_hop.s_addr) {
			/* send out the packets */
			node* cur_packet_node = aqe->head;
			node* next_packet_node = NULL;

			while (cur_packet_node) {
				next_packet_node = cur_packet_node->next;
				arp_queue_packet_entry* aqpe = (arp_queue_packet_entry*)cur_packet_node->data;

				/* send_ip takes responsibility for the packet so we don't need to free it */
				send_ip(sr, aqpe->packet, aqpe->len, &(aqe->next_hop), aqe->out_iface_name);

				node_remove(&(aqe->head), cur_packet_node);
				cur_packet_node = next_packet_node;
			}

			node_remove(&(rs->arp_queue), n);
		}
		n = next;
	}
}
Ejemplo n.º 2
0
static node_t *node_remove(tree_t *tree, node_t *p, const int key)
{
	if (!IS_NIL(p)) {
		int d = tree->compare(key, p->key);

		if (d == 0) {
			if (IS_NIL(p->left)) {
				node_t *q = p->right;

				node_destroy(tree, p);
				return q;
			} else if (IS_NIL(p->right)) {
				node_t *q = p->left;

				node_destroy(tree, p);
				return q;
			} else {
				node_t *q = p;
				node_t *r = node_remove_swap(tree, p->right,
						&q);

				p = q;
				p->right = r;
			}
		} else if (d < 0)
			p->left = node_remove(tree, p->left, key);
		else
			p->right = node_remove(tree, p->right, key);

		p = node_rebalance(p);
	}

	return p;
}
Ejemplo n.º 3
0
/*
 * NOT THREAD SAFE! Lock cache rd, queue wr
 *
 *
 */
void send_queued_packets(struct sr_instance* sr, struct in_addr* dest_ip, char* dest_mac) {
	node* n = get_router_state(sr)->arp_queue;
	node* next = NULL;

	while (n) {
		next = n->next;

		arp_queue_entry* aqe = (arp_queue_entry*)n->data;

		/* match the arp reply sip to our entry next hop ip */
		if (dest_ip->s_addr == aqe->next_hop.s_addr) {
			node* cur_packet_node = aqe->head;
			node* next_packet_node = NULL;

			while (cur_packet_node) {
				next_packet_node = cur_packet_node->next;

				/* send the packet */
				arp_queue_packet_entry* aqpe = (arp_queue_packet_entry*)cur_packet_node->data;

				send_ip(sr, aqpe->packet, aqpe->len, &(aqe->next_hop), aqe->out_iface_name);
				node_remove(&(aqe->head), cur_packet_node);

				cur_packet_node = next_packet_node;
			}

			/* free the arp queue entry for this destination ip, and patch the list */
			node_remove(&(get_router_state(sr)->arp_queue), n);
		}

		n = next;
	}
}
Ejemplo n.º 4
0
static inline
avl_tree_node_t *node_remove(avl_tree_node_t *n, avl_tree_key_t k,
                             bool *removed,
                             void **_data) {
    avl_tree_node_t copy, *min;
    bool n_is_left = false;

    if (!n)
        return NULL;

    if (k < n->key)
        n->left = node_remove(n->left, k, removed, _data);
    else if (k > n->key)
        n->right = node_remove(n->right, k, removed, _data);
    else {
        *removed = true;
        *_data = n->data;
        n_is_left = node_is_left(n);

        copy = *n;

        node_operators[n->host->inplace].deallocator(n);

        if (!copy.right) {
            if (copy.left)
                copy.left->parent = copy.parent;
            return copy.left;
        }

        min = node_leftmost(copy.right);

        min->right = node_remove_min(copy.right);
        min->left = copy.left;

        min->parent = copy.parent;

        if (min->parent) {
            if (n_is_left)
                min->parent->left = min;
            else
                min->parent->right = min;
        }

        if (min->left)
            min->left->parent = min;

        if (min->right)
            min->right->parent = min;

        return node_balance(min);
    }

    return node_balance(n);
}
Ejemplo n.º 5
0
void pending_request_remove_and_free(PendingRequest *pending_request) {
    node_remove(&pending_request->global_node);
    node_remove(&pending_request->client_node);

    if (pending_request->client != NULL) {
        --pending_request->client->pending_request_count;
    }

    if (pending_request->zombie != NULL) {
        --pending_request->zombie->pending_request_count;
    }

    free(pending_request);
}
Ejemplo n.º 6
0
nth_desc_t* nth_desc_edlist_get_front (nth_desc_edlist_t *l, int state,
                                       nth_desc_t *from )
{
    int vp = from->vp;
    nth_player_t *player = from->player;
    nth_desc_t *rv=NULL;

    if (l->first) {
        nth_spin_lock(&l->mutex);
        rv = l->first;
        while (rv) {
            if ( rv->state == state )
// To be included in next revision
//			&& (!rv->player || rv->player->team == team )
                if ( !rv->tied || rv->vp == vp )
                    break;

            rv = rv->next;
        }
        if (rv) {
            node_remove(l,rv);
        }
        nth_spin_unlock(&l->mutex);
    }

    return rv;
}
Ejemplo n.º 7
0
/*
 * HELPER function called from arp_thread
 * NOT THREAD SAFE
 */
void expire_arp_cache(struct sr_instance* sr) {
	assert(sr);

	router_state *rs = (router_state *)sr->interface_subsystem;
	node *arp_walker = 0;
	arp_cache_entry *arp_entry = 0;
	time_t now;
	double diff;
	int timedout_entry = 0;

	arp_walker = rs->arp_cache;
	while(arp_walker) {
		arp_entry = (arp_cache_entry *)arp_walker->data;
		node *tmp = arp_walker;
		arp_walker = arp_walker->next;

		/** if not static, check that is TTL is within reason **/
		if (arp_entry->is_static != 1) {
			time(&now);
			diff = difftime(now, arp_entry->TTL);

			if (diff > rs->arp_ttl) {
				node_remove(&rs->arp_cache, tmp);
				timedout_entry = 1;
			}
		}
	}

	/* update the hw arp cache */
	if(timedout_entry == 1) {
		trigger_arp_cache_modified(rs);
	}
}
Ejemplo n.º 8
0
nth_desc_t* nth_desc_edlist_get_back (nth_desc_edlist_t *l, int state,
                                      nth_desc_t *from)
{
    int vp = from->vp;
    nth_player_t *player = from->player;
    nth_desc_t *rv=NULL;

    if (l->last) {
        nth_spin_lock(&l->mutex);
        rv = l->last;
        while (rv) {
            if ( rv->state == state )
                //	&& (!rv->player || rv->player->team == team ) )
                if ( !rv->tied || rv->vp == vp )
                    break;

            rv = rv->prev;
        }
        if (rv) {
            node_remove(l,rv);
        }
        nth_spin_unlock(&l->mutex);
    }

    return rv;
}
Ejemplo n.º 9
0
Archivo: state.c Proyecto: pscha/tines
static void* save_state_cmd (int argc, char **argv, void *data)
{
	Node *pos = (Node *) data;
	Node *i;
	Node *j;

	if (savedtree != NULL) {
		tree_free (savedtree);
	}
	savedtree = node_new ();

	i = node_root (pos);
	j = savedtree;
	do {
		j = savedtree = tree_duplicate (i, j);
		i = node_down (i);
		j = node_insert_down (j);
	} while (i != NULL);
	j = node_remove (j);

	{
		int no;

		no = node_no (pos);
		savedtree = node_root (savedtree);
		while (--no)
			savedtree = node_recurse (savedtree);
	}

	return pos;
}
Ejemplo n.º 10
0
void trie_done(trie_tree *tree)
{
	assert(tree != NULL);
    if(tree->root != NULL)
        node_remove(tree->root);
    free(tree);
}
Ejemplo n.º 11
0
/**
 Usuwa poddrzewo node'a
 @param[in,out] node Węzeł
 */
static void node_remove(trie_node *node)
{
	assert(node != NULL);
	for(int i = 0 ; i < vector_size(node->sons); i++)
		node_remove(NTH_SON(node, i));
	vector_done(node->sons);
	free(node);
}
Ejemplo n.º 12
0
node_t *tree_remove(tree_t *tree, int key)
{
	node_t *n = tree_search(tree, key);

	if (n == tree->root)
		tree->root = NULL;

	return (!is_nil(n)) ? (node_remove(n)) : NULL;
}
Ejemplo n.º 13
0
int main(int argc, char* argv[]) {
	int i, j, k;
	char c;

	node *head = (node*) malloc(sizeof(node)); // 헤드 노드 생성
	head->next = NULL; // 잘못된 주소 할당 방지 위해 next 포인터 0x0 으로 만들어 놓기 -> head 노드가 노드의 끝이라는 것 명시
	printf("Main: %p, %p\n", head, head->next); // 헤드 노드 및 next 포인터 프린트


	while(1) {
		printf("Input command(I: insert, A: append, C: Append sequentially, D: delete, P: print, R: print all. E: exit.\n");
		scanf(" %c", &c);
		if(c =='E' || c == 'e') break;
		switch(c) {
			case 'I':
			case 'i':
				printf("Input number and position (For example, 4 5 measn put number 4 in fifth node)\n");
				scanf("%d %d", &i, &j);
				node_insert(head, i, j);
				break;
			case 'A' :
			case 'a' :
				printf("Input number (for example, 4 means append number 4)\n");
				scanf("%d", &i);
				node_append(head, i);
				break;
			case 'C' :
			case 'c' :
				printf("Input number (for example, 4 8 means append number 4 5 6 7 8 in a row)\n");
				scanf("%d %d", &i, &j);
				for(k=i; k<=j; k++)
					node_append(head, k);
				break;
			case 'D' :
			case 'd' :
				printf("Input node position to delete (For example, 5 means delete node in postition 5)\n");
				scanf("%d", &i);
				node_remove(head, i);
				break;
			case 'P' :
			case 'p' :
				printf("Input node position to print(For example, 5 means print number in fifth node)\n");
				scanf("%d", &i);
				node_print(head, i);
				break;
			case 'R' :
			case 'r' :
				node_print_all(head);
				break;
		}
	}


	free(head);
	return 0;
}
Ejemplo n.º 14
0
/**
 Próbuje usunąć węzeł
 @param[in,out] node Węzeł
 @return NULL jeżeli node został usunięty, node w p. p.
 */
static trie_node * node_try_to_delete(trie_node *node)
{
	assert(node != NULL);
	if(!node->end_of_word && vector_size(node->sons) == 0)
	{
		node_remove(node);
		return NULL;
	}
	return node;
}
Ejemplo n.º 15
0
nth_desc_t * nth_desc_dlist_pop_back ( nth_desc_dlist_t *l )
{
    nth_desc_t *nth;

    nth = l->last;
    if ( nth ) {
        node_remove(l,nth);
    }
    return nth;
}
Ejemplo n.º 16
0
nth_desc_t * nth_desc_dlist_pop_front ( nth_desc_dlist_t *l )
{
    nth_desc_t *nth;

    nth = l->first;
    if ( nth ) {
        node_remove(l,nth);
    }
    return nth;
}
Ejemplo n.º 17
0
/*  removes *pos if it is a temporary node, then returns 1
 *  otherwize returns 0
 */
static int remove_temp (Node **pos)
{
	if (node_getflag (*pos, F_temp)) {
		*pos = node_remove ((*pos));
		node_update_parents_todo ((*pos));
		docmd(*pos,"tree_changed");
		return 1;
	}
	return 0;
}
Ejemplo n.º 18
0
Article* queue_pop(Queue *queue) {
    if (!queue_isempty(queue)) {
        Article *ptr = node_get_ptr(queue->top);
        Node *old_top = queue->top;
        queue->top = node_get_next(queue->top);
        node_remove(old_top); // Don't delete article in the node
        queue->size--;
        return ptr;
    }
    return 0;
}
Ejemplo n.º 19
0
void avl_tree_remove(avl_tree_t *t, avl_tree_key_t k) {
    void *d;
    bool removed = false;

    assert(t);

    t->root = node_remove(t->root, k, &removed, &d);

    if (removed)
        --t->count;
}
Ejemplo n.º 20
0
static int cut_cmd (int argc,char **argv, void *data)
{
	Node *pos = (Node *) data;

	if (clipboard != NULL) {
		tree_free (clipboard);
	}
	clipboard = node_new ();

	clipboard = tree_duplicate (pos, clipboard);
	pos = node_remove (pos);
	return (int) pos;
}
Ejemplo n.º 21
0
nth_desc_t * nth_desc_edlist_pop_back ( nth_desc_edlist_t *l )
{
    nth_desc_t *nth=0;

    if ( l->last ) {
        nth_spin_lock(&l->mutex);
        nth = l->last;
        if ( nth ) {
            node_remove(l,nth);
        }
        nth_spin_unlock(&l->mutex);
    }
    return nth;
}
Ejemplo n.º 22
0
node_t *node_remove(node_t *n)
{
	if (is_leaf(n))
	{
		// przypadek 1: jest liściem

		// usuń wskaźnik z ojca
		if (is_left_child(n))
			parent(n)->left = NULL;
		else
			parent(n)->right = NULL;
	}
	else if (has_one_child(n))
	{
		// przypadek 2: tylko jedno dziecko
		node_t *child = (!is_nil(n->left)) ? (n->left) : (n->right);

		// niech dziadek stanie się ojcem
		parent(child) = parent(n);

		// podczep dziecko jako lewego lub prawego syna rodzica usuwanego węzła
		if (is_left_child(n))
			parent(child)->left = child;
		else
			parent(child)->right = child;
	}
	else
	{
		// przypadek 3: dwoje dzieci

		// znajdź poprzednika
		node_t *next = n->left;

		while (!is_nil(next->right))
			next = next->right;

		// zamień dane następnika z węzłem
		node_swap_data(next, n);

		n = node_remove(next);
	}

	n->left = NULL;
	n->right = NULL;
	parent(n) = NULL;

	return n;
}
Ejemplo n.º 23
0
static void* cut_cmd (int argc,char **argv, void *data)
{
	Node *pos = (Node *) data;
	if(prefs.readonly){
		cli_outfun("readonly flag set, avoiding tree change");
		return data;
	}

	if (clipboard != NULL) {
		tree_free (clipboard);
	}
	clipboard = node_new ();

	clipboard = tree_duplicate (pos, clipboard);
	pos = node_remove (pos);
	docmd(pos,"tree_changed");
	return pos;
}
Ejemplo n.º 24
0
nth_desc_t * nth_desc_edlist_remove ( nth_desc_t *node, nth_desc_edlist_t *wh )
{
    volatile nth_desc_edlist_t *l;

    if ( !(l=node->myqueue) ) return NULL;

    if ( wh && l != wh ) return NULL;

    nth_assert(l,"null my queue");
    nth_spin_lock(&l->mutex);
    if ( node->myqueue == l && (!wh || l == wh)) {
        nth_assert(l==node->myqueue,"l=%p myqueue=%p",l,node->myqueue);
        node_remove(l,node);
    } else node = NULL;
    nth_spin_unlock(&l->mutex);

    return node;
}
Ejemplo n.º 25
0
void *avl_tree_remove_get_data(avl_tree_t *t, avl_tree_key_t k) {
    void *d = NULL;
    bool removed = false;

    assert(t);

#if 0
    n = node_get(t->root, k);
    d = n->data;
#endif

    t->root = node_remove(t->root, k, &removed, &d);

    if (removed)
        --t->count;

    return d;
}
Ejemplo n.º 26
0
void
feedlist_node_removed (nodePtr node)
{
	if (node == SELECTED)
		feedlist_unselect ();
		
	/* First remove all children */
	node_foreach_child (node, feedlist_node_removed);

	node_remove (node);

	ui_node_remove_node (node);

	node->parent->children = g_slist_remove (node->parent->children, node);

	node_free (node);
	
	feedlist_schedule_save ();
}
Ejemplo n.º 27
0
/*
 * NOT THREAD SAFE
 * Returns: # of deleted arp cache entries (should only be 1)
 */
int del_arp_cache(struct sr_instance* sr, struct in_addr* ip) {
	router_state* rs = get_router_state(sr);
	node* cur = rs->arp_cache;
	node* next = NULL;
	int retval = 0;

	while (cur) {
		next = cur->next;
		arp_cache_entry* entry = (arp_cache_entry*)cur->data;

		if (entry->ip.s_addr == ip->s_addr) {
			node_remove(&(rs->arp_cache), cur);
			++retval;
		}

		cur = next;
	}

	return retval;
}
Ejemplo n.º 28
0
STATIC VOID MultiString_Event(void **msg)
{
/*	struct IClass *cl = (struct IClass*)msg[0];*/
	Object *obj = (Object*)msg[1];
	struct object_node *obj_node = (struct object_node*)msg[2];
	Object *window = (Object*)xget(obj,MUIA_WindowObject);
	int event = (int)msg[3];

	if (event == MUIV_SingleString_Event_CursorUp && node_prev(&obj_node->node))
	{
		set(window, MUIA_Window_ActiveObject, ((struct object_node*)node_prev(&obj_node->node))->obj);
		return;
	}

	if (event == MUIV_SingleString_Event_CursorDown && node_next(&obj_node->node))
	{
		set(window, MUIA_Window_ActiveObject, ((struct object_node*)node_next(&obj_node->node))->obj);
		return;
	}

	if (event == MUIV_SingleString_Event_ContentsToPrevLine && node_prev(&obj_node->node))
	{
		struct object_node *prev_node = (struct object_node*)node_prev(&obj_node->node);
		char *contents = (char*)xget(obj_node->obj, MUIA_UTF8String_Contents);
		int new_cursor_pos = strlen((char*)xget(prev_node->obj, MUIA_String_Contents)); /* is Okay */

		DoMethod(prev_node->obj, MUIM_UTF8String_Insert, (ULONG)contents, MUIV_BetterString_Insert_EndOfString);
		set(prev_node-> obj,MUIA_String_BufferPos, new_cursor_pos);
		set(window, MUIA_Window_ActiveObject, prev_node->obj);

		node_remove(&obj_node->node);
		DoMethod(obj, MUIM_Group_InitChange);
		DoMethod(obj, OM_REMMEMBER, (ULONG)obj_node->obj);
		MUI_DisposeObject(obj_node->obj);
		free(obj_node);
		DoMethod(obj, MUIM_Group_ExitChange);
		return;
	}
}
Ejemplo n.º 29
0
void cli_nuke_arp_cache(router_state *rs, cli_request *req) {

	lock_arp_cache_wr(rs);

	/* destroy the sw arp cache */
	node *cur = rs->arp_cache;
	while(cur) {
		node *next = cur->next;
		node_remove(&rs->arp_cache, cur);

		cur = next;
	}

	/* zero out the hw arp cache */
	if(rs->is_netfpga) {
		trigger_arp_cache_modified(rs);
	}

	unlock_arp_cache(rs);

	char *info = "SW and HW arp cache info was nuked\n";
	send_to_socket(req->sockfd, info, strlen(info));
}
Ejemplo n.º 30
0
void libusb_close(libusb_device_handle *dev_handle) {
	libusb_device *dev = dev_handle->dev;
	libusb_context *ctx = dev->ctx;
	jmethodID close_device_mid;

	if (!dev_handle->disconnected && ctx->pollfd_removed_callback != NULL) {
		ctx->pollfd_removed_callback(dev_handle->pollfd.fd, ctx->pollfd_user_data);
	}

	usbi_log_debug(ctx, "Closing device %p (context: %p, name: %s, fd: %d)",
	               dev, ctx, dev->name, dev_handle->pollfd.fd);

	close_device_mid = (*android_env)->GetMethodID(android_env, (*android_env)->GetObjectClass(android_env, android_service),
	                                               "closeDevice", "(I)V"); // FIXME: check result
	(*android_env)->CallVoidMethod(android_env, android_service, close_device_mid, dev_handle->pollfd.fd); // FIXME: check result

	node_remove(&dev_handle->node);
	--ctx->dev_handle_count;

	libusb_unref_device(dev_handle->dev);

	free(dev_handle);
}