Commit c4428ffa authored by Yann Garcia's avatar Yann Garcia
Browse files

Staring AtsPIM implementation; Editorial changes in AtsAVM; Rename AtsPI and AtsSA

parent 5a59d345
Loading
Loading
Loading
Loading
+255 −0
Original line number Original line Diff line number Diff line
#include <memory>

#include "LibItsPim_EncdecDeclarations.hh"

#include "pim_codec.hh"
#include "loggers.hh"
#include "uppertester_pim_codec.hh"

namespace LibItsPim__EncdecDeclarations {

  /****************************************************
   * @desc    External function to encode a PimReq type
   * @param   value to encode
   * @return  encoded value
   ****************************************************/
  BITSTRING fx__enc__PimReq(const LibItsPim__TypesAndValues::PimReq &p_pimReq) {
    loggers::get_instance().log_msg(">>> fx__enc__PimReq: ", p_pimReq);

    pim_codec   codec;
    OCTETSTRING os;
    if (codec.encode(p_pimReq.msgOut(), os) == -1) {
      loggers::get_instance().warning("fx__enc__PimReq: -1 result code was returned");
      return int2bit(0, 1);
    }

    return oct2bit(os);
  }

  /****************************************************
   * @desc    External function to decode a PimReq type
   * @param   value to encode
   * @return  encoded value
   ****************************************************/
  INTEGER fx__dec__PimReq(BITSTRING &b, LibItsPim__TypesAndValues::PimReq &p) {
    loggers::get_instance().log(">>> fx__dec__PimReq");

    // Sanity check
    if (b.lengthof() == 0) {
      return -1;
    }

    pim_codec                   codec;
    MIM__PDU__Descriptions::MIM pim;
    OCTETSTRING                 is = bit2oct(b);

    if (codec.decode(is, pim) == -1) {
      loggers::get_instance().warning("fx__dec__MvmReq: -1 result code was returned");
      return -1;
    }
    p.msgOut() = pim;

    return 0;
  }

