Commit 5358032d authored by YannGarcia's avatar YannGarcia
Browse files

Add changes due to CV2X#1 Plugtest

parent 0d89f1d1
Loading
Loading
Loading
Loading
+53 −47
Original line number Original line Diff line number Diff line
@@ -8,7 +8,7 @@


#include "converter.hh"
#include "converter.hh"


unsigned char commsignia_layer::_fixed_header[10] = { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0D };
unsigned char commsignia_layer::_g5_fixed_header[10] = { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0D };


commsignia_layer::commsignia_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params(), _mac_src(), _eth_type() {
commsignia_layer::commsignia_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params(), _mac_src(), _eth_type() {
  loggers::get_instance().log(">>> commsignia_layer::commsignia_layer: %s, %s", to_string().c_str(), param.c_str());
  loggers::get_instance().log(">>> commsignia_layer::commsignia_layer: %s, %s", to_string().c_str(), param.c_str());
@@ -45,13 +45,19 @@ commsignia_layer::commsignia_layer(const std::string & p_type, const std::string
  if (it == _params.cend()) {
  if (it == _params.cend()) {
    _params.insert(std::pair<std::string, std::string>(std::string("use_vpn"), "0"));
    _params.insert(std::pair<std::string, std::string>(std::string("use_vpn"), "0"));
  }
  }
  it = _params.find(std::string("xport_mode"));
  if (it == _params.cend()) {
    _params.insert(std::pair<std::string, std::string>(std::string("xport_mode"), "G5"));
  }
  //_params.log();
  //_params.log();
}
}


void commsignia_layer::send_data(OCTETSTRING& data, params& params) {
void commsignia_layer::send_data(OCTETSTRING& data, params& params) {
  loggers::get_instance().log_msg(">>> commsignia_layer::send_data: ", data);
  loggers::get_instance().log_msg(">>> commsignia_layer::send_data: ", data);


  OCTETSTRING buffer(10, commsignia_layer::_fixed_header);
  OCTETSTRING buffer = OCTETSTRING(0, nullptr);
  if (_params[std::string("xport_mode")].compare("G5") == 0) {
    buffer = OCTETSTRING(10, commsignia_layer::_g5_fixed_header);
    if (_params[std::string("use_vpn")].compare("1") == 0) {
    if (_params[std::string("use_vpn")].compare("1") == 0) {
      buffer += int2oct(1, 1); // Injection to software
      buffer += int2oct(1, 1); // Injection to software
    } else {
    } else {
@@ -96,6 +102,7 @@ void commsignia_layer::send_data(OCTETSTRING& data, params& params) {
    loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Fixed=", buffer);
    loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Fixed=", buffer);
    buffer += int2oct(data.lengthof(), 2); // Data length
    buffer += int2oct(data.lengthof(), 2); // Data length
    loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Data length=", buffer);
    loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Data length=", buffer);
  } // else, LTE-V2X, injection buffer = GN+BTP+CAM/DENM only
  buffer += data; // Payload
  buffer += data; // Payload
  
  
  loggers::get_instance().log_msg("commsignia_layer::send_data: Final buffer=", buffer);
  loggers::get_instance().log_msg("commsignia_layer::send_data: Final buffer=", buffer);
@@ -188,6 +195,8 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
  memcpy((void*)&h.fragment_seq_num, (unsigned short*)p, sizeof(unsigned short)); p += sizeof(unsigned short);
  memcpy((void*)&h.fragment_seq_num, (unsigned short*)p, sizeof(unsigned short)); p += sizeof(unsigned short);
  loggers::get_instance().log("commsignia_layer::receive_data: fragment_seq_num=%04x", h.fragment_seq_num);
  loggers::get_instance().log("commsignia_layer::receive_data: fragment_seq_num=%04x", h.fragment_seq_num);
  
  
  OCTETSTRING bid = OCTETSTRING(6, (const unsigned char*)&h.bss_id); // TODO To be removed
  loggers::get_instance().log_msg("commsignia_layer::receive_data: bss_id: ", bid);
  OCTETSTRING dst = OCTETSTRING(6, (const unsigned char*)&h.dst_addr);
  OCTETSTRING dst = OCTETSTRING(6, (const unsigned char*)&h.dst_addr);
  loggers::get_instance().log_msg("commsignia_layer::receive_data: dst: ", dst);
  loggers::get_instance().log_msg("commsignia_layer::receive_data: dst: ", dst);
  OCTETSTRING src = OCTETSTRING(6, (const unsigned char*)&h.src_addr);
  OCTETSTRING src = OCTETSTRING(6, (const unsigned char*)&h.src_addr);
@@ -199,9 +208,9 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
    loggers::get_instance().warning("commsignia_layer::receive_data: Discard packet due to wrong comparison");
    loggers::get_instance().warning("commsignia_layer::receive_data: Discard packet due to wrong comparison");
    //TODO return;
    //TODO return;
  } // else, continue
  } // else, continue
  const commsignia_layer::c2p_llc_hdr* l;
  int length;
  int length;
  if (c2p_ver == 0x11) {
  if (c2p_ver == 0x11) {
    const commsignia_layer::c2p_llc_hdr* l;
    if ((ntohs(h.frame_ctrl) & 0xf000) == 0x8000) {
    if ((ntohs(h.frame_ctrl) & 0xf000) == 0x8000) {
      l = (const commsignia_layer::c2p_llc_hdr*)(static_cast<const unsigned char *>(data) + sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_qos_ctrl));
      l = (const commsignia_layer::c2p_llc_hdr*)(static_cast<const unsigned char *>(data) + sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_qos_ctrl));
      length = sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_qos_ctrl) + sizeof(commsignia_layer::c2p_llc_hdr);
      length = sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_qos_ctrl) + sizeof(commsignia_layer::c2p_llc_hdr);
@@ -209,11 +218,8 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
      l = (const commsignia_layer::c2p_llc_hdr*)(p + sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr));
      l = (const commsignia_layer::c2p_llc_hdr*)(p + sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr));
      length = sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_llc_hdr);
      length = sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_llc_hdr);
    }
    }
    loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap);
  } else { // LTE-V2X
    loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap);
    length = sizeof(commsignia_layer::c2p_s_v1_rx_cv2x_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + 10/*Fixed size*/;
    loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ctrl);
    loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type);
  } else {
  }
  }
  
  
  // Check ether type
  // Check ether type
