diff mbox series

[BlueZ,1/5] mgmt: Add support of mgmt TLV API

Message ID 20201028215824.608794-1-luiz.dentz@gmail.com
State New
Headers show
Series [BlueZ,1/5] mgmt: Add support of mgmt TLV API | expand

Commit Message

Luiz Augusto von Dentz Oct. 28, 2020, 9:58 p.m. UTC
From: Howard Chung <howardchung@google.com>

This adds API to send multiple TLVs to kernel, it is useful for
mgmt set system config command.
---
 src/shared/mgmt.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/mgmt.h |  9 +++++
 2 files changed, 103 insertions(+)

Comments

bluez.test.bot@gmail.com Oct. 28, 2020, 10:36 p.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=372299

---Test result---

##############################
Test: CheckPatch - FAIL
Output:
core: Split LE and BR/EDR parameters
WARNING:STATIC_CONST_CHAR_ARRAY: static const char * array should probably be static const char * const
#602: FILE: src/main.c:84:
+static const char *br_options[] = {

WARNING:STATIC_CONST_CHAR_ARRAY: static const char * array should probably be static const char * const
#616: FILE: src/main.c:98:
+static const char *le_options[] = {

- total: 0 errors, 2 warnings, 1036 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

Your patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.


##############################
Test: CheckGitLint - PASS

##############################
Test: CheckBuild - PASS

##############################
Test: MakeCheck - PASS



---
Regards,
Linux Bluetooth
Luiz Augusto von Dentz Oct. 29, 2020, 5:40 p.m. UTC | #2
Hi,

On Wed, Oct 28, 2020 at 2:58 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>

> From: Howard Chung <howardchung@google.com>

>

> This adds API to send multiple TLVs to kernel, it is useful for

> mgmt set system config command.

> ---

>  src/shared/mgmt.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++

>  src/shared/mgmt.h |  9 +++++

>  2 files changed, 103 insertions(+)

>

> diff --git a/src/shared/mgmt.c b/src/shared/mgmt.c

> index b327b4088..9ea9974f5 100644

> --- a/src/shared/mgmt.c

> +++ b/src/shared/mgmt.c

> @@ -68,6 +68,11 @@ struct mgmt_notify {

>         void *user_data;

>  };

>

> +struct mgmt_tlv_list {

> +       struct queue *tlv_queue;

> +       uint16_t size;

> +};

> +

>  static void destroy_request(void *data)

>  {

>         struct mgmt_request *request = data;

> @@ -558,6 +563,95 @@ static struct mgmt_request *create_request(uint16_t opcode, uint16_t index,

>         return request;

>  }

>

> +struct mgmt_tlv_list *mgmt_tlv_list_new(void)

> +{

> +       struct mgmt_tlv_list *tlv_list = new0(struct mgmt_tlv_list, 1);

> +

> +       tlv_list->tlv_queue = queue_new();

> +       tlv_list->size = 0;

> +

> +       return tlv_list;

> +}

> +

> +static struct mgmt_tlv *mgmt_tlv_new(uint16_t type, uint8_t length,

> +                                                               void *value)

> +{

> +       struct mgmt_tlv *entry = malloc(sizeof(*entry) + length);

> +

> +       if (!entry)

> +               return NULL;

> +

> +       entry->type = htobs(type);

> +       entry->length = length;

> +       memcpy(entry->value, value, length);

> +

> +       return entry;

> +}

> +

> +static void mgmt_tlv_free(struct mgmt_tlv *entry)

> +{

> +       free(entry);

> +}

> +

> +void mgmt_tlv_list_free(struct mgmt_tlv_list *tlv_list)

> +{

> +       queue_destroy(tlv_list->tlv_queue, NULL);

> +       free(tlv_list);

> +}

> +

> +bool mgmt_tlv_add(struct mgmt_tlv_list *tlv_list, uint16_t type, uint8_t length,

> +                                                               void *value)

> +{

> +       struct mgmt_tlv *entry = mgmt_tlv_new(type, length, value);

> +

> +       if (!entry)

> +               return false;

> +

> +       if (!queue_push_tail(tlv_list->tlv_queue, entry)) {

> +               mgmt_tlv_free(entry);

> +               return false;

> +       }

> +

> +       tlv_list->size += sizeof(*entry) + entry->length;

> +       return true;

> +}

> +

> +static void mgmt_tlv_to_buf(void *data, void *user_data)

> +{

> +       struct mgmt_tlv *entry = data;

> +       uint8_t **buf_ptr = user_data;

> +       size_t entry_size = sizeof(*entry) + entry->length;

> +

> +       memcpy(*buf_ptr, entry, entry_size);

> +       *buf_ptr += entry_size;

> +}

> +

> +unsigned int mgmt_send_tlv(struct mgmt *mgmt, uint16_t opcode, uint16_t index,

> +                               struct mgmt_tlv_list *tlv_list,

> +                               mgmt_request_func_t callback,

> +                               void *user_data, mgmt_destroy_func_t destroy)

> +{

> +       uint8_t *buf, *buf_ptr;

> +       unsigned int ret;

> +

> +       if (!tlv_list)

> +               return 0;

> +

> +       buf = malloc(tlv_list->size);

> +

> +       if (!buf)

> +               return 0;

> +

> +       buf_ptr = buf;

> +

> +       queue_foreach(tlv_list->tlv_queue, mgmt_tlv_to_buf, &buf_ptr);

> +

> +       ret = mgmt_send(mgmt, opcode, index, tlv_list->size, (void *)buf,

> +                                               callback, user_data, destroy);

> +       free(buf);

> +       return ret;

> +}

> +

>  unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index,

>                                 uint16_t length, const void *param,

>                                 mgmt_request_func_t callback,

> diff --git a/src/shared/mgmt.h b/src/shared/mgmt.h

> index 6608faa7e..74b8befd8 100644

> --- a/src/shared/mgmt.h

> +++ b/src/shared/mgmt.h

> @@ -16,6 +16,7 @@

>  typedef void (*mgmt_destroy_func_t)(void *user_data);

>

>  struct mgmt;

> +struct mgmt_tlv_list;

>

>  struct mgmt *mgmt_new(int fd);

>  struct mgmt *mgmt_new_default(void);

> @@ -33,6 +34,14 @@ bool mgmt_set_close_on_unref(struct mgmt *mgmt, bool do_close);

>  typedef void (*mgmt_request_func_t)(uint8_t status, uint16_t length,

>                                         const void *param, void *user_data);

>

> +struct mgmt_tlv_list *mgmt_tlv_list_new(void);

> +void mgmt_tlv_list_free(struct mgmt_tlv_list *tlv_list);

> +bool mgmt_tlv_add(struct mgmt_tlv_list *tlv_list, uint16_t type, uint8_t length,

> +                                                               void *value);

> +unsigned int mgmt_send_tlv(struct mgmt *mgmt, uint16_t opcode, uint16_t index,

> +                               struct mgmt_tlv_list *tlv_list,

> +                               mgmt_request_func_t callback,

> +                               void *user_data, mgmt_destroy_func_t destroy);

>  unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index,

>                                 uint16_t length, const void *param,

>                                 mgmt_request_func_t callback,

> --

> 2.26.2

>


Pushed.

-- 
Luiz Augusto von Dentz
diff mbox series

Patch

diff --git a/src/shared/mgmt.c b/src/shared/mgmt.c
index b327b4088..9ea9974f5 100644
--- a/src/shared/mgmt.c
+++ b/src/shared/mgmt.c
@@ -68,6 +68,11 @@  struct mgmt_notify {
 	void *user_data;
 };
 
+struct mgmt_tlv_list {
+	struct queue *tlv_queue;
+	uint16_t size;
+};
+
 static void destroy_request(void *data)
 {
 	struct mgmt_request *request = data;
@@ -558,6 +563,95 @@  static struct mgmt_request *create_request(uint16_t opcode, uint16_t index,
 	return request;
 }
 
+struct mgmt_tlv_list *mgmt_tlv_list_new(void)
+{
+	struct mgmt_tlv_list *tlv_list = new0(struct mgmt_tlv_list, 1);
+
+	tlv_list->tlv_queue = queue_new();
+	tlv_list->size = 0;
+
+	return tlv_list;
+}
+
+static struct mgmt_tlv *mgmt_tlv_new(uint16_t type, uint8_t length,
+								void *value)
+{
+	struct mgmt_tlv *entry = malloc(sizeof(*entry) + length);
+
+	if (!entry)
+		return NULL;
+
+	entry->type = htobs(type);
+	entry->length = length;
+	memcpy(entry->value, value, length);
+
+	return entry;
+}
+
+static void mgmt_tlv_free(struct mgmt_tlv *entry)
+{
+	free(entry);
+}
+
+void mgmt_tlv_list_free(struct mgmt_tlv_list *tlv_list)
+{
+	queue_destroy(tlv_list->tlv_queue, NULL);
+	free(tlv_list);
+}
+
+bool mgmt_tlv_add(struct mgmt_tlv_list *tlv_list, uint16_t type, uint8_t length,
+								void *value)
+{
+	struct mgmt_tlv *entry = mgmt_tlv_new(type, length, value);
+
+	if (!entry)
+		return false;
+
+	if (!queue_push_tail(tlv_list->tlv_queue, entry)) {
+		mgmt_tlv_free(entry);
+		return false;
+	}
+
+	tlv_list->size += sizeof(*entry) + entry->length;
+	return true;
+}
+
+static void mgmt_tlv_to_buf(void *data, void *user_data)
+{
+	struct mgmt_tlv *entry = data;
+	uint8_t **buf_ptr = user_data;
+	size_t entry_size = sizeof(*entry) + entry->length;
+
+	memcpy(*buf_ptr, entry, entry_size);
+	*buf_ptr += entry_size;
+}
+
+unsigned int mgmt_send_tlv(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
+				struct mgmt_tlv_list *tlv_list,
+				mgmt_request_func_t callback,
+				void *user_data, mgmt_destroy_func_t destroy)
+{
+	uint8_t *buf, *buf_ptr;
+	unsigned int ret;
+
+	if (!tlv_list)
+		return 0;
+
+	buf = malloc(tlv_list->size);
+
+	if (!buf)
+		return 0;
+
+	buf_ptr = buf;
+
+	queue_foreach(tlv_list->tlv_queue, mgmt_tlv_to_buf, &buf_ptr);
+
+	ret = mgmt_send(mgmt, opcode, index, tlv_list->size, (void *)buf,
+						callback, user_data, destroy);
+	free(buf);
+	return ret;
+}
+
 unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
 				uint16_t length, const void *param,
 				mgmt_request_func_t callback,
diff --git a/src/shared/mgmt.h b/src/shared/mgmt.h
index 6608faa7e..74b8befd8 100644
--- a/src/shared/mgmt.h
+++ b/src/shared/mgmt.h
@@ -16,6 +16,7 @@ 
 typedef void (*mgmt_destroy_func_t)(void *user_data);
 
 struct mgmt;
+struct mgmt_tlv_list;
 
 struct mgmt *mgmt_new(int fd);
 struct mgmt *mgmt_new_default(void);
@@ -33,6 +34,14 @@  bool mgmt_set_close_on_unref(struct mgmt *mgmt, bool do_close);
 typedef void (*mgmt_request_func_t)(uint8_t status, uint16_t length,
 					const void *param, void *user_data);
 
+struct mgmt_tlv_list *mgmt_tlv_list_new(void);
+void mgmt_tlv_list_free(struct mgmt_tlv_list *tlv_list);
+bool mgmt_tlv_add(struct mgmt_tlv_list *tlv_list, uint16_t type, uint8_t length,
+								void *value);
+unsigned int mgmt_send_tlv(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
+				struct mgmt_tlv_list *tlv_list,
+				mgmt_request_func_t callback,
+				void *user_data, mgmt_destroy_func_t destroy);
 unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
 				uint16_t length, const void *param,
 				mgmt_request_func_t callback,