Beispiel #1
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;
}
Beispiel #2
0
void Timeout() {

	if(linkLayer.numTransmissions < MAXR-1){
		printf("[TIMEOUT] Timeout %d -> ", linkLayer.numTransmissions);
		if(!linkLayer.alarm_inf){
			printf("Sending Supervision Frame\n");
			if(!sendSupervisionFrame(linkLayer.fd, linkLayer.alarm_char)) exit(-1);
		}
		else if(linkLayer.alarm_inf) {
			printf("Sending Informacion Frame\n");
			if(!sendInformationFrame(linkLayer.frame, linkLayer.frameLength)) exit(-1);
		}
		else exit(-1);
		alarm(linkLayer.timeout);
	}
	else if (linkLayer.numTransmissions == MAXR-1) {
		printf("[TIMEOUT] Port closing, didn't get any response\n");
		close(linkLayer.fd);
		exit(-1);
	}
	linkLayer.numTransmissions++;
	timeout_time++; //for external variable
}
Beispiel #3
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;

}