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)
diff --git a/stack/pan/pan_main.cc b/stack/pan/pan_main.cc
index d89096b..01e1ea4 100644
--- a/stack/pan/pan_main.cc
+++ b/stack/pan/pan_main.cc
@@ -214,6 +214,39 @@
     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.
+   */
+  bool 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;