Skip to content

Commit 79964fc

Browse files
authored
Send current IP address during network provisioning (#4591)
1 parent 6e13df1 commit 79964fc

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/transport/NetworkProvisioning.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@
3434

3535
namespace chip {
3636

37+
#ifdef IFNAMSIZ
38+
constexpr uint16_t kMaxInterfaceName = IFNAMSIZ;
39+
#else
40+
constexpr uint16_t kMaxInterfaceName = 32;
41+
#endif
42+
43+
constexpr char kAPInterfaceNamePrefix[] = "ap";
44+
constexpr char kLoobackInterfaceNamePrefix[] = "lo";
45+
3746
void NetworkProvisioning::Init(NetworkProvisioningDelegate * delegate)
3847
{
3948
mDelegate = delegate;
@@ -81,6 +90,12 @@ CHIP_ERROR NetworkProvisioning::HandleNetworkProvisioningMessage(uint8_t msgType
8190
#if defined(CHIP_DEVICE_LAYER_TARGET)
8291
DeviceLayer::DeviceNetworkProvisioningDelegateImpl deviceDelegate;
8392
err = deviceDelegate.ProvisionWiFi(SSID, passwd);
93+
SuccessOrExit(err);
94+
95+
if (DeviceLayer::ConnectivityMgr().IsWiFiStationConnected())
96+
{
97+
err = SendCurrentIPv4Address();
98+
}
8499
#endif
85100
#endif
86101
}
@@ -187,6 +202,26 @@ CHIP_ERROR NetworkProvisioning::SendIPAddress(const Inet::IPAddress & addr)
187202
return err;
188203
}
189204

205+
CHIP_ERROR NetworkProvisioning::SendCurrentIPv4Address()
206+
{
207+
for (chip::Inet::InterfaceAddressIterator it; it.HasCurrent(); it.Next())
208+
{
209+
char ifName[kMaxInterfaceName];
210+
if (it.IsUp() && CHIP_NO_ERROR == it.GetInterfaceName(ifName, sizeof(ifName)) &&
211+
memcmp(ifName, kAPInterfaceNamePrefix, sizeof(kAPInterfaceNamePrefix) - 1) &&
212+
memcmp(ifName, kLoobackInterfaceNamePrefix, sizeof(kLoobackInterfaceNamePrefix) - 1))
213+
{
214+
chip::Inet::IPAddress addr = it.GetAddress();
215+
if (addr.IsIPv4())
216+
{
217+
return SendIPAddress(addr);
218+
}
219+
}
220+
}
221+
222+
return CHIP_NO_ERROR;
223+
}
224+
190225
CHIP_ERROR NetworkProvisioning::SendNetworkCredentials(const char * ssid, const char * passwd)
191226
{
192227
CHIP_ERROR err = CHIP_NO_ERROR;

src/transport/NetworkProvisioning.h

+8
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ class DLL_EXPORT NetworkProvisioning
113113
*/
114114
CHIP_ERROR SendIPAddress(const Inet::IPAddress & addr);
115115

116+
/**
117+
* @brief
118+
* The device can use this function to send its current IP address to
119+
* commissioner. This would generally be called during network
120+
* provisioning of the device, when the device already has an IP address.
121+
*/
122+
CHIP_ERROR SendCurrentIPv4Address();
123+
116124
static size_t EncodedStringSize(const char * str);
117125
static CHIP_ERROR EncodeString(const char * str, BufBound & bbuf);
118126
static CHIP_ERROR DecodeString(const uint8_t * input, size_t input_len, BufBound & bbuf, size_t & consumed);

0 commit comments

Comments
 (0)