/* *@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); }
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; }
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; }