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