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; }
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 }
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; }