[PATCH BlueZ 1/1] client/player: Allow the user to control BIG encryption

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This commit adds support for controlling the use of encryption and
setting the broadcast code. On the source side the user will be
prompted to choose if he wants to use the BIG mode 3 encryption,
and the Broadcast Code to be used (custom/default value). On the
sink side only the Broadcast Code option is displayed as the use
of encryption is set according to the BASE of the source.
---
 client/player.c | 75 ++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 59 insertions(+), 16 deletions(-)

diff --git a/client/player.c b/client/player.c
index 92fc91f92..7a5277fad 100644
--- a/client/player.c
+++ b/client/player.c
@@ -1966,6 +1966,11 @@ static void append_bcast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
 	g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE,
 						&bcast_qos.bcast.framing);
 
+	bt_shell_printf("Encryption 0x%02x\n", bcast_qos.bcast.encryption);
+
+	g_dbus_dict_append_entry(iter, "Encryption", DBUS_TYPE_BYTE,
+						&bcast_qos.bcast.encryption);
+
 	bt_shell_printf("SyncFactor %u\n", bcast_qos.bcast.sync_factor);
 
 	g_dbus_dict_append_entry(iter, "SyncFactor", DBUS_TYPE_BYTE,
@@ -3110,6 +3115,34 @@ static void endpoint_config(const char *input, void *user_data)
 	endpoint_set_config(cfg);
 }
 
+static void set_broadcast_code(const char *input, void *user_data)
+{
+	struct endpoint_config *cfg = user_data;
+	char *endptr;
+
+	/* If input is no, set the encryption flag to 0.*/
+	if (!strcasecmp(input, "n") || !strcasecmp(input, "no"))
+		bcast_qos.bcast.encryption = 0;
+	else
+		bcast_qos.bcast.encryption = 1;
+
+	/* If input is auto, do nothing, default value will be used */
+	if (!(!strcasecmp(input, "a") || !strcasecmp(input, "auto"))) {
+		bcast_qos.bcast.bcode[0] = strtol(input, &endptr, 16);
+
+		for (uint8_t i = 1; i < 16; i++)
+			bcast_qos.bcast.bcode[i] = strtol(endptr, &endptr, 16);
+	}
+	bt_shell_printf("%ld\n", sizeof(bcast_qos.bcast.bcode));
+	iov_append(&cfg->ep->bcode, bcast_qos.bcast.bcode,
+		sizeof(bcast_qos.bcast.bcode));
+	/* Copy capabilities for broadcast*/
+	iov_append(&cfg->caps, base_lc3_16_2_1,
+		sizeof(base_lc3_16_2_1));
+
+	endpoint_set_config(cfg);
+}
+
 static struct endpoint *endpoint_new(const struct capabilities *cap);
 
 static void cmd_config_endpoint(int argc, char *argv[])
@@ -3119,7 +3152,7 @@ static void cmd_config_endpoint(int argc, char *argv[])
 	const struct capabilities *cap;
 	char *uuid;
 	uint8_t codec_id;
-	bool broadcast = false;
+	bool local_ep_not_provided = false;
 
 	cfg = new0(struct endpoint_config, 1);
 
@@ -3142,7 +3175,7 @@ static void cmd_config_endpoint(int argc, char *argv[])
 		codec_id = strtol(argv[3], NULL, 0);
 		cap = find_capabilities(uuid, codec_id);
 		if (cap) {
-			broadcast = true;
+			local_ep_not_provided = true;
 			cfg->ep = endpoint_new(cap);
 			cfg->ep->preset = find_presets_name(uuid, argv[3]);
 			if (!cfg->ep->preset)
@@ -3154,9 +3187,10 @@ static void cmd_config_endpoint(int argc, char *argv[])
 		}
 	}
 
-	if (((broadcast == false) && (argc > 3)) ||
-		((broadcast == true) && (argc > 4))) {
-		char *preset_name = (broadcast == false)?argv[3]:argv[4];
+	if (((local_ep_not_provided == false) && (argc > 3)) ||
+		((local_ep_not_provided == true) && (argc > 4))) {
+		char *preset_name = (local_ep_not_provided == false)
+							? argv[3]:argv[4];
 
 		preset = preset_find_name(cfg->ep->preset, preset_name);
 		if (!preset) {
@@ -3164,23 +3198,32 @@ static void cmd_config_endpoint(int argc, char *argv[])
 			goto fail;
 		}
 
+		/* Set QoS parameters */
+		cfg->qos = &preset->qos;
+
 		if (cfg->ep->broadcast) {
-			iov_append(&cfg->ep->bcode, bcast_qos.bcast.bcode,
-				sizeof(bcast_qos.bcast.bcode));
-			/* Copy capabilities for broadcast*/
-			iov_append(&cfg->caps, base_lc3_16_2_1,
-				sizeof(base_lc3_16_2_1));
+			/* If the endpoint is configured to be a broadcast
+			 * sink or source allow the user to set a custom
+			 * broadcast code or use the default one. Selecting
+			 * 'no' will result in the broadcast not using any
+			 * encryption.
+			 */
+			if (!strcmp(cfg->ep->uuid, BAA_SERVICE_UUID) ||
+				!strcmp(cfg->ep->uuid, BCAA_SERVICE_UUID)) {
+				bt_shell_prompt_input(cfg->ep->path,
+						"Enter the broadcast code (value/auto/no):",
+						set_broadcast_code, cfg);
+				return;
+			}
+
 		} else {
 			/* Copy capabilities */
 			iov_append(&cfg->caps, preset->data.iov_base,
 							preset->data.iov_len);
-		}
 
-		/* Set QoS parameters */
-		cfg->qos = &preset->qos;
-
-		endpoint_set_config(cfg);
-		return;
+			endpoint_set_config(cfg);
+			return;
+		}
 	}
 
 	bt_shell_prompt_input(cfg->ep->path, "Enter configuration:",
-- 
2.39.2





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux