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; }
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; }