Commit d74c3a5f authored by garciay's avatar garciay
Browse files

Unify CAM/DENM codec code

parent 71e9a516
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -34,8 +34,9 @@ template<typename TPDU> class PERCodec : public ASN1Recode
public:
  virtual int encode(const TPDU& msg, BITSTRING& bits) = 0;
  virtual int decode(const BITSTRING& bits, TPDU& msg) = 0;
  
protected:
  int _decode (const TTCN_Typedescriptor_t& ttcn, const asn_TYPE_descriptor_s & td, const BITSTRING& p_data, TPDU& msg) {
  inline int _decode (const TTCN_Typedescriptor_t& ttcn, const asn_TYPE_descriptor_s & td, const BITSTRING& p_data, TPDU& msg) {
    TTCN_Buffer buf(bit2oct(p_data));
    TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_WARNING);
    int rc = per2ber (td, buf);
@@ -45,7 +46,7 @@ protected:
    }
    return rc;
  }
  int _encode (const TTCN_Typedescriptor_t& ttcn, const asn_TYPE_descriptor_s & td, const TPDU& msg, BITSTRING& p_data) {
  inline int _encode (const TTCN_Typedescriptor_t& ttcn, const asn_TYPE_descriptor_s & td, const TPDU& msg, BITSTRING& p_data) {
    int rc = -1;
    TTCN_Buffer buf;
    TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_WARNING);
@@ -53,7 +54,7 @@ protected:
    if (buf.get_len() > 0) {
      rc = ber2per (td, buf);
      if (rc > 0) {
        p_data = p_data + oct2bit(OCTETSTRING(buf.get_len(), buf.get_data()));
        p_data = oct2bit(OCTETSTRING(buf.get_len(), buf.get_data()));
      }
    }
    return rc;
+0 −80
Original line number Diff line number Diff line
@@ -42,83 +42,3 @@ int CAMPDUCodec::decode (const BITSTRING& p_data, CAM__PDU__Descriptions::CAM& p
{
  return _decode(CAM__PDU__Descriptions::CAM_descr_, asn_DEF_CAM, p_data, p_cam);
}
/*


extern "C" {
    extern asn_TYPE_descriptor_t asn_DEF_CAM;
    static int asn1c_collect_encoded_data(const void *buffer, size_t size, void *application_specific_key)
    {
      TTCN_Buffer * tb = (TTCN_Buffer *)application_specific_key;
      tb->put_s(size, (unsigned char *)buffer);
      return 0;
    }
}

int CAMPDUCodec::encode (const CAM__PDU__Descriptions::CAM& p_cam, BITSTRING& p_data)
{
  loggers::get_instance().log_msg(">>> CAMPDUCodec::encode: ", p_cam);
  
  int rc = -1;
  // Encode as BER
  // Encode message in BER (CER variant, but can be any)
  TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_WARNING);
  TTCN_Buffer buf;
  p_cam.encode(CAM__PDU__Descriptions::CAM_descr_, buf, TTCN_EncDec::CT_BER, BER_ENCODE_DER);
  loggers::get_instance().log_to_hexa("CAMPDUCodec::encode: BER encoding=", buf);

  // Decode BER
  void * ptr = NULL;
  asn_dec_rval_t rc_d;
  rc_d = asn_decode(NULL, ATS_BER, &asn_DEF_CAM, &ptr, buf.get_data(), buf.get_len());
  if(rc_d.code == RC_OK){
	// Encode as PER
    asn_enc_rval_t rc_e;
    buf.clear();
    rc_e = asn_encode(NULL, ATS_UNALIGNED_CANONICAL_PER, &asn_DEF_CAM, ptr,
			asn1c_collect_encoded_data, &buf);
    if(rc_e.encoded < 0) {
      loggers::get_instance().warning("CAMPDUCodec: PER encoding failed");
    }else{
      rc = rc_e.encoded * 8;
      p_data = p_data + oct2bit(OCTETSTRING(buf.get_len(), buf.get_data()));
    }
  } else {
    loggers::get_instance().warning("CAMPDUCodec: BER decoding failed");
  }
  if(ptr){
    ASN_STRUCT_FREE(asn_DEF_CAM, ptr);
  }
  return rc;
}

int CAMPDUCodec::decode (const BITSTRING& p_data, CAM__PDU__Descriptions::CAM& p_cam)
{
  loggers::get_instance().log(">>> CAMPDUCodec::decode");
  int rc = -1;
  void * ptr = NULL;
  // Decode UPER
  OCTETSTRING os = bit2oct(p_data);
  asn_dec_rval_t rc_d = asn_decode(NULL, ATS_UNALIGNED_BASIC_PER, &asn_DEF_CAM, &ptr, static_cast<const unsigned char*>(os), os.lengthof());
  if(rc_d.code == RC_OK) {
    // Encode BER
    TTCN_Buffer buf;
    asn_enc_rval_t rc_e = asn_encode(NULL, ATS_DER, &asn_DEF_CAM, ptr,
    		asn1c_collect_encoded_data, &buf);
    if (rc_e.encoded >= 0) {
      loggers::get_instance().log_to_hexa("CAMPDUCodec::decode: PER encoding=", buf);
      p_cam.decode(CAM__PDU__Descriptions::CAM_descr_, buf, TTCN_EncDec::CT_BER, BER_ACCEPT_ALL);
      rc = buf.get_len() * 8;
      loggers::get_instance().log("<<< CAMPDUCodec::decode: %d bits", rc);
    } else {
        loggers::get_instance().warning("CAMPDUCodec::decode: BER encoding failure");
    }
  } else {
    loggers::get_instance().warning("CAMPDUCodec::decode: PER");
  }
  if(ptr){
    ASN_STRUCT_FREE(asn_DEF_CAM, ptr);
  }
  return rc;
}
*/
 No newline at end of file
+4 −71
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ int DENMCodec::decode (const OCTETSTRING& p_data, DENM__PDU__Descriptions::DENM&
  
  int rc = asnCodec.decode(oct2bit(p_data), p_denm);
  if(rc > 0) {
    // TODO: fill other Indication fields
    loggers::get_instance().log_msg("DENMCodec::decode: ", p_denm);
  }
  
  loggers::get_instance().log("<<< DENMCodec::decode: %d", rc);
@@ -33,81 +33,14 @@ int DENMCodec::decode (const OCTETSTRING& p_data, DENM__PDU__Descriptions::DENM&

extern "C" {
  extern asn_TYPE_descriptor_t asn_DEF_DENM;
    static int asn1c_collect_encoded_data(const void *buffer, size_t size, void *application_specific_key)
    {
      TTCN_Buffer * tb = (TTCN_Buffer *)application_specific_key;
      tb->put_s(size, (unsigned char *)buffer);
      return 0;
    }
}

int DENMPDUCodec::encode (const DENM__PDU__Descriptions::DENM& p_denm, BITSTRING& p_data)
{
  loggers::get_instance().log_msg(">>> DENMPDUCodec::encode: ", p_denm);
  
  int rc = -1;
  TTCN_Buffer buf;

  // Encode as BER
  // Encode message in BER (CER variant, but can be any)
  TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_WARNING);
  p_denm.encode(DENM__PDU__Descriptions::DENM_descr_, buf, TTCN_EncDec::CT_BER, BER_ENCODE_DER);
  loggers::get_instance().log_to_hexa("DENMPDUCodec::encode: BER encoding=", buf);

  // Decode BER
  void *ptr = NULL;
  asn_dec_rval_t rc_d;
  rc_d = asn_decode(NULL, ATS_BER, &asn_DEF_DENM, &ptr, buf.get_data(), buf.get_len());
  if(rc_d.code == RC_OK){
	// Encode as PER
    asn_enc_rval_t rc_e;
    buf.clear();
    rc_e = asn_encode(NULL, ATS_UNALIGNED_CANONICAL_PER, &asn_DEF_DENM, ptr,
			asn1c_collect_encoded_data, &buf);
    if(rc_e.encoded >= 0) {
      rc = rc_e.encoded;
      p_data = p_data + oct2bit(OCTETSTRING(buf.get_len(), buf.get_data()));
    } else {
      if(rc_e.failed_type)
        loggers::get_instance().warning("DENMPDUCodec: PER encoding failed on %s", rc_e.failed_type->name);
      else
        loggers::get_instance().warning("DENMPDUCodec: PER encoding failed");
    }
  } else {
    loggers::get_instance().warning("DENMPDUCodec: BER decoding failed");
  }
  if(ptr){
    ASN_STRUCT_FREE(asn_DEF_DENM, ptr);
  }
  return rc;
  return _encode(DENM__PDU__Descriptions::DENM_descr_, asn_DEF_DENM, p_denm, p_data);
}

int DENMPDUCodec::decode (const BITSTRING& p_data, DENM__PDU__Descriptions::DENM& p_denm)
{
  loggers::get_instance().log(">>> DENMPDUCodec::decode");
  int rc = -1;
  void * ptr = NULL;
  // Decode UPER
  OCTETSTRING os = bit2oct(p_data);
  asn_dec_rval_t rc_d = asn_decode(NULL, ATS_UNALIGNED_BASIC_PER, &asn_DEF_DENM, &ptr, static_cast<const unsigned char*>(os), os.lengthof());
  if(rc_d.code == RC_OK) {
    // Encode BER
    TTCN_Buffer buf;
    asn_enc_rval_t rc_e;
    rc_e = asn_encode(NULL, ATS_DER, &asn_DEF_DENM, ptr, asn1c_collect_encoded_data, &buf);
    if (rc_e.encoded >= 0) {
      loggers::get_instance().log_to_hexa("DENMPDUCodec::decode: DER encoding=", buf);
      p_denm.decode(DENM__PDU__Descriptions::DENM_descr_, buf, TTCN_EncDec::CT_BER, BER_ACCEPT_ALL);
      rc = buf.get_len();
      loggers::get_instance().log("<<< DENMPDUCodec::decode: %d bits", rc);
    } else {
      loggers::get_instance().warning("DENMPDUCodec::decode: BER encoding failure");
    }
  } else {
    loggers::get_instance().warning("DENMPDUCodec::decode: PER decoding failed");
  }
  if(ptr){
    ASN_STRUCT_FREE(asn_DEF_DENM, ptr);
  }
  return rc;
  return _decode(DENM__PDU__Descriptions::DENM_descr_, asn_DEF_DENM, p_data, p_denm);
}