Example #1
0
File: net.c Project: op5/merlin
/*
 * Reads input from a particular node and ships it off to
 * the "handle_event()"
 */
int net_input(int sd, int io_evt, void *node_)
{
	merlin_event *pkt;
	merlin_node *node = (merlin_node *)node_;
	int len, events = 0;

	errno = 0;
	ldebug("NETINPUT from %p (%s)", node, node ? node->name : "oops");
	len = node_recv(node);
	if (len < 0) {
		return 0;
	}
	node->stats.bytes.read += len;
	node->last_recv = time(NULL);

	while ((pkt = node_get_event(node))) {
		events++;
		handle_event(node, pkt);
		free(pkt);
	}
	ldebug("Read %d events in %s from %s node %s",
		   events, human_bytes(len), node_type(node), node->name);

	return events;
}
Example #2
0
int distribute_thr(int recvSock)
{
    char *p, buf[2048], *url;
    URLNODE_T *urlNode;

    urlNode = (URLNODE_T *) buf;
    url = buf + sizeof(URLNODE_T);

    while (1)
    {
        node_recv(recvSock, buf, 2048);
        assert(urlNode->urlLen + sizeof(URLNODE_T) < 2048);

        *(url + urlNode->urlLen) = 0;
        printf("recv: %s urlLen: %d", url, urlNode->urlLen);

        if (link_filter(url) == 0)
            continue;

        node_send(urlNode, url);
        printf("send (%s) to center\n", links->links[i]);
    }

    return 0;
}
Example #3
0
int process_epidemic_cnt_event(struct Simulator *aSim, struct Node *aNode, struct Node *bNode)
{
	struct Item *aItem, *temp;
	struct Pkg *aPkg, *newPkg;

	/* update neighborhood */
	node_met_a_node(aNode, bNode, aSim->oracle->neighborThreshold);
	node_met_a_node(bNode, aNode, aSim->oracle->neighborThreshold);


	aItem = aNode->storage->pkgs.head;
	while(aItem != NULL) {
		aPkg = (struct Pkg*)aItem->datap;
		newPkg = pkg_copy_func(aPkg);
		if(strcmp(aPkg->dst, bNode->name)==0) {
			newPkg->endAt = aSim->clock;
			node_recv(aSim, bNode, newPkg);
			temp = aItem->next;
			storage_remove_pkg(aNode->storage, aPkg->id);
			aItem = temp;
			continue;
		} else { 
			node_recv(aSim, bNode, newPkg);
			aItem = aItem->next;
		}
	}

	aItem = bNode->storage->pkgs.head;
	while(aItem != NULL) {
		aPkg = (struct Pkg*)aItem->datap;
		newPkg = pkg_copy_func(aPkg);
		if(strcmp(aPkg->dst, aNode->name)==0) {
			newPkg->endAt = aSim->clock;
			node_recv(aSim, aNode, newPkg);
			temp = aItem->next;
			storage_remove_pkg(bNode->storage, aPkg->id);
			aItem = temp;
			continue;
		} else { 
			node_recv(aSim, aNode, newPkg);
			aItem = aItem->next;
		}
	}
	return 0;
}
Example #4
0
static int ipc_reap_events(void)
{
	int len, events = 0;
	merlin_event *pkt;

	node_log_event_count(&ipc, 0);

	len = node_recv(&ipc);
	if (len < 0)
		return len;

	while ((pkt = node_get_event(&ipc))) {
		events++;
		handle_ipc_event(pkt);
	}
	ldebug("Read %d events in %s from %s", events, human_bytes(len), ipc.name);

	return 0;
}
Example #5
0
void cache_work_thr()
{
    unsigned ret;
    char buf[2048], url[MAX_URL_LEN];
    URLNODE_T *urlNode;

    urlNode = (URLNODE_T *) buf;

    while (1)
    {
        node_recv(buf, 2048);

        if (urlNode->urlLen > MAX_URL_LEN)
        {
            printf("urlNode->urlLen error.\n");
            continue;
        }

        *(buf + sizeof(URLNODE_T) + urlNode->urlLen) = 0;
        snprintf(url, MAX_URL_LEN, "%s", buf + sizeof(URLNODE_T));

        if ((ret = NEO_cache_check(g_domainRBdict, url)) > 100000)
        {
            printf("this domain save too many (%d) url.\n", ret);
            continue;
        }
        //本机url, 直接更新, 同时发送到radar记录
        guide_send(urlNode, url);

        if (urlNode->updateTime > 0)
        {
            pthread_mutex_lock(&cache_mutex);
            NEO_cache_url(g_domainRBdict, url, urlNode);
            pthread_mutex_unlock(&cache_mutex);
        }
    }

    return;
}
Example #6
0
File: net.c Project: ageric/merlin
/*
 * Reads input from a particular node and ships it off to
 * the "handle_network_event()" routine up above
 */
