nimble/ll: Add support for read static address VS HCI command

This allows to enable support for reading static random address
from controller via dedicated VS HCI command.
diff --git a/nimble/controller/src/ble_ll_hci.c b/nimble/controller/src/ble_ll_hci.c
index a3da98d..7cd3621 100644
--- a/nimble/controller/src/ble_ll_hci.c
+++ b/nimble/controller/src/ble_ll_hci.c
@@ -1525,6 +1525,47 @@
     return rc;
 }
 
+#if MYNEWT_VAL(BLE_HCI_VS)
+static int
+ble_ll_hci_vs_rd_static_addr(uint8_t *rspbuf, uint8_t *rsplen)
+{
+    struct ble_hci_vs_rd_static_addr_rp *rsp = (void *) rspbuf;
+    ble_addr_t addr;
+
+    if (ble_hw_get_static_addr(&addr) < 0) {
+        return BLE_ERR_UNSPECIFIED;
+    }
+
+    memcpy(rsp->addr, addr.val, sizeof(rsp->addr));
+
+    *rsplen = sizeof(*rsp);
+    return BLE_ERR_SUCCESS;
+}
+
+static int
+ble_ll_hci_vs_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf,
+                       uint8_t *rspbuf, uint8_t *rsplen)
+{
+    int rc;
+
+    /* Assume error; if all pass rc gets set to 0 */
+    rc = BLE_ERR_INV_HCI_CMD_PARMS;
+
+    switch (ocf) {
+    case BLE_HCI_OCF_VS_RD_STATIC_ADDR:
+        if (len == 0) {
+            rc = ble_ll_hci_vs_rd_static_addr(rspbuf, rsplen);
+        }
+        break;
+    default:
+        rc = BLE_ERR_UNKNOWN_HCI_CMD;
+        break;
+    }
+
+    return rc;
+}
+#endif
+
 /**
  * Called to process an HCI command from the host.
  *
@@ -1584,6 +1625,11 @@
     case BLE_HCI_OGF_LE:
         rc = ble_ll_hci_le_cmd_proc(cmd->data, cmd->length, ocf, rspbuf, &rsplen, &post_cb);
         break;
+#if MYNEWT_VAL(BLE_HCI_VS)
+    case BLE_HCI_OGF_VENDOR:
+        rc = ble_ll_hci_vs_cmd_proc(cmd->data, cmd->length, ocf, rspbuf, &rsplen);
+        break;
+#endif
     default:
         /* XXX: Need to support other OGF. For now, return unsupported */
         rc = BLE_ERR_UNKNOWN_HCI_CMD;
diff --git a/nimble/include/nimble/hci_common.h b/nimble/include/nimble/hci_common.h
index 3df8dd6..92031c3 100644
--- a/nimble/include/nimble/hci_common.h
+++ b/nimble/include/nimble/hci_common.h
@@ -1061,6 +1061,12 @@
     uint8_t val;
 } __attribute__((packed));
 
+/* --- Vendor specific commands (OGF 0x00FF) */
+#define BLE_HCI_OCF_VS_RD_STATIC_ADDR                 (0x0001)
+struct ble_hci_vs_rd_static_addr_rp {
+    uint8_t addr[6];
+} __attribute__((packed));
+
 /* Command Specific Definitions */
 /* --- Set controller to host flow control (OGF 0x03, OCF 0x0031) --- */
 #define BLE_HCI_CTLR_TO_HOST_FC_OFF         (0)
diff --git a/nimble/syscfg.yml b/nimble/syscfg.yml
index dcbdfd1..b5cfc58 100644
--- a/nimble/syscfg.yml
+++ b/nimble/syscfg.yml
@@ -95,6 +95,15 @@
         restrictions:
             - 'BLE_ISO if 1'
 
+    BLE_HCI_VS:
+        description: >
+            Enables support for NimBLE specific vendor HCI commands
+        value: 0
+
 # Allow periodic sync transfer only if 5.1 or higher
 syscfg.restrictions:
     - "'BLE_PERIODIC_ADV_SYNC_TRANSFER == 0' || 'BLE_VERSION >= 51'"
+
+# Enable VS HCI by default for combined or standalone controller build
+syscfg.vals.BLE_CONTROLLER:
+    BLE_HCI_VS: 1