diff --git a/android/hal-bluetooth.c b/android/hal-bluetooth.c
index 28289d3..e24f7d2 100644
--- a/android/hal-bluetooth.c
+++ b/android/hal-bluetooth.c
}
cmd.service_id = HAL_SERVICE_ID_SOCKET;
- cmd.mode = HAL_MODE_DEFAULT;
cmd.max_clients = 1;
+#if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
+ cmd.mode = HAL_MODE_SOCKET_DYNAMIC_MAP;
+#else
+ cmd.mode = HAL_MODE_DEFAULT;
+#endif
+
status = hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
sizeof(cmd), &cmd, NULL, NULL, NULL);
if (status != BT_STATUS_SUCCESS) {
diff --git a/android/hal-msg.h b/android/hal-msg.h
index 9d38a9f..88b0c52 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
/* Bluetooth Socket HAL api */
+#define HAL_MODE_SOCKET_DEFAULT HAL_MODE_DEFAULT
+#define HAL_MODE_SOCKET_DYNAMIC_MAP 0x01
+
#define HAL_SOCK_RFCOMM 0x01
#define HAL_SOCK_SCO 0x02
#define HAL_SOCK_L2CAP 0x03
diff --git a/android/socket.c b/android/socket.c
index 2b836e9..ec78dcd 100644
--- a/android/socket.c
+++ b/android/socket.c
static bdaddr_t adapter_addr;
+static uint8_t hal_mode = HAL_MODE_SOCKET_DEFAULT;
+
static const uint8_t zero_uuid[16] = { 0 };
/* Simple list of RFCOMM connected sockets */
{
sdp_list_t *seq;
sdp_profile_desc_t profile[1];
- uint8_t minst = DEFAULT_MAS_INSTANCE;
- uint8_t mtype = DEFAULT_MAS_MSG_TYPE;
+ uint8_t minst, mtype;
sdp_record_t *record;
uuid_t uuid;
+ int cnt, ret;
+
+ switch (hal_mode) {
+ case HAL_MODE_SOCKET_DYNAMIC_MAP:
+ /*
+ * Service name for MAP is passed as XXYYname
+ * XX - instance
+ * YY - message type
+ */
+ ret = sscanf(svc_name, "%02hhx%02hhx%n", &minst, &mtype, &cnt);
+ if (ret != 2 || cnt != 4)
+ return NULL;
+
+ svc_name += 4;
+ break;
+ case HAL_MODE_SOCKET_DEFAULT:
+ minst = DEFAULT_MAS_INSTANCE;
+ mtype = DEFAULT_MAS_MSG_TYPE;
+ break;
+ default:
+ return NULL;
+ }
sdp_uuid16_create(&uuid, MAP_MSE_SVCLASS_ID);
DBG("");
+ hal_mode = mode;
+
/*
* make sure channels assigned for profiles are reserved and not used
* for app services