Skip to content
Snippets Groups Projects
Commit 5bb43193 authored by Yann Garcia's avatar Yann Garcia
Browse files

Add bases for offline send_data

parent a8db2aef
No related branches found
No related tags found
No related merge requests found
#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;
......@@ -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
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment