Skip to content

Commit

Permalink
[Darwin] Handle short discriminator while pairing (project-chip#3550)
Browse files Browse the repository at this point in the history
* Handle pairing with short setup codes

* Update type casts

* Use a different check to see if the discriminator has been set

* Address review comments
  • Loading branch information
sagar-apple authored Nov 5, 2020
1 parent 005b7ae commit 1d812b7
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 7 deletions.
1 change: 0 additions & 1 deletion src/ble/BleLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,6 @@ BLE_ERROR BleLayer::NewBleConnection(void * appState, const uint16_t connDiscrim
BLE_ERROR err = BLE_NO_ERROR;

VerifyOrExit(mState == kState_Initialized, err = BLE_ERROR_INCORRECT_STATE);
VerifyOrExit(connDiscriminator != 0, err = BLE_ERROR_BAD_ARGS);
VerifyOrExit(mConnectionDelegate != nullptr, err = BLE_ERROR_INCORRECT_STATE);

mConnectionDelegate->OnConnectionComplete = onConnectionComplete;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,6 @@ - (void)parseOptionalData:(CHIPSetupPayload *)payload
- (void)handleRendezVous:(CHIPSetupPayload *)payload
{
switch (payload.rendezvousInformation) {
case kRendezvousInformationNone:
case kRendezvousInformationThread:
case kRendezvousInformationEthernet:
case kRendezvousInformationAllMask:
Expand All @@ -520,6 +519,7 @@ - (void)handleRendezVous:(CHIPSetupPayload *)payload
NSLog(@"Rendezvous Wi-Fi");
[self handleRendezVousWiFi:[self getNetworkName:payload.discriminator]];
break;
case kRendezvousInformationNone:
case kRendezvousInformationBLE:
NSLog(@"Rendezvous BLE");
[self handleRendezVousBLE:payload.discriminator.unsignedShortValue setupPINCode:payload.setUpPINCode.unsignedIntValue];
Expand Down
1 change: 1 addition & 0 deletions src/platform/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ if (chip_device_platform != "none" && chip_device_platform != "external") {
"${chip_root}/src/lib/core",
"${chip_root}/src/lib/core:chip_config_header",
"${chip_root}/src/lib/support",
"${chip_root}/src/setup_payload",
"${nlio_root}:nlio",
]

Expand Down
14 changes: 13 additions & 1 deletion src/platform/Darwin/BleConnectionDelegateImpl.mm
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <ble/BleLayer.h>
#include <ble/BleUUID.h>
#include <platform/Darwin/BleConnectionDelegate.h>
#include <setup_payload/SetupPayload.h>
#include <support/logging/CHIPLogging.h>

#import <CoreBluetooth/CoreBluetooth.h>
Expand Down Expand Up @@ -137,7 +138,7 @@ - (void)centralManager:(CBCentralManager *)central
discriminator = static_cast<uint16_t>(((bytes[1] & 0x0F) << 8) | bytes[2]);
}

if (opCode == 0 && discriminator == _deviceDiscriminator) {
if (opCode == 0 && [self checkDiscriminator:discriminator]) {
ChipLogProgress(Ble, "Connecting to device: %@", peripheral);
[self connect:peripheral];
[self stopScanning];
Expand All @@ -150,6 +151,17 @@ - (void)centralManager:(CBCentralManager *)central
}
}

- (BOOL)checkDiscriminator:(uint16_t)discriminator
{
// If the setup discriminator is only 4 bits, only match the lower 4 from the BLE advertisement
if (_deviceDiscriminator <= chip::kManualSetupDiscriminatorFieldBitMask) {
return _deviceDiscriminator == (discriminator & chip::kManualSetupDiscriminatorFieldBitMask);
} else {
// else compare the entire thing
return _deviceDiscriminator == discriminator;
}
}

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
[peripheral setDelegate:self];
Expand Down
3 changes: 3 additions & 0 deletions src/setup_payload/SetupPayload.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ const int kManualSetupProductIdCharLength = 5;
const uint8_t kSerialNumberTag = 128;
const uint32_t kTag_QRCodeExensionDescriptor = 0x00;

// The largest value of the 12-bit Payload discriminator
const uint16_t kMaxDiscriminatorValue = 0xFFF;

// clang-format off
const int kTotalPayloadDataSizeInBits =
kVersionFieldLengthInBits +
Expand Down
11 changes: 7 additions & 4 deletions src/transport/RendezvousParameters.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@

namespace chip {

// The largest supported value for Rendezvous discriminators
const uint16_t kMaxRendezvousDiscriminatorValue = 0xFFF;

class RendezvousParameters
{
public:
Expand All @@ -42,7 +45,7 @@ class RendezvousParameters
return *this;
}

bool HasDiscriminator() const { return mDiscriminator != 0; }
bool HasDiscriminator() const { return mDiscriminator <= kMaxRendezvousDiscriminatorValue; }
uint16_t GetDiscriminator() const { return mDiscriminator; }
RendezvousParameters & SetDiscriminator(uint16_t discriminator)
{
Expand Down Expand Up @@ -79,9 +82,9 @@ class RendezvousParameters
#endif // CONFIG_NETWORK_LAYER_BLE

private:
Optional<NodeId> mLocalNodeId; ///< the local node id
uint32_t mSetupPINCode = 0; ///< the target peripheral setup PIN Code
uint16_t mDiscriminator = 0; ///< the target peripheral discriminator
Optional<NodeId> mLocalNodeId; ///< the local node id
uint32_t mSetupPINCode = 0; ///< the target peripheral setup PIN Code
uint16_t mDiscriminator = UINT16_MAX; ///< the target peripheral discriminator

#if CONFIG_NETWORK_LAYER_BLE
Ble::BleLayer * mBleLayer = nullptr;
Expand Down

0 comments on commit 1d812b7

Please sign in to comment.