Commit af9c0dad authored by garciay's avatar garciay
Browse files

Review IVIM, MAPEM/SPATEM and SREM/SSEM

parent f7ca2771
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ void CAMLayer::receiveData(OCTETSTRING& data, Params& params)
  
  // Sanity check
  if (*(static_cast<const unsigned char*>(data)+ 1) != 0x02) { // Check that received packet has CA message id - See ETSI TS 102 894
    // Not a DENM message, discard it
    // Not a CAM message, discard it
    loggers::get_instance().warning("CAMLayer::receiveData: Wrong message id: 0x%02x", *(static_cast<const unsigned char*>(data)+ 1));
    return;
  }
+43 −0
Original line number Diff line number Diff line
#include "LibItsIvim_TestSystem.hh"
#include "IVIMCodec.hh"
#include "asn1/asn_application.h" // from asn1c
#include "loggers.hh"

int IVIMCodec::encode (const IVIM__PDU__Descriptions::IVIM& ivim, OCTETSTRING& data)
{
  loggers::get_instance().log(">>> IVIMCodec::encode");
  
  BITSTRING b;
  int rc = asnCodec.encode(ivim, b);
  if(rc){
    data = bit2oct(b);
    loggers::get_instance().log_msg("IVIMCodec::encode: ", data);
  }
  return rc;
}

int IVIMCodec::decode (const OCTETSTRING& data, IVIM__PDU__Descriptions::IVIM& ivim, Params* params)
{
  loggers::get_instance().log_msg(">>> IVIMCodec::decode: ", data);
  
  int rc = asnCodec.decode(oct2bit(data), ivim);
  loggers::get_instance().log("IVIMCodec::decode: ASN.1 codec returned %d", rc);
  if(rc) {
    loggers::get_instance().log_msg("IVIMCodec::decode: ", ivim);
  }
  return rc;
}

extern "C" {
  extern asn_TYPE_descriptor_t asn_DEF_IVIM;
}

int IVIMPDUCodec::encode (const IVIM__PDU__Descriptions::IVIM& p_ivim, BITSTRING& p_data)
{
  return _encode(IVIM__PDU__Descriptions::IVIM_descr_, asn_DEF_IVIM, p_ivim, p_data);
}

int IVIMPDUCodec::decode (const BITSTRING& p_data, IVIM__PDU__Descriptions::IVIM& p_ivim)
{
  return _decode(IVIM__PDU__Descriptions::IVIM_descr_, asn_DEF_IVIM, p_data, p_ivim);
}
+33 −0
Original line number Diff line number Diff line
#ifndef IVIMCODEC_H
#define IVIMCODEC_H

#include "Codec.hh"
#include "loggers.hh" // TODO To be removed
#include "Params.hh"

#include "LibItsIvim_TestSystem.hh"
//class BITSTRING;
//class OCTETSTRING;
//class IVIM__PDU__Descriptions::IVIM;

class IVIMPDUCodec : public PERCodec <IVIM__PDU__Descriptions::IVIM>
{
public:
  IVIMPDUCodec() { loggers::get_instance().log("IVIMPDUCodec::IVIMPDUCodec(D)"); };
  virtual int encode (const IVIM__PDU__Descriptions::IVIM& ivim, BITSTRING& data);
  virtual int decode (const BITSTRING& data, IVIM__PDU__Descriptions::IVIM&);
};

class IVIMCodec : public Codec<IVIM__PDU__Descriptions::IVIM, IVIM__PDU__Descriptions::IVIM>
{
  IVIMPDUCodec asnCodec;

public:
  IVIMCodec() : Codec<IVIM__PDU__Descriptions::IVIM, IVIM__PDU__Descriptions::IVIM>(), asnCodec() { loggers::get_instance().log("IVIMCodec::IVIMCodec(D)"); };
  virtual ~IVIMCodec() { loggers::get_instance().log("IVIMCodec::~IVIMCodec"); };

  virtual int encode (const IVIM__PDU__Descriptions::IVIM& ivim, OCTETSTRING& data);
  virtual int decode (const OCTETSTRING& data, IVIM__PDU__Descriptions::IVIM&, Params* params = NULL);
};

#endif
+126 −0
Original line number Diff line number Diff line
#include "IVIMLayerFactory.hh"

#include "IVIMTypes.hh"

#include "loggers.hh"

IVIMLayer::IVIMLayer(const std::string & p_type, const std::string & param) : TLayer<LibItsIvim__TestSystem::IvimPort>(p_type), _params(), _codec() {
  loggers::get_instance().log(">>> IVIMLayer::IVIMLayer: %s, %s", to_string().c_str(), param.c_str());
  // Setup parameters
  Params::convert(_params, param);
}