  INTEGER fx__dec__PimInd(BITSTRING &b, LibItsPim__TypesAndValues::PimInd &p_pimInd) {
    loggers::get_instance().log(">>> fx__dec__PimInd");

    // Sanity check
    if (b.lengthof() == 0) {
      return -1;
    }

    codec                       codec;
    PIM__PDU__Descriptions::PIM pim;
    OCTETSTRING                 is = bit2oct(b);

    // Calculate the size of the lower layers information
    int s = (LibItsPim__TypesAndValues::PimInd_gnNextHeader_raw_.fieldlength + LibItsPim__TypesAndValues::PimInd_gnHeaderType_raw_.fieldlength +
             LibItsPim__TypesAndValues::PimInd_gnHeaderSubtype_raw_.fieldlength + LibItsPim__TypesAndValues::PimInd_gnLifetime_raw_.fieldlength +
             LibItsPim__TypesAndValues::PimInd_gnTrafficClass_raw_.fieldlength + LibItsPim__TypesAndValues::PimInd_btpDestinationPort_raw_.fieldlength +
             LibItsPim__TypesAndValues::PimInd_btpInfo_raw_.fieldlength + LibItsPim__TypesAndValues::PimInd_ssp_raw_.fieldlength +
             LibItsPim__TypesAndValues::PimInd_its__aid_raw_.fieldlength) /
            8;
    // Decode MV message
    if (codec.decode(OCTETSTRING(is.lengthof() - s, static_cast<const uint8_t *>(is)), pim) == -1) {
      loggers::get_instance().warning("fx__dec__PimInd: -1 result code was returned");
      return -1;
    }
    p_pimInd.msgIn() = pim;
    // Decode lower layer data
    TTCN_Buffer decoding_buffer(OCTETSTRING(s, static_cast<const uint8_t *>(is) + is.lengthof() - s));
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // gnNextHeader
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_gnNextHeader_raw_.fieldlength / 8)) {
      p_pimInd.gnNextHeader().set_to_omit();
    } else {
      OCTETSTRING os;
      os.decode(LibItsPim__TypesAndValues::PimInd_gnNextHeader_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.gnNextHeader() = oct2int(os);
    }
    loggers::get_instance().log_msg("fx__dec_MIM: gnNextHeader=", p_pimInd.gnNextHeader());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // gnHeaderType
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_gnHeaderType_raw_.fieldlength / 8)) {
      p_pimInd.gnHeaderType().set_to_omit();
    } else {
      OCTETSTRING os;
      os.decode(LibItsPim__TypesAndValues::PimInd_gnHeaderType_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.gnHeaderType() = oct2int(os);
    }
    loggers::get_instance().log_msg("fx__dec_MIM: gnHeaderType=", p_pimInd.gnHeaderType());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // gnHeaderSubtype
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_gnHeaderSubtype_raw_.fieldlength / 8)) {
      p_pimInd.gnHeaderSubtype().set_to_omit();
    } else {
      OCTETSTRING os;
      os.decode(LibItsPim__TypesAndValues::PimInd_gnHeaderSubtype_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.gnHeaderSubtype() = oct2int(os);
    }
    loggers::get_instance().log_msg("fx__dec_MIM: gnHeaderSubtype=", p_pimInd.gnHeaderSubtype());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // gnLifetime
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_gnLifetime_raw_.fieldlength / 8)) {
      p_pimInd.gnLifetime().set_to_omit();
    } else {
      INTEGER i;
      i.decode(LibItsPim__TypesAndValues::PimInd_gnLifetime_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.gnLifetime() = i;
    }
    loggers::get_instance().log_msg("fx__dec_MIM: gnLifetime=", p_pimInd.gnLifetime());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // gnTrafficClass
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_gnTrafficClass_raw_.fieldlength / 8)) {
      p_pimInd.gnTrafficClass().set_to_omit();
    } else {
      OCTETSTRING os;
      os.decode(LibItsPim__TypesAndValues::PimInd_gnTrafficClass_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.gnTrafficClass() = oct2int(os);
    }
    loggers::get_instance().log_msg("fx__dec_MIM: gnTrafficClass=", p_pimInd.gnTrafficClass());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // btpDestinationPort
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_btpDestinationPort_raw_.fieldlength / 8)) {
      p_pimInd.btpDestinationPort().set_to_omit();
    } else {
      INTEGER i;
      i.decode(LibItsPim__TypesAndValues::PimInd_btpDestinationPort_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.btpDestinationPort() = i;
    }
    loggers::get_instance().log_msg("fx__dec_MIM: btpDestinationPort=", p_pimInd.btpDestinationPort());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // btpInfo
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_btpInfo_raw_.fieldlength / 8)) {
      p_pimInd.btpInfo().set_to_omit();
    } else {
      INTEGER i;
      i.decode(LibItsPim__TypesAndValues::PimInd_btpInfo_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.btpInfo() = i;
    }
    loggers::get_instance().log_msg("fx__dec_MIM: btpInfo=", p_pimInd.btpInfo());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // ssp
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_ssp_raw_.fieldlength / 8)) {
      p_pimInd.ssp().set_to_omit();
    } else {
      BITSTRING bs;
      bs.decode(LibItsPim__TypesAndValues::PimInd_ssp_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.ssp() = bs;
    }
    loggers::get_instance().log_msg("fx__dec_MIM: ssp=", p_pimInd.ssp());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);
    // its__aid
    if (decoding_buffer.get_read_len() < static_cast<size_t>(LibItsPim__TypesAndValues::PimInd_its__aid_raw_.fieldlength / 8)) {
      p_pimInd.its__aid().set_to_omit();
    } else {
      INTEGER i;
      i.decode(LibItsPim__TypesAndValues::PimInd_its__aid_descr_, decoding_buffer, TTCN_EncDec::CT_RAW);
      p_pimInd.its__aid() = i;
    }
    loggers::get_instance().log_msg("fx__dec_MIM: its_aid=", p_pimInd.its__aid());
    loggers::get_instance().log_to_hexa("fx__dec_MIM: ", decoding_buffer);

    return 0;
  }

  BITSTRING fx__enc__MIM(const MIM__PDU__Descriptions::MIM &p_cam) {
    loggers::get_instance().log_msg(">>> fx__enc__MIM: ", p_cam);

    pim_codec   codec;
    OCTETSTRING os;
    codec.encode(p_cam, os);
    return oct2bit(os);
  }

  INTEGER fx__dec__MIM(BITSTRING &b, MIM__PDU__Descriptions::MIM &p) {
    loggers::get_instance().log(">>> fx__dec__MIM");
    codec       codec;
    OCTETSTRING is = bit2oct(b);

    if (codec.decode(OCTETSTRING(is.lengthof(), static_cast<const uint8_t *>(is)), p) == -1) {
      loggers::get_instance().warning("fx__dec__MIM: -1 result code was returned");
      return -1;
    }

    return 0;
  }

  BITSTRING fx__enc__UtPimInitialize(const LibItsPim__TypesAndValues::UtPimInitialize &p_utPimInitialize) {
    loggers::get_instance().log_msg(">>> fx__enc__UtPimInitialize: ", p_utPimInitialize);

    uppertester_pim_codec codec;
    OCTETSTRING           os;
    codec.encode(p_utPimInitialize, os);
    return oct2bit(os);
  }

  BITSTRING fx__enc__UtPimTrigger(const LibItsPim__TypesAndValues::UtPimTrigger &p_utPimTrigger) {
    loggers::get_instance().log_msg(">>> fx__enc__UtPimTrigger: ", p_utPimTrigger);

    uppertester_pim_codec codec;
    OCTETSTRING           os;
    codec.encode(p_utPimTrigger, os);
    return oct2bit(os);
  }

  /****************************************************
   * @desc    External function to decode a UtPimResults type
   * @param   value to encode
   * @return  encoded value
   ****************************************************/
  INTEGER fx__dec__UtPimResults(BITSTRING &b, LibItsPim__TypesAndValues::UtPimResults &p) {
    loggers::get_instance().log(">>> fx__dec__UtPimResults");

    uppertester_pim_codec      codec;
    OCTETSTRING                is  = bit2oct(b);
    std::unique_ptr<Base_Type> ptr = codec.decode(is);
    if (ptr == nullptr) {
      loggers::get_instance().warning("fx__dec__UtPimResults: -1 result code was returned");
      return -1;
    }
    p = static_cast<LibItsPim__TypesAndValues::UtPimResults &>(*ptr);
    return 0;
  }

  /****************************************************
   * @desc    External function to decode a UtPimEventInd type
   * @param   value to encode
   * @return  encoded value
   ****************************************************/
  INTEGER fx__dec__UtPimEventInd(BITSTRING &b, LibItsPim__TypesAndValues::UtPimEventInd &p) {
    loggers::get_instance().log(">>> fx__dec__UtPimEventInd");

    uppertester_pim_codec      codec;
    OCTETSTRING                is  = bit2oct(b);
    std::unique_ptr<Base_Type> ptr = codec.decode(is);
    if (ptr == nullptr) {
      loggers::get_instance().warning("fx__dec__UtPimEventInd: -1 result code was returned");
      return -1;
    }
    p = static_cast<LibItsPim__TypesAndValues::UtPimEventInd &>(*ptr);
    return 0;
  }

} // namespace LibItsPim__EncdecDeclarations
+5 −0
Original line number Original line Diff line number Diff line
@@ -82,3 +82,8 @@ sources += LibItsAvm_Encdec.cc \
           LibItsBtp_Encdec.cc
           LibItsBtp_Encdec.cc
