Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 1 | /* |
| 2 | * |
Kevin Schoedel | a868187 | 2021-01-28 15:53:13 -0500 | [diff] [blame] | 3 | * Copyright (c) 2020-2021 Project CHIP Authors |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 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 | |
| 18 | #include <cstdio> |
| 19 | #include <memory> |
Michael Spang | 2b6cc31 | 2021-04-16 11:03:36 -0400 | [diff] [blame] | 20 | #include <string> |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 21 | #include <vector> |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 22 | |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 23 | #include <TracingCommandLineArgument.h> |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 24 | #include <inet/InetInterface.h> |
| 25 | #include <inet/UDPEndPoint.h> |
Andrei Litvin | c52f766 | 2022-09-12 13:23:45 -0400 | [diff] [blame] | 26 | #include <lib/dnssd/MinimalMdnsServer.h> |
Andrei Litvin | 0bc1578 | 2022-08-29 09:28:41 -0400 | [diff] [blame] | 27 | #include <lib/dnssd/minimal_mdns/AddressPolicy.h> |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 28 | #include <lib/dnssd/minimal_mdns/QueryBuilder.h> |
| 29 | #include <lib/dnssd/minimal_mdns/Server.h> |
| 30 | #include <lib/dnssd/minimal_mdns/core/QName.h> |
Zang MingJie | 53dd583 | 2021-09-03 03:05:16 +0800 | [diff] [blame] | 31 | #include <lib/support/CHIPArgParser.hpp> |
| 32 | #include <lib/support/CHIPMem.h> |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 33 | #include <platform/CHIPDeviceLayer.h> |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 34 | #include <system/SystemPacketBuffer.h> |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 35 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 36 | #include "PacketReporter.h" |
| 37 | |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 38 | using namespace chip; |
| 39 | |
| 40 | namespace { |
| 41 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 42 | struct Options |
| 43 | { |
Andrei Litvin | 2f73cb9 | 2020-12-07 10:36:50 -0500 | [diff] [blame] | 44 | bool unicastAnswers = true; |
| 45 | uint32_t runtimeMs = 500; |
| 46 | uint16_t querySendPort = 5353; |
| 47 | uint16_t listenPort = 5388; |
| 48 | const char * query = "_services._dns-sd._udp.local"; |
| 49 | mdns::Minimal::QType type = mdns::Minimal::QType::ANY; |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 50 | } gOptions; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 51 | |
Andrei Litvin | ab57289 | 2022-05-11 14:21:01 -0400 | [diff] [blame] | 52 | constexpr uint32_t kTestMessageId = 0; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 53 | constexpr size_t kMdnsMaxPacketSize = 1'024; |
| 54 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 55 | using namespace chip::ArgParser; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 56 | |
Andrei Litvin | 0bc1578 | 2022-08-29 09:28:41 -0400 | [diff] [blame] | 57 | constexpr uint16_t kOptionQuery = 'q'; |
| 58 | constexpr uint16_t kOptionType = 't'; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 59 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 60 | // non-ascii options have no short option version |
| 61 | constexpr uint16_t kOptionListenPort = 0x100; |
| 62 | constexpr uint16_t kOptionQueryPort = 0x101; |
| 63 | constexpr uint16_t kOptionRuntimeMs = 0x102; |
| 64 | constexpr uint16_t kOptionMulticastReplies = 0x103; |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 65 | constexpr uint16_t kOptionTraceTo = 0x104; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 66 | |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 67 | // Only used for argument parsing. Tracing setup owned by the main loop. |
| 68 | chip::CommandLineApp::TracingSetup * tracing_setup_for_argparse = nullptr; |
| 69 | |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 70 | bool HandleOptions(const char * aProgram, OptionSet * aOptions, int aIdentifier, const char * aName, const char * aValue) |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 71 | { |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 72 | switch (aIdentifier) |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 73 | { |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 74 | case kOptionListenPort: |
| 75 | if (!ParseInt(aValue, gOptions.listenPort)) |
| 76 | { |
| 77 | PrintArgError("%s: invalid value for listen port: %s\n", aProgram, aValue); |
| 78 | return false; |
| 79 | } |
| 80 | return true; |
| 81 | case kOptionQuery: |
| 82 | gOptions.query = aValue; |
| 83 | return true; |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 84 | case kOptionTraceTo: |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 85 | tracing_setup_for_argparse->EnableTracingFor(aValue); |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 86 | return true; |
Andrei Litvin | 2f73cb9 | 2020-12-07 10:36:50 -0500 | [diff] [blame] | 87 | case kOptionType: |
| 88 | if (strcasecmp(aValue, "ANY") == 0) |
| 89 | { |
| 90 | gOptions.type = mdns::Minimal::QType::ANY; |
| 91 | } |
| 92 | else if (strcasecmp(aValue, "A") == 0) |
| 93 | { |
| 94 | gOptions.type = mdns::Minimal::QType::A; |
| 95 | } |
| 96 | else if (strcasecmp(aValue, "AAAA") == 0) |
| 97 | { |
| 98 | gOptions.type = mdns::Minimal::QType::AAAA; |
| 99 | } |
| 100 | else if (strcasecmp(aValue, "PTR") == 0) |
| 101 | { |
| 102 | gOptions.type = mdns::Minimal::QType::PTR; |
| 103 | } |
| 104 | else if (strcasecmp(aValue, "TXT") == 0) |
| 105 | { |
| 106 | gOptions.type = mdns::Minimal::QType::TXT; |
| 107 | } |
| 108 | else if (strcasecmp(aValue, "SRV") == 0) |
| 109 | { |
| 110 | gOptions.type = mdns::Minimal::QType::SRV; |
| 111 | } |
| 112 | else if (strcasecmp(aValue, "CNAME") == 0) |
| 113 | { |
| 114 | gOptions.type = mdns::Minimal::QType::CNAME; |
| 115 | } |
| 116 | else |
| 117 | { |
| 118 | PrintArgError("%s: invalid value for query type: %s\n", aProgram, aValue); |
| 119 | return false; |
| 120 | } |
| 121 | return true; |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 122 | |
| 123 | case kOptionQueryPort: |
| 124 | if (!ParseInt(aValue, gOptions.querySendPort)) |
| 125 | { |
| 126 | PrintArgError("%s: invalid value for query send port: %s\n", aProgram, aValue); |
| 127 | return false; |
| 128 | } |
| 129 | return true; |
| 130 | |
| 131 | case kOptionRuntimeMs: |
| 132 | if (!ParseInt(aValue, gOptions.runtimeMs)) |
| 133 | { |
| 134 | PrintArgError("%s: invalid value for runtime ms: %s\n", aProgram, aValue); |
| 135 | return false; |
| 136 | } |
| 137 | return true; |
| 138 | |
| 139 | case kOptionMulticastReplies: |
| 140 | gOptions.unicastAnswers = false; |
| 141 | return true; |
| 142 | |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 143 | default: |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 144 | PrintArgError("%s: INTERNAL ERROR: Unhandled option: %s\n", aProgram, aName); |
| 145 | return false; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 146 | } |
| 147 | } |
| 148 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 149 | OptionDef cmdLineOptionsDef[] = { |
| 150 | { "listen-port", kArgumentRequired, kOptionListenPort }, |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 151 | { "query", kArgumentRequired, kOptionQuery }, |
Andrei Litvin | 2f73cb9 | 2020-12-07 10:36:50 -0500 | [diff] [blame] | 152 | { "type", kArgumentRequired, kOptionType }, |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 153 | { "query-port", kArgumentRequired, kOptionQueryPort }, |
| 154 | { "timeout-ms", kArgumentRequired, kOptionRuntimeMs }, |
| 155 | { "multicast-reply", kNoArgument, kOptionMulticastReplies }, |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 156 | { "trace-to", kArgumentRequired, kOptionTraceTo }, |
Michael Spang | 2b6cc31 | 2021-04-16 11:03:36 -0400 | [diff] [blame] | 157 | {}, |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 158 | }; |
| 159 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 160 | OptionSet cmdLineOptions = { HandleOptions, cmdLineOptionsDef, "PROGRAM OPTIONS", |
| 161 | " --listen-port <number>\n" |
| 162 | " The port number to listen on\n" |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 163 | " -q\n" |
| 164 | " --query\n" |
| 165 | " The query to send\n" |
Andrei Litvin | 2f73cb9 | 2020-12-07 10:36:50 -0500 | [diff] [blame] | 166 | " -t\n" |
| 167 | " --type\n" |
| 168 | " The query type to ask for (ANY/PTR/A/AAAA/SRV/TXT)\n" |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 169 | " --query-port\n" |
| 170 | " On what port to multicast the query\n" |
| 171 | " --timeout-ms\n" |
| 172 | " How long to wait for replies\n" |
| 173 | " --multicast-reply\n" |
| 174 | " Do not request unicast replies\n" |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 175 | " --trace-to <dest>\n" |
| 176 | " trace to the given destination (supported: " SUPPORTED_COMMAND_LINE_TRACING_TARGETS ").\n" |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 177 | "\n" }; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 178 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 179 | HelpOptions helpOptions("minimal-mdns-client", "Usage: minimal-mdns-client [options]", "1.0"); |
| 180 | |
| 181 | OptionSet * allOptions[] = { &cmdLineOptions, &helpOptions, nullptr }; |
| 182 | |
| 183 | class ReportDelegate : public mdns::Minimal::ServerDelegate |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 184 | { |
| 185 | public: |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 186 | void OnQuery(const mdns::Minimal::BytesRange & data, const chip::Inet::IPPacketInfo * info) override |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 187 | { |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 188 | char addr[32]; |
| 189 | info->SrcAddress.ToString(addr, sizeof(addr)); |
| 190 | |
Andrei Litvin | 641aacd | 2021-11-15 08:37:42 -0500 | [diff] [blame] | 191 | char ifName[64]; |
| 192 | VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); |
| 193 | |
| 194 | printf("QUERY from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 195 | Report("QUERY: ", data); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 196 | } |
| 197 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 198 | void OnResponse(const mdns::Minimal::BytesRange & data, const chip::Inet::IPPacketInfo * info) override |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 199 | { |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 200 | char addr[32]; |
| 201 | info->SrcAddress.ToString(addr, sizeof(addr)); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 202 | |
Andrei Litvin | 641aacd | 2021-11-15 08:37:42 -0500 | [diff] [blame] | 203 | char ifName[64]; |
| 204 | VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); |
| 205 | |
| 206 | printf("RESPONSE from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 207 | Report("RESPONSE: ", data); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 208 | } |
| 209 | |
| 210 | private: |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 211 | void Report(const char * prefix, const mdns::Minimal::BytesRange & data) |
| 212 | { |
| 213 | MdnsExample::PacketReporter reporter(prefix, data); |
| 214 | if (!mdns::Minimal::ParsePacket(data, &reporter)) |
| 215 | { |
| 216 | printf("INVALID PACKET!!!!!!\n"); |
| 217 | } |
| 218 | } |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 219 | }; |
| 220 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 221 | class QuerySplitter |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 222 | { |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 223 | public: |
| 224 | void Split(const char * query) |
| 225 | { |
| 226 | mStorage.clear(); |
| 227 | mParts.clear(); |
| 228 | |
| 229 | const char * dot = nullptr; |
| 230 | while (nullptr != (dot = strchr(query, '.'))) |
| 231 | { |
| 232 | mStorage.push_back(std::string(query, dot)); |
| 233 | query = dot + 1; |
| 234 | } |
| 235 | |
| 236 | mStorage.push_back(query); |
| 237 | |
| 238 | for (unsigned i = 0; i < mStorage.size(); i++) |
| 239 | { |
| 240 | mParts.push_back(mStorage[i].c_str()); |
| 241 | } |
| 242 | } |
| 243 | |
Andrei Litvin | 2f73cb9 | 2020-12-07 10:36:50 -0500 | [diff] [blame] | 244 | mdns::Minimal::Query MdnsQuery() const |
| 245 | { |
| 246 | mdns::Minimal::FullQName qName; |
| 247 | |
| 248 | qName.nameCount = mParts.size(); |
| 249 | qName.names = mParts.data(); |
| 250 | |
| 251 | return mdns::Minimal::Query(qName); |
| 252 | } |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 253 | |
| 254 | private: |
| 255 | std::vector<mdns::Minimal::QNamePart> mParts; |
| 256 | std::vector<std::string> mStorage; |
| 257 | }; |
| 258 | |
| 259 | void BroadcastPacket(mdns::Minimal::ServerBase * server) |
| 260 | { |
Kevin Schoedel | a868187 | 2021-01-28 15:53:13 -0500 | [diff] [blame] | 261 | System::PacketBufferHandle buffer = System::PacketBufferHandle::New(kMdnsMaxPacketSize); |
Kevin Schoedel | 5d905ea | 2022-01-21 15:03:15 -0500 | [diff] [blame] | 262 | VerifyOrDie(!buffer.IsNull()); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 263 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 264 | QuerySplitter query; |
| 265 | query.Split(gOptions.query); |
| 266 | |
Kevin Schoedel | f77bebf | 2021-01-08 12:15:52 -0500 | [diff] [blame] | 267 | mdns::Minimal::QueryBuilder builder(std::move(buffer)); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 268 | |
| 269 | builder.Header().SetMessageId(kTestMessageId); |
Andrei Litvin | 2f73cb9 | 2020-12-07 10:36:50 -0500 | [diff] [blame] | 270 | builder.AddQuery(query |
| 271 | .MdnsQuery() // |
| 272 | .SetClass(mdns::Minimal::QClass::IN) // |
| 273 | .SetType(gOptions.type) // |
| 274 | .SetAnswerViaUnicast(gOptions.unicastAnswers) // |
| 275 | ); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 276 | |
| 277 | if (!builder.Ok()) |
| 278 | { |
| 279 | printf("Failed to build the question"); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 280 | return; |
| 281 | } |
| 282 | |
Andrei Litvin | 8bfdc13 | 2021-11-24 13:20:41 -0500 | [diff] [blame] | 283 | if (gOptions.unicastAnswers) |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 284 | { |
Andrei Litvin | 8bfdc13 | 2021-11-24 13:20:41 -0500 | [diff] [blame] | 285 | if (server->BroadcastUnicastQuery(builder.ReleasePacket(), gOptions.querySendPort) != CHIP_NO_ERROR) |
| 286 | { |
| 287 | printf("Error sending\n"); |
| 288 | return; |
| 289 | } |
| 290 | } |
| 291 | else |
| 292 | { |
| 293 | if (server->BroadcastSend(builder.ReleasePacket(), gOptions.querySendPort) != CHIP_NO_ERROR) |
| 294 | { |
| 295 | printf("Error sending\n"); |
| 296 | return; |
| 297 | } |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 298 | } |
| 299 | } |
| 300 | |
Andrei Litvin | fa47b31 | 2022-01-11 09:54:45 -0500 | [diff] [blame] | 301 | mdns::Minimal::Server<20> gMdnsServer; |
| 302 | |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 303 | } // namespace |
| 304 | |
| 305 | int main(int argc, char ** args) |
| 306 | { |
| 307 | if (Platform::MemoryInit() != CHIP_NO_ERROR) |
| 308 | { |
| 309 | printf("FAILED to initialize memory"); |
| 310 | return 1; |
| 311 | } |
| 312 | |
| 313 | if (DeviceLayer::PlatformMgr().InitChipStack() != CHIP_NO_ERROR) |
| 314 | { |
| 315 | printf("FAILED to initialize chip stack"); |
| 316 | return 1; |
| 317 | } |
| 318 | |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 319 | chip::CommandLineApp::TracingSetup tracing_setup; |
| 320 | |
| 321 | tracing_setup_for_argparse = &tracing_setup; |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 322 | if (!chip::ArgParser::ParseArgs(args[0], argc, args, allOptions)) |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 323 | { |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 324 | return 1; |
| 325 | } |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 326 | tracing_setup_for_argparse = nullptr; |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 327 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 328 | printf("Running...\n"); |
| 329 | |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 330 | ReportDelegate reporter; |
chrisdecenzo | 97d9f7e | 2021-09-14 10:37:29 -0700 | [diff] [blame] | 331 | CHIP_ERROR err; |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 332 | |
Andrei Litvin | c52f766 | 2022-09-12 13:23:45 -0400 | [diff] [blame] | 333 | // This forces the global MDNS instance to be loaded in, effectively setting |
| 334 | // built in policies for addresses. |
| 335 | (void) chip::Dnssd::GlobalMinimalMdnsServer::Instance(); |
| 336 | |
Andrei Litvin | fa47b31 | 2022-01-11 09:54:45 -0500 | [diff] [blame] | 337 | gMdnsServer.SetDelegate(&reporter); |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 338 | |
| 339 | { |
Andrei Litvin | 0bc1578 | 2022-08-29 09:28:41 -0400 | [diff] [blame] | 340 | auto endpoints = mdns::Minimal::GetAddressPolicy()->GetListenEndpoints(); |
Andrei Litvin | f8043b6 | 2021-04-19 12:20:34 -0400 | [diff] [blame] | 341 | |
Andrei Litvin | 0bc1578 | 2022-08-29 09:28:41 -0400 | [diff] [blame] | 342 | err = gMdnsServer.Listen(chip::DeviceLayer::UDPEndPointManager(), endpoints.get(), gOptions.listenPort); |
Andrei Litvin | f8043b6 | 2021-04-19 12:20:34 -0400 | [diff] [blame] | 343 | if (err != CHIP_NO_ERROR) |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 344 | { |
Andrei Litvin | f8043b6 | 2021-04-19 12:20:34 -0400 | [diff] [blame] | 345 | printf("Server failed to listen on all interfaces: %s\n", chip::ErrorStr(err)); |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 346 | return 1; |
| 347 | } |
| 348 | } |
| 349 | |
Andrei Litvin | fa47b31 | 2022-01-11 09:54:45 -0500 | [diff] [blame] | 350 | BroadcastPacket(&gMdnsServer); |
Andrei Litvin | 00c7f5a | 2020-11-23 10:43:42 -0500 | [diff] [blame] | 351 | |
chrisdecenzo | 97d9f7e | 2021-09-14 10:37:29 -0700 | [diff] [blame] | 352 | err = DeviceLayer::SystemLayer().StartTimer( |
Andrei Litvin | 641aacd | 2021-11-15 08:37:42 -0500 | [diff] [blame] | 353 | chip::System::Clock::Milliseconds32(gOptions.runtimeMs), |
Kevin Schoedel | 86eb040 | 2021-09-10 08:37:38 -0400 | [diff] [blame] | 354 | [](System::Layer *, void *) { |
Andrei Litvin | fa47b31 | 2022-01-11 09:54:45 -0500 | [diff] [blame] | 355 | // Close all sockets BEFORE system layer is shut down, otherwise |
| 356 | // attempts to free UDP sockets with system layer down will segfault |
| 357 | gMdnsServer.Shutdown(); |
| 358 | |
Kevin Schoedel | 2d103c8 | 2021-08-10 22:11:16 -0400 | [diff] [blame] | 359 | DeviceLayer::PlatformMgr().StopEventLoopTask(); |
Kevin Schoedel | 2d103c8 | 2021-08-10 22:11:16 -0400 | [diff] [blame] | 360 | }, |
| 361 | nullptr); |
| 362 | if (err != CHIP_NO_ERROR) |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 363 | { |
Kevin Schoedel | 2d103c8 | 2021-08-10 22:11:16 -0400 | [diff] [blame] | 364 | printf("Failed to create the shutdown timer. Kill with ^C. %" CHIP_ERROR_FORMAT "\n", err.Format()); |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 365 | } |
| 366 | |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 367 | DeviceLayer::PlatformMgr().RunEventLoop(); |
| 368 | |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 369 | tracing_setup.StopTracing(); |
Boris Zbarsky | a358967 | 2023-04-03 23:02:21 -0400 | [diff] [blame] | 370 | DeviceLayer::PlatformMgr().Shutdown(); |
| 371 | Platform::MemoryShutdown(); |
| 372 | |
Andrei Litvin | 056d0b3 | 2020-11-16 13:58:58 -0500 | [diff] [blame] | 373 | printf("Done...\n"); |
| 374 | return 0; |
| 375 | } |