+2 −1
Original line number Original line Diff line number Diff line
@@ -113,7 +113,8 @@ class commsignia_layer : public layer {
  std::vector<unsigned char> _eth_type; //! Used to optimize filtering on ethernet type in \see commsignia_layer::receive_data method
  std::vector<unsigned char> _eth_type; //! Used to optimize filtering on ethernet type in \see commsignia_layer::receive_data method


  //! Fixed header for packet injection
  //! Fixed header for packet injection
  static unsigned char _fixed_header[10];
  static unsigned char _g5_fixed_header[10];
  static unsigned char _cv2x_fixed_header[10];
  
  
public:
public:
  //! \publicsection
  //! \publicsection
+39 −0
Original line number Original line Diff line number Diff line
#include <algorithm>
#include <cctype>
#include <arpa/inet.h>

#include "qualcomm_layer_factory.hh"

#include "loggers.hh"

#include "converter.hh"

qualcomm_layer::qualcomm_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params() {
  loggers::get_instance().log(">>> qualcomm_layer::qualcomm_layer: %s, %s", to_string().c_str(), param.c_str());
  
  // Setup parameters
  params::convert(_params, param);
  //_params.log();
}

void qualcomm_layer::send_data(OCTETSTRING& data, params& params) {
  loggers::get_instance().log_msg(">>> qualcomm_layer::send_data: ", data);

  OCTETSTRING buffer = int2oct(3, 1); // CV2X identifier
  buffer += data; // Payload
  
  loggers::get_instance().log_msg("qualcomm_layer::send_data: Final buffer=", buffer);
  send_to_all_layers(buffer, params);
}

void qualcomm_layer::receive_data(OCTETSTRING& data, params& params) {
  loggers::get_instance().log_msg(">>> qualcomm_layer::receive_data: ", data);
  
  // Remove CV2X identifier
  data = OCTETSTRING(data.lengthof() - 1, 1 + static_cast<const unsigned char*>(data));
  loggers::get_instance().log_msg("qualcomm_layer::receive_data: payload for upper layer:", data);
  
  // FIXME receive_to_all_layers(data, params);
}

qualcomm_layer_factory qualcomm_layer_factory::_f;
+43 −0
Original line number Original line Diff line number Diff line
/*!
 * \file      udp_layer_factory.hh
 * \brief     Header file for ITS Qualcomm port protocol layer factory.
 * \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 "t_layer.hh"
#include "params.hh"

class OCTETSTRING; //! Forward declaration of TITAN class

/*!
 * \class qualcomm_layer
 * \brief  This class provides description of ITS Qualcomm port protocol layer
 */
class qualcomm_layer : public layer {
  
  params _params;                       //! Layer parameters
  
public:
  //! \publicsection
   /*!
    * \brief Specialised constructor
    *        Create a new instance of the qualcomm_layer class
    * \param[in] p_type \todo
    * \param[in] p_param \todo
    */
  qualcomm_layer(const std::string & p_type, const std::string & param);
  /*!
   * \brief Default destructor
   * \remark If \see _reconnect_on_send is set to false, the disconnection is done by the destructor
   */
  virtual ~qualcomm_layer() {};

  virtual void send_data(OCTETSTRING& data, params& params);
  virtual void receive_data(OCTETSTRING& data, params& info);
}; // End of class qualcomm_layer
+45 −0
Original line number Original line Diff line number Diff line
/*!
 * \file      qualcomm_layer_factory.hh
 * \brief     Header file for ITS Qualcomm protocol layer factory.
 * \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 "layer_stack_builder.hh"

#include "qualcomm_layer.hh"

/*!
 * \class qualcomm_layer_factory
 * \brief  This class provides a factory class to create an qualcomm_layer class instance
 */
class qualcomm_layer_factory: public layer_factory {
  static qualcomm_layer_factory _f; //! Reference to the unique instance of this class
public: //! \publicsection
  /*!
   * \brief Default constructor
   *        Create a new instance of the udp_layer_factory class
   * \remark The Qualcomm layer identifier is QUALCOMM
   */
  qualcomm_layer_factory() {
    // register factory
    layer_stack_builder::register_layer_factory("QUALCOMM", this);
  };
  /*!
   * \fn layer* create_layer(const std::string & type, const std::string & param);
   * \brief  Create the layers stack based on the provided layers stack description
   * \param[in] p_type The provided layers stack description
   * \param[in] p_params Optional parameters
   * \return 0 on success, -1 otherwise
   * \inline
   */
  inline virtual layer* create_layer(const std::string& p_type, const std::string& p_param) {
    return new qualcomm_layer(p_type, p_param);
  };
}; // End of class qualcomm_layer_factory
Loading