// Comprueba los códigos de control de redundancia de las tramas de datos int validarCrc (char *trama, int *tam) { char tramaReducida[1500]; int checksum; int d, tamRed; char cceh, ccel; char hibyte, lobyte; // Almacenamos los CRC recibidos cceh = (char)trama[*tam-2]; ccel = (char)trama[*tam-1]; tamRed = *tam-7; // Montamos la trama de datos sin los caracteres de sincronismo for (d=0; d<tamRed ; d++) { tramaReducida[d] = trama[d+5]; } // Calculamos el Checksum checksum = icrc(0,(unsigned char *)tramaReducida, tamRed-1, 255, -1); hibyte = (char) HIBYTE(checksum); lobyte = (char)LOBYTE(checksum); // Comparamos los valores de los caracteres CRC if (cceh == hibyte && ccel == lobyte) return 0; // Éxito else return 1; }
/**@ingroup gen_crc * Adds a CRC to every received packet from each interface */ int work(void **inp, void **out) { int i; unsigned int n; input_t *input; if (poly_id) param_get_int(poly_id,&poly); if (long_crc_id) param_get_int(long_crc_id, &long_crc); for (i=0;i<NOF_INPUT_ITF;i++) { if (get_input_samples(i)) { moddebug("rcv_len=%d\n",get_input_samples(i)); memcpy(out[i],inp[i],sizeof(input_t)*get_input_samples(i)); input = out[i]; n = icrc(0, input, get_input_samples(i), long_crc, poly, mode == MODE_ADD); if (mode==MODE_CHECK) { if (n) { total_errors++; } total_pkts++; set_output_samples(i,get_input_samples(i)-long_crc); if (!print_nof_pkts) { tscnt++; if (tscnt==interval_ts) { tscnt=0; #ifdef PRINT_BLER printf("Total blocks: %d\tTotal errors: %d\tBLER=%g\n", total_pkts,total_errors,(float)total_errors/total_pkts); #endif } } else { print_nof_pkts_cnt++; if (print_nof_pkts_cnt == print_nof_pkts) { print_nof_pkts_cnt=0; printf("Total blocks: %d\tTotal errors: %d\tBLER=%g\n", total_pkts,total_errors,(float)total_errors/total_pkts); total_pkts=0; total_errors=0; } } } else { set_output_samples(i,get_input_samples(i)+long_crc); } } } return 0; }
// Función que genera una trama de datos (pasados por referencia) void tramaDatos(char *trama, int *tam, char *datos, int *tamDatos, char nSec){ char tramaReducida[1500]; int checksum; int i,j,d; char hibyte, lobyte; // Montamos la trama de datos sin los caracteres de sincronismo tramaReducida[0]=SOH; tramaReducida[1]=nSec; tramaReducida[2]=DLE; tramaReducida[3]=STX; for (i=4,j=0; j<*tamDatos; i++,j++) { tramaReducida[i] = datos[j]; if (datos[j] == DLE){ tramaReducida[i+1] = DLE; i++; } } *tam=i+2; tramaReducida[*tam-2] = DLE; tramaReducida[*tam-1] = ETX; // Calculamos el Checksum checksum = icrc(0,(unsigned char *)tramaReducida, *tam-1, 255, -1); // Calculamos los caracteres CRC *tam = *tam+2; tramaReducida[*tam-2] = (char)HIBYTE(checksum); // CCEH tramaReducida[*tam-1] = (char)LOBYTE(checksum); // CCEL // Generamos la trama de datos completa (con los CRC) trama[0]=DLE; trama[1]=SYN; trama[2]=DLE; trama[3]=SYN; trama[4]=DLE; for (d=0; d < *tam; d++) { trama[d+5] = tramaReducida[d]; } *tam = *tam+5; }
DWORD evaluateFrame(struct Frame *f) { int i; unsigned short crc; char head[5] = {DLE,SYN,DLE,SYN,DLE}; for(i=0;i<5;i++)//la cabecera sera siempre la misma para todos { if(f->body[i] != head[i]){return -1;} } if(f->body[i] == ENQ){f->type = enqFrame; return enqFrame;}//ENQ if(f->body[i] == ACK){f->type = ackFrame; return ackFrame;}//ACK if(f->body[i] == EOT){f->type = eotFrame; return eotFrame;}//EOT if(f->body[i] != SOH){return -1;};//SOH i++; if( (f->body[i] != '0' && f->body[i] != '1'))//numero de secuencia(es un caracter, hay que tratarlo como tal) { return -1; } else { if(f->body[i] == '0') { f->nSecuence = 0; } else { f->nSecuence = 1; } } i++; if(f->body[i] != DLE){return -1;};//DLE i++; if(f->body[i] == STX)//DATOS { i++; while(f->body[i] != DLE && f->body[i+1] != ETX) { // DLE dentro de data if(f->body[i] == DLE) { if(f->body[i+1] != DLE){return -1;} } i++; if(i == MTU){return -1;}//no llega nunca el ETX, la trama esta mal } if(f->body[i] != DLE){return -1;}//DLE i++; if(f->body[i] == ETX)//ETX { //CRC catchData(f); crc =icrc(0,(unsigned char *)f->data,strlen(f->data), 255, -1); if(LOBYTE(crc)!=(unsigned char)f->body[i+1]){return -1;} if(HIBYTE(crc) !=(unsigned char)f->body[i+2]){return -1;} f->type = dataFrame; return dataFrame; } } return -1; }
DWORD makeFrame(int type, unsigned char *data) { int ret,i,j,k; struct Frame *f; unsigned char *in_morse; unsigned short crc; //la cabecera sera igual para todos char head[5] = {DLE,SYN,DLE,SYN,DLE}; in_morse = (unsigned char*) malloc(sizeof(unsigned char)*8); f = (struct Frame*) malloc(sizeof(Frame)); f->length = 0; //ponemos la cabecera que sera igual para todos indistintamente for(i=0;i<5;i++) { f->body[i]= head[i]; f->length++; } switch(type)//dependiendo del tipo de trama... { case enqFrame://ENQ f->body[i] = ENQ; i++; f->length++; f->type = enqFrame; break; case ackFrame://ACK f->body[i] = ACK; i++; f->length++; f->type = ackFrame; break; case eotFrame://EOT f->body[i] = EOT; i++; f->length++; f->type = eotFrame; break; case dataFrame://DATA f->body[i] = SOH;//inicio cabecera de datos i++; f->length++; if(nSecuenceNext == 0)//numero de sencuencia { f->body[i] = '0'; } else { f->body[i] = '1'; } f->nSecuence = nSecuenceNext; i++; f->length++; f->body[i] = DLE;//DLE i++; f->length++; f->body[i] = STX;//inicio de datos i++; f->length++; for(j=0;j< strlen(data);j++)//datos de la trama { f->body[i] = data[j]; if(data[j] == DLE)//si aparece DLE en el texto, este mismo se duplica { f->body[i+1] = DLE; i++; f->length++; } i++; f->length++; } f->body[i] = DLE;//DLE anterior a ETX i++; f->length++; f->body[i] = ETX;//fin de datos i++; f->length++; //codigo de control de errores CRC strcat(data,"\0"); crc =icrc(0,(unsigned char *)data,strlen(data), 255, -1); f->body[i]=LOBYTE(crc); f->body[i+1]=HIBYTE(crc); f->length = f->length +2; f->type = dataFrame; break; case morseFrame: f->body[i] = SOH;//inicio cabecera de datos i++; f->length++; if(nSecuenceWait == 0)//numero de sencuencia { f->body[i] = '0'; } else { f->body[i] = '1'; } f->nSecuence = nSecuenceWait; i++; f->length++; f->body[i] = DLE;//DLE i++; f->length++; f->body[i] = STX;//inicio de datos i++; f->length++; //datos en morse for(j=0;j<(strlen(data));j++) { morse(data[j],in_morse);//llama la funcion que traduce a morse for(k=0;k<strlen(in_morse);k++) { f->body[i] = in_morse[k]; if(data[j] == DLE)//si aparece DLE en el texto, este mismo se duplica { f->body[i+1] = DLE; i++; f->length++; } i++; f->length++; } //caracter de separacion entre cada palabra de morse f->body[i] = '#'; i++; f->length++; } f->body[i] = DLE;//DLE anterior a ETX i++; f->length++; f->body[i] = ETX;//fin de datos i++; f->length++; //codigo de control de errores CRC catchData(f); crc =icrc(0,(unsigned char *)f->data,strlen(f->data), 255, -1); f->body[i]=LOBYTE(crc); f->body[i+1]=HIBYTE(crc); f->length = f->length +2; f->type = dataFrame; break; } //trama creada, procedemos a enviarla ret = sendFrame(*f); return ret;//devolvemos lo que nos devuelve la funcion de enviar la trama }