示例#1
0
int llread(int fd,unsigned char* buffer) {

	int num_chars_read = 0, aux_num_chars = 0;
	int Type;

	unsigned char aux[MAX_SIZE];
	linkLayer.sequenceNumber = 0;
	do {
		Type= receiveframe(aux, &aux_num_chars);

		if(Type == DATA_RECEIVED)
		{
			linkLayer.sequenceNumber = linkLayer.sequenceNumber ^ 1;
			sendSupervisionFrame(linkLayer.fd, RR);
			memcpy(buffer + num_chars_read, aux, aux_num_chars);
			num_chars_read += aux_num_chars;
			aux_num_chars = 0;
		}
		else if(Type == BAD_DATA_RECEIVED) {
			rej_send_received++;
			sendSupervisionFrame(linkLayer.fd, REJ);
		}
		else if(Type == DISC_RECEIVED) {
			llclose(linkLayer.fd);
			return num_chars_read;
		}
	} while(1);

	return -1;
}
示例#2
0
int llopen(int fd, int txrx) {
	printf("[LLOPEN] START\n");
	
	linkLayer.sequenceNumber = 0;
	
	if(txrx == TRANSMITTER) {
		
		int tmpvar;
		(void) signal(SIGALRM, atende);
		linkLayer.numTransmissions = 0;
		linkLayer.timeout = MAXT;
		printf("[llopen] Send SET\n");
		sendSupervisionFrame(fd, SET);
		alarm(linkLayer.timeout);
		printf("[llopen] EXPETING UA\n");	
		tmpvar = receiveframe(NULL,NULL);
		if( tmpvar != UA_RECEIVED ){
			printf("[LLOPEN - TRANSMITTER] NOT UA\n");
			return -1; //return error
		}
		else if(tmpvar == UA_RECEIVED) {
			printf("[LLOPEN - TRANSMITTER] UA RECEIVED\n");
			
			
			return fd; //retorn file ID
		}
		return -1;	
		
	}
	
	else if (txrx == RECEIVER) {
		
		printf("Waiting for SET\n");
		if(receiveframe(NULL,NULL) == SET_RECEIVED) printf("SET_RECEIVED");
	
		sendSupervisionFrame(fd,UA);
		printf("UA sent\n");
		
		return fd;
	}
	
	return 0;
}
示例#3
0
int llopen(char* port, int txrx) {

	int tmpvar;

	linkLayer.fd = config(port);
	linkLayer.State = txrx;
	linkLayer.numTransmissions = 0;
	linkLayer.timeout = MAXT;
	linkLayer.frame = (unsigned char*) malloc((2*MAX_SIZE)+6);
	linkLayer.alarm_char = SET;
	linkLayer.alarm_inf = FALSE;

	//printf("[RS-232] Port open - Starting");

	if(txrx == TRANSMITTER) {
		linkLayer.State = TRANSMITTER;
		(void) signal(SIGALRM, Timeout);

		sendSupervisionFrame(linkLayer.fd, SET);

		alarm(linkLayer.timeout);
		tmpvar = receiveframe(NULL,NULL);
		if( tmpvar != UA_RECEIVED )	return -1; //return error
		else if(tmpvar == UA_RECEIVED) {
			(void) signal(SIGALRM, SIG_IGN);
			return linkLayer.fd; //retorn file ID
		}
		return -1;

	}
	else if (txrx == RECEIVER) {
		linkLayer.State = RECEIVER;

		if(receiveframe(NULL,NULL) != SET_RECEIVED)	{
			return -1;
		}
		sendSupervisionFrame(linkLayer.fd,UA);
		return linkLayer.fd;
	}

	return 1;
}
示例#4
0
int llclose(int fd) {

	int tmp;
	(void) signal(SIGALRM, Timeout);
	linkLayer.alarm_char = DISC;

	if (linkLayer.State == TRANSMITTER) {
		sendSupervisionFrame(fd, DISC);
		alarm(linkLayer.timeout); //starting timout for DISC
		tmp = receiveframe(NULL,NULL); //waiting for DISC

		if (tmp == DISC_RECEIVED) {
			(void) signal(SIGALRM, SIG_IGN); //closing Timeout if received

			sendSupervisionFrame(fd, UA);
						sleep(1);
			close(fd);
			return 1;

		}
		else{
			return -1;
		}
	}
	else if (linkLayer.State == RECEIVER) {

		linkLayer.alarm_char = DISC;
		sendSupervisionFrame(fd, DISC);
		alarm(linkLayer.timeout); //starting timout for DISC
		tmp = receiveframe(NULL,NULL);

		if (tmp == UA_RECEIVED) {
			(void) signal(SIGALRM, SIG_IGN); //closing Timeout if received
			close(fd);
			return 1;
		}
		else return -1;
	}
	else return -1;
}
示例#5
0
int llread(int fd, char* buffer) {
	printf("[LLREAD] START\n");
	int num_chars_read = 0;

	int Type = receiveframe(buffer, &num_chars_read);

	if(Type == DATA_RECEIVED)	{
		printf("[LLREAD] END\n");
		return num_chars_read;
	}

	return -1;
}
示例#6
0
int write_frame(int fd, unsigned char* buffer, int length, int* i ,int remaning) {

	(void) signal(SIGALRM, Timeout); //

	//SENDING FRAME
	if(remaning == FALSE) {
		linkLayer.frameLength = MAX_SIZE;
		memcpy(linkLayer.frame, buffer + (*i * MAX_SIZE), MAX_SIZE); //to be used by the timeout
		sendInformationFrame(buffer + (*i * MAX_SIZE), MAX_SIZE);
	}
	else {
		linkLayer.frameLength = length;
		memcpy(linkLayer.frame, buffer + (*i * MAX_SIZE), length);
		sendInformationFrame(buffer + (*i * MAX_SIZE), length);
  }

	//after sending frame switch sequence Number


	alarm(linkLayer.timeout);
	int tmp = receiveframe(NULL,NULL);

	if(tmp != RR_RECEIVED) { //Bad RR being the oldest RR
		*i = *i - 1;
		(void) signal(SIGALRM, SIG_IGN);

		if( (tmp == BAD_RR_RECEIVED) || (tmp = BAD_REJ_RECEIVED)) rej_send_received++;
		else if(tmp == REJ_RECEIVED) rej_send_received++;
		else return -1;
	}
	else if(tmp == RR_RECEIVED){
		(void) signal(SIGALRM, SIG_IGN);
		linkLayer.sequenceNumber = linkLayer.sequenceNumber^1;
	}
	linkLayer.numTransmissions = 0;
}
示例#7
0
int llwrite(int fd, unsigned char* buffer, int length) {
    printf("[LLWRITE] START\n");
    
	linkLayer.timeout = 0;
	int CompleteFrames =  length / MAX_SIZE;
	int remainingBytes =  length % MAX_SIZE;
	int flag = 1;
	
	(void) signal(SIGALRM, atende);
	linkLayer.numTransmissions = 0;
	linkLayer.timeout = MAXT;
	
	int i;
	for(i = 0; i < CompleteFrames; i++){
	
		flag = 1;
		while(linkLayer.numTransmissions < MAXT && flag) {	
			printf("[LLWRITE] Frames = %d\n", i);
			
			if(alarm_flag){
				
				sendInformationFrame(buffer + (i * MAX_SIZE), MAX_SIZE);
				alarm(linkLayer.timeout);                 				// activa alarme de 3s
				alarm_flag=0;
			}
	
			if(receiveframe(NULL,NULL) != RR_RECEIVED) {
				 if(receiveframe(NULL,NULL) == REJ_RECEIVED) linkLayer.numTransmissions = 0;
				 else return -1;
			}
			else if(receiveframe(NULL,NULL) == RR_RECEIVED) flag =0;
			
		}
		
		
	}
	
	if(remainingBytes > 0){
		printf("[LLWRITE] START\n");
		flag = 1;
		while(linkLayer.numTransmissions < MAXT && flag) {	
		
			if(alarm_flag){
				
				sendInformationFrame(buffer + (i * MAX_SIZE), remainingBytes);
				alarm(linkLayer.timeout);                 				// activa alarme de 3s
				alarm_flag=0;
			}
	
			if(receiveframe(NULL,NULL) != RR_RECEIVED) {
				 if(receiveframe(NULL,NULL) == REJ_RECEIVED) linkLayer.numTransmissions = 0;
				 else return -1;
			}
			else if(receiveframe(NULL,NULL) == RR_RECEIVED) flag =0;
			
		}
		
	}
	printf("[LLWRITE] END\n");
	return 0;

}