Commit 29ec759f authored by garciay's avatar garciay
Browse files

GeoNetworking codecs ongoing

Add GeoNetworkingLayer
parent 37b2bc92
......@@ -12,17 +12,17 @@ class Layer {
std::vector<Layer*> lowerLayers;
public:
Layer(){}
virtual ~Layer();
void deleteLayer();
virtual ~Layer() {};
void deleteLayer() {};
public:
void addUpperLayer(Layer*);
void removeUpperLayer(Layer*);
void addUpperLayer(Layer*) {};
void removeUpperLayer(Layer*) {};
virtual void sendData(const OCTETSTRING& data, const Params& params);
virtual void receiveData(const OCTETSTRING& data, const Params& info);
virtual void sendData(const OCTETSTRING& data, const Params& params) {};
virtual void receiveData(const OCTETSTRING& data, const Params& info) {};
protected:
void toAllLayers(std::vector<Layer*>&layers, const OCTETSTRING& data, const Params& info);
void toAllLayers(std::vector<Layer*>&layers, const OCTETSTRING& data, const Params& info) {};
inline void toAllUpperLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
inline void toAllLowerLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
inline void receiveToAllLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
......
#pragma once
#include <map>
typedef std::map<std::string, std::string> params;
......@@ -2,6 +2,8 @@
#include <stdexcept>
#include <regex>
#include "loggers.hh"
LayerStackBuilder * LayerStackBuilder::_instance = NULL;
// static functions
......@@ -26,8 +28,9 @@ void LayerStackBuilder::registerLayerFactory(const std::string & type, LayerFact
Layer* LayerStackBuilder::createLayerStack(const char* s)
{
Layer * up = NULL;
loggers::loggers::log(">>> LayerStackBuilder::createLayerStack: %s", s);
Layer * up = NULL;
//parse str
std::regex rgx ("(\\w+)(\\((.*?)\\))?(\\/|$)");
std::smatch m;
......@@ -35,11 +38,13 @@ Layer* LayerStackBuilder::createLayerStack(const char* s)
try {
while(std::regex_search(str, m, rgx)) {
std::string mname = m[1];
loggers::loggers::log("LayerStackBuilder::createLayerStack: mname=%s", mname);
LayerFactoryMap::iterator it =_fs.find(mname);
if(it == _fs.end()){
throw (std::logic_error(mname + ": Unknown layer type"));
}
// TODO: parse parameters
loggers::loggers::log("LayerStackBuilder::createLayerStack: Create layer %s", it->first);
Layer * l = it->second->createLayer(mname, m[3]);
if(NULL == l){
throw (std::logic_error(mname + ": Layer creation error"));
......@@ -57,8 +62,3 @@ Layer* LayerStackBuilder::createLayerStack(const char* s)
}
return up;
}
void Layer::deleteLayer()
{
}
......@@ -8,11 +8,12 @@
// add your member functions here.
#include "GeoNetworkingPort.hh"
#include "loggers.hh"
namespace LibItsGeoNetworking__TestSystem {
GeoNetworkingPort::GeoNetworkingPort(const char *par_port_name)
: GeoNetworkingPort_BASE(par_port_name)
: GeoNetworkingPort_BASE(par_port_name), _params(), _layer(NULL)
{
}
......@@ -22,10 +23,10 @@ GeoNetworkingPort::~GeoNetworkingPort()
}
void GeoNetworkingPort::set_parameter(const char * /*parameter_name*/,
const char * /*parameter_value*/)
void GeoNetworkingPort::set_parameter(const char * parameter_name, const char * parameter_value)
{
loggers::loggers::log("GeoNetworkingPort::set_parameter: %s=%s", parameter_name, parameter_value);
_params.insert(std::pair<std::string, std::string>(std::string(parameter_name), std::string(parameter_value)));
}
/*void GeoNetworkingPort::Handle_Fd_Event(int fd, boolean is_readable,
......@@ -48,8 +49,12 @@ void GeoNetworkingPort::Handle_Fd_Event_Readable(int /*fd*/)
/*void GeoNetworkingPort::Handle_Timeout(double time_since_last_call) {}*/
void GeoNetworkingPort::user_map(const char * /*system_port*/)
void GeoNetworkingPort::user_map(const char * system_port)
{
loggers::loggers::log("GeoNetworkingPort::user_map: %s", system_port);
//if (strcmp(parameter_name, "geoNetworkingPort") == 0);
// _layer = LayerStackBuilder::GetInstance()->createLayerStack("ETH(src_addr=00:00:00:00:00:00,FF:FF:FF:FF:Fsrc_addr=00:00:00:00:00:00,FF:FF:FF:FF:F)");
//}
}
......
......@@ -13,10 +13,13 @@
#include "LibItsGeoNetworking_TestSystem.hh"
#include "GeoNetworkingLayer.hh"
#include "params.hh"
namespace LibItsGeoNetworking__TestSystem {
class GeoNetworkingPort : public GeoNetworkingPort_BASE {
params _params;
Layer * _layer;
public:
GeoNetworkingPort(const char *par_port_name = NULL);
~GeoNetworkingPort();
......
#include <string>
#include <typeinfo>
#//include <TTCN3.hh>
//include <TTCN3.hh>
#include "GeoNetworkingCodec.hh"
#include "loggers.hh"
......@@ -46,8 +46,6 @@ int GeoNetworkingCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& f
loggers::loggers::log("GeoNetworkingCodec::decode_: processing Record_Type %s", r.get_descriptor()->name);
for(int i = 0; i < r.get_count(); i++) {
loggers::loggers::log("GeoNetworkingCodec::decode_: processing %s/%s/%s", r.fld_name(i), r.fld_descr(i)->name, r.get_at(i)->get_descriptor()->name);
// Base_Type *b = ((Base_Type *)(r.get_at(i)));
// ((Base_Type *)(r.get_at(i)))->decode_((const TTCN_Typedescriptor_t&)*r.fld_descr(i), decoding_buffer, TTCN_EncDec::CT_RAW);
if (decode_(*((Base_Type *)(r.get_at(i))), *(r.fld_descr(i)), decoding_buffer) == -1) {
return -1;
}
......@@ -60,7 +58,7 @@ int GeoNetworkingCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& f
}
type.set_value(extendedHeader.clone());
} else {
type.set_to_omit();
type.set_to_omit();
}
} else if (std::string(type.get_descriptor()->name).compare("@LibItsGeoNetworking_TypesAndValues.Payload") == 0) {
if (_dc.plLength != 0) {
......@@ -82,18 +80,28 @@ int GeoNetworkingCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& f
} else {
loggers::loggers::log("GeoNetworkingCodec::decode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name);
if (std::string(field_descriptor.name).compare("@LibItsGeoNetworking_TypesAndValues.CommonHeader.nextHeader") == 0) {
// Decode NextHeader data strcuture
type.decode(field_descriptor, decoding_buffer, TTCN_EncDec::CT_RAW);
// Store NextHeader field value and continue decoding
_dc.next_header = (unsigned int)dynamic_cast<const Enum_Type &>(type).as_int();
loggers::loggers::log("GeoNetworkingCodec::decode_: Storing next_header %d for %s", _dc.next_header, field_descriptor.name);
// loggers::loggers::log("GeoNetworkingCodec::decode_: Storing next_header %d for %s", _dc.next_header, field_descriptor.name);
} else if (std::string(field_descriptor.name).compare("@LibItsGeoNetworking_TypesAndValues.CommonHeader.plLength") == 0) {
// Store playload length and continue decoding
// Decode plLength data strcuture
type.decode(field_descriptor, decoding_buffer, TTCN_EncDec::CT_RAW);
_dc.plLength = dynamic_cast<const OCTETSTRING &>(type).lengthof();
loggers::loggers::log("GeoNetworkingCodec::decode_: Storing position payload length: %d", _dc.plLength);
} else if (std::string(field_descriptor.name).compare("@LibItsGeoNetworking_TypesAndValues.Payload.rawPayload") == 0) {
// Store playload length and continue decoding
_dc.plLength = dynamic_cast<const OCTETSTRING &>(type).lengthof();
loggers::loggers::log("GeoNetworkingCodec::decode_: Storing payload length %d for %s", _dc.plLength, field_descriptor.name);
_dc.plLength = (unsigned int)static_cast<int>(dynamic_cast<const INTEGER &>(type));
// loggers::loggers::log("GeoNetworkingCodec::decode_: Storing position payload length: %d", _dc.plLength);
} else if (std::string(field_descriptor.name).compare("@LibItsGeoNetworking_TypesAndValues.Payload.rawPayload") == 0) {
// Decode RawPayload data strcuture
type.decode(field_descriptor, decoding_buffer, TTCN_EncDec::CT_RAW);
// Store it
const OCTETSTRING& s = dynamic_cast<const OCTETSTRING &>(type);
const unsigned char * p = static_cast<const unsigned char *>(s);
if (s.lengthof() <= _dc.plLength) {
_dc.payload.assign(p, p + s.lengthof());
} else {
_dc.payload.assign(p, p + _dc.plLength);
}
} else {
type.decode(field_descriptor, decoding_buffer, TTCN_EncDec::CT_RAW);
}
......
#ifndef GNCODEC_H
#define GNCODEC_H
#include <vector>
#include "Codec.hh"
class Base_Type;
......@@ -16,17 +19,18 @@ namespace LibItsGeoNetworking__TypesAndValues {
struct Encoding_Context {
unsigned char next_header; // FIXME Useless?
unsigned int plLength_position;
unsigned int plLength;
unsigned int plLength_position;
unsigned int plLength;
Encoding_Context() { next_header = 0xff; plLength_position = -1; plLength = -1; }
};
struct Decoding_Context {
unsigned char next_header; // FIXME Useless?
unsigned int plLength;
unsigned char next_header; // FIXME Useless?
unsigned int plLength;
std::vector<unsigned char> payload;
Decoding_Context() { next_header = 0xff; plLength = -1; }
Decoding_Context() : payload() { next_header = 0xff; plLength = -1; }
};
class GeoNetworkingCodec : public Codec<LibItsGeoNetworking__TypesAndValues::GeoNetworkingPdu, LibItsGeoNetworking__TypesAndValues::GeoNetworkingPdu> {
......
#pragma once
using namespace std;
//class OCTETSTRING;
//class TTCN_Buffer;
//class TTCN_Logger;
//extern void TTCN_error(const char *err_msg, ...);
#include <TTCN3.hh>
namespace loggers {
......@@ -15,11 +20,11 @@ namespace loggers {
void loggers::log_to_hexa(const char *prompt, const TTCN_Buffer & buffer)
{
TTCN_Logger::begin_event(TTCN_DEBUG);
TTCN_Logger::begin_event(TTCN_Logger::DEBUG_UNQUALIFIED);
TTCN_Logger::log_event_str(prompt);
buffer.log();
TTCN_Logger::end_event();
// TTCN_Logger::begin_event(TTCN_DEBUG);
// TTCN_Logger::begin_event(TTCN_Logger::DEBUG_UNQUALIFIED);
// int len = buffer->get_read_len();
// const unsigned char* ptr = buffer->get_read_data();
// for(int i = buffer->get_pos(); i < len; i++)
......@@ -31,7 +36,7 @@ namespace loggers {
void loggers::log_to_hexa(const char *prompt, const OCTETSTRING& msg)
{
TTCN_Logger::begin_event(TTCN_DEBUG);
TTCN_Logger::begin_event(TTCN_Logger::DEBUG_UNQUALIFIED);
TTCN_Logger::log_event_str(prompt);
TTCN_Logger::log_event("Size: %d,\nMsg: ",msg.lengthof());
......@@ -43,7 +48,7 @@ namespace loggers {
void loggers::log_msg(const char *prompt, const Base_Type& type)
{
TTCN_Logger::begin_event(TTCN_DEBUG);
TTCN_Logger::begin_event(TTCN_Logger::DEBUG_UNQUALIFIED);
TTCN_Logger::log_event_str(prompt);
type.log();
TTCN_Logger::end_event();
......@@ -51,7 +56,7 @@ namespace loggers {
void loggers::log(const char *fmt, ...)
{
TTCN_Logger::begin_event(TTCN_DEBUG);
TTCN_Logger::begin_event(TTCN_Logger::DEBUG_UNQUALIFIED);
va_list args;
va_start(args, fmt);
TTCN_Logger::log_event_va_list(fmt, args);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment