Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
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");
}