Skip to content

Commit

Permalink
pass src ip and port to ip data link layer
Browse files Browse the repository at this point in the history
  • Loading branch information
Ing-Dom committed May 21, 2024
1 parent 94892ec commit 76013e8
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 13 deletions.
4 changes: 3 additions & 1 deletion src/esp32_platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,11 @@ bool Esp32Platform::sendBytesMultiCast(uint8_t * buffer, uint16_t len)
return true;
}

int Esp32Platform::readBytesMultiCast(uint8_t * buffer, uint16_t maxLen)
int Esp32Platform::readBytesMultiCast(uint8_t * buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port)
{
int len = _udp.parsePacket();
src_addr = _udp.remoteIP();
src_port = _udp.remotePort();
if (len == 0)
return 0;

Expand Down
2 changes: 1 addition & 1 deletion src/esp32_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class Esp32Platform : public ArduinoPlatform
void setupMultiCast(uint32_t addr, uint16_t port) override;
void closeMultiCast() override;
bool sendBytesMultiCast(uint8_t* buffer, uint16_t len) override;
int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen) override;
int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port) override;

//unicast
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
Expand Down
19 changes: 11 additions & 8 deletions src/knx/ip_data_link_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,9 @@ void IpDataLinkLayer::loop()


uint8_t buffer[512];
int len = _platform.readBytesMultiCast(buffer, 512);
uint16_t remotePort = 0;
uint32_t remoteAddr = 0;
int len = _platform.readBytesMultiCast(buffer, 512, remoteAddr, remotePort);
if (len <= 0)
return;

Expand Down Expand Up @@ -330,7 +332,7 @@ void IpDataLinkLayer::loop()
#ifdef KNX_TUNNELING
case ConnectRequest:
{
loopHandleConnectRequest(buffer, len);
loopHandleConnectRequest(buffer, len, remoteAddr, remotePort);
break;
}

Expand All @@ -343,7 +345,7 @@ void IpDataLinkLayer::loop()
case DisconnectRequest:
{
loopHandleDisconnectRequest(buffer, len);
break;;
break;
}

case DescriptionRequest:
Expand Down Expand Up @@ -513,7 +515,7 @@ void IpDataLinkLayer::loopHandleSearchRequestExtended(uint8_t* buffer, uint16_t
#endif

#ifdef KNX_TUNNELING
void IpDataLinkLayer::loopHandleConnectRequest(uint8_t* buffer, uint16_t length)
void IpDataLinkLayer::loopHandleConnectRequest(uint8_t* buffer, uint16_t length, uint32_t& src_addr, uint16_t& src_port)
{
KnxIpConnectRequest connRequest(buffer, length);
#ifdef KNX_LOG_TUNNELING
Expand Down Expand Up @@ -585,7 +587,8 @@ void IpDataLinkLayer::loopHandleConnectRequest(uint8_t* buffer, uint16_t length)

// data preparation

uint32_t srcIP = connRequest.hpaiCtrl().ipAddress();
uint32_t srcIP = connRequest.hpaiCtrl().ipAddress()? connRequest.hpaiCtrl().ipAddress() : src_addr;
uint16_t srcPort = connRequest.hpaiCtrl().ipPortNumber()? connRequest.hpaiCtrl().ipPortNumber() : src_port;

// read current elements in PID_ADDITIONAL_INDIVIDUAL_ADDRESSES
uint16_t propCount = 0;
Expand Down Expand Up @@ -803,9 +806,9 @@ void IpDataLinkLayer::loopHandleConnectRequest(uint8_t* buffer, uint16_t length)
println(tun->IndividualAddress & 0xFF);
#endif

tun->IpAddress = connRequest.hpaiData().ipAddress();
tun->PortData = connRequest.hpaiData().ipPortNumber();
tun->PortCtrl = connRequest.hpaiCtrl().ipPortNumber();
tun->IpAddress = srcIP;
tun->PortData = srcPort;
tun->PortCtrl = connRequest.hpaiCtrl().ipPortNumber()?connRequest.hpaiCtrl().ipPortNumber():srcPort;

KnxIpConnectResponse connRes(_ipParameters, tun->IndividualAddress, 3671, tun->ChannelId, connRequest.cri().type());
_platform.sendBytesUniCast(tun->IpAddress, tun->PortCtrl, connRes.data(), connRes.totalLength());
Expand Down
2 changes: 1 addition & 1 deletion src/knx/ip_data_link_layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class IpDataLinkLayer : public DataLinkLayer
bool sendFrame(CemiFrame& frame);
#ifdef KNX_TUNNELING
void sendFrameToTunnel(KnxIpTunnelConnection *tunnel, CemiFrame& frame);
void loopHandleConnectRequest(uint8_t* buffer, uint16_t length);
void loopHandleConnectRequest(uint8_t* buffer, uint16_t length, uint32_t& src_addr, uint16_t& src_port);
void loopHandleConnectionStateRequest(uint8_t* buffer, uint16_t length);
void loopHandleDisconnectRequest(uint8_t* buffer, uint16_t length);
void loopHandleDescriptionRequest(uint8_t* buffer, uint16_t length);
Expand Down
5 changes: 5 additions & 0 deletions src/knx/platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@ int Platform::readBytesMultiCast(uint8_t *buffer, uint16_t maxLen)
return 0;
}

int Platform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port)
{
return readBytesMultiCast(buffer, maxLen);
}

size_t Platform::flashEraseBlockSize()
{
return 0;
Expand Down
1 change: 1 addition & 0 deletions src/knx/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class Platform
virtual void closeMultiCast();
virtual bool sendBytesMultiCast(uint8_t* buffer, uint16_t len);
virtual int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen);
virtual int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port);

//unicast socket
virtual bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len);
Expand Down
4 changes: 3 additions & 1 deletion src/rp2040_arduino_platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ bool RP2040ArduinoPlatform::sendBytesMultiCast(uint8_t* buffer, uint16_t len)
return true;
}

int RP2040ArduinoPlatform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen)
int RP2040ArduinoPlatform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port)
{
int len = _udp.parsePacket();
if (len == 0)
Expand All @@ -339,6 +339,8 @@ int RP2040ArduinoPlatform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen)
_udp.read(buffer, len);
_remoteIP = _udp.remoteIP();
_remotePort = _udp.remotePort();
src_addr = _remoteIP;
src_port = _remotePort;

// print("Remote IP: ");
// print(_udp.remoteIP().toString().c_str());
Expand Down
2 changes: 1 addition & 1 deletion src/rp2040_arduino_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ class RP2040ArduinoPlatform : public ArduinoPlatform
void setupMultiCast(uint32_t addr, uint16_t port) override;
void closeMultiCast() override;
bool sendBytesMultiCast(uint8_t* buffer, uint16_t len) override;
int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen) override;
int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port) override;

// unicast
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
Expand Down

0 comments on commit 76013e8

Please sign in to comment.