Exemple #1
0
int process_addr_discover_reply(Header *header, ChordPacketArgs *args,
								AddrDiscoverReply *msg, Node *from)
{
	ChordServer *srv = args->srv;
	LOG_PROCESS(&from->id, &from->addr, from->port);

	if (!verify_ticket(srv->ticket_salt, srv->ticket_salt_len,
					   srv->ticket_hash_len, msg->ticket.data, msg->ticket.len,
					   "c6s", CHORD_ADDR_DISCOVER, &from->addr, from->port))
		return CHORD_INVALID_TICKET;

	if (IN6_IS_ADDR_UNSPECIFIED(&srv->node.addr)) {
		v6_addr_set(&srv->node.addr, msg->addr.data);
		get_address_id(&srv->node.id, &srv->node.addr, srv->node.port);
		chord_update_range(srv, &srv->node.id, &srv->node.id);

		StartLog(INFO);
		PartialLog("address: [%s]:%d, ", v6addr_to_str(&srv->node.addr), srv->node.port);
		PartialLog("node id: ");
		print_chordID(clog_file_logger()->fp, &srv->node.id);
		EndLog();
		
		Info("Stabilizing every %u.%u seconds", STABILIZE_PERIOD / 1000000UL, STABILIZE_PERIOD % 1000000UL);

		event_del(srv->discover_addr_event);
		
		struct timeval timeout;
		timeout.tv_sec = STABILIZE_PERIOD / 1000000UL;
		timeout.tv_usec = STABILIZE_PERIOD % 1000000UL;
		event_add(srv->stab_event, &timeout);
	}
	return CHORD_NO_ERROR;
}
Exemple #2
0
int process_stab_reply(Header *header, ChordPacketArgs *args,
					   StabilizeReply *msg, Node *from)
{
	ChordServer *srv = args->srv;
	Finger *succ;
	int fnew;
	chordID id;

	if (IN6_IS_ADDR_UNSPECIFIED(&srv->node.addr))
		return CHORD_ADDR_UNDISCOVERED;

	in6_addr addr;
	memcpy(addr.s6_addr, msg->addr.data, 16);

	get_address_id(&id, &addr, msg->port);

	LOG_PROCESS(&id, NULL, -1);

	// If we are our successor's predecessor, everything is fine, so do nothing.
	if (v6_addr_equals(&srv->node.addr, &addr) && srv->node.port == msg->port)
		return CHORD_NO_ERROR;

	// Otherwise, there is a better successor in between us and our current
	// successor. So we notify the in-between node that we should be its
	// predecessor.
	insert_finger(srv, &id, &addr, msg->port, &fnew);
	succ = succ_finger(srv);
	send_notify(srv, &succ->node.addr, succ->node.port);
	if (fnew)
		send_ping(srv, &addr, msg->port, get_current_time());
	return CHORD_NO_ERROR;
}
Exemple #3
0
int process_stab(Header *header, ChordPacketArgs *args, Stabilize *msg,
				 Node *from)
{
	ChordServer *srv = args->srv;
	Finger *pred = pred_finger(srv);
	int		 fnew;
	chordID id;

	if (IN6_IS_ADDR_UNSPECIFIED(&srv->node.addr))
		return CHORD_ADDR_UNDISCOVERED;

	in6_addr addr;
	memcpy(addr.s6_addr, msg->addr.data, 16);

	get_address_id(&id, &addr, msg->port);

	LOG_PROCESS(&id, &addr, msg->port);

	insert_finger(srv, &id, &addr, msg->port, &fnew);

	// If we have a predecessor, tell the requesting node what it is.
	if (pred)
		send_stab_reply(srv, &addr, msg->port, &pred->node.addr,
						pred->node.port);
	return CHORD_NO_ERROR;
}
Exemple #4
0
int process_fs_reply(Header *header, ChordPacketArgs *args,
					 FindSuccessorReply *msg, Node *from)
{
	ChordServer *srv = args->srv;
	int fnew;
	chordID id;

	if (IN6_IS_ADDR_UNSPECIFIED(&srv->node.addr))
		return CHORD_ADDR_UNDISCOVERED;

	in6_addr addr;
	memcpy(addr.s6_addr, msg->addr.data, 16);

	get_address_id(&id, &addr, msg->port);

	if (!verify_ticket(srv->ticket_salt, srv->ticket_salt_len,
					   srv->ticket_hash_len, msg->ticket.data, msg->ticket.len,
					   "c", CHORD_FS))
		return CHORD_INVALID_TICKET;

	if (v6_addr_equals(&srv->node.addr, &addr) && srv->node.port == msg->port)
		return CHORD_NO_ERROR;
	
	LOG_PROCESS(&id, &from->addr, from->port);

	insert_finger(srv, &id, &addr, msg->port, &fnew);
	if (fnew)
		send_ping(srv, &addr, msg->port, get_current_time());

	return CHORD_NO_ERROR;
}
Exemple #5
0
void quest_override(u32 mod_number) {
    u32 *result;

    if(mod_number == QUEST_START_MARKER) {
        kprintf("quest started\n");
        quest_started = 1;
        loaded_mib = 0;
    }
    if(quest_started == 1) {
        if(mod_number >= 2820 && mod_number <= 3972) {
            kprintf("detected quest: %i\n", mod_number);
            loaded_mib = mod_number;
        }
        if(mod_number > 5000) {
            if(loaded_mib == 0) {
                kprintf("no quest has been loaded, starting mib analysis\n");
                result = search_exact(get_address_id((u8 *)MIB_ADDR, MIB_ID_SIZE), mib_table, mib_elems);
                if(result) {
                    loaded_mib = get_quest_number(result);
                    kprintf("mib number found: %i\n", loaded_mib);
                } else {
                    kprintf("unknown mib file, skipping\n");
                }
            }
            quest_started = 2;
        }
    }
    if(mod_number == QUEST_END_MARKER) {
        kprintf("quest finished\n");
        quest_started = 0;
        loaded_mib = 0;
    }
}
Exemple #6
0
int process_fs(Header *header, ChordPacketArgs *args, FindSuccessor *msg,
			   Node *from)
{
	ChordServer *srv = args->srv;
	Node *succ, *np;
	chordID reply_id;
	in6_addr reply_addr;
	ushort reply_port = msg->port;

	if (IN6_IS_ADDR_UNSPECIFIED(&srv->node.addr))
		return CHORD_ADDR_UNDISCOVERED;

	v6_addr_set(&reply_addr, msg->addr.data);
	get_address_id(&reply_id, &reply_addr, reply_port);

	LOG_PROCESS(&reply_id, &reply_addr, reply_port);

	if (--msg->ttl == 0) {
		StartLog(WARN);
		print_two_chordIDs(clog_file_logger()->fp, "TTL expired: fix_finger packet ", &reply_id,
						   " dropped at node ", &srv->node.id, "");
		EndLog();
		return CHORD_TTL_EXPIRED;
	}

	if (v6_addr_equals(&srv->node.addr, &reply_addr)
		&& srv->node.port == reply_port)
		return CHORD_NO_ERROR;

	if (succ_finger(srv) == NULL) {
		send_fs_reply(srv, msg->ticket.data, msg->ticket.len, &reply_addr, reply_port,
					  &srv->node.addr, srv->node.port);
		return CHORD_NO_ERROR;
	}
	succ = &succ_finger(srv)->node;

	if (id_is_between(&reply_id, &srv->node.id, &succ->id) || id_equals(&reply_id,
																  &succ->id)) {
		send_fs_reply(srv, msg->ticket.data, msg->ticket.len, &reply_addr, reply_port,
					  &succ->addr, succ->port);
	}
	else {
		np = closest_preceding_node(srv, &reply_id, 0);
		send_fs_forward(srv, msg->ticket.data, msg->ticket.len, msg->ttl, &np->addr, np->port,
						&reply_addr, reply_port);
	}
	return CHORD_NO_ERROR;
}