Skip to content

Commit

Permalink
fix all ready to merge
Browse files Browse the repository at this point in the history
  • Loading branch information
Ing-Dom committed Feb 11, 2024
1 parent f50bb3a commit baa68e5
Show file tree
Hide file tree
Showing 9 changed files with 40 additions and 10 deletions.
8 changes: 7 additions & 1 deletion src/knx/data_link_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ void DataLinkLayer::dataIndicationToTunnel(CemiFrame& frame)
{
println("default dataIndicationToTunnel");
}

bool DataLinkLayer::isTunnelAddress(uint16_t addr)
{
println("default IsTunnelAddress");
return false;
}
#endif

void DataLinkLayer::dataRequestFromTunnel(CemiFrame& frame)
Expand Down Expand Up @@ -210,7 +216,7 @@ bool DataLinkLayer::sendTelegram(NPDU & npdu, AckType ack, uint16_t destinationA
#endif
tmpFrame.confirm(ConfirmNoError);

if(frame.sourceAddress() == _deviceObject.individualAddress() && mediumType() == DptMedium::KNX_TP1) // quick fix only send to tunnel if we are the tpuart data link layer
if(frame.sourceAddress() == _deviceObject.individualAddress() && _networkLayerEntity.getEntityIndex() == 1) // only send to tunnel if we are the secondary interface
_cemiServer->dataIndicationToTunnel(tmpFrame);
#endif

Expand Down
1 change: 1 addition & 0 deletions src/knx/data_link_layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class DataLinkLayer
virtual void dataRequestToTunnel(CemiFrame& frame);
virtual void dataConfirmationToTunnel(CemiFrame& frame);
virtual void dataIndicationToTunnel(CemiFrame& frame);
virtual bool isTunnelAddress(uint16_t addr);
#endif
#endif

Expand Down
12 changes: 12 additions & 0 deletions src/knx/ip_data_link_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,18 @@ void IpDataLinkLayer::sendFrameToTunnel(KnxIpTunnelConnection *tunnel, CemiFrame

_platform.sendBytesUniCast(tunnel->IpAddress, tunnel->PortData, req.data(), req.totalLength());
}

bool IpDataLinkLayer::isTunnelAddress(uint16_t addr)
{
if(addr == 0)
return false; // 0.0.0 is not a valid tunnel address and is used as default value

for(int i = 0; i < KNX_TUNNELING; i++)
if(tunnels[i].IndividualAddress == addr)
return true;

return false;
}
#endif

void IpDataLinkLayer::loop()
Expand Down
1 change: 1 addition & 0 deletions src/knx/ip_data_link_layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class IpDataLinkLayer : public DataLinkLayer
void dataRequestToTunnel(CemiFrame& frame) override;
void dataConfirmationToTunnel(CemiFrame& frame) override;
void dataIndicationToTunnel(CemiFrame& frame) override;
bool isTunnelAddress(uint16_t addr) override;
#endif

private:
Expand Down
14 changes: 6 additions & 8 deletions src/knx/network_layer_coupler.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "network_layer_coupler.h"
#include "data_link_layer.h"
#include "device_object.h"
#include "router_object.h"
#include "tpdu.h"
Expand Down Expand Up @@ -348,8 +349,9 @@ void NetworkLayerCoupler::routeDataIndividual(AckType ack, uint16_t destination,
// if destination is not within our scope then send via primary interface, else via secondary interface
uint8_t destIfidx = (Z != netaddr) ? kPrimaryIfIndex : kSecondaryIfIndex;
#ifdef KNX_TUNNELING
if(isTunnelAddress(destination))
destIfidx = kSecondaryIfIndex;
if(destIfidx == kPrimaryIfIndex)
if(isTunnelAddress(destination))
destIfidx = kSecondaryIfIndex;
#endif
//print("NetworkLayerCoupler::routeDataIndividual local to s or p: ");
//println(destIfidx);
Expand Down Expand Up @@ -587,10 +589,6 @@ void NetworkLayerCoupler::dataSystemBroadcastRequest(AckType ack, HopCountType h

bool NetworkLayerCoupler::isTunnelAddress(uint16_t destination)
{
_netLayerEntities[kSecondaryIfIndex].dataLinkLayer().mediumType();
// FIXME
if((destination / 0x100) == 0xFF)
return true;

return false;
// tunnels are managed within the IpDataLinkLayer - kPrimaryIfIndex
return _netLayerEntities[kPrimaryIfIndex].dataLinkLayer().isTunnelAddress(destination);
}
5 changes: 5 additions & 0 deletions src/knx/network_layer_entity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ DataLinkLayer& NetworkLayerEntity::dataLinkLayer()
return *_dataLinkLayer;
}

NetworkLayer& NetworkLayerEntity::networkLayer()
{
return _netLayer;
}

DptMedium NetworkLayerEntity::mediumType() const
{
return _dataLinkLayer->mediumType();
Expand Down
1 change: 1 addition & 0 deletions src/knx/network_layer_entity.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class NetworkLayerEntity

void dataLinkLayer(DataLinkLayer& layer);
DataLinkLayer& dataLinkLayer();
NetworkLayer& networkLayer();

DptMedium mediumType() const;
uint8_t getEntityIndex();
Expand Down
6 changes: 6 additions & 0 deletions src/knx/tpuart_data_link_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,12 @@ void TpUartDataLinkLayer::addFrameTxQueue(CemiFrame& frame)
}
}

bool TpUartDataLinkLayer::isTunnelAddress(uint16_t addr)
{
println("TpDataLinkLayer::isTunnelAddress");
return false;
}

bool TpUartDataLinkLayer::isTxQueueEmpty()
{
if (_tx_queue.front == NULL)
Expand Down
2 changes: 1 addition & 1 deletion src/knx/tpuart_data_link_layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class TpUartDataLinkLayer : public DataLinkLayer
bool enabled() const;
void setFrameRepetition(uint8_t nack, uint8_t busy);
DptMedium mediumType() const override;

bool isTunnelAddress(uint16_t addr) override;
private:
bool _enabled = false;
uint8_t* _sendBuffer = 0;
Expand Down

0 comments on commit baa68e5

Please sign in to comment.