int llread(int fd, char * buffer) { //printf("iniciar llread \n"); while(1) { info->frameTempLength = readFrame(info->frameTemp); char * type = NULL; type = verifyFrameType(info->frameTemp); if (type == "set") { buildFrame(info->flag, "ua"); transmitirFrame(info->frameSend, info->frameSendLength); continue; } else if (type == "I0" || type == "I1") { destuffing(info->frameTemp, &info->frameTempLength); //fprintf(stderr,"Destuffing "); /*int bb; for(bb = 0; bb < info->frameTempLength; bb++){ fprintf(stderr,"0x%x ", info->frameTemp[bb]); } fprintf(stderr,"\n");*/ if (verifyFrame(info->frameTemp, info->frameTempLength, type)) { if(type == "I0" && !info->sequenceNumber || type == "I1" && info->sequenceNumber) { //printf("recebeu a trama I correspondente aos sequenceNumber %d \n", info->sequenceNumber); char * typeRR = malloc(5); sprintf(typeRR, "rr%d", !info->sequenceNumber); //printf("criar frame de %s \n", typeRR); buildFrame(info->flag, typeRR); transmitirFrame(info->frameSend, info->frameSendLength); free(typeRR); info->sequenceNumber = !info->sequenceNumber; } else { char * typeRR = malloc(5); sprintf(typeRR, "rr%d", info->sequenceNumber); //printf("criar frame de %s \n", typeRR); buildFrame(info->flag, typeRR); transmitirFrame(info->frameSend, info->frameSendLength); free(typeRR); continue; } int j; //printf("frameTempLength: %d\n", info->frameTempLength); //printf("dados recebidos: "); for(j = 0; j < (info->frameTempLength-6); j++) { info->dados[j] = info->frameTemp[4+j]; //printf(" %x ", info->dados[j]); buffer[j] = info->dados[j]; //printf(" %x \n", info->dados[j]); } //printf("\n"); info->lengthDados = j; } else { char * typeREJ = malloc(5); sprintf(typeREJ, "rej%d", !info->sequenceNumber); //printf("criar frame de %s \n", typeREJ); buildFrame(info->flag, typeREJ); transmitirFrame(info->frameSend, info->frameSendLength); free(typeREJ); continue; } } break; } return 1; }
int llread(int fd, unsigned char** buffer) { int stuff_size; int pack_size; falhas = 0; while (1) { unsigned char *stuffed = malloc((PACK_SIZE + 4) * 2 + 2); alarm(timeoutTime); timeout = 0; stuff_size = 0; int start = 0; int stop = 0; while (timeout != 1 && !stop) { int r = read(fd, &stuffed[stuff_size], 1); if (r > 0) { if (stuff_size != 0 && stuffed[stuff_size] == F) stop = 1; else if (stuff_size == 0 && stuffed[0] == F) start = 1; if (start) stuff_size += r; } } if (timeout == 1) { timeout = 0; continue; } falhas = 0; alarm(0); unsigned char* frame; int frame_size = destuffing(stuffed, stuff_size, &frame); if (frame_size < 0) { //send_reject(fd); continue; } pack_size = infoStateMachine(frame, frame_size, buffer); if (pack_size < 0) { //send_reject(fd); continue; } if (pack_size >= 0) { unsigned char* rr; int missing; if (ns == 0) missing = create_control_frame(RR1, &rr); else missing = create_control_frame(RR0, &rr); int num = 0; while (missing > 0) { num = write(fd, rr, missing); rr += num; missing -= num; } break; } } if (ns == 0) ns = 1; else ns = 0; if (falhas < numRetransmissoes) return pack_size; return -1; }