int sendInformationFrame(unsigned char * data, int length) { //verificacions if(data == NULL &&length <= 0) return -1; int C = (linkLayer.sequenceNumber << 6); //Comand is only sequence number on the 6 bit int BCC1 = (A ^ C); //BCC1 xor adress and Command int BCC2 = data[0]; //BCC2 xor data values unsigned int lengthAfterStuffing; int i; unsigned char* frame = malloc(length*2+6); unsigned char stuffed_data[(MAX_SIZE*2)]; unsigned char* tmpbuffer = malloc(length +1); if(tmpbuffer == NULL || frame == NULL) return ENOMEM; //memory error; for(i = 1; i < length; i++) BCC2 = ((BCC2 ^ data[i]) ^ errorchar()); memcpy(tmpbuffer, data, length); tmpbuffer[length] = BCC2; lengthAfterStuffing = byte_stuffing(tmpbuffer, stuffed_data, length+1); if(lengthAfterStuffing < length) return -1; //error in stuffing //Making Frame frame[0] = FLAG ^errorchar(); frame[1] = A ^errorchar(); frame[2] = C^errorchar(); frame[3] = BCC1^errorchar(); memcpy(frame+4, stuffed_data, lengthAfterStuffing); frame[4+lengthAfterStuffing] = FLAG^errorchar(); //End making frame transmited++; return (int) write(linkLayer.fd, frame, lengthAfterStuffing+5); // "+5" pois somamos 2FLAG,1BCC,1A,1C }
int sendInformationFrame(unsigned char * data, int length) { printf("[sendinf] START\n"); unsigned char stuffed_data[MAX_SIZE-6]; if(length > MAX_SIZE/2){ printf("That size is too big!"); return -1; } int C = linkLayer.sequenceNumber << 6; int BCC1 = A ^ C; int i; //Se não funcionar, tentar usar um buffer auxiliar para onde vai //a data antes de fazer estas operações //De forma a calcular BBC2 simplesmente fazemos o calculo do XOR //de cada byte de data com o proximo e desse resultado com o proximo. //O cálculo de BBC2 é realizado antes do byte stuffing int BCC2 = data[0]; for(i = 1; i < length; i++){ BCC2 = (BCC2 ^ data[i]); } unsigned int lengthAfterStuffing = byte_stuffing(data, stuffed_data, length); linkLayer.frame[0] = FLAG; linkLayer.frame[1] = A; linkLayer.frame[2] = C; linkLayer.frame[3] = BCC1; memcpy(linkLayer.frame+4, stuffed_data, lengthAfterStuffing); //Ou linkLayer.frame+4 linkLayer.frame[3+lengthAfterStuffing] = BCC2; linkLayer.frame[4+lengthAfterStuffing] = FLAG; return (int) write(linkLayer.fd, linkLayer.frame, lengthAfterStuffing+6); // "+6" pois somamos 2FLAG,2BCC,1A,1C printf("[sendinf] END\n"); }