void IVIMLayer::sendMsg(const LibItsIvim__TestSystem::IvimReq& p, Params& params){
  loggers::get_instance().log_msg(">>> IVIMLayer::sendMsg: ", p);

  // Encode IVIM PDU
  OCTETSTRING data;
  if (_codec.encode(p.msgOut(), data) == -1) {
    loggers::get_instance().warning("IVIMLayer::sendMsg: Encodeing failure");
    return;
  }
  // Update parameters
  params.insert(std::pair<std::string, std::string>(
                                                    Params::packetize,
                                                    std::string("")
                                                   ));
  sendData(data, params);
}

void IVIMLayer::sendData(OCTETSTRING& data, Params& params) {
  loggers::get_instance().log_msg(">>> IVIMLayer::sendData: ", data);
  //params.log();
  sendToAllLayers(data, params);
}

void IVIMLayer::receiveData(OCTETSTRING& data, Params& params)
{
  loggers::get_instance().log_msg(">>> IVIMLayer::receiveData: ", data);
  
  // Sanity check
  if (*(static_cast<const unsigned char*>(data)+ 1) != 0x06) { // Check that received packet has IVI message id - See ETSI TS 102 894
    // Not a IVIM message, discard it
    loggers::get_instance().warning("IVIMLayer::receiveData: Wrong message id: 0x%02x", *(static_cast<const unsigned char*>(data)+ 1));
    return;
  }
  
  // Decode the payload
  LibItsIvim__TestSystem::IvimInd p;
  _codec.decode(data, p.msgIn());
  if (!p.msgIn().is_bound()) {
    // Discard it
    return;
  } // else, continue
  

  // Process lower layer data
  // gnNextHeader
  Params::const_iterator it = params.find(Params::gn_next_header);
  if (it != params.cend()) {
    p.gnNextHeader() = std::stoi(it->second);
  } else {
    p.gnNextHeader().set_to_omit();
  }
  // gnHeaderType
  it = params.find(Params::gn_header_type);
  if (it != params.cend()) {
    p.gnHeaderType() = std::stoi(it->second);
  } else {
    p.gnHeaderType().set_to_omit();
  }
  // gnHeaderSubtype
  it = params.find(Params::gn_header_sub_type);
  if (it != params.cend()) {
    p.gnHeaderSubtype() = std::stoi(it->second);
  } else {
    p.gnHeaderSubtype().set_to_omit();
  }
  // gnLifetime
  it = params.find(Params::gn_lifetime);
  if (it != params.cend()) {
    p.gnLifetime() = std::stoi(it->second);
  } else {
    p.gnLifetime().set_to_omit();
  }
  // gnTrafficClass
  it = params.find(Params::gn_traffic_class);
  if (it != params.cend()) {
    p.gnTrafficClass() = std::stoi(it->second);
  } else {
    p.gnTrafficClass().set_to_omit();
  }
  // btpDestinationPort
  it = params.find(Params::btp_destination_port);
  if (it != params.cend()) {
    p.btpDestinationPort() = std::stoi(it->second);
  } else {
    p.btpDestinationPort().set_to_omit();
  }
  // btpInfo
  it = params.find(Params::btp_info);
  if (it != params.cend()) {
    p.btpInfo() = std::stoi(it->second);
  } else {
    p.btpInfo().set_to_omit();
  }
  // ssp
  it = params.find(Params::ssp);
  if (it != params.cend()) {
    OCTETSTRING os(it->second.length(), (const unsigned char *)(it->second.c_str()));
    p.ssp() = oct2bit(os);
  } else {
    p.ssp().set_to_omit();
  }
  // its_aid
  it = params.find(Params::its_aid);
  if (it != params.cend()) {
    p.its__aid() = std::stoi(it->second);
  } else {
    p.its__aid().set_to_omit();
  }
  
  // Pass it to the ports if amy
  toAllUpperPorts(p, params);
}

IVIMLayerFactory IVIMLayerFactory::_f;
+35 −0
Original line number Diff line number Diff line
/*!
 * \file      IVIMLayer.hh
 * \brief     Header file for ITS IVIM protocol layer.
 * \author    ETSI STF525
 * \copyright ETSI Copyright Notification
 *            No part may be reproduced except as authorized by written permission.
 *            The copyright and the foregoing restriction extend to reproduction in all media.
 *            All rights reserved.
 * \version   0.1
 */
#pragma once

#include "TLayer.hh"
#include "IVIMCodec.hh"

namespace LibItsIvim__TestSystem {
  class IvimPort;
  class IvimReq;
  class IvimInd;
}

class IVIMLayer : public TLayer<LibItsIvim__TestSystem::IvimPort> {
  Params _params;
  IVIMCodec _codec;
public:
  IVIMLayer() : TLayer<LibItsIvim__TestSystem::IvimPort>(), _params(), _codec() {};
  IVIMLayer(const std::string& p_type, const std::string& param);
  virtual ~IVIMLayer() {};

  void sendMsg(const LibItsIvim__TestSystem::IvimReq&, Params& params);
    
  virtual void sendData(OCTETSTRING& data, Params& params);
  virtual void receiveData(OCTETSTRING& data, Params& info);
}; // End of class IVIMLayer
Loading