From 76013e8bc2e8dc98ef452cfd4b68bac887c36ad7 Mon Sep 17 00:00:00 2001 From: Ing-Dom Date: Tue, 21 May 2024 22:14:04 +0200 Subject: [PATCH] pass src ip and port to ip data link layer --- src/esp32_platform.cpp | 4 +++- src/esp32_platform.h | 2 +- src/knx/ip_data_link_layer.cpp | 19 +++++++++++-------- src/knx/ip_data_link_layer.h | 2 +- src/knx/platform.cpp | 5 +++++ src/knx/platform.h | 1 + src/rp2040_arduino_platform.cpp | 4 +++- src/rp2040_arduino_platform.h | 2 +- 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/esp32_platform.cpp b/src/esp32_platform.cpp index 9367f4e4..3fdef0fd 100644 --- a/src/esp32_platform.cpp +++ b/src/esp32_platform.cpp @@ -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; diff --git a/src/esp32_platform.h b/src/esp32_platform.h index 318291cb..b30c5d55 100644 --- a/src/esp32_platform.h +++ b/src/esp32_platform.h @@ -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; diff --git a/src/knx/ip_data_link_layer.cpp b/src/knx/ip_data_link_layer.cpp index a5113c50..7e905da3 100644 --- a/src/knx/ip_data_link_layer.cpp +++ b/src/knx/ip_data_link_layer.cpp @@ -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; @@ -330,7 +332,7 @@ void IpDataLinkLayer::loop() #ifdef KNX_TUNNELING case ConnectRequest: { - loopHandleConnectRequest(buffer, len); + loopHandleConnectRequest(buffer, len, remoteAddr, remotePort); break; } @@ -343,7 +345,7 @@ void IpDataLinkLayer::loop() case DisconnectRequest: { loopHandleDisconnectRequest(buffer, len); - break;; + break; } case DescriptionRequest: @@ -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 @@ -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; @@ -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()); diff --git a/src/knx/ip_data_link_layer.h b/src/knx/ip_data_link_layer.h index 0f2a8fff..f0974e93 100644 --- a/src/knx/ip_data_link_layer.h +++ b/src/knx/ip_data_link_layer.h @@ -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); diff --git a/src/knx/platform.cpp b/src/knx/platform.cpp index ac22575f..760cad9f 100644 --- a/src/knx/platform.cpp +++ b/src/knx/platform.cpp @@ -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; diff --git a/src/knx/platform.h b/src/knx/platform.h index f79e921e..ad60e065 100644 --- a/src/knx/platform.h +++ b/src/knx/platform.h @@ -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); diff --git a/src/rp2040_arduino_platform.cpp b/src/rp2040_arduino_platform.cpp index e2cafe8f..74ed2744 100644 --- a/src/rp2040_arduino_platform.cpp +++ b/src/rp2040_arduino_platform.cpp @@ -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) @@ -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()); diff --git a/src/rp2040_arduino_platform.h b/src/rp2040_arduino_platform.h index 0ed35e08..c9da3492 100644 --- a/src/rp2040_arduino_platform.h +++ b/src/rp2040_arduino_platform.h @@ -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;