save work

This commit is contained in:
Nanosonde 2020-07-15 17:50:54 +02:00
parent bc09622a77
commit 9a6d5cecf4
7 changed files with 51 additions and 73 deletions

View File

@ -103,8 +103,6 @@ add_executable(knx-linux
../../src/knx/rf_medium_object.h ../../src/knx/rf_medium_object.h
../../src/knx/rf_physical_layer.cpp ../../src/knx/rf_physical_layer.cpp
../../src/knx/rf_physical_layer.h ../../src/knx/rf_physical_layer.h
../../src/knx/router_object.cpp
../../src/knx/router_object.h
../../src/knx/router_object_filtertable.cpp ../../src/knx/router_object_filtertable.cpp
../../src/knx/router_object_filtertable.h ../../src/knx/router_object_filtertable.h
../../src/knx/secure_application_layer.cpp ../../src/knx/secure_application_layer.cpp

View File

@ -6,14 +6,15 @@
BauSystemBCoupler::BauSystemBCoupler(Platform& platform) : BauSystemBCoupler::BauSystemBCoupler(Platform& platform) :
BauSystemB(platform), BauSystemB(platform),
_platform(platform), _platform(platform),
_rtObjPrimary(), _rtObjPrimary(memory()),
_rtObjSecondary(memory()), _rtObjSecondary(memory()),
#ifdef USE_DATASECURE #ifdef USE_DATASECURE
_appLayer(_deviceObj, _secIfObj, *this), _appLayer(_deviceObj, _secIfObj, *this),
#else #else
_appLayer(*this), _appLayer(*this),
#endif #endif
_transLayer(_appLayer), _netLayer(_deviceObj, _transLayer) _transLayer(_appLayer),
_netLayer(_deviceObj, _transLayer)
{ {
_appLayer.transportLayer(_transLayer); _appLayer.transportLayer(_transLayer);
_transLayer.networkLayer(_netLayer); _transLayer.networkLayer(_netLayer);

View File

@ -8,7 +8,6 @@
#include "group_object_table_object.h" #include "group_object_table_object.h"
#include "security_interface_object.h" #include "security_interface_object.h"
#include "application_program_object.h" #include "application_program_object.h"
#include "router_object.h"
#include "router_object_filtertable.h" #include "router_object_filtertable.h"
#include "application_layer.h" #include "application_layer.h"
#include "secure_application_layer.h" #include "secure_application_layer.h"
@ -32,7 +31,7 @@ class BauSystemBCoupler : public BauSystemB
Platform& _platform; Platform& _platform;
RouterObject _rtObjPrimary; RouterObject _rtObjPrimary;
RouterObjectFilterTable _rtObjSecondary; RouterObject _rtObjSecondary;
#ifdef USE_DATASECURE #ifdef USE_DATASECURE
SecureApplicationLayer _appLayer; SecureApplicationLayer _appLayer;

View File

@ -14,12 +14,6 @@ void RouterObject::initializeProperties(size_t propertiesSize, Property** proper
{ {
Property* ownProperties[] = Property* ownProperties[] =
{ {
new DataProperty( PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) OT_ROUTER ),
new DataProperty( PID_OBJECT_INDEX, false, PDT_UNSIGNED_CHAR, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx
new DataProperty( PID_MEDIUM_STATUS, false, PDT_GENERIC_01, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // For now: communication on medium is always possible
new DataProperty( PID_MAX_APDU_LENGTH_ROUTER, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 254 ), // For now: fixed size
new DataProperty( PID_HOP_COUNT, true, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 5), // TODO: Primary side: 5 for line coupler, 4 for backbone coupler, only exists if secondary is open medium without hop count
new DataProperty( PID_MEDIUM, false, PDT_ENUM8, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx
}; };
uint8_t ownPropertiesCount = sizeof(ownProperties) / sizeof(Property*); uint8_t ownPropertiesCount = sizeof(ownProperties) / sizeof(Property*);
@ -43,19 +37,3 @@ void RouterObject::masterReset(EraseCode eraseCode, uint8_t channel)
println("Factory reset of router object requested."); println("Factory reset of router object requested.");
} }
} }
uint16_t RouterObject::getNumberOfElements(PropertyID propId)
{
// Get number of entries for this property
uint16_t numElements = 0;
uint8_t data[sizeof(uint16_t)]; // is sizeof(_currentElements) which is uint16_t
uint8_t count = property(propId)->read(0, 1, data);
if (count > 0)
{
popWord(numElements, data);
}
return numElements;
}

View File

@ -15,6 +15,4 @@ public:
protected: protected:
void initializeProperties(size_t propertiesSize, Property** properties) override; void initializeProperties(size_t propertiesSize, Property** properties) override;
private:
uint16_t getNumberOfElements(PropertyID propId);
}; };

View File

@ -16,14 +16,20 @@ enum RouteTableServices
SetGroupAddress = 0x04, // 4 bytes: start address and end address SetGroupAddress = 0x04, // 4 bytes: start address and end address
}; };
RouterObjectFilterTable::RouterObjectFilterTable(Memory& memory) RouterObject::RouterObject(Memory& memory)
: _memory(memory) : _memory(memory)
{ {
Property* properties[] = Property* properties[] =
{ {
new CallbackProperty<RouterObjectFilterTable>(this, PID_LOAD_STATE_CONTROL, true, PDT_CONTROL, 1, ReadLv3 | WriteLv3, new DataProperty( PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) OT_ROUTER ),
new DataProperty( PID_OBJECT_INDEX, false, PDT_UNSIGNED_CHAR, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx
new DataProperty( PID_MEDIUM_STATUS, false, PDT_GENERIC_01, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // For now: communication on medium is always possible
new DataProperty( PID_MAX_APDU_LENGTH_ROUTER, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 254 ), // For now: fixed size
new DataProperty( PID_HOP_COUNT, true, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 5), // TODO: Primary side: 5 for line coupler, 4 for backbone coupler, only exists if secondary is open medium without hop count
new DataProperty( PID_MEDIUM, false, PDT_ENUM8, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx
new CallbackProperty<RouterObject>(this, PID_LOAD_STATE_CONTROL, true, PDT_CONTROL, 1, ReadLv3 | WriteLv3,
// ReadCallback of PID_LOAD_STATE_CONTROL // ReadCallback of PID_LOAD_STATE_CONTROL
[](RouterObjectFilterTable* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t { [](RouterObject* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t {
if (start == 0) if (start == 0)
return 1; return 1;
@ -31,12 +37,12 @@ RouterObjectFilterTable::RouterObjectFilterTable(Memory& memory)
return 1; return 1;
}, },
// WriteCallback of PID_LOAD_STATE_CONTROL // WriteCallback of PID_LOAD_STATE_CONTROL
[](RouterObjectFilterTable* obj, uint16_t start, uint8_t count, const uint8_t* data) -> uint8_t { [](RouterObject* obj, uint16_t start, uint8_t count, const uint8_t* data) -> uint8_t {
obj->loadEvent(data); obj->loadEvent(data);
return 1; return 1;
}), }),
new CallbackProperty<RouterObjectFilterTable>(this, PID_TABLE_REFERENCE, false, PDT_UNSIGNED_LONG, 1, ReadLv3 | WriteLv0, new CallbackProperty<RouterObject>(this, PID_TABLE_REFERENCE, false, PDT_UNSIGNED_LONG, 1, ReadLv3 | WriteLv0,
[](RouterObjectFilterTable* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t { [](RouterObject* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t {
if(start == 0) if(start == 0)
{ {
uint16_t currentNoOfElements = 1; uint16_t currentNoOfElements = 1;
@ -53,33 +59,33 @@ RouterObjectFilterTable::RouterObjectFilterTable(Memory& memory)
new DataProperty( PID_MCB_TABLE, false, PDT_GENERIC_08, 1, ReadLv3 | WriteLv0), new DataProperty( PID_MCB_TABLE, false, PDT_GENERIC_08, 1, ReadLv3 | WriteLv0),
new FunctionProperty<RouterObjectFilterTable>(this, PID_ROUTETABLE_CONTROL, new FunctionProperty<RouterObject>(this, PID_ROUTETABLE_CONTROL,
// Command Callback of PID_ROUTETABLE_CONTROL // Command Callback of PID_ROUTETABLE_CONTROL
[](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void {
obj->functionRouteTableControl(true, data, length, resultData, resultLength); obj->functionRouteTableControl(true, data, length, resultData, resultLength);
}, },
// State Callback of PID_ROUTETABLE_CONTROL // State Callback of PID_ROUTETABLE_CONTROL
[](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void {
obj->functionRouteTableControl(false, data, length, resultData, resultLength); obj->functionRouteTableControl(false, data, length, resultData, resultLength);
}), }),
new DataProperty( PID_FILTER_TABLE_USE, true, PDT_BINARY_INFORMATION, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // default: invalid filter table, do not use new DataProperty( PID_FILTER_TABLE_USE, true, PDT_BINARY_INFORMATION, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // default: invalid filter table, do not use
new FunctionProperty<RouterObjectFilterTable>(this, PID_RF_ENABLE_SBC, new FunctionProperty<RouterObject>(this, PID_RF_ENABLE_SBC,
// Command Callback of PID_RF_ENABLE_SBC // Command Callback of PID_RF_ENABLE_SBC
[](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void {
obj->functionRfEnableSbc(true, data, length, resultData, resultLength); obj->functionRfEnableSbc(true, data, length, resultData, resultLength);
}, },
// State Callback of PID_RF_ENABLE_SBC // State Callback of PID_RF_ENABLE_SBC
[](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void {
obj->functionRfEnableSbc(false, data, length, resultData, resultLength); obj->functionRfEnableSbc(false, data, length, resultData, resultLength);
}), }),
}; };
RouterObject::initializeProperties(sizeof(properties), properties); initializeProperties(sizeof(properties), properties);
} }
uint8_t* RouterObjectFilterTable::save(uint8_t* buffer) uint8_t* RouterObject::save(uint8_t* buffer)
{ {
buffer = pushByte(_state, buffer); buffer = pushByte(_state, buffer);
@ -88,10 +94,10 @@ uint8_t* RouterObjectFilterTable::save(uint8_t* buffer)
else else
buffer = pushInt(0, buffer); buffer = pushInt(0, buffer);
return RouterObject::save(buffer); return InterfaceObject::save(buffer);
} }
const uint8_t* RouterObjectFilterTable::restore(const uint8_t* buffer) const uint8_t* RouterObject::restore(const uint8_t* buffer)
{ {
uint8_t state = 0; uint8_t state = 0;
buffer = popByte(state, buffer); buffer = popByte(state, buffer);
@ -107,15 +113,15 @@ const uint8_t* RouterObjectFilterTable::restore(const uint8_t* buffer)
_filterTableGroupAddresses = (uint16_t*)_data; _filterTableGroupAddresses = (uint16_t*)_data;
return RouterObject::restore(buffer); return InterfaceObject::restore(buffer);
} }
uint16_t RouterObjectFilterTable::saveSize() uint16_t RouterObject::saveSize()
{ {
return 1 + 4 + RouterObject::saveSize(); return 1 + 4 + InterfaceObject::saveSize();
} }
void RouterObjectFilterTable::functionRouteTableControl(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) void RouterObject::functionRouteTableControl(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength)
{ {
bool isError = false; bool isError = false;
RouteTableServices srvId = (RouteTableServices) data[1]; RouteTableServices srvId = (RouteTableServices) data[1];
@ -159,7 +165,7 @@ void RouterObjectFilterTable::functionRouteTableControl(bool isCommand, uint8_t*
} }
} }
void RouterObjectFilterTable::functionRfEnableSbc(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) void RouterObject::functionRfEnableSbc(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength)
{ {
if (isCommand) if (isCommand)
{ {
@ -171,17 +177,17 @@ void RouterObjectFilterTable::functionRfEnableSbc(bool isCommand, uint8_t* data,
resultLength = 2; resultLength = 2;
} }
bool RouterObjectFilterTable::isRfSbcRoutingEnabled() bool RouterObject::isRfSbcRoutingEnabled()
{ {
return _rfSbcRoutingEnabled; return _rfSbcRoutingEnabled;
} }
uint32_t RouterObjectFilterTable::tableReference() uint32_t RouterObject::tableReference()
{ {
return (uint32_t)_memory.toRelative(_data); return (uint32_t)_memory.toRelative(_data);
} }
bool RouterObjectFilterTable::allocTable(uint32_t size, bool doFill, uint8_t fillByte) bool RouterObject::allocTable(uint32_t size, bool doFill, uint8_t fillByte)
{ {
if (_data) if (_data)
{ {
@ -202,17 +208,17 @@ bool RouterObjectFilterTable::allocTable(uint32_t size, bool doFill, uint8_t fil
return true; return true;
} }
bool RouterObjectFilterTable::isLoaded() bool RouterObject::isLoaded()
{ {
return _state == LS_LOADED; return _state == LS_LOADED;
} }
LoadState RouterObjectFilterTable::loadState() LoadState RouterObject::loadState()
{ {
return _state; return _state;
} }
void RouterObjectFilterTable::loadEvent(const uint8_t* data) void RouterObject::loadEvent(const uint8_t* data)
{ {
switch (_state) switch (_state)
{ {
@ -234,7 +240,7 @@ void RouterObjectFilterTable::loadEvent(const uint8_t* data)
} }
} }
void RouterObjectFilterTable::loadEventUnloaded(const uint8_t* data) void RouterObject::loadEventUnloaded(const uint8_t* data)
{ {
uint8_t event = data[0]; uint8_t event = data[0];
switch (event) switch (event)
@ -253,7 +259,7 @@ void RouterObjectFilterTable::loadEventUnloaded(const uint8_t* data)
} }
} }
void RouterObjectFilterTable::loadEventLoading(const uint8_t* data) void RouterObject::loadEventLoading(const uint8_t* data)
{ {
uint8_t event = data[0]; uint8_t event = data[0];
switch (event) switch (event)
@ -276,7 +282,7 @@ void RouterObjectFilterTable::loadEventLoading(const uint8_t* data)
} }
} }
void RouterObjectFilterTable::loadEventLoaded(const uint8_t* data) void RouterObject::loadEventLoaded(const uint8_t* data)
{ {
uint8_t event = data[0]; uint8_t event = data[0];
switch (event) switch (event)
@ -306,7 +312,7 @@ void RouterObjectFilterTable::loadEventLoaded(const uint8_t* data)
} }
} }
void RouterObjectFilterTable::loadEventError(const uint8_t* data) void RouterObject::loadEventError(const uint8_t* data)
{ {
uint8_t event = data[0]; uint8_t event = data[0];
switch (event) switch (event)
@ -325,7 +331,7 @@ void RouterObjectFilterTable::loadEventError(const uint8_t* data)
} }
} }
void RouterObjectFilterTable::additionalLoadControls(const uint8_t* data) void RouterObject::additionalLoadControls(const uint8_t* data)
{ {
if (data[1] != 0x0B) // Data Relative Allocation if (data[1] != 0x0B) // Data Relative Allocation
{ {
@ -344,7 +350,7 @@ void RouterObjectFilterTable::additionalLoadControls(const uint8_t* data)
} }
} }
void RouterObjectFilterTable::loadState(LoadState newState) void RouterObject::loadState(LoadState newState)
{ {
if (newState == _state) if (newState == _state)
return; return;
@ -352,14 +358,14 @@ void RouterObjectFilterTable::loadState(LoadState newState)
_state = newState; _state = newState;
} }
void RouterObjectFilterTable::errorCode(ErrorCode errorCode) void RouterObject::errorCode(ErrorCode errorCode)
{ {
uint8_t data = errorCode; uint8_t data = errorCode;
Property* prop = property(PID_ERROR_CODE); Property* prop = property(PID_ERROR_CODE);
prop->write(data); prop->write(data);
} }
void RouterObjectFilterTable::beforeStateChange(LoadState& newState) void RouterObject::beforeStateChange(LoadState& newState)
{ {
if (newState != LS_LOADED) if (newState != LS_LOADED)
return; return;
@ -370,7 +376,7 @@ void RouterObjectFilterTable::beforeStateChange(LoadState& newState)
_filterTableGroupAddresses = (uint16_t*)_data; _filterTableGroupAddresses = (uint16_t*)_data;
} }
void RouterObjectFilterTable::updateMcb() void RouterObject::updateMcb()
{ {
uint8_t mcb[propertySize(PID_MCB_TABLE)]; uint8_t mcb[propertySize(PID_MCB_TABLE)];
@ -385,10 +391,8 @@ void RouterObjectFilterTable::updateMcb()
property(PID_MCB_TABLE)->write(mcb); property(PID_MCB_TABLE)->write(mcb);
} }
void RouterObjectFilterTable::masterReset(EraseCode eraseCode, uint8_t channel) void RouterObject::masterReset(EraseCode eraseCode, uint8_t channel)
{ {
RouterObject::masterReset(eraseCode, channel);
if (eraseCode == FactoryReset) if (eraseCode == FactoryReset)
{ {
// TODO handle different erase codes // TODO handle different erase codes
@ -396,7 +400,7 @@ void RouterObjectFilterTable::masterReset(EraseCode eraseCode, uint8_t channel)
} }
} }
bool RouterObjectFilterTable::isGroupAddressInFilterTable(uint16_t groupAddress) bool RouterObject::isGroupAddressInFilterTable(uint16_t groupAddress)
{ {
uint8_t filterTableUse = 0x00; uint8_t filterTableUse = 0x00;
if (property(PID_FILTER_TABLE_USE)->read(filterTableUse) == 0) if (property(PID_FILTER_TABLE_USE)->read(filterTableUse) == 0)

View File

@ -2,15 +2,15 @@
#include "config.h" #include "config.h"
#include "router_object.h" #include "interface_object.h"
#include "knx_types.h" #include "knx_types.h"
class Memory; class Memory;
class RouterObjectFilterTable: public RouterObject class RouterObject : public InterfaceObject
{ {
public: public:
RouterObjectFilterTable(Memory& memory); RouterObject(Memory& memory);
bool isGroupAddressInFilterTable(uint16_t groupAddress); bool isGroupAddressInFilterTable(uint16_t groupAddress);