/* * @brief Adds the specified server to the master. */ static void Ms_AddServer(struct sockaddr_in *from) { struct sockaddr_in addr; if (Ms_GetServer(from)) { Com_Print("Duplicate ping from %s\n", inet_ntoa(from->sin_addr)); return; } if (Ms_BlacklistServer(from)) { Com_Print("Server %s has been blacklisted\n", inet_ntoa(from->sin_addr)); return; } ms_server_t *server = Z_Malloc(sizeof(*server)); server->ip = *from; server->last_heartbeat = time(0); server->port = from->sin_port; ms_servers = g_list_prepend(ms_servers, server); Com_Print("Server %s registered\n", inet_ntoa(from->sin_addr)); // send an acknowledgment addr.sin_addr = server->ip.sin_addr; addr.sin_family = AF_INET; addr.sin_port = server->port; memset(&addr.sin_zero, 0, sizeof(addr.sin_zero)); sendto(ms_sock, "\xFF\xFF\xFF\xFF" "ack", 7, 0, (struct sockaddr*) &addr, sizeof(addr)); }
/** * @brief Removes the specified server. */ static void Ms_RemoveServer(struct sockaddr_in *from) { ms_server_t *server = Ms_GetServer(from); if (!server) { Com_Warn("Shutdown from unregistered server %s\n", atos(from)); return; } Com_Print("Shutdown from %s\n", stos(server)); Ms_DropServer(server); }
/* * @brief */ static void Ms_Ack(struct sockaddr_in *from) { ms_server_t *server; if (!(server = Ms_GetServer(from))) return; Com_Print("Ack from %s (%d).\n", inet_ntoa(server->ip.sin_addr), server->queued_pings); server->last_heartbeat = time(0); server->queued_pings = 0; server->heartbeats++; server->validated = true; }
/* * @brief Removes the specified server. */ static void Ms_RemoveServer(struct sockaddr_in *from, ms_server_t *server) { if (!server) // resolve from address server = Ms_GetServer(from); if (!server) { Com_Print("Shutdown from unregistered server %s\n", inet_ntoa(from->sin_addr)); return; } Com_Print("Shutdown from %s\n", inet_ntoa(from->sin_addr)); Ms_DropServer(server); }
/** * @brief Acknowledge the server from the specified address. */ static void Ms_Ack(struct sockaddr_in *from) { ms_server_t *server = Ms_GetServer(from); if (server) { Com_Verbose("Ack from %s (%d)\n", stos(server), server->queued_pings); server->validated = true; server->queued_pings = 0; } else { Com_Warn("Ack from unregistered server %s\n", atos(from)); } }
/** * @brief Accept a "heartbeat" from the specified server address. */ static void Ms_Heartbeat(struct sockaddr_in *from) { ms_server_t *server = Ms_GetServer(from); if (server) { server->last_heartbeat = time(NULL); Com_Verbose("Heartbeat from %s\n", stos(server)); const void *ack = "\xFF\xFF\xFF\xFF" "ack"; sendto(ms_sock, ack, 7, 0, (struct sockaddr *) &server->addr, sizeof(server->addr)); } else { Ms_AddServer(from); } }
/* * @brief */ static void Ms_Heartbeat(struct sockaddr_in *from) { ms_server_t *server; struct sockaddr_in addr; if ((server = Ms_GetServer(from))) { // update their timestamp addr.sin_addr = server->ip.sin_addr; addr.sin_family = AF_INET; addr.sin_port = server->port; memset(&addr.sin_zero, 0, sizeof(addr.sin_zero)); server->validated = true; server->last_heartbeat = time(0); Com_Print("Heartbeat from %s.\n", inet_ntoa(server->ip.sin_addr)); sendto(ms_sock, "\xFF\xFF\xFF\xFF" "ack", 7, 0, (struct sockaddr*) &addr, sizeof(addr)); return; } Ms_AddServer(from); }
/** * @brief Adds the specified server to the master. */ static void Ms_AddServer(struct sockaddr_in *from) { if (Ms_GetServer(from)) { Com_Warn("Duplicate ping from %s\n", atos(from)); return; } if (Ms_BlacklistServer(from)) { Com_Warn("Server %s has been blacklisted\n", atos(from)); return; } ms_server_t *server = Mem_Malloc(sizeof(ms_server_t)); server->addr = *from; server->last_heartbeat = time(NULL); ms_servers = g_list_prepend(ms_servers, server); Com_Print("Server %s registered\n", stos(server)); // send an acknowledgment sendto(ms_sock, "\xFF\xFF\xFF\xFF" "ack", 7, 0, (struct sockaddr *) from, sizeof(*from)); }