endif
endif


ifeq (AtsPIM, $(ATS))
sources += LibItsPim_Encdec.cc \
           LibItsBtp_Encdec.cc
endif
+3 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,9 @@ ifeq (AtsAVM, $(ATS))
sources +=  LibItsSecurity_externals.cc
sources +=  LibItsSecurity_externals.cc
endif
endif


ifeq (AtsPIM, $(ATS))
sources +=  LibItsSecurity_externals.cc
endif


ifeq (AtsRSUsSimulator, $(ATS))
ifeq (AtsRSUsSimulator, $(ATS))
sources += LibItsPki_externals.cc LibItsSecurity_externals.cc AtsRSUsSimulator_externals.cc
sources += LibItsPki_externals.cc LibItsSecurity_externals.cc AtsRSUsSimulator_externals.cc
+70 −0
Original line number Original line Diff line number Diff line
#include <TTCN3.hh>

#include "loggers.hh"
#include "registration.hh"

#include "AdapterControlPort_PIM.hh"
#include "pim_layer.hh"

//=============================================================================
namespace LibItsPim__TestSystem {

  AdapterControlPort::AdapterControlPort(const char *par_port_name) : AdapterControlPort_BASE(par_port_name) {}

  AdapterControlPort::~AdapterControlPort() {}

