Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 1 | /* |
| 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 Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 19 | #include <optional> |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 20 | |
| 21 | #include <arpa/inet.h> |
| 22 | #include <strings.h> |
| 23 | |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 24 | #include <TracingCommandLineArgument.h> |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 25 | #include <lib/dnssd/Advertiser.h> |
Zang MingJie | 53dd583 | 2021-09-03 03:05:16 +0800 | [diff] [blame] | 26 | #include <lib/support/CHIPArgParser.hpp> |
| 27 | #include <lib/support/CHIPMem.h> |
| 28 | #include <lib/support/Span.h> |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 29 | #include <platform/CHIPDeviceLayer.h> |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 30 | |
| 31 | using namespace chip; |
| 32 | |
| 33 | namespace { |
| 34 | |
| 35 | enum class AdvertisingMode |
| 36 | { |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 37 | kCommissionableNode, |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 38 | kOperational, |
Andrei Litvin | f11287f | 2023-06-19 11:32:19 -0400 | [diff] [blame] | 39 | kOperationalMultiAdmin, |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 40 | kCommissioner, |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 41 | }; |
| 42 | |
| 43 | struct Options |
| 44 | { |
| 45 | bool enableIpV4 = false; |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 46 | AdvertisingMode advertisingMode = AdvertisingMode::kCommissionableNode; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 47 | |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 48 | // commissionable node / commissioner params |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 49 | std::optional<uint16_t> vendorId; |
| 50 | std::optional<uint16_t> productId; |
| 51 | std::optional<uint32_t> deviceType; |
| 52 | std::optional<const char *> deviceName; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 53 | |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 54 | // commissionable node params |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 55 | uint8_t shortDiscriminator = 52; |
| 56 | uint16_t longDiscriminator = 840; |
| 57 | Dnssd::CommissioningMode commissioningMode = Dnssd::CommissioningMode::kDisabled; |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 58 | std::optional<const char *> rotatingId; |
| 59 | std::optional<const char *> pairingInstr; |
| 60 | std::optional<uint16_t> pairingHint; |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 61 | |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 62 | // operational params |
| 63 | uint64_t fabricId = 12345; |
| 64 | uint64_t nodeId = 6789; |
cecille | 551c87c | 2021-04-06 11:26:36 -0400 | [diff] [blame] | 65 | uint8_t mac[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 66 | |
| 67 | } gOptions; |
| 68 | |
| 69 | using namespace chip::ArgParser; |
| 70 | |
| 71 | constexpr uint16_t kOptionEnableIpV4 = '4'; |
| 72 | constexpr uint16_t kOptionAdvertisingMode = 'm'; |
| 73 | |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 74 | constexpr uint16_t kOptionCommissioningShortDiscriminator = 's'; |
| 75 | constexpr uint16_t kOptionCommissioningLongDiscriminaotr = 'l'; |
| 76 | constexpr uint16_t kOptionCommissioningVendorId = 0x100; // v is used by 'version' |
| 77 | constexpr uint16_t kOptionCommissioningProductId = 'p'; |
| 78 | constexpr uint16_t kOptionCommissioningPairingInstr = 0x200; // Just use the long format |
| 79 | constexpr uint16_t kOptionCommissioningPairingHint = 0x300; |
| 80 | constexpr uint16_t kOptionCommissioningDeviceType = 0x400; |
| 81 | constexpr uint16_t kOptionCommissioningDeviceName = 0x500; |
| 82 | constexpr uint16_t kOptionCommissioningMode = 0x600; |
| 83 | constexpr uint16_t kOptionCommissioningRotatingId = 0x700; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 84 | |
| 85 | constexpr uint16_t kOptionOperationalFabricId = 'f'; |
| 86 | constexpr uint16_t kOptionOperationalNodeId = 'n'; |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 87 | constexpr uint16_t kOptionTraceTo = 't'; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 88 | |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 89 | // Only used for argument parsing. Tracing setup owned by the main loop. |
| 90 | chip::CommandLineApp::TracingSetup * tracing_setup_for_argparse = nullptr; |
| 91 | |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 92 | bool HandleOptions(const char * aProgram, OptionSet * aOptions, int aIdentifier, const char * aName, const char * aValue) |
| 93 | { |
chrisdecenzo | 97d9f7e | 2021-09-14 10:37:29 -0700 | [diff] [blame] | 94 | uint8_t cm; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 95 | switch (aIdentifier) |
| 96 | { |
| 97 | case kOptionEnableIpV4: |
| 98 | gOptions.enableIpV4 = true; |
| 99 | return true; |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 100 | case kOptionTraceTo: |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 101 | tracing_setup_for_argparse->EnableTracingFor(aValue); |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 102 | return true; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 103 | case kOptionAdvertisingMode: |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 104 | if (strcmp(aValue, "operational") == 0) |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 105 | { |
| 106 | gOptions.advertisingMode = AdvertisingMode::kOperational; |
| 107 | } |
Andrei Litvin | f11287f | 2023-06-19 11:32:19 -0400 | [diff] [blame] | 108 | else if (strcmp(aValue, "operational-multi-admin") == 0) |
| 109 | { |
| 110 | gOptions.advertisingMode = AdvertisingMode::kOperationalMultiAdmin; |
| 111 | } |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 112 | else if (strcmp(aValue, "commissionable-node") == 0) |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 113 | { |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 114 | gOptions.advertisingMode = AdvertisingMode::kCommissionableNode; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 115 | } |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 116 | else if (strcmp(aValue, "commissioner") == 0) |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 117 | { |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 118 | gOptions.advertisingMode = AdvertisingMode::kCommissioner; |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 119 | } |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 120 | else |
| 121 | { |
| 122 | PrintArgError("%s: Invalid advertising mode %s\n", aProgram, aValue); |
| 123 | |
| 124 | return false; |
| 125 | } |
| 126 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 127 | case kOptionCommissioningShortDiscriminator: |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 128 | gOptions.shortDiscriminator = static_cast<uint8_t>(atoi(aValue)); |
| 129 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 130 | case kOptionCommissioningLongDiscriminaotr: |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 131 | gOptions.longDiscriminator = static_cast<uint16_t>(atoi(aValue)); |
| 132 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 133 | case kOptionCommissioningVendorId: |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 134 | gOptions.vendorId = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue))); |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 135 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 136 | case kOptionCommissioningProductId: |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 137 | gOptions.productId = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue))); |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 138 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 139 | case kOptionCommissioningMode: |
chrisdecenzo | 97d9f7e | 2021-09-14 10:37:29 -0700 | [diff] [blame] | 140 | cm = static_cast<uint8_t>(atoi(aValue)); |
| 141 | if (cm == 1) |
| 142 | { |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 143 | gOptions.commissioningMode = Dnssd::CommissioningMode::kEnabledBasic; |
chrisdecenzo | 97d9f7e | 2021-09-14 10:37:29 -0700 | [diff] [blame] | 144 | } |
| 145 | if (cm == 2) |
| 146 | { |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 147 | gOptions.commissioningMode = Dnssd::CommissioningMode::kEnabledEnhanced; |
chrisdecenzo | 97d9f7e | 2021-09-14 10:37:29 -0700 | [diff] [blame] | 148 | } |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 149 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 150 | case kOptionCommissioningDeviceType: |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 151 | gOptions.deviceType = std::make_optional<uint32_t>(static_cast<uint32_t>(atoi(aValue))); |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 152 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 153 | case kOptionCommissioningDeviceName: |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 154 | gOptions.deviceName = std::make_optional<const char *>(static_cast<const char *>(aValue)); |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 155 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 156 | case kOptionCommissioningRotatingId: |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 157 | gOptions.rotatingId = std::make_optional<const char *>(static_cast<const char *>(aValue)); |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 158 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 159 | case kOptionCommissioningPairingInstr: |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 160 | gOptions.pairingInstr = std::make_optional<const char *>(static_cast<const char *>(aValue)); |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 161 | return true; |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 162 | case kOptionCommissioningPairingHint: |
Andrei Litvin | 9ed9c72 | 2024-04-30 12:53:56 -0400 | [diff] [blame] | 163 | gOptions.pairingHint = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue))); |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 164 | return true; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 165 | case kOptionOperationalFabricId: |
Michael Spang | 2b6cc31 | 2021-04-16 11:03:36 -0400 | [diff] [blame] | 166 | if (sscanf(aValue, "%" SCNx64, &gOptions.fabricId) != 1) |
| 167 | { |
| 168 | PrintArgError("%s: Invalid fabric id: %s\n", aProgram, aValue); |
| 169 | return false; |
| 170 | } |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 171 | return true; |
| 172 | case kOptionOperationalNodeId: |
Michael Spang | 2b6cc31 | 2021-04-16 11:03:36 -0400 | [diff] [blame] | 173 | if (sscanf(aValue, "%" SCNx64, &gOptions.nodeId) != 1) |
| 174 | { |
| 175 | PrintArgError("%s: Invalid node id: %s\n", aProgram, aValue); |
| 176 | return false; |
| 177 | } |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 178 | return true; |
| 179 | default: |
| 180 | PrintArgError("%s: INTERNAL ERROR: Unhandled option: %s\n", aProgram, aName); |
| 181 | return false; |
| 182 | } |
| 183 | } |
| 184 | |
| 185 | OptionDef cmdLineOptionsDef[] = { |
| 186 | #if INET_CONFIG_ENABLE_IPV4 |
| 187 | { "enable-ip-v4", kNoArgument, kOptionEnableIpV4 }, |
| 188 | #endif |
| 189 | { "advertising-mode", kArgumentRequired, kOptionAdvertisingMode }, |
| 190 | |
Martin Turon | d24eff1 | 2021-12-17 06:21:23 -0800 | [diff] [blame] | 191 | { "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 Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 201 | |
Andrei Litvin | f8043b6 | 2021-04-19 12:20:34 -0400 | [diff] [blame] | 202 | { "fabric-id", kArgumentRequired, kOptionOperationalFabricId }, |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 203 | { "node-id", kArgumentRequired, kOptionOperationalNodeId }, |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 204 | { "trace-to", kArgumentRequired, kOptionTraceTo }, |
Michael Spang | 2b6cc31 | 2021-04-16 11:03:36 -0400 | [diff] [blame] | 205 | {}, |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 206 | }; |
| 207 | |
Andrei Litvin | f11287f | 2023-06-19 11:32:19 -0400 | [diff] [blame] | 208 | OptionSet cmdLineOptions = { |
| 209 | HandleOptions, cmdLineOptionsDef, "PROGRAM OPTIONS", |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 210 | #if INET_CONFIG_ENABLE_IPV4 |
Andrei Litvin | f11287f | 2023-06-19 11:32:19 -0400 | [diff] [blame] | 211 | " -4\n" |
| 212 | " --enable-ip-v4\n" |
| 213 | " enable listening on IPv4\n" |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 214 | #endif |
Andrei Litvin | f11287f | 2023-06-19 11:32:19 -0400 | [diff] [blame] | 215 | " -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 Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 252 | |
| 253 | HelpOptions helpOptions("advertiser", "Usage: advertiser [options]", "1.0"); |
| 254 | |
| 255 | OptionSet * allOptions[] = { &cmdLineOptions, &helpOptions, nullptr }; |
| 256 | |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 257 | void StopSignalHandler(int signal) |
| 258 | { |
| 259 | DeviceLayer::PlatformMgr().StopEventLoopTask(); |
| 260 | } |
| 261 | |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 262 | } // namespace |
| 263 | |
| 264 | int 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 Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 278 | chip::CommandLineApp::TracingSetup tracing_setup; |
| 279 | |
| 280 | tracing_setup_for_argparse = &tracing_setup; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 281 | if (!chip::ArgParser::ParseArgs(args[0], argc, args, allOptions)) |
| 282 | { |
| 283 | return 1; |
| 284 | } |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 285 | tracing_setup_for_argparse = nullptr; |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 286 | |
Kevin Schoedel | 8e5eb8a | 2021-12-09 11:07:45 -0500 | [diff] [blame] | 287 | if (chip::Dnssd::ServiceAdvertiser::Instance().Init(DeviceLayer::UDPEndPointManager()) != CHIP_NO_ERROR) |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 288 | { |
| 289 | fprintf(stderr, "FAILED to start MDNS advertisement\n"); |
| 290 | return 1; |
| 291 | } |
| 292 | |
| 293 | CHIP_ERROR err; |
| 294 | |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 295 | if (gOptions.advertisingMode == AdvertisingMode::kCommissionableNode) |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 296 | { |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 297 | printf("Advertise Commissionable Node\n"); |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 298 | 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 Nicolas | 8e40abc | 2021-12-16 17:12:37 +0100 | [diff] [blame] | 309 | .SetRotatingDeviceId(gOptions.rotatingId) |
| 310 | .SetPairingInstruction(gOptions.pairingInstr) |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 311 | .SetPairingHint(gOptions.pairingHint)); |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 312 | } |
| 313 | else if (gOptions.advertisingMode == AdvertisingMode::kOperational) |
| 314 | { |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 315 | err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise( |
| 316 | chip::Dnssd::OperationalAdvertisingParameters() |
Andrei Litvin | f8043b6 | 2021-04-19 12:20:34 -0400 | [diff] [blame] | 317 | .EnableIpV4(gOptions.enableIpV4) |
| 318 | .SetPort(CHIP_PORT) |
| 319 | .SetMac(chip::ByteSpan(gOptions.mac, 6)) |
Pankaj Garg | 6efec20 | 2021-08-25 10:47:29 -0700 | [diff] [blame] | 320 | .SetPeerId(PeerId().SetCompressedFabricId(gOptions.fabricId).SetNodeId(gOptions.nodeId))); |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 321 | } |
Andrei Litvin | f11287f | 2023-06-19 11:32:19 -0400 | [diff] [blame] | 322 | 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 | } |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 351 | else if (gOptions.advertisingMode == AdvertisingMode::kCommissioner) |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 352 | { |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 353 | printf("Advertise Commissioner\n"); |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 354 | err = chip::Dnssd::ServiceAdvertiser::Instance().Advertise( |
| 355 | chip::Dnssd::CommissionAdvertisingParameters() |
Jiacheng Guo | bcb23b1 | 2021-01-16 04:52:54 +0800 | [diff] [blame] | 356 | .EnableIpV4(gOptions.enableIpV4) |
| 357 | .SetPort(CHIP_PORT) |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 358 | .SetMac(chip::ByteSpan(gOptions.mac, 6)) |
Jiacheng Guo | bcb23b1 | 2021-01-16 04:52:54 +0800 | [diff] [blame] | 359 | .SetVendorId(gOptions.vendorId) |
| 360 | .SetProductId(gOptions.productId) |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 361 | .SetDeviceType(gOptions.deviceType) |
| 362 | .SetDeviceName(gOptions.deviceName) |
Kamil Kasperczyk | d9e02a0 | 2021-10-12 09:19:23 +0200 | [diff] [blame] | 363 | .SetCommissionAdvertiseMode(chip::Dnssd::CommssionAdvertiseMode::kCommissioner)); |
Arun Bharadwaj | be3279a | 2021-01-14 14:47:17 -0800 | [diff] [blame] | 364 | } |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 365 | else |
| 366 | { |
| 367 | fprintf(stderr, "FAILED to determine advertising type.\n"); |
| 368 | return 1; |
| 369 | } |
| 370 | |
| 371 | if (err != CHIP_NO_ERROR) |
| 372 | { |
chrisdecenzo | 8d40409 | 2021-05-07 17:27:17 -0700 | [diff] [blame] | 373 | fprintf(stderr, "FAILED to setup advertisement parameters err=%s\n", chip::ErrorStr(err)); |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 374 | return 1; |
| 375 | } |
| 376 | |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 377 | signal(SIGTERM, StopSignalHandler); |
| 378 | signal(SIGINT, StopSignalHandler); |
| 379 | |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 380 | DeviceLayer::PlatformMgr().RunEventLoop(); |
| 381 | |
Andrei Litvin | d356484 | 2023-06-23 12:30:50 -0400 | [diff] [blame] | 382 | tracing_setup.StopTracing(); |
Andrei Litvin | 00b522f | 2023-06-13 11:32:16 -0400 | [diff] [blame] | 383 | Dnssd::Resolver::Instance().Shutdown(); |
| 384 | DeviceLayer::PlatformMgr().Shutdown(); |
| 385 | |
Andrei Litvin | 5874688 | 2021-01-12 11:57:24 -0500 | [diff] [blame] | 386 | printf("Done...\n"); |
| 387 | return 0; |
| 388 | } |