/* Add nodes to the to_ping list. * All nodes in this list are pinged every TIME_TO_PING seconds * and are then removed from the list. * If the list is full the nodes farthest from our public_key are replaced. * The purpose of this list is to enable quick integration of new nodes into the * network while preventing amplification attacks. * * return 0 if node was added. * return -1 if node was not added. */ int add_to_ping(PING *ping, const uint8_t *public_key, IP_Port ip_port) { if (!ip_isset(&ip_port.ip)) { return -1; } if (!node_addable_to_close_list(ping->dht, public_key, ip_port)) { return -1; } if (in_list(ping->dht->close_clientlist, LCLIENT_LIST, public_key, ip_port)) { return -1; } IP_Port temp; if (DHT_getfriendip(ping->dht, public_key, &temp) == 0) { send_ping_request(ping, ip_port, public_key); return -1; } unsigned int i; for (i = 0; i < MAX_TO_PING; ++i) { if (!ip_isset(&ping->to_ping[i].ip_port.ip)) { memcpy(ping->to_ping[i].public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE); ipport_copy(&ping->to_ping[i].ip_port, &ip_port); return 0; } if (public_key_cmp(ping->to_ping[i].public_key, public_key) == 0) { return -1; } } if (add_to_list(ping->to_ping, MAX_TO_PING, public_key, ip_port, ping->dht->self_public_key)) { return 0; } return -1; }
/* Ping all the valid nodes in the to_ping list every TIME_TO_PING seconds. * This function must be run at least once every TIME_TO_PING seconds. */ void do_to_ping(PING *ping) { if (!is_timeout(ping->last_to_ping, TIME_TO_PING)) return; if (!ip_isset(&ping->to_ping[0].ip_port.ip)) return; uint32_t i; for (i = 0; i < MAX_TO_PING; ++i) { if (!ip_isset(&ping->to_ping[i].ip_port.ip)) break; send_ping_request(ping, ping->to_ping[i].ip_port, ping->to_ping[i].public_key); ip_reset(&ping->to_ping[i].ip_port.ip); } if (i != 0) ping->last_to_ping = unix_time(); }
/* Ping all the valid nodes in the to_ping list every TIME_TO_PING seconds. * This function must be run at least once every TIME_TO_PING seconds. */ void do_to_ping(PING *ping) { if (!is_timeout(ping->last_to_ping, TIME_TO_PING)) return; if (!ip_isset(&ping->to_ping[0].ip_port.ip)) return; unsigned int i; for (i = 0; i < MAX_TO_PING; ++i) { if (!ip_isset(&ping->to_ping[i].ip_port.ip)) break; if (!node_addable_to_close_list(ping->dht, ping->to_ping[i].public_key, ping->to_ping[i].ip_port)) continue; send_ping_request(ping, ping->to_ping[i].ip_port, ping->to_ping[i].public_key); ip_reset(&ping->to_ping[i].ip_port.ip); } if (i != 0) ping->last_to_ping = unix_time(); }
void monitor_sockets() { fd_set set_fd; fd_set set_sel; int mx_fd; struct sockaddr_in multicast_socket; struct timeval ping_timeout; FD_ZERO(&set_fd); struct tour_packet packet; char buf[100]; struct in_addr dest_ip; strcpy(buf,"This is Multicast message \n"); while(1) { FD_SET(rt_fd,&set_fd); mx_fd = rt_fd; if (am_i_member_multicast == 1) { FD_SET(udp_fd,&set_fd); mx_fd = max(rt_fd,udp_fd); } if (ping_enabled == 1 || exit_flag == 1) { FD_SET(pg_fd,&set_fd); mx_fd = max(mx_fd,pg_fd); ping_timeout.tv_sec = 1; ping_timeout.tv_usec = 0; if (exit_flag == 1) { ping_timeout.tv_sec = 5; ping_timeout.tv_usec = 0; ping_enabled = 1; } } mx_fd = mx_fd +1; int s = select(mx_fd,&set_fd,NULL,NULL,ping_enabled ? &ping_timeout : NULL); if (s == 0) { if (exit_flag == 1) { exit(0); } if (tour_ended == 1) { if (ping_count >= 0) ping_count--; } if (ping_count == 0) { ping_enabled = 0; end_multicast(); } else { int i; //send_ping_request(pf_fd,host_ip_struct,dest_ip); for (i = 1; i< 11;i++) { if (ping_status[i] == 1) { dest_ip.s_addr = ping_add[i].s_addr; send_ping_request(pf_fd,host_ip_struct,dest_ip); } } } } else if (FD_ISSET(rt_fd,&set_fd)) { int len = recvfrom(rt_fd,&packet,sizeof(struct tour_packet),0,NULL,NULL); enable_multicating(ip_multicast,port_multicast); int ping_index = packet.index - 1; dest_ip.s_addr = packet.vm_list[ping_index].s_addr; printf(" \n %s Received Source Routing Packet from %s \n",print_time(),getVMbyIPaddr(dest_ip)); ping_enabled = 1; char *vm_id = getVMbyIPaddr(dest_ip); vm_id++; vm_id++; int node_no = atoi(vm_id); ping_status[node_no] = 1; ping_add[node_no].s_addr = dest_ip.s_addr; send_ping_request(pf_fd,host_ip_struct,dest_ip); if (packet.index == packet.end_index) { tour_ended = 1; continue; } send_to_next_node(&packet,count); } else if (FD_ISSET(udp_fd,&set_fd)) { char buf[100]; int len = recvfrom(udp_fd,buf,100,0,NULL,NULL); printf("\n Node %s Received %s \n",getVMbyIPaddr(ip_hw_map[0].ip),buf); if (multicast_message_sent == 0) { multicast_socket.sin_family = AF_INET; multicast_socket.sin_addr.s_addr = ip_multicast.s_addr; multicast_socket.sin_port = htons(PORT_MULTICAST); memset(buf,'\0',100); sprintf(buf,"This is multicast message from %s",getVMbyIPaddr(ip_hw_map[0].ip)); printf("\n Node %s ,i am member of group \n",getVMbyIPaddr(ip_hw_map[0].ip)); printf("\n Node %s Sending %s \n",getVMbyIPaddr(ip_hw_map[0].ip),buf); int s = sendto(udp_fd,(void *)buf,100,0,(struct sockaddr *)&multicast_socket,sizeof(struct sockaddr)); multicast_message_sent = 1; tour_ended = 1; ping_enabled = 0; exit_flag = 1; //printf("Multicast packet sent %d",s); if (s<=0) perror("multicast error"); continue; } } else if (FD_ISSET(pg_fd,&set_fd)) { //printf("\n PING reply received \n "); proc_v4(pg_fd); } } }