save work

This commit is contained in:
Nanosonde 2020-07-12 11:41:11 +02:00
parent 2d0b0d05e5
commit d17fe1003b
7 changed files with 78 additions and 89 deletions

View File

@ -85,6 +85,10 @@ add_executable(knx-linux
../../src/knx/memory.h ../../src/knx/memory.h
../../src/knx/network_layer.cpp ../../src/knx/network_layer.cpp
../../src/knx/network_layer.h ../../src/knx/network_layer.h
../../src/knx/network_layer_coupler.cpp
../../src/knx/network_layer_coupler.h
../../src/knx/network_layer_device.cpp
../../src/knx/network_layer_device.h
../../src/knx/network_layer_entity.cpp ../../src/knx/network_layer_entity.cpp
../../src/knx/network_layer_entity.h ../../src/knx/network_layer_entity.h
../../src/knx/npdu.cpp ../../src/knx/npdu.cpp

View File

@ -11,7 +11,7 @@
#include "application_layer.h" #include "application_layer.h"
#include "secure_application_layer.h" #include "secure_application_layer.h"
#include "transport_layer.h" #include "transport_layer.h"
#include "network_layer.h" #include "network_layer_coupler.h"
#include "data_link_layer.h" #include "data_link_layer.h"
#include "platform.h" #include "platform.h"
#include "memory.h" #include "memory.h"
@ -36,6 +36,6 @@ class BauSystemBCoupler : public BauSystemB
ApplicationLayer _appLayer; ApplicationLayer _appLayer;
#endif #endif
TransportLayer _transLayer; TransportLayer _transLayer;
NetworkLayer _netLayer; NetworkLayerCoupler _netLayer;
bool _configured = true; bool _configured = true;
}; };

View File

@ -11,7 +11,7 @@
#include "application_layer.h" #include "application_layer.h"
#include "secure_application_layer.h" #include "secure_application_layer.h"
#include "transport_layer.h" #include "transport_layer.h"
#include "network_layer.h" #include "network_layer_device.h"
#include "data_link_layer.h" #include "data_link_layer.h"
#include "platform.h" #include "platform.h"
#include "memory.h" #include "memory.h"
@ -50,7 +50,7 @@ class BauSystemBDevice : public BauSystemB
ApplicationLayer _appLayer; ApplicationLayer _appLayer;
#endif #endif
TransportLayer _transLayer; TransportLayer _transLayer;
NetworkLayer _netLayer; NetworkLayerDevice _netLayer;
bool _configured = true; bool _configured = true;
}; };

View File

@ -1,46 +0,0 @@
#pragma once
#include <stdint.h>
#include "knx_types.h"
#include "npdu.h"
#include "transport_layer.h"
#include "network_layer_entity.h"
class DeviceObject;
class NetworkLayer
{
public:
NetworkLayer(DeviceObject& deviceObj, TransportLayer& layer);
NetworkLayerEntity& getEntity(uint8_t num);
uint8_t hopCount() const;
void hopCount(uint8_t value);
// from transport layer
void dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu);
void dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu);
void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu);
void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu);
// from entities
void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source);
void dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority,
uint16_t source, NPDU& npdu, bool status);
void broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source);
void broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status);
void systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source);
void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status);
private:
uint8_t _hopCount = 6;
// Support a maximum of two physical interfaces
NetworkLayerEntity _netLayerEntities[2];
TransportLayer& _transportLayer;
DeviceObject& _deviceObj;
};

View File

