Beispiel #1
0
/* 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;
}
Beispiel #2
0
/* 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();
}
Beispiel #3
0
/* 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();
}
Beispiel #4
0
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);
	}
   }
}