コード例 #1
0
ファイル: linkLayer.c プロジェクト: SousaP/RCOM
/*
*@param Data to be sent
*@param Data size
*@param Frame to be created
*@ret int -> Total frame size
*/
int createInformationFrame(char* data, size_t dataSize, char* frame) {

	char* stuffInfo = (char*)malloc(sizeof(char)*MAX_FRAME_SIZE);

	frame[0] = FLAG; // estava F
	frame[1] = FRAME_A_T ;  // estava A
	frame[2] = FRAME_C_SET; // estava SETUP
	frame[3] = FRAME_A_T  ^ FRAME_C_SET;  // estava BCC1

	char BCC2 = data[0];

	int i;
	for(i = 0; i < dataSize; i++) {
		BCC2 ^= data[i];
	}

	int size = byteStuffing(data, dataSize, stuffInfo);

	memcpy(&frame[4], stuffInfo, size);

	frame[size + 4] = BCC2;
	frame[size + 5] = FLAG;

	return (size+6);
}
コード例 #2
0
ファイル: link.c プロジェクト: duartepbrandao/RCOM
int llwrite(int fd, unsigned char * buffer, unsigned int length) {
	if (linklayer.flag == RECEIVER) {
		printf("RECEIVER CANNOT WRITE TO SERIAL PORT\n");
		return -1;
	}

	if (!initialized) {
		printf("SERIAL PORT ISNT INITIALIZED\n");
		return -1;
	}
	unsigned char bcc2 = 0;
	generate_bcc2(buffer, length, &bcc2);

	unsigned char aux_buffer[MAX_SIZE] = "";
	memcpy(aux_buffer, buffer, length);
	printf("bcc2 wrote: %x\n",bcc2);
	aux_buffer[length] = bcc2;

	unsigned char * stuffed_buffer = malloc(MAX_SIZE);
	int stuffed_length = 0;

	if ((stuffed_length = byteStuffing(aux_buffer, length+1, stuffed_buffer)) == -1) {
		printf("BYTE STUFFING ERROR\n");
		return -1;
	}
	int nbytes = 0;
	printf("sending data!\n");
	nbytes = send_data(fd, stuffed_buffer, stuffed_length);
	printf("wrote: %d bytes",nbytes);
	if (rec_resp_receiver(fd, stuffed_buffer, stuffed_length, bcc2) == -1) {
		printf("\n");
		return -1;
	}

	free(stuffed_buffer);
	linklayer.sequenceNumber = NEXT_INDEX(linklayer.sequenceNumber);

	return nbytes;
}
コード例 #3
0
ファイル: linklayer.c プロジェクト: jrfcabral/rcom
int llwrite(int fd, unsigned char* buffer, int length){

//printf("entrei no llwrite\n");
	char *bufferStuffed;
	char header[] = { FLAG, 0x03, I(ll.sequenceNumber), header[1]^header[2] };
	char dataBCC = generateBCC((char*)buffer, length);
	char* toStuff = malloc(length+1);
	memcpy(toStuff, buffer, length);
	toStuff[length] = dataBCC;


	int n= byteStuffing(toStuff,  length+1, &bufferStuffed);

	//int k;
	//puts("");
	//for (k=0;k<n;k++){
		//printf("\n%d\n", bufferStuffed[k]);
	//}
	//	puts("");
	char* message = (char*)  malloc(n+6);

	memcpy(message, header, 4);
	memcpy(message+4, bufferStuffed, n);
	message[n+4] = FLAG;
	int wrote = 0;
	while(!wrote)
		wrote = write(fd, message, n+5);
	stats.dataFramesTransmitted++;



//puts("message sent\n");

	free(message);
	free(bufferStuffed);
	alarm(ll.timeOut);
	
	Command command = receiveCommand(fd);
	
	//was asked for new frame
	if (command.command == RR(!ll.sequenceNumber)){
		ll.sequenceNumber = (!ll.sequenceNumber);
		retries = 0;
	//puts("fui confirmado");
		alarm(0);
		return length;
	}
	//frame was rejected, resend
	if (command.command == REJ(ll.sequenceNumber) || (command.command == NONE && ll.numTransmissions > retries)){
		if (command.command == NONE){
			
			stats.timeouts++;
			//printf("\nNumber of retries: %d\n", retries);
			alarm(0);
		}
		//puts("byte was rejected,resending or no response\n");
		stats.rejs++;
		return llwrite(fd, buffer, length);
	}
	else{
		//puts("eu esperei mas o reader nao me quis responder :(");
		return -1;
	}

	return length;
}