@ -1,32 +1,21 @@
#include "network_layer.h" #include "network_layer_device.h"
#include "device_object.h" #include "device_object.h"
#include "tpdu.h" #include "tpdu.h"
#include "cemi_frame.h" #include "cemi_frame.h"
#include "bits.h" #include "bits.h"
NetworkLayer::NetworkLayer(DeviceObject &deviceObj, TransportLayer& layer) : NetworkLayerDevice::NetworkLayerDevice(DeviceObject &deviceObj, TransportLayer& layer) :
_netLayerEntities { {*this, 0}, {*this, 1} }, NetworkLayer(deviceObj, layer),
_transportLayer(layer), _netLayerEntities { {*this, 0} }
_deviceObj(deviceObj)
{ {
} }
NetworkLayerEntity& NetworkLayer::getEntity(uint8_t num) NetworkLayerEntity& NetworkLayerDevice::getEntity(uint8_t interfaceIndex)
{ {
return _netLayerEntities[num]; return _netLayerEntities[interfaceIndex];
} }
uint8_t NetworkLayer::hopCount() const void NetworkLayerDevice::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
return _hopCount;
}
void NetworkLayer::hopCount(uint8_t value)
{
_hopCount = value & 0x7;
}
void NetworkLayer::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{ {
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter; HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
@ -64,7 +53,7 @@ void NetworkLayer::dataIndication(AckType ack, AddressType addrType, uint16_t de
_transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu()); _transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu());
} }
void NetworkLayer::dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) void NetworkLayerDevice::dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{ {
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter; HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
if (addressType == InduvidualAddress) if (addressType == InduvidualAddress)
@ -82,38 +71,38 @@ void NetworkLayer::dataConfirm(AckType ack, AddressType addressType, uint16_t de
_transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status); _transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status);
} }
void NetworkLayer::broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source) void NetworkLayerDevice::broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{ {
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter; HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu()); _transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu());
} }
void NetworkLayer::broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) void NetworkLayerDevice::broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{ {
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter; HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status); _transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status);
} }
void NetworkLayer::systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source) void NetworkLayerDevice::systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{ {
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter; HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu()); _transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
} }
void NetworkLayer::systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) void NetworkLayerDevice::systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{ {
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter; HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastConfirm(ack, hopType, npdu.tpdu(), priority, status); _transportLayer.dataSystemBroadcastConfirm(ack, hopType, npdu.tpdu(), priority, status);
} }
void NetworkLayer::dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu) void NetworkLayerDevice::dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu)
{ {
NPDU& npdu = tpdu.frame().npdu(); NPDU& npdu = tpdu.frame().npdu();
if (hopType == UnlimitedRouting) if (hopType == UnlimitedRouting)
npdu.hopCount(7); npdu.hopCount(7);
else else
npdu.hopCount(_hopCount); npdu.hopCount(hopCount());
//if (tpdu.apdu().length() > 0) //if (tpdu.apdu().length() > 0)
//{ //{
@ -123,38 +112,38 @@ void NetworkLayer::dataIndividualRequest(AckType ack, uint16_t destination, HopC
_netLayerEntities[0].sendDataRequest(npdu, ack, destination, priority, InduvidualAddress, Broadcast); _netLayerEntities[0].sendDataRequest(npdu, ack, destination, priority, InduvidualAddress, Broadcast);
} }
void NetworkLayer::dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu) void NetworkLayerDevice::dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu)
{ {
NPDU& npdu = tpdu.frame().npdu(); NPDU& npdu = tpdu.frame().npdu();
if (hopType == UnlimitedRouting) if (hopType == UnlimitedRouting)
npdu.hopCount(7); npdu.hopCount(7);
else else
npdu.hopCount(_hopCount); npdu.hopCount(hopCount());
_netLayerEntities[0].sendDataRequest(npdu, ack, destination, priority, GroupAddress, Broadcast); _netLayerEntities[0].sendDataRequest(npdu, ack, destination, priority, GroupAddress, Broadcast);
} }
void NetworkLayer::dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu) void NetworkLayerDevice::dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu)
{ {
NPDU& npdu = tpdu.frame().npdu(); NPDU& npdu = tpdu.frame().npdu();
if (hopType == UnlimitedRouting) if (hopType == UnlimitedRouting)
npdu.hopCount(7); npdu.hopCount(7);
else else
npdu.hopCount(_hopCount); npdu.hopCount(hopCount());
_netLayerEntities[0].sendDataRequest(npdu, ack, 0, priority, GroupAddress, Broadcast); _netLayerEntities[0].sendDataRequest(npdu, ack, 0, priority, GroupAddress, Broadcast);
} }
void NetworkLayer::dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu) void NetworkLayerDevice::dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu)
{ {
NPDU& npdu = tpdu.frame().npdu(); NPDU& npdu = tpdu.frame().npdu();
if (hopType == UnlimitedRouting) if (hopType == UnlimitedRouting)
npdu.hopCount(7); npdu.hopCount(7);
else else
npdu.hopCount(_hopCount); npdu.hopCount(hopCount());
_netLayerEntities[0].sendDataRequest(npdu, ack, 0, priority, GroupAddress, SysBroadcast); _netLayerEntities[0].sendDataRequest(npdu, ack, 0, priority, GroupAddress, SysBroadcast);
} }

View File

@ -0,0 +1,42 @@
#pragma once
#include <stdint.h>
#include "knx_types.h"
#include "npdu.h"
#include "transport_layer.h"
#include "network_layer_entity.h"
#include "network_layer.h"
class DeviceObject;
class NetworkLayerDevice : public NetworkLayer
{
friend class NetworkLayerEntity;
public:
NetworkLayerDevice(DeviceObject& deviceObj, TransportLayer& layer);
virtual NetworkLayerEntity& getEntity(uint8_t interfaceIndex) override;
// from transport layer
virtual void dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu) override;
virtual void dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu) override;
virtual void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu) override;
virtual void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu) override;
private:
// from entities
virtual void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source) override;
virtual void dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority,
uint16_t source, NPDU& npdu, bool status) override;
virtual void broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source) override;
virtual void broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) override;
virtual void systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source) override;
virtual void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) override;
// Support only physical interface for normal devices
NetworkLayerEntity _netLayerEntities[1];
};

View File

@ -9,17 +9,14 @@ class NetworkLayer;
class NetworkLayerEntity class NetworkLayerEntity
{ {
friend class NetworkLayerCoupler;
friend class NetworkLayerDevice;
public: public:
NetworkLayerEntity(NetworkLayer &netLayer, uint8_t entityIndex); NetworkLayerEntity(NetworkLayer &netLayer, uint8_t entityIndex);
void dataLinkLayer(DataLinkLayer& layer); void dataLinkLayer(DataLinkLayer& layer);
// From network layer
/*
void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu);
*/
void sendDataRequest(NPDU& npdu, AckType ack, uint16_t destination, Priority priority, AddressType addrType, SystemBroadcast systemBroadcast);
// from data link layer // from data link layer
void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu, void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source); Priority priority, uint16_t source);
@ -33,6 +30,9 @@ class NetworkLayerEntity
void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status); void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status);
private: private:
// From network layer
void sendDataRequest(NPDU& npdu, AckType ack, uint16_t destination, Priority priority, AddressType addrType, SystemBroadcast systemBroadcast);
DataLinkLayer* _dataLinkLayer = 0; DataLinkLayer* _dataLinkLayer = 0;
NetworkLayer& _netLayer; NetworkLayer& _netLayer;
uint8_t _entityIndex; uint8_t _entityIndex;