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; }
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; }
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; }
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; }
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; } }
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; }