Add secure transport and OAM router runtime implementations

- Implement secure transport mechanisms in `gateway_knx_secure_transport.cpp` for handling secure sessions, including AES encryption, session key generation, and secure packet wrapping and unwrapping.
- Introduce `OamRouterRuntime` in `oam_router_runtime.cpp` to manage OAM router identity, individual addresses, and tunnel frame handling.
- Enhance secure session management with functions for session allocation, authentication, and secure packet processing.
- Ensure compatibility with existing KNXnet/IP protocols while adding support for secure communications.

Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
Tony
2026-05-25 08:18:01 +08:00
parent 0467179f70
commit 2b779d5532
22 changed files with 2665 additions and 77 deletions
+95
View File
@@ -779,6 +779,101 @@ config GATEWAY_KNX_INDIVIDUAL_ADDRESS
Raw 16-bit individual address used by the ETS-programmable KNX-DALI gateway device.
The default 65534 is 15.15.254, used as the unprogrammed logical device address.
config GATEWAY_KNX_OAM_ROUTER_SUPPORTED
bool "OAM-compatible KNX/IP router persona is supported"
depends on GATEWAY_KNX_BRIDGE_SUPPORTED
default n
help
Compiles support for a second OAM-compatible BAU091A KNX/IP router
application behind the same KNXnet/IP endpoint and TP interface as the
KNX-DALI gateway application.
config GATEWAY_KNX_OAM_ROUTER_ENABLED
bool "Enable OAM-compatible KNX/IP router persona by default"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
default n
help
Enables the second router application in the default KNX bridge config.
The physical UDP/TCP endpoint and TP-UART remain shared with the main
KNX/IP router settings.
config GATEWAY_KNX_OAM_ROUTER_OEM_MANUFACTURER_ID
hex "OAM router OEM manufacturer ID"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range 0x0000 0xffff
default 0x00FA
help
Manufacturer ID advertised by the OAM-compatible IP router application.
The default follows the OpenKNX OAM-IP-Router reference database.
config GATEWAY_KNX_OAM_ROUTER_HARDWARE_ID
hex "OAM router hardware ID"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range 0x0000 0xffff
default 0x0001
config GATEWAY_KNX_OAM_ROUTER_APPLICATION_NUMBER
hex "OAM router application number"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range 0x0000 0xffff
default 0xA11F
help
Application number for the OAM IP-Router release database.
config GATEWAY_KNX_OAM_ROUTER_APPLICATION_VERSION
hex "OAM router application version"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range 0x00 0xff
default 0x07
help
Application version for the OAM IP-Router release database.
config GATEWAY_KNX_OAM_ROUTER_INDIVIDUAL_ADDRESS
int "OAM router individual address raw value"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range 0 65535
default 65282
help
Raw 16-bit individual address for the second BAU091A router application.
The default 65282 is 15.15.2.
config GATEWAY_KNX_OAM_ROUTER_TUNNEL_ADDRESS_BASE
int "OAM router tunnel address base raw value"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range 0 65520
default 65296
help
First raw 16-bit individual address reserved for the OAM router tunnel
users. The default 65296 is 15.15.16 and leaves room for 16 tunnels.
config GATEWAY_KNX_OAM_PROGRAMMING_BUTTON_GPIO
int "OAM router programming button GPIO"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range -1 48
default -1
help
GPIO used to toggle programming mode for the second OAM router
application. Set to -1 to disable the local OAM programming button.
config GATEWAY_KNX_OAM_PROGRAMMING_BUTTON_ACTIVE_LOW
bool "OAM router programming button is active low"
depends on GATEWAY_KNX_OAM_PROGRAMMING_BUTTON_GPIO >= 0
default y
config GATEWAY_KNX_OAM_PROGRAMMING_LED_GPIO
int "OAM router programming LED GPIO"
depends on GATEWAY_KNX_OAM_ROUTER_SUPPORTED
range -1 48
default -1
help
GPIO used to show programming mode for the second OAM router
application. Set to -1 to disable the local OAM programming LED.
config GATEWAY_KNX_OAM_PROGRAMMING_LED_ACTIVE_HIGH
bool "OAM router programming LED is active high"
depends on GATEWAY_KNX_OAM_PROGRAMMING_LED_GPIO >= 0
default y
config GATEWAY_KNX_PROGRAMMING_BUTTON_GPIO
int "KNX programming button GPIO"
depends on GATEWAY_KNX_BRIDGE_SUPPORTED
+47
View File
@@ -243,6 +243,22 @@
#define CONFIG_GATEWAY_KNX_IP_INTERFACE_INDIVIDUAL_ADDRESS 65281
#endif
#ifndef CONFIG_GATEWAY_KNX_OAM_ROUTER_INDIVIDUAL_ADDRESS
#define CONFIG_GATEWAY_KNX_OAM_ROUTER_INDIVIDUAL_ADDRESS 65282
#endif
#ifndef CONFIG_GATEWAY_KNX_OAM_ROUTER_TUNNEL_ADDRESS_BASE
#define CONFIG_GATEWAY_KNX_OAM_ROUTER_TUNNEL_ADDRESS_BASE 65296
#endif
#ifndef CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_BUTTON_GPIO
#define CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_BUTTON_GPIO -1
#endif
#ifndef CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_LED_GPIO
#define CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_LED_GPIO -1
#endif
#ifndef CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_GPIO
#define CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_GPIO -1
#endif
@@ -400,6 +416,18 @@ constexpr bool kKnxMulticastEnabled = true;
constexpr bool kKnxMulticastEnabled = false;
#endif
#ifdef CONFIG_GATEWAY_KNX_OAM_ROUTER_SUPPORTED
constexpr bool kKnxOamRouterSupported = true;
#else
constexpr bool kKnxOamRouterSupported = false;
#endif
#ifdef CONFIG_GATEWAY_KNX_OAM_ROUTER_ENABLED
constexpr bool kKnxOamRouterEnabled = true;
#else
constexpr bool kKnxOamRouterEnabled = false;
#endif
#ifdef CONFIG_GATEWAY_CLOUD_BRIDGE_SUPPORTED
constexpr bool kCloudBridgeSupported = true;
#else
@@ -904,6 +932,25 @@ extern "C" void app_main(void) {
static_cast<uint16_t>(CONFIG_GATEWAY_KNX_IP_INTERFACE_INDIVIDUAL_ADDRESS);
default_knx.individual_address =
static_cast<uint16_t>(CONFIG_GATEWAY_KNX_INDIVIDUAL_ADDRESS);
default_knx.oam_router.enabled = kKnxOamRouterSupported && kKnxOamRouterEnabled;
default_knx.oam_router.individual_address =
static_cast<uint16_t>(CONFIG_GATEWAY_KNX_OAM_ROUTER_INDIVIDUAL_ADDRESS);
default_knx.oam_router.tunnel_address_base =
static_cast<uint16_t>(CONFIG_GATEWAY_KNX_OAM_ROUTER_TUNNEL_ADDRESS_BASE);
default_knx.oam_router.programming_button_gpio =
CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_BUTTON_GPIO;
default_knx.oam_router.programming_led_gpio =
CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_LED_GPIO;
#ifdef CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_BUTTON_ACTIVE_LOW
default_knx.oam_router.programming_button_active_low = true;
#else
default_knx.oam_router.programming_button_active_low = false;
#endif
#ifdef CONFIG_GATEWAY_KNX_OAM_PROGRAMMING_LED_ACTIVE_HIGH
default_knx.oam_router.programming_led_active_high = true;
#else
default_knx.oam_router.programming_led_active_high = false;
#endif
default_knx.programming_button_gpio = CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_GPIO;
default_knx.programming_led_gpio = CONFIG_GATEWAY_KNX_PROGRAMMING_LED_GPIO;
#ifdef CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_ACTIVE_LOW
+13 -3
View File
@@ -596,7 +596,7 @@ CONFIG_PARTITION_TABLE_MD5=y
#
# Gateway App
#
CONFIG_GATEWAY_CHANNEL_COUNT=1
CONFIG_GATEWAY_CHANNEL_COUNT=2
#
# Gateway Channel 1
@@ -615,6 +615,15 @@ CONFIG_GATEWAY_CHANNEL1_NATIVE_BAUDRATE=1200
#
# Gateway Channel 2
#
CONFIG_GATEWAY_CHANNEL2_GW_ID=4
# CONFIG_GATEWAY_CHANNEL2_PHY_DISABLED is not set
CONFIG_GATEWAY_CHANNEL2_PHY_NATIVE=y
# CONFIG_GATEWAY_CHANNEL2_PHY_UART1 is not set
# CONFIG_GATEWAY_CHANNEL2_PHY_UART2 is not set
CONFIG_GATEWAY_CHANNEL2_NATIVE_BUS_ID=1
CONFIG_GATEWAY_CHANNEL2_NATIVE_TX_PIN=4
CONFIG_GATEWAY_CHANNEL2_NATIVE_RX_PIN=3
CONFIG_GATEWAY_CHANNEL2_NATIVE_BAUDRATE=1200
# end of Gateway Channel 2
#
@@ -624,7 +633,7 @@ CONFIG_GATEWAY_CACHE_SUPPORTED=y
CONFIG_GATEWAY_CACHE_START_ENABLED=y
CONFIG_GATEWAY_CACHE_RECONCILIATION_ENABLED=y
CONFIG_GATEWAY_CACHE_FULL_STATE_MIRROR=y
CONFIG_GATEWAY_CACHE_FLUSH_INTERVAL_MS=10000
CONFIG_GATEWAY_CACHE_FLUSH_INTERVAL_MS=600000
CONFIG_GATEWAY_CACHE_REFRESH_INTERVAL_MS=120000
CONFIG_GATEWAY_CACHE_OUTSIDE_BUS_FIRST=y
# CONFIG_GATEWAY_CACHE_LOCAL_GATEWAY_FIRST is not set
@@ -658,7 +667,7 @@ CONFIG_GATEWAY_ETHERNET_W5500_MISO_GPIO=33
CONFIG_GATEWAY_ETHERNET_W5500_CS_GPIO=34
CONFIG_GATEWAY_ETHERNET_W5500_INT_GPIO=36
CONFIG_GATEWAY_ETHERNET_W5500_POLL_PERIOD_MS=0
CONFIG_GATEWAY_ETHERNET_W5500_CLOCK_MHZ=40
CONFIG_GATEWAY_ETHERNET_W5500_CLOCK_MHZ=20
CONFIG_GATEWAY_ETHERNET_PHY_RESET_GPIO=-1
CONFIG_GATEWAY_ETHERNET_PHY_ADDR=1
CONFIG_GATEWAY_ETHERNET_RX_TASK_STACK_SIZE=4096
@@ -693,6 +702,7 @@ CONFIG_GATEWAY_KNX_UDP_PORT=3671
CONFIG_GATEWAY_KNX_MULTICAST_ADDRESS="224.0.23.12"
CONFIG_GATEWAY_KNX_IP_INTERFACE_INDIVIDUAL_ADDRESS=65281
CONFIG_GATEWAY_KNX_INDIVIDUAL_ADDRESS=65534
# CONFIG_GATEWAY_KNX_OAM_ROUTER_SUPPORTED is not set
CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_GPIO=0
CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_ACTIVE_LOW=y
CONFIG_GATEWAY_KNX_PROGRAMMING_LED_GPIO=10
+6 -2
View File
@@ -622,9 +622,12 @@ CONFIG_GATEWAY_CHANNEL1_NATIVE_BAUDRATE=1200
#
CONFIG_GATEWAY_CACHE_SUPPORTED=y
CONFIG_GATEWAY_CACHE_START_ENABLED=y
# CONFIG_GATEWAY_CACHE_RECONCILIATION_ENABLED is not set
CONFIG_GATEWAY_CACHE_RECONCILIATION_ENABLED=y
CONFIG_GATEWAY_CACHE_FULL_STATE_MIRROR=y
CONFIG_GATEWAY_CACHE_FLUSH_INTERVAL_MS=10000
CONFIG_GATEWAY_CACHE_REFRESH_INTERVAL_MS=120000
CONFIG_GATEWAY_CACHE_OUTSIDE_BUS_FIRST=y
# CONFIG_GATEWAY_CACHE_LOCAL_GATEWAY_FIRST is not set
# end of Gateway Cache
# CONFIG_GATEWAY_ENABLE_DALI_BUS is not set
@@ -655,7 +658,7 @@ CONFIG_GATEWAY_ETHERNET_W5500_MISO_GPIO=33
CONFIG_GATEWAY_ETHERNET_W5500_CS_GPIO=34
CONFIG_GATEWAY_ETHERNET_W5500_INT_GPIO=36
CONFIG_GATEWAY_ETHERNET_W5500_POLL_PERIOD_MS=0
CONFIG_GATEWAY_ETHERNET_W5500_CLOCK_MHZ=40
CONFIG_GATEWAY_ETHERNET_W5500_CLOCK_MHZ=20
CONFIG_GATEWAY_ETHERNET_PHY_RESET_GPIO=-1
CONFIG_GATEWAY_ETHERNET_PHY_ADDR=1
CONFIG_GATEWAY_ETHERNET_RX_TASK_STACK_SIZE=4096
@@ -690,6 +693,7 @@ CONFIG_GATEWAY_KNX_UDP_PORT=3671
CONFIG_GATEWAY_KNX_MULTICAST_ADDRESS="224.0.23.12"
CONFIG_GATEWAY_KNX_IP_INTERFACE_INDIVIDUAL_ADDRESS=65281
CONFIG_GATEWAY_KNX_INDIVIDUAL_ADDRESS=65534
# CONFIG_GATEWAY_KNX_OAM_ROUTER_SUPPORTED is not set
CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_GPIO=0
CONFIG_GATEWAY_KNX_PROGRAMMING_BUTTON_ACTIVE_LOW=y
CONFIG_GATEWAY_KNX_PROGRAMMING_LED_GPIO=10