Beispiel #1
0
// 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;    
}
Beispiel #2
0
/**@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;
}
Beispiel #3
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;

}
Beispiel #4
0
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;      
}
Beispiel #5
0
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          
}