diff --git a/src/controller/CHIPDevice.cpp b/src/controller/CHIPDevice.cpp index f5b14e271a85b1..c9d4af8b9038e5 100644 --- a/src/controller/CHIPDevice.cpp +++ b/src/controller/CHIPDevice.cpp @@ -240,10 +240,11 @@ CHIP_ERROR Device::LoadSecureSessionParameters(ResetTransport resetNeeded) if (resetNeeded == ResetTransport::kYes) { - err = mTransportMgr->ResetTransport(Transport::UdpListenParameters(mInetLayer).SetAddressType(kIPAddressType_IPv6) + err = mTransportMgr->ResetTransport( + Transport::UdpListenParameters(mInetLayer).SetAddressType(kIPAddressType_IPv6).SetListenPort(mListenPort) #if INET_CONFIG_ENABLE_IPV4 - , - Transport::UdpListenParameters(mInetLayer).SetAddressType(kIPAddressType_IPv4) + , + Transport::UdpListenParameters(mInetLayer).SetAddressType(kIPAddressType_IPv4).SetListenPort(mListenPort) #endif ); SuccessOrExit(err); diff --git a/src/controller/CHIPDevice.h b/src/controller/CHIPDevice.h index e5804cfbe4895b..7484608624e5d6 100644 --- a/src/controller/CHIPDevice.h +++ b/src/controller/CHIPDevice.h @@ -103,12 +103,14 @@ class DLL_EXPORT Device * @param[in] transportMgr Transport manager object pointer * @param[in] sessionMgr Secure session manager object pointer * @param[in] inetLayer InetLayer object pointer + * @param[in] listenPort Port on which controller is listening (typically CHIP_PORT) */ - void Init(DeviceTransportMgr * transportMgr, SecureSessionMgr * sessionMgr, Inet::InetLayer * inetLayer) + void Init(DeviceTransportMgr * transportMgr, SecureSessionMgr * sessionMgr, Inet::InetLayer * inetLayer, uint16_t listenPort) { mTransportMgr = transportMgr; mSessionManager = sessionMgr; mInetLayer = inetLayer; + mListenPort = listenPort; } /** @@ -125,14 +127,15 @@ class DLL_EXPORT Device * @param[in] transportMgr Transport manager object pointer * @param[in] sessionMgr Secure session manager object pointer * @param[in] inetLayer InetLayer object pointer + * @param[in] listenPort Port on which controller is listening (typically CHIP_PORT) * @param[in] deviceId Node ID of the device * @param[in] devicePort Port on which device is listening (typically CHIP_PORT) * @param[in] interfaceId Local Interface ID that should be used to talk to the device */ - void Init(DeviceTransportMgr * transportMgr, SecureSessionMgr * sessionMgr, Inet::InetLayer * inetLayer, NodeId deviceId, - uint16_t devicePort, Inet::InterfaceId interfaceId) + void Init(DeviceTransportMgr * transportMgr, SecureSessionMgr * sessionMgr, Inet::InetLayer * inetLayer, uint16_t listenPort, + NodeId deviceId, uint16_t devicePort, Inet::InterfaceId interfaceId) { - Init(transportMgr, sessionMgr, inetLayer); + Init(transportMgr, sessionMgr, inetLayer, mListenPort); mDeviceId = deviceId; mDevicePort = devicePort; mInterface = interfaceId; @@ -256,6 +259,8 @@ class DLL_EXPORT Device * @param[in] resetNeeded Does the underlying network socket require a reset */ CHIP_ERROR LoadSecureSessionParameters(ResetTransport resetNeeded); + + uint16_t mListenPort; }; /** diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index 26af9b6b3f7dcd..a0f61db664f3d1 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -88,6 +88,7 @@ DeviceController::DeviceController() mLocalDeviceId = 0; mStorageDelegate = nullptr; mPairedDevicesInitialized = false; + mListenPort = CHIP_PORT; } CHIP_ERROR DeviceController::Init(NodeId localDeviceId, PersistentStorageDelegate * storageDelegate, System::Layer * systemLayer, @@ -126,10 +127,11 @@ CHIP_ERROR DeviceController::Init(NodeId localDeviceId, PersistentStorageDelegat mTransportMgr = chip::Platform::New(); mSessionManager = chip::Platform::New(); - err = mTransportMgr->Init(Transport::UdpListenParameters(mInetLayer).SetAddressType(Inet::kIPAddressType_IPv6) + err = mTransportMgr->Init( + Transport::UdpListenParameters(mInetLayer).SetAddressType(Inet::kIPAddressType_IPv6).SetListenPort(mListenPort) #if INET_CONFIG_ENABLE_IPV4 - , - Transport::UdpListenParameters(mInetLayer).SetAddressType(Inet::kIPAddressType_IPv4) + , + Transport::UdpListenParameters(mInetLayer).SetAddressType(Inet::kIPAddressType_IPv4).SetListenPort(mListenPort) #endif ); SuccessOrExit(err); @@ -190,6 +192,17 @@ CHIP_ERROR DeviceController::Shutdown() return err; } +CHIP_ERROR DeviceController::SetUdpListenPort(uint16_t listenPort) +{ + if (mState == State::Initialized) + { + return CHIP_ERROR_INCORRECT_STATE; + } + + mListenPort = listenPort; + return CHIP_NO_ERROR; +} + CHIP_ERROR DeviceController::GetDevice(NodeId deviceId, const SerializedDevice & deviceInfo, Device ** out_device) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -214,7 +227,7 @@ CHIP_ERROR DeviceController::GetDevice(NodeId deviceId, const SerializedDevice & err = device->Deserialize(deviceInfo); VerifyOrExit(err == CHIP_NO_ERROR, ReleaseDevice(device)); - device->Init(mTransportMgr, mSessionManager, mInetLayer); + device->Init(mTransportMgr, mSessionManager, mInetLayer, mListenPort); } *out_device = device; @@ -276,7 +289,7 @@ CHIP_ERROR DeviceController::GetDevice(NodeId deviceId, Device ** out_device) err = device->Deserialize(deviceInfo); VerifyOrExit(err == CHIP_NO_ERROR, ReleaseDevice(device)); - device->Init(mTransportMgr, mSessionManager, mInetLayer); + device->Init(mTransportMgr, mSessionManager, mInetLayer, mListenPort); } } @@ -496,7 +509,7 @@ CHIP_ERROR DeviceCommissioner::PairDevice(NodeId remoteDeviceId, RendezvousParam err = mRendezvousSession->Init(params.SetLocalNodeId(mLocalDeviceId).SetRemoteNodeId(remoteDeviceId), mTransportMgr); SuccessOrExit(err); - device->Init(mTransportMgr, mSessionManager, mInetLayer, remoteDeviceId, remotePort, interfaceId); + device->Init(mTransportMgr, mSessionManager, mInetLayer, mListenPort, remoteDeviceId, remotePort, interfaceId); // TODO: BLE rendezvous and IP rendezvous should have same logic in the future after BLE becomes a transport and network // provisiong cluster is ready. @@ -547,7 +560,7 @@ CHIP_ERROR DeviceCommissioner::PairTestDeviceWithoutSecurity(NodeId remoteDevice testSecurePairingSecret->ToSerializable(device->GetPairing()); - device->Init(mTransportMgr, mSessionManager, mInetLayer, remoteDeviceId, remotePort, interfaceId); + device->Init(mTransportMgr, mSessionManager, mInetLayer, mListenPort, remoteDeviceId, remotePort, interfaceId); device->SetAddress(deviceAddr); diff --git a/src/controller/CHIPDeviceController.h b/src/controller/CHIPDeviceController.h index e69c4f621e2679..c12c2881117496 100644 --- a/src/controller/CHIPDeviceController.h +++ b/src/controller/CHIPDeviceController.h @@ -146,6 +146,8 @@ class DLL_EXPORT DeviceController : public SecureSessionMgrDelegate, public Pers */ CHIP_ERROR GetDevice(NodeId deviceId, Device ** device); + CHIP_ERROR SetUdpListenPort(uint16_t listenPort); + virtual void ReleaseDevice(Device * device); // ----- IO ----- @@ -188,6 +190,7 @@ class DLL_EXPORT DeviceController : public SecureSessionMgrDelegate, public Pers PersistentStorageDelegate * mStorageDelegate; Inet::InetLayer * mInetLayer; + uint16_t mListenPort; uint16_t GetInactiveDeviceIndex(); uint16_t FindDeviceIndex(NodeId id); void ReleaseDevice(uint16_t index);