From 0700e5b5a66014f364e9838b3a32839b1497ff3a Mon Sep 17 00:00:00 2001 From: Pavlin Radoslavov Date: Wed, 12 Jul 2017 18:39:31 -0700 Subject: [PATCH] Disable PAN Reverse Tethering when connection originated by the Remote * Check for valid interactions between the three PAN profile roles per Table 1 in PAN Profile v1.0 spec. * Explicitly disable connections to the local PANU if the remote is not PANU. Bug: 63145701 Test: External script Change-Id: I29a7e404ba7e4453b6a7c59148a2b3eb7395303a Merged-In: I29a7e404ba7e4453b6a7c59148a2b3eb7395303a (cherry picked from commit 9aea2c2f92dd5245f6b35d564ce8e471fec2b4ec) (cherry picked from commit 3f2ee5b546b65b5b021779588316249276ed3827) (cherry picked from commit 40c7cefb12ac1a70bf7b1c770c1ab21a5b3f229e) (cherry picked from commit f7a7f7a948e38195e8ca897785ac5d489082f0cc) (cherry picked from commit b40497b27a0dce81d11f0dca09af6d81abf4bd92) --- stack/pan/pan_main.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/stack/pan/pan_main.c b/stack/pan/pan_main.c index 5c3a36739..74a75ecd4 100644 --- a/stack/pan/pan_main.c +++ b/stack/pan/pan_main.c @@ -222,6 +222,39 @@ void pan_conn_ind_cb (UINT16 handle, return; } + /* Check for valid interactions between the three PAN profile roles */ + /* + * For reference, see Table 1 in PAN Profile v1.0 spec. + * Note: the remote is the initiator. + */ + BOOLEAN is_valid_interaction = FALSE; + switch (remote_uuid->uu.uuid16) { + case UUID_SERVCLASS_NAP: + case UUID_SERVCLASS_GN: + if (local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU) + is_valid_interaction = TRUE; + break; + case UUID_SERVCLASS_PANU: + is_valid_interaction = TRUE; + break; + } + /* + * Explicitly disable connections to the local PANU if the remote is + * not PANU. + */ + if ((local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU) && + (remote_uuid->uu.uuid16 != UUID_SERVCLASS_PANU)) { + is_valid_interaction = FALSE; + } + if (!is_valid_interaction) { + PAN_TRACE_ERROR( + "PAN Connection failed because of invalid PAN profile roles " + "interaction: Remote UUID 0x%x Local UUID 0x%x", + remote_uuid->uu.uuid16, local_uuid->uu.uuid16); + BNEP_ConnectResp(handle, BNEP_CONN_FAILED_SRC_UUID); + return; + } + /* Requested destination role is */ if (local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU) req_role = PAN_ROLE_CLIENT; -- 2.11.0