13cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati/****************************************************************************** 23cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * 33cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * Copyright (C) 2014 Google, Inc. 43cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * 53cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * Licensed under the Apache License, Version 2.0 (the "License"); 63cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * you may not use this file except in compliance with the License. 73cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * You may obtain a copy of the License at: 83cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * 93cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * http://www.apache.org/licenses/LICENSE-2.0 103cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * 113cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * Unless required by applicable law or agreed to in writing, software 123cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * distributed under the License is distributed on an "AS IS" BASIS, 133cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * See the License for the specific language governing permissions and 153cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * limitations under the License. 163cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati * 173cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati ******************************************************************************/ 183cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 193cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "base.h" 203cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "support/callbacks.h" 213cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "support/pan.h" 223cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 233cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatistatic const int local_role = BTPAN_ROLE_PANU; 243cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatistatic const int remote_role = BTPAN_ROLE_PANNAP; 253cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 263cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool pan_enable() { 273cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati int error; 283cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 293cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati // PAN is enabled by default, wait for the first control state change 303cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati // with default parameters set. We don't want to verify the result since 313cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati // the implementation could have set any parameters. 323cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati WAIT(pan_control_state_changed); 333cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 343cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati // Call enable explicitly and verify that the parameters match what we just set. 353cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati CALL_AND_WAIT(error = pan_interface->enable(local_role), pan_control_state_changed); 363cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(error == BT_STATUS_SUCCESS, "Error enabling PAN: %d", error); 373cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_control_state() == BTPAN_STATE_ENABLED, "Control state is disabled."); 383cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_local_role() == local_role, "Unexpected local role: %d", pan_get_local_role()); 393cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error in control callback: %d", pan_get_error()); 403cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 413cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati return true; 423cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati} 433cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 443cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool pan_connect() { 453cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati int error; 463cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 473cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati if (!pan_enable()) { 483cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati return false; 493cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati } 503cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 513cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati CALL_AND_WAIT(error = pan_interface->connect(&bt_remote_bdaddr, local_role, remote_role), pan_connection_state_changed); 523cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(error == BT_STATUS_SUCCESS, "Error connecting to remote host: %d", error); 533cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error connecting to BT device: %d", pan_get_error()); 543cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_connection_state() == BTPAN_STATE_CONNECTING, "Invalid PAN state after connect: %d", pan_get_connection_state()); 553cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_local_role() == local_role, "Incorrect local role: %d", pan_get_local_role()); 563cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_remote_role() == remote_role, "Incorrect remote role: %d", pan_get_remote_role()); 573cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 583cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati WAIT(pan_connection_state_changed); 593cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error connecting to BT device: %d", pan_get_error()); 603cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_connection_state() == BTPAN_STATE_CONNECTED, "Invalid PAN state after connect: %d", pan_get_connection_state()); 613cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_local_role() == local_role, "Incorrect local role: %d", pan_get_local_role()); 623cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_remote_role() == remote_role, "Incorrect remote role: %d", pan_get_remote_role()); 633cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 643cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati return true; 653cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati} 663cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 673cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool pan_disconnect() { 683cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati int error; 693cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 703cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati if (!pan_connect()) { 713cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati return false; 723cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati } 733cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 743cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati CALL_AND_WAIT(error = pan_interface->disconnect(&bt_remote_bdaddr), pan_connection_state_changed); 753cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(error == BT_STATUS_SUCCESS, "Error disconnecting from remote host: %d", error); 763cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error()); 773cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTING, "Invalid PAN state after disconnect: %d", pan_get_connection_state()); 783cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 793cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati WAIT(pan_connection_state_changed); 803cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error()); 813cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTED, "Invalid PAN state after disconnect: %d", pan_get_connection_state()); 823cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati 833cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati return true; 843cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati} 85