  void AdapterControlPort::set_parameter(const char * /*parameter_name*/, const char * /*parameter_value*/) {}

  /*void AdapterControlPort::Handle_Fd_Event(int fd, boolean is_readable,
          boolean is_writable, boolean is_error) {}*/

  void AdapterControlPort::Handle_Fd_Event_Error(int /*fd*/) {}

  void AdapterControlPort::Handle_Fd_Event_Writable(int /*fd*/) {}

  void AdapterControlPort::Handle_Fd_Event_Readable(int /*fd*/) {}

  /*void AdapterControlPort::Handle_Timeout(double time_since_last_call) {}*/

  void AdapterControlPort::user_map(const char * /*system_port*/) {}

  void AdapterControlPort::user_unmap(const char * /*system_port*/) {}

  void AdapterControlPort::user_start() {}

  void AdapterControlPort::user_stop() {}

  void AdapterControlPort::outgoing_send(const LibItsCommon__TypesAndValues::AcGnssPrimitive & /*send_par*/) {}

  void AdapterControlPort::outgoing_send(const LibItsCommon__TypesAndValues::AcSecPrimitive &send_par) {
    loggers::get_instance().log_msg(">>> AdapterControlPort::outgoing_send: ", send_par);

    // Register this object for AdapterControlPort
    pim_layer *p = registration<pim_layer>::get_instance().get_item(std::string("PIM"));
    if (p != NULL) {
      loggers::get_instance().log("AdapterControlPort::outgoing_send: Got PIM layer %p", p);
      LibItsCommon__TypesAndValues::AdapterControlResults response;
      response.acSecResponse() = BOOLEAN(true);
      if (send_par.ischosen(LibItsCommon__TypesAndValues::AcSecPrimitive::ALT_acEnableSecurity)) {
        loggers::get_instance().log("AdapterControlPort::outgoing_send: Enable secured mode");
        std::string str(static_cast<const char *>(send_par.acEnableSecurity().certificateId()));
        if (p->enable_secured_mode(str, send_par.acEnableSecurity().enforceSecurity()) == -1) {
          response.acSecResponse() = BOOLEAN(false);
        }
      } else if (send_par.ischosen(LibItsCommon__TypesAndValues::AcSecPrimitive::ALT_acDisableSecurity)) {
        loggers::get_instance().log("AdapterControlPort::outgoing_send: Disable secured mode");
        if (p->disable_secured_mode() == -1) {
          response.acSecResponse() = BOOLEAN(false);
        }
      } else {
        response.acSecResponse() = BOOLEAN(false);
      }
      // Send response
      loggers::get_instance().log_msg("AdapterControlPort::outgoing_send: Send response: ", response);
      incoming_message(response);
    } else {
      loggers::get_instance().error("AdapterControlPort::outgoing_send: PIM not registered");
    }
  }

} // namespace LibItsPim__TestSystem
+36 −0
Original line number Original line Diff line number Diff line
#ifndef AdapterControlPort_PIM_HH
#define AdapterControlPort_PIM_HH
//=============================================================================
#include "LibItsPim_TestSystem.hh"

namespace LibItsPim__TestSystem {

  class AdapterControlPort : public AdapterControlPort_BASE {
  public:
    AdapterControlPort(const char *par_port_name = NULL);
    ~AdapterControlPort();

    void set_parameter(const char *parameter_name, const char *parameter_value);

  private:
    /* void Handle_Fd_Event(int fd, boolean is_readable,
            boolean is_writable, boolean is_error); */
    void Handle_Fd_Event_Error(int fd);
    void Handle_Fd_Event_Writable(int fd);
    void Handle_Fd_Event_Readable(int fd);
    /* void Handle_Timeout(double time_since_last_call); */
  protected:
    void user_map(const char *system_port);
    void user_unmap(const char *system_port);

    void user_start();
    void user_stop();

    void outgoing_send(const LibItsCommon__TypesAndValues::AcGnssPrimitive &send_par);

    void outgoing_send(const LibItsCommon__TypesAndValues::AcSecPrimitive &send_par);
  };

} // namespace LibItsPim__TestSystem

#endif
Loading