static int net_input(merlin_node *node)
{
	merlin_event *pkt;
	int len, events = 0;

	errno = 0;
	len = node_recv(node);
	if (len < 0) {
		return 0;
	}
	node->stats.bytes.read += len;
	node->last_recv = time(NULL);

	while ((pkt = node_get_event(node))) {
		events++;
		handle_network_event(node, pkt);
	}
	ldebug("Read %d events in %s from %s node %s",
		   events, human_bytes(len), node_type(node), node->name);

	return events;
}
Example #7
0
void social_check_for_relaying_pkgs(struct Simulator *aSim, struct Node *aNode, struct Node *bNode)
{
	struct Pairwise *aPairwise, *bPairwise;
	struct Item *aItem, *temp;
	struct Pkg *aPkg, *newPkg;
	char cond1, cond2, cond3, cond4, doFwd;

	aItem = aNode->storage->pkgs.head;
	while(aItem != NULL) {
		aPkg = (struct Pkg*)aItem->datap;
		aPairwise = lookup_pairwise_in_oracle(aSim->oracle, aNode->name, aPkg->dst);
		bPairwise = lookup_pairwise_in_oracle(aSim->oracle, bNode->name, aPkg->dst);

		cond1 = ((aPairwise && aPairwise->estimation==-1)||aPairwise==NULL) && bPairwise && bPairwise->estimation!=-1;
		cond2 = aPairwise && aPairwise->estimation!=-1 && bPairwise && bPairwise->estimation!=-1 && aPairwise->estimation>bPairwise->estimation;
		cond3 = ((aPairwise && aPairwise->estimation==-1)||aPairwise==NULL) && ((bPairwise && bPairwise->estimation==-1)||bPairwise==NULL) && (aNode->betweenness<bNode->betweenness);
		cond4 = aNode->betweenness<bNode->betweenness;
		if(aSim->oracle->onlySocial)
			doFwd = cond4;
		else
			doFwd = cond1 || cond2 || cond3;

		if(aSim->fwdMethod == NO_REPLICA_FWD) {
			 if(strcmp(aPkg->dst, bNode->name)==0) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;

			 } else if(doFwd) {
				newPkg = pkg_copy_func(aPkg);
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			}


		} else if(aSim->fwdMethod == BETTER_ESTIMATE_FWD) {
			if ( strcmp(aPkg->dst, bNode->name)==0 ) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			} else if( doFwd) {
				newPkg = pkg_copy_func(aPkg);
				node_recv(aSim, bNode, newPkg);
			}

		} else if(aSim->fwdMethod == EVERBEST_ESTIMATE_FWD) {
			if ( strcmp(aPkg->dst, bNode->name)==0 ) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			} else  if( (aPkg->value==-1 && doFwd)
				||  (aPkg->value!=-1 && bPairwise && bPairwise->estimation!=-1 && aPkg->value>bPairwise->estimation)) {
				newPkg = pkg_copy_func(aPkg);
				aPkg->value = bPairwise->estimation;
				newPkg->value = bPairwise->estimation;
				node_recv(aSim, bNode, newPkg);
			}

		}
		aItem = aItem->next;
	}


}
Example #8
0
void simbet_check_for_relaying_pkgs(struct Simulator *aSim, struct Node *aNode, struct Node *bNode)
{
	struct Item *aItem, *temp;
	struct Pkg *aPkg, *newPkg;
	struct Node *dstNode;
	double sim_aNode_dst, sim_bNode_dst, SimUtil_aNode, SimUtil_bNode, BetUtil_aNode, BetUtil_bNode, SimBetUtil_aNode, SimBetUtil_bNode;

	aItem = aNode->storage->pkgs.head;
	while(aItem != NULL) {
		aPkg = (struct Pkg*)aItem->datap;
		dstNode = lookup_node(&aSim->vnodes, aPkg->dst);
		/* calculate the similarity between aNode and the dest*/
		sim_aNode_dst = calculate_similarity(aNode, dstNode);
		/* calculate the similarity between bNode and the dest*/
		sim_bNode_dst = calculate_similarity(bNode, dstNode);
		if(sim_aNode_dst+sim_bNode_dst == 0) {
			SimUtil_aNode = 0;
			SimUtil_bNode = 0;
		} else {
			SimUtil_aNode = sim_aNode_dst/(sim_aNode_dst+sim_bNode_dst);
			SimUtil_bNode = sim_bNode_dst/(sim_aNode_dst+sim_bNode_dst);
		}

		if(aNode->betweenness+bNode->betweenness == 0) {
			BetUtil_aNode = 0;
			BetUtil_bNode = 0;
		} else {
			BetUtil_aNode = aNode->betweenness/(aNode->betweenness+bNode->betweenness);
			BetUtil_bNode = bNode->betweenness/(aNode->betweenness+bNode->betweenness);
		}
		SimBetUtil_aNode = aSim->oracle->alfar*SimUtil_aNode + aSim->oracle->beta*BetUtil_aNode;
		SimBetUtil_bNode = aSim->oracle->alfar*SimUtil_bNode + aSim->oracle->beta*BetUtil_bNode;

		if(aSim->fwdMethod == NO_REPLICA_FWD) {
			 if(strcmp(aPkg->dst, bNode->name)==0) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			 } else if( SimBetUtil_aNode < SimBetUtil_bNode ) {
				newPkg = pkg_copy_func(aPkg);
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			 }


		} else if(aSim->fwdMethod == BETTER_ESTIMATE_FWD) {
			 if(strcmp(aPkg->dst, bNode->name)==0) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			 } else if( SimBetUtil_aNode < SimBetUtil_bNode ) {
				newPkg = pkg_copy_func(aPkg);
				node_recv(aSim, bNode, newPkg);
			 }


		} else if(aSim->fwdMethod == EVERBEST_ESTIMATE_FWD) {
			 if(strcmp(aPkg->dst, bNode->name)==0) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			} else  if ((aPkg->value==-1 && SimBetUtil_aNode < SimBetUtil_bNode) 
				||  (aPkg->value!=-1 && SimBetUtil_bNode > aPkg->value)) {
				newPkg = pkg_copy_func(aPkg);
				aPkg->value = SimBetUtil_bNode;
				newPkg->value = SimBetUtil_bNode;
				node_recv(aSim, bNode, newPkg);
			}
		}
		aItem = aItem->next;
	}
}
Example #9
0
void bubble_check_for_relaying_pkgs(struct Simulator *aSim, struct Node *aNode, struct Node *bNode)
{
	struct Item *aItem, *temp;
	struct Pkg *aPkg, *newPkg;

	aItem = aNode->storage->pkgs.head;
	while(aItem != NULL) {
		aPkg = (struct Pkg*)aItem->datap;
		if(aSim->fwdMethod == NO_REPLICA_FWD) {
			 if(strcmp(aPkg->dst, bNode->name)==0) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			 } else if( aNode->neighbors.count < bNode->neighbors.count ) {
				newPkg = pkg_copy_func(aPkg);
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			}


		} else if(aSim->fwdMethod == BETTER_ESTIMATE_FWD) {
			 if(strcmp(aPkg->dst, bNode->name)==0) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			} else if ( aNode->neighbors.count < bNode->neighbors.count ) {
				newPkg = pkg_copy_func(aPkg);
				node_recv(aSim, bNode, newPkg);
			}

		} else if(aSim->fwdMethod == EVERBEST_ESTIMATE_FWD) {
			 if(strcmp(aPkg->dst, bNode->name)==0) {
				newPkg = pkg_copy_func(aPkg);
				newPkg->endAt = aSim->clock;
				node_recv(aSim, bNode, newPkg);
				temp = aItem->next;
				storage_remove_pkg(aNode->storage, aPkg->id);
				aItem = temp;
				continue;
			} else  if ((aPkg->value==-1 && aNode->neighbors.count < bNode->neighbors.count) 
				||  (aPkg->value!=-1 && bNode->neighbors.count > aPkg->value)) {
				newPkg = pkg_copy_func(aPkg);
				aPkg->value = bNode->neighbors.count;
				newPkg->value = bNode->neighbors.count;
				node_recv(aSim, bNode, newPkg);
			}
		}
		aItem = aItem->next;
	}
}