Esempio n. 1
0
int llwrite(int control, char * buf, int seqNum) {

	switch(control) {
		case 0:
			return send_rr(control,buf);
			break;

		case 1:
			return send_rr(control,buf);
			break;

		case 2:
			return prepare_inf(buf, seqNum);
			break;
	}
	return -1;
}
Esempio n. 2
0
int rec_data(int fd, unsigned char * buffer) {
	unsigned char addr = 0;
	unsigned char ctrl = 0;
	unsigned int dataCount = 0;
	unsigned char stuffed_buffer[MAX_SIZE];
	int i = START_FLAG;
	STOP = FALSE;
	
	while (STOP == FALSE) {
		unsigned char c = 0;
		//printf("start while \n");
		if (read(fd, &c, 1)) {
			//printf("received a: %x\n",c);
			switch (i) {
				case START_FLAG:
					//printf("start\n");
					if (c == FLAG)
						i = ADDR;
					break;
				case ADDR:
//printf("adr\n");
					if (c == ADDR_TRANS) {
						addr = c;
						i = CTRL;
					} else if (c != FLAG) {
						i = START_FLAG;
					}
					break;
				case CTRL:
					//printf("ctrl\n");
					if (c == NEXT_CTRL_INDEX(linklayer.sequenceNumber) || c == CTRL_DISC) {
						ctrl = c;
						i = BCC1;
					} else if (c == FLAG) {
						i = ADDR;
					} else {
						i = FLAG;
					}
					break;
				case BCC1:
					//printf("bcc1\n");
					;
					int headerErrorProb = rand() % 100;

					if (headerErrorProb < linklayer.her) {
						i = START_FLAG;
					} else {
						if (c == (addr ^ ctrl)) {
							i = DATA;
						} else if (c == FLAG) {
							i = ADDR;
						} else {
							i = START_FLAG;
						}
					}
					break;
				case DATA:
					//printf("data\n");
					if (c != FLAG) {

						stuffed_buffer[dataCount] = c;
//printf("stuffed: %x\n",stuffed_buffer[dataCount]);
						dataCount++;
					} else {
//printf("else\n");
						if (ctrl == CTRL_DISC) {
							printf("send disc\n");
							if (send_disc(fd, RECEIVER))
								return -1;
							printf("rec ua\n");
							if (rec_ua(fd, RECEIVER))
								return -1;

							linklayer.openLink = 0;
							return DISCONECTED;
						} else {
							//printf("else data lenght\n");
							unsigned int dataLength = 0;
							
							//printf("data count: %d",dataCount);
							if ((dataLength = byteDestuffing(stuffed_buffer, dataCount, buffer)) == -1)
								return -1;

							unsigned char bcc2_received = buffer[dataLength - 1];
							//printf("bcc2 received: %x\n", bcc2_received);
							unsigned char bcc2 = 0;
							//printf("bcc2\n");

							generate_bcc2(buffer, dataLength - 1, &bcc2);
							//printf("bcc generated: %x\n",bcc2);
							int frameErrorProb = rand() % 100;

							if (frameErrorProb < linklayer.fer) {
								printf("send rej\n");
								send_rej(fd);
								i = START_FLAG;
								dataCount = 0;
							} else {
								//printf("else bcc2\n");
								if (bcc2 == bcc2_received) {
									printf("same bcc2\n");
									if (ctrl != NEXT_CTRL_INDEX(linklayer.sequenceNumber)) {
										printf("send rr1\n");
										send_rr(fd);
										i = START_FLAG;
										dataCount = 0;
									} else {
										printf("send rr 2\n");
										linklayer.sequenceNumber = NEXT_INDEX(linklayer.sequenceNumber);
										send_rr(fd);

										return (dataLength - 1);
									}
								} else {
									printf("not the same bcc2\n");
									if (ctrl != NEXT_CTRL_INDEX(linklayer.sequenceNumber))
										send_rr(fd);
									else
										send_rej(fd);

									i = START_FLAG;
									dataCount = 0;
								}
							}
						}
					}
					break;
			}
		}
	}
	printf("return\n");
	return 0;
}