Commit 5bb43193 authored by Yann Garcia's avatar Yann Garcia
Browse files

Add bases for offline send_data

parent a8db2aef
Loading
Loading
Loading
Loading
+58 −4
Original line number Diff line number Diff line
#include <netdb.h>
#include <arpa/inet.h>

#include "ip_offline_layer_factory.hh"

#include "loggers.hh"
@@ -10,12 +13,33 @@ ip_offline_layer::ip_offline_layer(const std::string& p_type, const std::string

void ip_offline_layer::send_data(OCTETSTRING& p_data, params& p_params) {
  loggers::get_instance().log_msg(">>> ip_offline_layer::send_data: ", p_data);
  p_params.log();

  //OCTETSTRING ip;
  // FIXME FSCOM: To be done
  loggers::get_instance().error("ip_offline_layer::send_data: Not implemented. On;ly for offline mode");
  //ip    += p_data;
  //send_to_all_layers(ip, static_cast<params&>(p_params));
  loggers::get_instance().warning("ip_offline_layer::send_data: Not implemented. Only for offline mode");
  TTCN_Buffer ip;
  ip.put_c(0x45); // Protocol version
  ip.put_c(0x02); // Flags
  unsigned short l = p_data.lengthof();
  ip.put_c(l >> 8 & 0xFF); // Data length
  ip.put_c(l & 0xFF); // Data length
  ip.put_c(0x00); ip.put_c(0x00); // Identification
  ip.put_c(0x40); ip.put_c(0x00); // Flags (Don't fragment)
  ip.put_c(0x40); // TTL
  ip.put_c(132); // Protocol is SCTP
  OCTETSTRING checksum = int2oct(0, 2); // Checksum
  ip.put_s(checksum.lengthof(), static_cast<const unsigned char*>(checksum));

  int addr = htonl(get_host_id("localhost"/*_params["dst_ip"]*/));
  OCTETSTRING ip_addr = int2oct(addr, 4); // Source address
  ip.put_s(ip_addr.lengthof(), static_cast<const unsigned char*>(ip_addr));
  ip_addr = int2oct(addr, 4); // Destination address
  ip.put_s(ip_addr.lengthof(), static_cast<const unsigned char*>(ip_addr));

  OCTETSTRING ip_pdu(ip.get_read_len(), ip.get_data());
  ip_pdu += p_data;

  send_to_all_layers(ip_pdu, static_cast<params&>(p_params));
}

void ip_offline_layer::receive_data(OCTETSTRING& p_data, params& p_params) {
@@ -70,4 +94,34 @@ void ip_offline_layer::receive_data(OCTETSTRING& p_data, params& p_params) {
  receive_to_all_layers(data, static_cast<params&>(p_params));
}

unsigned long ip_offline_layer::get_host_id(const std::string& p_host_name) {
  loggers::get_instance().log(">>> ip_offline_layer::get_host_id");

  if (p_host_name.empty()) {
    loggers::get_instance().warning("ip_offline_layer::get_host_id: Wrong parameter");
    return INADDR_ANY;
  }

  unsigned long ip_addr = 0;
  if (p_host_name.compare("255.255.255.255") == 0) {
    loggers::get_instance().warning("ip_offline_layer::get_host_id: Host ip is 255.255.255.255");
    ip_addr = 0xffffffff;
  } else {
    in_addr_t addr = ::inet_addr(p_host_name.c_str());
    if (addr != (in_addr_t)-1) { // host name in XX:XX:XX:XX form
      ip_addr = addr;
    } else { // host name in domain.com form
      struct hostent *hptr;
      if ((hptr = ::gethostbyname(p_host_name.c_str())) == 0) {
        loggers::get_instance().error("ip_offline_layer::get_host_id: Invalid host name: '%s'", p_host_name.c_str());
      }
      ip_addr = *((unsigned long *)hptr->h_addr_list[0]);
    }
  }

  loggers::get_instance().log("ip_offline_layer::get_host_id: Host name: '%s', Host address: %u", p_host_name.c_str(), ip_addr);

  return htonl(ip_addr);
}

ip_offline_layer_factory ip_offline_layer_factory::_f;
+3 −0
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@
class ip_offline_layer : public layer {
  params _params; //! Layer parameters

private: //! \privatesection
  unsigned long get_host_id(const std::string& p_host_name);

public: //! \publicsection
  /*!
   * \brief Specialised constructor
+42 −4
Original line number Diff line number Diff line
@@ -24,12 +24,44 @@ sctp_offline_layer::~sctp_offline_layer() {

void sctp_offline_layer::send_data(OCTETSTRING &p_data, params &p_params) {
  loggers::get_instance().log_msg(">>> sctp_offline_layer::send_data: ", p_data);
  p_params.log();

  //OCTETSTRING sctp;
  // FIXME FSCOM: To be done
  loggers::get_instance().error("sctp_offline_layer::send_data: Not implemented. On;ly for offline mode");
  //sctp    += p_data;
  //send_to_all_layers(sctp, static_cast<params&>(p_params));
  loggers::get_instance().warning("sctp_offline_layer::send_data: Not implemented. Only for offline mode");
  TTCN_Buffer chunk;
  chunk.put_c(0x00); // DATA chunk
  chunk.put_c(0x03); // Flags
  unsigned short l = p_data.lengthof();
  chunk.put_c(l >> 8 & 0xFF); // Data length
  chunk.put_c(l & 0xFF); // Data length
  OCTETSTRING tsn = int2oct(0, 4); // Transmission sequence number
  chunk.put_s(tsn.lengthof(), static_cast<const unsigned char*>(tsn));
  l = 7; // Stream sequence identifier
  chunk.put_c(l >> 8 & 0xFF); // Stream sequence identifier
  chunk.put_c(l & 0xFF); // Stream sequence identifier
  chunk.put_c(0x00); // Stream sequence number
  chunk.put_c(0x00); // Stream sequence number
  OCTETSTRING protocol = int2oct(60, 4); // Protocol is NGAP
  chunk.put_s(protocol.lengthof(), static_cast<const unsigned char*>(protocol));
  chunk.put_s(p_data.lengthof(), static_cast<const unsigned char*>(p_data));
  // FIXME FSCOM: Add padding

  TTCN_Buffer sctp;
  l = 12345; // SCTP Source port
  sctp.put_c(l >> 8 & 0xFF); // Stream sequence identifier
  sctp.put_c(l & 0xFF); // Stream sequence identifier
   l = 12345; // SCTP Destination port
  sctp.put_c(l >> 8 & 0xFF); // Stream sequence identifier
  sctp.put_c(l & 0xFF); // Stream sequence identifier
  OCTETSTRING vt = int2oct(0, 4); // Verification tag
  sctp.put_s(vt.lengthof(), static_cast<const unsigned char*>(vt));
  OCTETSTRING checksum = int2oct(0, 4); // Checksum
  sctp.put_s(checksum.lengthof(), static_cast<const unsigned char*>(checksum));
 
  OCTETSTRING sctp_pdu(sctp.get_read_len(), sctp.get_data());
  sctp_pdu += OCTETSTRING(chunk.get_read_len(), chunk.get_data());
  
  send_to_all_layers(sctp_pdu, static_cast<params&>(p_params));
}

void sctp_offline_layer::receive_data(OCTETSTRING &p_data, params &p_params) {
@@ -104,6 +136,12 @@ void sctp_offline_layer::process_chunk(const OCTETSTRING& p_chunk, params &p_par
      break;
    case 0x02: // INIT_ACK chunk
      break;
    case 0x03: // SACK
      break;
    case 0x04: // HEARTBEAT
      break;
    case 0x05: // HEARTBEAT_ACK
      break;
    case 0x0a: // COOKIE_ECHO chunk
      break;
    case 0x0b: // COOKIE_ACK chunk