|
|
@@ -78,6 +78,29 @@ chip::ByteSpan FillMAC(uint8_t (&mac)[8])
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
+uint16_t gSecuredPort = CHIP_PORT;
|
|
|
+uint16_t gUnsecuredPort = CHIP_UDC_PORT;
|
|
|
+
|
|
|
+void SetSecuredPort(uint16_t port)
|
|
|
+{
|
|
|
+ gSecuredPort = port;
|
|
|
+}
|
|
|
+
|
|
|
+uint16_t GetSecuredPort()
|
|
|
+{
|
|
|
+ return gSecuredPort;
|
|
|
+}
|
|
|
+
|
|
|
+void SetUnsecuredPort(uint16_t port)
|
|
|
+{
|
|
|
+ gUnsecuredPort = port;
|
|
|
+}
|
|
|
+
|
|
|
+uint16_t GetUnsecuredPort()
|
|
|
+{
|
|
|
+ return gUnsecuredPort;
|
|
|
+}
|
|
|
+
|
|
|
CHIP_ERROR GetCommissionableInstanceName(char * buffer, size_t bufferLen)
|
|
|
{
|
|
|
auto & mdnsAdvertiser = chip::Mdns::ServiceAdvertiser::Instance();
|
|
|
@@ -97,7 +120,7 @@ CHIP_ERROR AdvertiseOperational()
|
|
|
chip::Mdns::OperationalAdvertisingParameters()
|
|
|
.SetPeerId(PeerId().SetFabricId(fabricInfo.GetFabricId()).SetNodeId(fabricInfo.GetNodeId()))
|
|
|
.SetMac(FillMAC(mac))
|
|
|
- .SetPort(CHIP_PORT)
|
|
|
+ .SetPort(GetSecuredPort())
|
|
|
.SetMRPRetryIntervals(CHIP_CONFIG_MRP_DEFAULT_ACTIVE_RETRY_INTERVAL,
|
|
|
CHIP_CONFIG_MRP_DEFAULT_ACTIVE_RETRY_INTERVAL)
|
|
|
.EnableIpV4(true);
|
|
|
@@ -112,35 +135,27 @@ CHIP_ERROR AdvertiseOperational()
|
|
|
ReturnErrorOnFailure(mdnsAdvertiser.Advertise(advertiseParameters));
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
return CHIP_NO_ERROR;
|
|
|
}
|
|
|
|
|
|
-/// Set MDNS commissioner advertisement
|
|
|
-CHIP_ERROR AdvertiseCommisioner()
|
|
|
-{
|
|
|
- return Advertise(false);
|
|
|
-}
|
|
|
-
|
|
|
-/// Set MDNS commissionable node advertisement
|
|
|
-CHIP_ERROR AdvertiseCommissionableNode()
|
|
|
+/// Overloaded utility method for commissioner and commissionable advertisement
|
|
|
+/// This method is used for both commissioner discovery and commissionable node discovery since
|
|
|
+/// they share many fields.
|
|
|
+/// commissionableNode = true : advertise commissionable node
|
|
|
+/// commissionableNode = false : advertise commissioner
|
|
|
+CHIP_ERROR Advertise(bool commissionableNode, CommissioningMode mode)
|
|
|
{
|
|
|
- return Advertise(true);
|
|
|
-}
|
|
|
+ bool commissioningMode = (mode != CommissioningMode::kDisabled);
|
|
|
+ bool additionalCommissioning = (mode == CommissioningMode::kEnabledEnhanced);
|
|
|
|
|
|
-/// commissionableNode
|
|
|
-// CHIP_ERROR Advertise(chip::Mdns::CommssionAdvertiseMode mode)
|
|
|
-CHIP_ERROR Advertise(bool commissionableNode)
|
|
|
-{
|
|
|
- auto advertiseParameters = chip::Mdns::CommissionAdvertisingParameters().SetPort(CHIP_PORT).EnableIpV4(true);
|
|
|
+ auto advertiseParameters = chip::Mdns::CommissionAdvertisingParameters()
|
|
|
+ .SetPort(commissionableNode ? GetSecuredPort() : GetUnsecuredPort())
|
|
|
+ .EnableIpV4(true);
|
|
|
advertiseParameters.SetCommissionAdvertiseMode(commissionableNode ? chip::Mdns::CommssionAdvertiseMode::kCommissionableNode
|
|
|
: chip::Mdns::CommssionAdvertiseMode::kCommissioner);
|
|
|
|
|
|
- // TODO: device can re-enter commissioning mode after being fully provisioned
|
|
|
- // (additionalPairing == true)
|
|
|
- bool notYetCommissioned = !DeviceLayer::ConfigurationMgr().IsFullyProvisioned();
|
|
|
- bool additionalPairing = false;
|
|
|
- advertiseParameters.SetCommissioningMode(notYetCommissioned, additionalPairing);
|
|
|
+ advertiseParameters.SetCommissioningMode(commissioningMode);
|
|
|
+ advertiseParameters.SetAdditionalCommissioning(additionalCommissioning);
|
|
|
|
|
|
char pairingInst[chip::Mdns::kKeyPairingInstructionMaxLength + 1];
|
|
|
|
|
|
@@ -192,7 +207,7 @@ CHIP_ERROR Advertise(bool commissionableNode)
|
|
|
advertiseParameters.SetRotatingId(chip::Optional<const char *>::Value(rotatingDeviceIdHexBuffer));
|
|
|
#endif
|
|
|
|
|
|
- if (notYetCommissioned)
|
|
|
+ if (!additionalCommissioning)
|
|
|
{
|
|
|
if (DeviceLayer::ConfigurationMgr().GetInitialPairingHint(value) != CHIP_NO_ERROR)
|
|
|
{
|
|
|
@@ -241,10 +256,23 @@ CHIP_ERROR Advertise(bool commissionableNode)
|
|
|
return mdnsAdvertiser.Advertise(advertiseParameters);
|
|
|
}
|
|
|
|
|
|
+/// Set MDNS commissioner advertisement
|
|
|
+CHIP_ERROR AdvertiseCommissioner()
|
|
|
+{
|
|
|
+ return Advertise(false /* commissionableNode */, CommissioningMode::kDisabled);
|
|
|
+}
|
|
|
+
|
|
|
+/// Set MDNS commissionable node advertisement
|
|
|
+CHIP_ERROR AdvertiseCommissionableNode(CommissioningMode mode)
|
|
|
+{
|
|
|
+ return Advertise(true /* commissionableNode */, mode);
|
|
|
+}
|
|
|
+
|
|
|
/// (Re-)starts the minmdns server
|
|
|
-void StartServer()
|
|
|
+/// - if device has not yet been commissioned, then commissioning mode will show as enabled (CM=1, AC=0)
|
|
|
+/// - if device has been commissioned, then commissioning mode will reflect the state of mode argument
|
|
|
+void StartServer(CommissioningMode mode)
|
|
|
{
|
|
|
- ChipLogProgress(Discovery, "Start dns-sd server");
|
|
|
CHIP_ERROR err = chip::Mdns::ServiceAdvertiser::Instance().Start(&chip::DeviceLayer::InetLayer, chip::Mdns::kMdnsPort);
|
|
|
|
|
|
err = app::Mdns::AdvertiseOperational();
|
|
|
@@ -255,25 +283,44 @@ void StartServer()
|
|
|
|
|
|
if (HaveOperationalCredentials())
|
|
|
{
|
|
|
+ if (mode != CommissioningMode::kDisabled)
|
|
|
+ {
|
|
|
+ err = app::Mdns::AdvertiseCommissionableNode(mode);
|
|
|
+ if (err != CHIP_NO_ERROR)
|
|
|
+ {
|
|
|
+ ChipLogError(Discovery, "Failed to advertise commissionable node: %s", chip::ErrorStr(err));
|
|
|
+ }
|
|
|
+ }
|
|
|
#if CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
|
|
|
- err = app::Mdns::AdvertiseCommissionableNode();
|
|
|
-#endif
|
|
|
+ else
|
|
|
+ {
|
|
|
+ err = app::Mdns::AdvertiseCommissionableNode(mode);
|
|
|
+ if (err != CHIP_NO_ERROR)
|
|
|
+ {
|
|
|
+ ChipLogError(Discovery, "Failed to advertise extended commissionable node: %s", chip::ErrorStr(err));
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif // CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
#if CHIP_DEVICE_CONFIG_ENABLE_UNPROVISIONED_MDNS
|
|
|
- err = app::Mdns::AdvertiseCommissionableNode();
|
|
|
+ ChipLogProgress(Discovery, "Start dns-sd server - no current nodeId");
|
|
|
+ err = app::Mdns::AdvertiseCommissionableNode(CommissioningMode::kEnabledBasic);
|
|
|
+ if (err != CHIP_NO_ERROR)
|
|
|
+ {
|
|
|
+ ChipLogError(Discovery, "Failed to advertise unprovisioned commissionable node: %s", chip::ErrorStr(err));
|
|
|
+ }
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
#if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
|
|
|
- err = app::Mdns::AdvertiseCommisioner();
|
|
|
-#endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
|
|
|
-
|
|
|
+ err = app::Mdns::AdvertiseCommissioner();
|
|
|
if (err != CHIP_NO_ERROR)
|
|
|
{
|
|
|
- ChipLogError(Discovery, "Failed to start mDNS server: %s", chip::ErrorStr(err));
|
|
|
+ ChipLogError(Discovery, "Failed to advertise commissioner: %s", chip::ErrorStr(err));
|
|
|
}
|
|
|
+#endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
|
|
|
}
|
|
|
|
|
|
#if CHIP_ENABLE_ROTATING_DEVICE_ID
|