int llwrite(int fd, char * buffer, int length) { comporTramaI(TRANSMITTER, buffer, length); stuffing(info->frameSend, &info->frameSendLength); //printf("partes: %x, %x, %x, %x, %x, %x, %x, %x, %x \n", tramaI[0],tramaI[1],tramaI[2],tramaI[3],tramaI[4],tramaI[5],tramaI[6],tramaI[7],tramaI[8]); transmitirFrame(info->frameSend, info->frameSendLength); //printf("enviar frame I com sequenceNumber = %d \n", info->sequenceNumber); info->tentativas = tentativas; while(info->tentativas > 0) { start_alarm(); info->frameTempLength = readFrame(info->frameTemp); if (info->sequenceNumber == 1) { if (verifyFrame(info->frameTemp, info->frameTempLength, "rr0")) { //printf("recebeu rr corretamente \n"); stop_alarm(); info->tentativas = tentativas; break; } else if (verifyFrame(info->frameTemp, info->frameTempLength, "rej0")) { //printf("recebeu rej0\n"); transmitirFrame(info->frameSend, info->frameSendLength); continue; } } else if (info->sequenceNumber == 0) { if (verifyFrame(info->frameTemp, info->frameTempLength, "rr1")) { //printf("recebeu rr corretamente \n"); stop_alarm(); info->tentativas = tentativas; break; } else if (verifyFrame(info->frameTemp, info->frameTempLength, "rej1")) { //printf("recebeu rej1\n"); transmitirFrame(info->frameSend, info->frameSendLength); continue; } } } if (info->tentativas == 0) { printf("Número de tentativas chegou ao fim. \n"); exit(-1); } info->sequenceNumber = !info->sequenceNumber; //printf("retornar llwrite\n"); return 1; }
int llwrite(int fd, unsigned char * buffer, int length) { unsigned char* stuffed; unsigned char* frame; int frame_size = create_info_frame(ns, buffer, length, &frame); stuffed = malloc(length * 2); int stuff_size = stuffing(frame, frame_size, &stuffed); falhas = 0; while (falhas < numRetransmissoes) { timeout = 0; int missing = stuff_size; int num = 0; while (missing > 0) { num = write(fd, stuffed, missing); if (textMode) printf("Wrote %d bytes\n", num); stuffed += num; missing -= num; } stuffed -= stuff_size; unsigned char* rr; if (ns == 0) create_control_frame(RR1, &rr); else create_control_frame(RR0, &rr); alarm(timeoutTime); if (controlStateMachine(fd, rr) == 0) break; } if (falhas >= numRetransmissoes) return -1; if (ns == 0) ns = 1; else ns = 0; return frame_size; }
void testStuffing() { char test1[6]; int i; test1[0] = 'A'; test1[1] = 'B'; test1[2] = LFC_FLAG; test1[3] = 0x7D; test1[4] = 'D'; test1[5] = '\0'; printf("Before stuffing:\n"); for(i = 0; i < strlen(test1); i++) { printf("%x\n", test1[i]); } char stuffed[8]; if(stuffing(test1, 6, stuffed)) printf("Stuffing completed!\n"); printf("After stuffing:\n"); for(i = 0; i < 8; i++) { printf("%x\n", stuffed[i]); } if(unstuffing(stuffed, 8, test1)) { printf("Unstuffing success!\n"); } for(i = 0; i < 6; i++) { printf("%x\n", test1[i]); } }