Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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]);
    }

}