blob: 6e2602573013242501a595af268e2a25d51e1947 [file] [log] [blame]
Andrei Litvin58746882021-01-12 11:57:24 -05001/*
2 *
3 * Copyright (c) 2020 Project CHIP Authors
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17#include <cstdio>
18#include <memory>
Andrei Litvin9ed9c722024-04-30 12:53:56 -040019#include <optional>
Andrei Litvin58746882021-01-12 11:57:24 -050020
21#include <arpa/inet.h>
22#include <strings.h>
23
Andrei Litvin00b522f2023-06-13 11:32:16 -040024#include <TracingCommandLineArgument.h>
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +020025#include <lib/dnssd/Advertiser.h>
Zang MingJie53dd5832021-09-03 03:05:16 +080026#include <lib/support/CHIPArgParser.hpp>
27#include <lib/support/CHIPMem.h>
28#include <lib/support/Span.h>
Andrei Litvin58746882021-01-12 11:57:24 -050029#include <platform/CHIPDeviceLayer.h>
Andrei Litvin58746882021-01-12 11:57:24 -050030
31using namespace chip;
32
33namespace {
34
35enum class AdvertisingMode
36{
chrisdecenzo8d404092021-05-07 17:27:17 -070037 kCommissionableNode,
Andrei Litvin58746882021-01-12 11:57:24 -050038 kOperational,
Andrei Litvinf11287f2023-06-19 11:32:19 -040039 kOperationalMultiAdmin,
chrisdecenzo8d404092021-05-07 17:27:17 -070040 kCommissioner,
Andrei Litvin58746882021-01-12 11:57:24 -050041};
42
43struct Options
44{
45 bool enableIpV4 = false;
chrisdecenzo8d404092021-05-07 17:27:17 -070046 AdvertisingMode advertisingMode = AdvertisingMode::kCommissionableNode;
Andrei Litvin58746882021-01-12 11:57:24 -050047
chrisdecenzo8d404092021-05-07 17:27:17 -070048 // commissionable node / commissioner params
Andrei Litvin9ed9c722024-04-30 12:53:56 -040049 std::optional<uint16_t> vendorId;
50 std::optional<uint16_t> productId;
51 std::optional<uint32_t> deviceType;
52 std::optional<const char *> deviceName;
Andrei Litvin58746882021-01-12 11:57:24 -050053
Martin Turond24eff12021-12-17 06:21:23 -080054 // commissionable node params
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +020055 uint8_t shortDiscriminator = 52;
56 uint16_t longDiscriminator = 840;
57 Dnssd::CommissioningMode commissioningMode = Dnssd::CommissioningMode::kDisabled;
Andrei Litvin9ed9c722024-04-30 12:53:56 -040058 std::optional<const char *> rotatingId;
59 std::optional<const char *> pairingInstr;
60 std::optional<uint16_t> pairingHint;
Arun Bharadwajbe3279a2021-01-14 14:47:17 -080061
Andrei Litvin58746882021-01-12 11:57:24 -050062 // operational params
63 uint64_t fabricId = 12345;
64 uint64_t nodeId = 6789;
cecille551c87c2021-04-06 11:26:36 -040065 uint8_t mac[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Andrei Litvin58746882021-01-12 11:57:24 -050066
67} gOptions;
68
69using namespace chip::ArgParser;
70
71constexpr uint16_t kOptionEnableIpV4 = '4';
72constexpr uint16_t kOptionAdvertisingMode = 'm';
73
Martin Turond24eff12021-12-17 06:21:23 -080074constexpr uint16_t kOptionCommissioningShortDiscriminator = 's';
75constexpr uint16_t kOptionCommissioningLongDiscriminaotr = 'l';
76constexpr uint16_t kOptionCommissioningVendorId = 0x100; // v is used by 'version'
77constexpr uint16_t kOptionCommissioningProductId = 'p';
78constexpr uint16_t kOptionCommissioningPairingInstr = 0x200; // Just use the long format
79constexpr uint16_t kOptionCommissioningPairingHint = 0x300;
80constexpr uint16_t kOptionCommissioningDeviceType = 0x400;
81constexpr uint16_t kOptionCommissioningDeviceName = 0x500;
82constexpr uint16_t kOptionCommissioningMode = 0x600;
83constexpr uint16_t kOptionCommissioningRotatingId = 0x700;
Andrei Litvin58746882021-01-12 11:57:24 -050084
85constexpr uint16_t kOptionOperationalFabricId = 'f';
86constexpr uint16_t kOptionOperationalNodeId = 'n';
Andrei Litvin00b522f2023-06-13 11:32:16 -040087constexpr uint16_t kOptionTraceTo = 't';
Andrei Litvin58746882021-01-12 11:57:24 -050088
Andrei Litvind3564842023-06-23 12:30:50 -040089// Only used for argument parsing. Tracing setup owned by the main loop.
90chip::CommandLineApp::TracingSetup * tracing_setup_for_argparse = nullptr;
91
Andrei Litvin58746882021-01-12 11:57:24 -050092bool HandleOptions(const char * aProgram, OptionSet * aOptions, int aIdentifier, const char * aName, const char * aValue)
93{
chrisdecenzo97d9f7e2021-09-14 10:37:29 -070094 uint8_t cm;
Andrei Litvin58746882021-01-12 11:57:24 -050095 switch (aIdentifier)
96 {
97 case kOptionEnableIpV4:
98 gOptions.enableIpV4 = true;
99 return true;
Andrei Litvin00b522f2023-06-13 11:32:16 -0400100 case kOptionTraceTo:
Andrei Litvind3564842023-06-23 12:30:50 -0400101 tracing_setup_for_argparse->EnableTracingFor(aValue);
Andrei Litvin00b522f2023-06-13 11:32:16 -0400102 return true;
Andrei Litvin58746882021-01-12 11:57:24 -0500103 case kOptionAdvertisingMode:
Arun Bharadwajbe3279a2021-01-14 14:47:17 -0800104 if (strcmp(aValue, "operational") == 0)
Andrei Litvin58746882021-01-12 11:57:24 -0500105 {
106 gOptions.advertisingMode = AdvertisingMode::kOperational;
107 }
Andrei Litvinf11287f2023-06-19 11:32:19 -0400108 else if (strcmp(aValue, "operational-multi-admin") == 0)
109 {
110 gOptions.advertisingMode = AdvertisingMode::kOperationalMultiAdmin;
111 }
chrisdecenzo8d404092021-05-07 17:27:17 -0700112 else if (strcmp(aValue, "commissionable-node") == 0)
Andrei Litvin58746882021-01-12 11:57:24 -0500113 {
chrisdecenzo8d404092021-05-07 17:27:17 -0700114 gOptions.advertisingMode = AdvertisingMode::kCommissionableNode;
Andrei Litvin58746882021-01-12 11:57:24 -0500115 }
chrisdecenzo8d404092021-05-07 17:27:17 -0700116 else if (strcmp(aValue, "commissioner") == 0)
Arun Bharadwajbe3279a2021-01-14 14:47:17 -0800117 {
chrisdecenzo8d404092021-05-07 17:27:17 -0700118 gOptions.advertisingMode = AdvertisingMode::kCommissioner;
Arun Bharadwajbe3279a2021-01-14 14:47:17 -0800119 }
Andrei Litvin58746882021-01-12 11:57:24 -0500120 else
121 {
122 PrintArgError("%s: Invalid advertising mode %s\n", aProgram, aValue);
123
124 return false;
125 }
126 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800127 case kOptionCommissioningShortDiscriminator:
Andrei Litvin58746882021-01-12 11:57:24 -0500128 gOptions.shortDiscriminator = static_cast<uint8_t>(atoi(aValue));
129 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800130 case kOptionCommissioningLongDiscriminaotr:
Andrei Litvin58746882021-01-12 11:57:24 -0500131 gOptions.longDiscriminator = static_cast<uint16_t>(atoi(aValue));
132 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800133 case kOptionCommissioningVendorId:
Andrei Litvin9ed9c722024-04-30 12:53:56 -0400134 gOptions.vendorId = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue)));
Andrei Litvin58746882021-01-12 11:57:24 -0500135 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800136 case kOptionCommissioningProductId:
Andrei Litvin9ed9c722024-04-30 12:53:56 -0400137 gOptions.productId = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue)));
Andrei Litvin58746882021-01-12 11:57:24 -0500138 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800139 case kOptionCommissioningMode:
chrisdecenzo97d9f7e2021-09-14 10:37:29 -0700140 cm = static_cast<uint8_t>(atoi(aValue));
141 if (cm == 1)
142 {
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +0200143 gOptions.commissioningMode = Dnssd::CommissioningMode::kEnabledBasic;
chrisdecenzo97d9f7e2021-09-14 10:37:29 -0700144 }
145 if (cm == 2)
146 {
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +0200147 gOptions.commissioningMode = Dnssd::CommissioningMode::kEnabledEnhanced;
chrisdecenzo97d9f7e2021-09-14 10:37:29 -0700148 }
chrisdecenzo8d404092021-05-07 17:27:17 -0700149 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800150 case kOptionCommissioningDeviceType:
Andrei Litvin9ed9c722024-04-30 12:53:56 -0400151 gOptions.deviceType = std::make_optional<uint32_t>(static_cast<uint32_t>(atoi(aValue)));
chrisdecenzo8d404092021-05-07 17:27:17 -0700152 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800153 case kOptionCommissioningDeviceName:
Andrei Litvin9ed9c722024-04-30 12:53:56 -0400154 gOptions.deviceName = std::make_optional<const char *>(static_cast<const char *>(aValue));
chrisdecenzo8d404092021-05-07 17:27:17 -0700155 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800156 case kOptionCommissioningRotatingId:
Andrei Litvin9ed9c722024-04-30 12:53:56 -0400157 gOptions.rotatingId = std::make_optional<const char *>(static_cast<const char *>(aValue));
chrisdecenzo8d404092021-05-07 17:27:17 -0700158 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800159 case kOptionCommissioningPairingInstr:
Andrei Litvin9ed9c722024-04-30 12:53:56 -0400160 gOptions.pairingInstr = std::make_optional<const char *>(static_cast<const char *>(aValue));
Arun Bharadwajbe3279a2021-01-14 14:47:17 -0800161 return true;
Martin Turond24eff12021-12-17 06:21:23 -0800162 case kOptionCommissioningPairingHint:
Andrei Litvin9ed9c722024-04-30 12:53:56 -0400163 gOptions.pairingHint = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue)));
Arun Bharadwajbe3279a2021-01-14 14:47:17 -0800164 return true;
Andrei Litvin58746882021-01-12 11:57:24 -0500165 case kOptionOperationalFabricId:
Michael Spang2b6cc312021-04-16 11:03:36 -0400166 if (sscanf(aValue, "%" SCNx64, &gOptions.fabricId) != 1)
167 {
168 PrintArgError("%s: Invalid fabric id: %s\n", aProgram, aValue);
169 return false;
170 }
Andrei Litvin58746882021-01-12 11:57:24 -0500171 return true;
172 case kOptionOperationalNodeId:
Michael Spang2b6cc312021-04-16 11:03:36 -0400173 if (sscanf(aValue, "%" SCNx64, &gOptions.nodeId) != 1)
174 {
175 PrintArgError("%s: Invalid node id: %s\n", aProgram, aValue);
176 return false;
177 }
Andrei Litvin58746882021-01-12 11:57:24 -0500178 return true;
179 default:
180 PrintArgError("%s: INTERNAL ERROR: Unhandled option: %s\n", aProgram, aName);
181 return false;
182 }
183}
184
185OptionDef cmdLineOptionsDef[] = {
186#if INET_CONFIG_ENABLE_IPV4
187 { "enable-ip-v4", kNoArgument, kOptionEnableIpV4 },
188#endif
189 { "advertising-mode", kArgumentRequired, kOptionAdvertisingMode },
190
Martin Turond24eff12021-12-17 06:21:23 -0800191 { "short-discriminator", kArgumentRequired, kOptionCommissioningShortDiscriminator },
192 { "long-discriminator", kArgumentRequired, kOptionCommissioningLongDiscriminaotr },
193 { "vendor-id", kArgumentRequired, kOptionCommissioningVendorId },
194 { "product-id", kArgumentRequired, kOptionCommissioningProductId },
195 { "commissioning-mode", kNoArgument, kOptionCommissioningMode },
196 { "device-type", kArgumentRequired, kOptionCommissioningDeviceType },
197 { "device-name", kArgumentRequired, kOptionCommissioningDeviceName },
198 { "rotating-id", kArgumentRequired, kOptionCommissioningRotatingId },
199 { "pairing-instruction", kArgumentRequired, kOptionCommissioningPairingInstr },
200 { "pairing-hint", kArgumentRequired, kOptionCommissioningPairingHint },
Andrei Litvin58746882021-01-12 11:57:24 -0500201
Andrei Litvinf8043b62021-04-19 12:20:34 -0400202 { "fabric-id", kArgumentRequired, kOptionOperationalFabricId },
Andrei Litvin58746882021-01-12 11:57:24 -0500203 { "node-id", kArgumentRequired, kOptionOperationalNodeId },
Andrei Litvin00b522f2023-06-13 11:32:16 -0400204 { "trace-to", kArgumentRequired, kOptionTraceTo },
Michael Spang2b6cc312021-04-16 11:03:36 -0400205 {},
Andrei Litvin58746882021-01-12 11:57:24 -0500206};
207
Andrei Litvinf11287f2023-06-19 11:32:19 -0400208OptionSet cmdLineOptions = {
209 HandleOptions, cmdLineOptionsDef, "PROGRAM OPTIONS",
Andrei Litvin58746882021-01-12 11:57:24 -0500210#if INET_CONFIG_ENABLE_IPV4
Andrei Litvinf11287f2023-06-19 11:32:19 -0400211 " -4\n"
212 " --enable-ip-v4\n"
213 " enable listening on IPv4\n"
Andrei Litvin58746882021-01-12 11:57:24 -0500214#endif
Andrei Litvinf11287f2023-06-19 11:32:19 -0400215 " -m <mode>\n"
216 " --advertising-mode <mode>\n"
217 " Advertise in this mode (operational, operational-multi-admin, commissionable-node or commissioner).\n"
218 " --short-discriminator <value>\n"
219 " -s <value>\n"
220 " Commissioning/commissionable short discriminator.\n"
221 " --long-discriminator <value>\n"
222 " -l <value>\n"
223 " Commissioning/commissionable long discriminator.\n"
224 " --vendor-id <value>\n"
225 " Commissioning/commissionable vendor id.\n"
226 " --product-id <value>\n"
227 " -p <value>\n"
228 " Commissioning/commissionable product id.\n"
229 " --commissioning-mode <value>\n"
230 " Commissioning Mode (0=disabled, 1=basic, 2=enhanced).\n"
231 " --device-type <value>\n"
232 " Device type id.\n"
233 " --device-name <value>\n"
234 " Name of device.\n"
235 " --rotating-id <value>\n"
236 " Rotating Id.\n"
237 " --pairing-instruction <value>\n"
238 " Commissionable pairing instruction.\n"
239 " --pairing-hint <value>\n"
240 " Commissionable pairing hint.\n"
241 " --fabric-id <value>\n"
242 " -f <value>\n"
243 " Operational fabric id.\n"
244 " --node-id <value>\n"
245 " -n <value>\n"
246 " Operational node id.\n"
247 " -t <dest>\n"
248 " --trace-to <dest>\n"
249 " trace to the given destination (supported: " SUPPORTED_COMMAND_LINE_TRACING_TARGETS ").\n"
250 "\n"
251};
Andrei Litvin58746882021-01-12 11:57:24 -0500252
253HelpOptions helpOptions("advertiser", "Usage: advertiser [options]", "1.0");
254
255OptionSet * allOptions[] = { &cmdLineOptions, &helpOptions, nullptr };
256
Andrei Litvin00b522f2023-06-13 11:32:16 -0400257void StopSignalHandler(int signal)
258{
259 DeviceLayer::PlatformMgr().StopEventLoopTask();
260}
261
Andrei Litvin58746882021-01-12 11:57:24 -0500262} // namespace
263
264int main(int argc, char ** args)
265{
266 if (Platform::MemoryInit() != CHIP_NO_ERROR)
267 {
268 fprintf(stderr, "FAILED to initialize memory\n");
269 return 1;
270 }
271
272 if (DeviceLayer::PlatformMgr().InitChipStack() != CHIP_NO_ERROR)
273 {
274 fprintf(stderr, "FAILED to initialize chip stack\n");
275 return 1;
276 }
277
Andrei Litvind3564842023-06-23 12:30:50 -0400278 chip::CommandLineApp::TracingSetup tracing_setup;
279
280 tracing_setup_for_argparse = &tracing_setup;
Andrei Litvin58746882021-01-12 11:57:24 -0500281 if (!chip::ArgParser::ParseArgs(args[0], argc, args, allOptions))
282 {
283 return 1;
284 }
Andrei Litvind3564842023-06-23 12:30:50 -0400285 tracing_setup_for_argparse = nullptr;
Andrei Litvin58746882021-01-12 11:57:24 -0500286
Kevin Schoedel8e5eb8a2021-12-09 11:07:45 -0500287 if (chip::Dnssd::ServiceAdvertiser::Instance().Init(DeviceLayer::UDPEndPointManager()) != CHIP_NO_ERROR)
Andrei Litvin58746882021-01-12 11:57:24 -0500288 {
289 fprintf(stderr, "FAILED to start MDNS advertisement\n");
290 return 1;
291 }
292
293 CHIP_ERROR err;
294
chrisdecenzo8d404092021-05-07 17:27:17 -0700295 if (gOptions.advertisingMode == AdvertisingMode::kCommissionableNode)
Andrei Litvin58746882021-01-12 11:57:24 -0500296 {
chrisdecenzo8d404092021-05-07 17:27:17 -0700297 printf("Advertise Commissionable Node\n");
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +0200298 err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise(chip::Dnssd::CommissionAdvertisingParameters()
299 .EnableIpV4(gOptions.enableIpV4)
300 .SetPort(CHIP_PORT)
301 .SetShortDiscriminator(gOptions.shortDiscriminator)
302 .SetLongDiscriminator(gOptions.longDiscriminator)
303 .SetMac(chip::ByteSpan(gOptions.mac, 6))
304 .SetVendorId(gOptions.vendorId)
305 .SetProductId(gOptions.productId)
306 .SetCommissioningMode(gOptions.commissioningMode)
307 .SetDeviceType(gOptions.deviceType)
308 .SetDeviceName(gOptions.deviceName)
Vivien Nicolas8e40abc2021-12-16 17:12:37 +0100309 .SetRotatingDeviceId(gOptions.rotatingId)
310 .SetPairingInstruction(gOptions.pairingInstr)
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +0200311 .SetPairingHint(gOptions.pairingHint));
Andrei Litvin58746882021-01-12 11:57:24 -0500312 }
313 else if (gOptions.advertisingMode == AdvertisingMode::kOperational)
314 {
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +0200315 err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise(
316 chip::Dnssd::OperationalAdvertisingParameters()
Andrei Litvinf8043b62021-04-19 12:20:34 -0400317 .EnableIpV4(gOptions.enableIpV4)
318 .SetPort(CHIP_PORT)
319 .SetMac(chip::ByteSpan(gOptions.mac, 6))
Pankaj Garg6efec202021-08-25 10:47:29 -0700320 .SetPeerId(PeerId().SetCompressedFabricId(gOptions.fabricId).SetNodeId(gOptions.nodeId)));
Andrei Litvin58746882021-01-12 11:57:24 -0500321 }
Andrei Litvinf11287f2023-06-19 11:32:19 -0400322 else if (gOptions.advertisingMode == AdvertisingMode::kOperationalMultiAdmin)
323 {
324 err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise(
325 chip::Dnssd::OperationalAdvertisingParameters()
326 .EnableIpV4(gOptions.enableIpV4)
327 .SetPort(CHIP_PORT)
328 .SetMac(chip::ByteSpan(gOptions.mac, 6))
329 .SetPeerId(PeerId().SetCompressedFabricId(gOptions.fabricId).SetNodeId(gOptions.nodeId)));
330
331 if (err == CHIP_NO_ERROR)
332 {
333 err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise(
334 chip::Dnssd::OperationalAdvertisingParameters()
335 .EnableIpV4(gOptions.enableIpV4)
336 .SetPort(CHIP_PORT + 1)
337 .SetMac(chip::ByteSpan(gOptions.mac, 6))
338 .SetPeerId(PeerId().SetCompressedFabricId(gOptions.fabricId + 1).SetNodeId(gOptions.nodeId + 1)));
339 }
340
341 if (err == CHIP_NO_ERROR)
342 {
343 err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise(
344 chip::Dnssd::OperationalAdvertisingParameters()
345 .EnableIpV4(gOptions.enableIpV4)
346 .SetPort(CHIP_PORT + 2)
347 .SetMac(chip::ByteSpan(gOptions.mac, 6))
348 .SetPeerId(PeerId().SetCompressedFabricId(gOptions.fabricId + 2).SetNodeId(gOptions.nodeId + 2)));
349 }
350 }
chrisdecenzo8d404092021-05-07 17:27:17 -0700351 else if (gOptions.advertisingMode == AdvertisingMode::kCommissioner)
Arun Bharadwajbe3279a2021-01-14 14:47:17 -0800352 {
chrisdecenzo8d404092021-05-07 17:27:17 -0700353 printf("Advertise Commissioner\n");
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +0200354 err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise(
355 chip::Dnssd::CommissionAdvertisingParameters()
Jiacheng Guobcb23b12021-01-16 04:52:54 +0800356 .EnableIpV4(gOptions.enableIpV4)
357 .SetPort(CHIP_PORT)
chrisdecenzo8d404092021-05-07 17:27:17 -0700358 .SetMac(chip::ByteSpan(gOptions.mac, 6))
Jiacheng Guobcb23b12021-01-16 04:52:54 +0800359 .SetVendorId(gOptions.vendorId)
360 .SetProductId(gOptions.productId)
chrisdecenzo8d404092021-05-07 17:27:17 -0700361 .SetDeviceType(gOptions.deviceType)
362 .SetDeviceName(gOptions.deviceName)
Kamil Kasperczykd9e02a02021-10-12 09:19:23 +0200363 .SetCommissionAdvertiseMode(chip::Dnssd::CommssionAdvertiseMode::kCommissioner));
Arun Bharadwajbe3279a2021-01-14 14:47:17 -0800364 }
Andrei Litvin58746882021-01-12 11:57:24 -0500365 else
366 {
367 fprintf(stderr, "FAILED to determine advertising type.\n");
368 return 1;
369 }
370
371 if (err != CHIP_NO_ERROR)
372 {
chrisdecenzo8d404092021-05-07 17:27:17 -0700373 fprintf(stderr, "FAILED to setup advertisement parameters err=%s\n", chip::ErrorStr(err));
Andrei Litvin58746882021-01-12 11:57:24 -0500374 return 1;
375 }
376
Andrei Litvin00b522f2023-06-13 11:32:16 -0400377 signal(SIGTERM, StopSignalHandler);
378 signal(SIGINT, StopSignalHandler);
379
Andrei Litvin58746882021-01-12 11:57:24 -0500380 DeviceLayer::PlatformMgr().RunEventLoop();
381
Andrei Litvind3564842023-06-23 12:30:50 -0400382 tracing_setup.StopTracing();
Andrei Litvin00b522f2023-06-13 11:32:16 -0400383 Dnssd::Resolver::Instance().Shutdown();
384 DeviceLayer::PlatformMgr().Shutdown();
385
Andrei Litvin58746882021-01-12 11:57:24 -0500386 printf("Done...\n");
387 return 0;
388}