Ejemplo n.º 1
0
/**
*
*
* @author Francesco Quaglia
*/
int messages_checking(void) {
	msg_t msg;
	int at_least_one_message = 0;


	// Are we in GVT computation phase?
	// TODO a cosa serve questa parte qui sotto?!
//	if (ComputingGvt() == false)
//		send_forced_ack();


	// Check whether we have received any ack message
	receive_ack();

	// If we have pending messages, we process all of them in order to update the queues
 	while(pending_msg()){

		at_least_one_message = 1;

		// Receive the message
	    	(void)comm_recv((char*)&msg, sizeof(msg_t), MPI_CHAR, MPI_ANY_SOURCE, MSG_EVENT, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

		// For GVT Operations
		gvt_messages_rcvd[GidToKernel(msg.sender)] += 1;


		// Update the queues
//		DataUpdating(&msg);

	}

	// Did we receive at least one message?
	return at_least_one_message;

}
Ejemplo n.º 2
0
irom static i2c_error_t send_header(int address, i2c_direction_t direction)
{
	i2c_error_t error;
	bool_t ack;

	if(state != i2c_state_header_send)
		return(i2c_error_invalid_state_not_send_header);

	address <<= 1;
	address |= direction == i2c_direction_receive ? 0x01 : 0x00;

	state = i2c_state_start_send;

	if((error = send_start()) != i2c_error_ok)
		return(error);

	state = i2c_state_address_send;

	if((error = send_byte(address)) != i2c_error_ok)
		return(error);

	state = i2c_state_address_ack_receive;

	if((error = receive_ack(&ack)) != i2c_error_ok)
		return(error);

	state = i2c_state_address_ack_received;

	if(!ack)
		return(i2c_error_address_nak);

	return(i2c_error_ok);
}
Ejemplo n.º 3
0
// Receive a handshake record.
static bool receive_handshake(sptps_t *s, const char *data, uint16_t len) {
	// Only a few states to deal with handshaking.
	switch(s->state) {
		case SPTPS_SECONDARY_KEX:
			// We receive a secondary KEX request, first respond by sending our own.
			if(!send_kex(s))
				return false;
		case SPTPS_KEX:
			// We have sent our KEX request, we expect our peer to sent one as well.
			if(!receive_kex(s, data, len))
				return false;
			s->state = SPTPS_SIG;
			return true;
		case SPTPS_SIG:
			// If we already sent our secondary public ECDH key, we expect the peer to send his.
			if(!receive_sig(s, data, len))
				return false;
			if(s->outstate)
				s->state = SPTPS_ACK;
			else {
				s->outstate = true;
				if(!receive_ack(s, NULL, 0))
					return false;
				s->receive_record(s->handle, SPTPS_HANDSHAKE, NULL, 0);
				s->state = SPTPS_SECONDARY_KEX;
			}

			return true;
		case SPTPS_ACK:
			// We expect a handshake message to indicate transition to the new keys.
			if(!receive_ack(s, data, len))
				return false;
			s->receive_record(s->handle, SPTPS_HANDSHAKE, NULL, 0);
			s->state = SPTPS_SECONDARY_KEX;
			return true;
		// TODO: split ACK into a VERify and ACK?
		default:
			return error(s, EIO, "Invalid session state %d", s->state);
	}
}
Ejemplo n.º 4
0
irom i2c_error_t i2c_send(int address, int length, const uint8_t *bytes)
{
	int current;
	i2c_error_t error;
	bool_t ack;

	if(!i2c_flags.init_done)
		return(i2c_error_no_init);

	if(state != i2c_state_idle)
		return(i2c_error_invalid_state_not_idle);

	state = i2c_state_header_send;

	if((error = send_header(address, i2c_direction_send)) != i2c_error_ok)
		return(error);

	for(current = 0; current < length; current++)
	{
		state = i2c_state_data_send_data;

		if((error = send_byte(bytes[current])) != i2c_error_ok)
			return(error);

		state = i2c_state_data_send_ack_receive;

		if((error = receive_ack(&ack)) != i2c_error_ok)
			return(error);

		state = i2c_state_data_send_ack_received;

		if(!ack)
			return(i2c_error_data_nak);
	}

	state = i2c_state_stop_send;

	if((error = send_stop()) != i2c_error_ok)
		return(error);

	state = i2c_state_idle;

	return(i2c_error_ok);
}
Ejemplo n.º 5
0
static int do_sending(void)
{
  unsigned i;
  if (!make_msg())
    return stdin_eof ? STATE_EXITING : STATE_CONNECTED;
  /* Try to send the message packet multiple times. */
  for (i = 1; !exitasap && i <= retransmits; ++i) {
    debugf(DEBUG_PACKET, "{Sending seq #}llu{ to #}llu", seq_send, seq_last);
    send_packet("MSG1", ack_timeout * i);
    while (!exitasap) {
      if (poll_both() == 0) {
	debug1(DEBUG_STATE, "Timed out waiting for ACK");
	break;
      }
      if (stdin_ready)
	read_lines();
      if (sock_ready && receive_ack())
	return saw_seq_gap ? STATE_DISCONNECTED : STATE_SENDING;
    }
  }
  return STATE_DISCONNECTED;
}
Ejemplo n.º 6
0
static void handle_rrq(tftp_client_state_t *cli)
{
    short pak_type;
    short *netbuf_shorts = (short *)cli->block_buffer;
    sock_errno_e retcode;

    if (cli->state_flags & TFTP_SRV_BLKSIZE) {
        handle_oack_transmit(cli);
    } else {
        handle_data_transmit(cli);
    }

    while (1) {
        retcode = receive_packet(cli->client, cli->block_buffer, &cli->block_buffer_size);

        switch (retcode) {
        case SOCK_ERR_OK:
            break;
        case SOCK_ERR_TIMEOUT:
            if (handle_timeout(cli)) {
                continue;
            } else {
                return;
            }
            break;

        default:
            return;
        }

        pak_type = ntohs(netbuf_shorts[0]);

        switch (pak_type) {
        case TFTP_ACK:
            if (SOCK_ERR_OK == receive_ack(cli->block_buffer, cli->blockid)) {
                if (cli->state_flags & TFTP_SRV_LASTACK) {
                    return;
                } else {
                    handle_data_transmit(cli);
                }
            }
            break;

        case TFTP_ERROR:
            receive_error(cli->block_buffer);
            return;

        case TFTP_RRQ:
        /* FALLTHRU */
        case TFTP_WRQ:
        /* FALLTHRU */
        case TFTP_DATA:
        /* FALLTHRU */
        case TFTP_OACK:
            tftp_log_message("Unhandled packet type %d in %s\n", pak_type, __FUNCTION__);
            break;

        default:
            tftp_log_message("Unknown packet type %d in %s\n", pak_type, __FUNCTION__);
            break;
        }
    }
}
Ejemplo n.º 7
0
int main(int argc, char** argv) {
    if(argc != 4){
        printf("Usage: %s <server-ip> <port> <directory\n", argv[0]);
        return 0;
    }

    char buffer[(1<<16)+1];
    buffer[0] = '\0';

    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir (argv[3])) != NULL) {
        //read all files in the directory specified
        while ((ent = readdir (dir)) != NULL) {
            // send_stuffed_msg(con, ent->d_name);
            // if(!receive_ack(con)){
            //     printf("The server don't seem to support our protocol\n");
            //     close_connection(con);
            //     return EXIT_FAILURE;
            // }
            // bytesTransfered += strlen(ent->d_name)+1;
            // bytesTransfered += ACK_LEN;
            if(ent->d_name[0] != '.'){
                sprintf(buffer, "%s%s\n", buffer, ent->d_name);
            }
        }
        closedir (dir);
    } else {
        printf("We couldn't open the specified directory\n");
        return EXIT_FAILURE;
    }

    char* address = argv[1];
    int port = atoi(argv[2]);

    Connection* con = connect_to_server(address, port);

    if(con == NULL){
        printf("Couldn't connect to the server. Is the address correct? (only ip addesses are supported)\n");
        return EXIT_FAILURE;
    }

    struct timespec beginTime, endTime;

    int bytesTransfered = 0;


    send_greeting(con);
    if(!receive_greet_ack(con)){
        printf("The server don't seem to support our protocol\n");
        close_connection(con);
        return EXIT_FAILURE;
    }

    send_stuffed_msg(con, argv[3]);
    if(!receive_ack(con)){
        printf("The server don't seem to support our protocol\n");
        close_connection(con);
        return EXIT_FAILURE;
    }

    clock_gettime(CLOCK_REALTIME, &beginTime);

    send_stuffed_msg(con, buffer);
    if(!receive_ack(con)){
        printf("The server don't seem to support our protocol\n");
        close_connection(con);
        return EXIT_FAILURE;
    }

    bytesTransfered = strlen(buffer);

    clock_gettime(CLOCK_REALTIME, &endTime);

    send_farewell(con);
    close_connection(con);

    double ellapsedTime = (endTime.tv_sec - beginTime.tv_sec) + (endTime.tv_nsec - beginTime.tv_nsec) / 1E9;




    printf("The file names were successfully sent %d B to server in %f seconds at %f B/s.\n", bytesTransfered, ellapsedTime, (bytesTransfered/ellapsedTime));

    return 0;
}