Skip to content

Commit 8c3568f

Browse files
MariuszSkamrafabiobaltieri
authored andcommitted
Bluetooth: audio: mcs: Fix endianess issues
This fixes missing endianess conversions in mcs.c. Signed-off-by: Mariusz Skamra <[email protected]>
1 parent d8166e8 commit 8c3568f

File tree

1 file changed

+77
-30
lines changed
  • subsys/bluetooth/audio

1 file changed

+77
-30
lines changed

subsys/bluetooth/audio/mcs.c

Lines changed: 77 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <stdio.h>
1717
#include <zephyr/types.h>
1818
#include <zephyr/sys/atomic.h>
19+
#include <zephyr/sys/byteorder.h>
1920
#include <zephyr/sys/util.h>
2021

2122
#include <zephyr/bluetooth/bluetooth.h>
@@ -124,10 +125,14 @@ static ssize_t read_icon_id(struct bt_conn *conn,
124125
uint16_t len, uint16_t offset)
125126
{
126127
uint64_t icon_id = media_proxy_sctrl_get_icon_id();
128+
uint8_t icon_id_le[BT_OTS_OBJ_ID_SIZE];
129+
130+
sys_put_le48(icon_id, icon_id_le);
127131

128132
LOG_DBG_OBJ_ID("Icon object read: ", icon_id);
129-
return bt_gatt_attr_read(conn, attr, buf, len, offset, &icon_id,
130-
BT_OTS_OBJ_ID_SIZE);
133+
134+
return bt_gatt_attr_read(conn, attr, buf, len, offset, icon_id_le,
135+
sizeof(icon_id_le));
131136
}
132137
#endif /* CONFIG_BT_OTS */
133138

@@ -186,13 +191,14 @@ static ssize_t read_track_duration(struct bt_conn *conn,
186191
{
187192
struct client_state *client = &clients[bt_conn_index(conn)];
188193
int32_t duration = media_proxy_sctrl_get_track_duration();
194+
int32_t duration_le = sys_cpu_to_le32(duration);
189195

190196
LOG_DBG("Track duration read: %d (0x%08x)", duration, duration);
191197

192198
atomic_clear_bit(client->flags, FLAG_TRACK_DURATION_CHANGED);
193199

194-
return bt_gatt_attr_read(conn, attr, buf, len, offset, &duration,
195-
sizeof(duration));
200+
return bt_gatt_attr_read(conn, attr, buf, len, offset, &duration_le,
201+
sizeof(duration_le));
196202
}
197203

198204
static void track_duration_cfg_changed(const struct bt_gatt_attr *attr,
@@ -207,13 +213,14 @@ static ssize_t read_track_position(struct bt_conn *conn,
207213
{
208214
struct client_state *client = &clients[bt_conn_index(conn)];
209215
int32_t position = media_proxy_sctrl_get_track_position();
216+
int32_t position_le = sys_cpu_to_le32(position);
210217

211218
LOG_DBG("Track position read: %d (0x%08x)", position, position);
212219

213220
atomic_clear_bit(client->flags, FLAG_TRACK_POSITION_CHANGED);
214221

215-
return bt_gatt_attr_read(conn, attr, buf, len, offset, &position,
216-
sizeof(position));
222+
return bt_gatt_attr_read(conn, attr, buf, len, offset, &position_le,
223+
sizeof(position_le));
217224
}
218225

219226
static ssize_t write_track_position(struct bt_conn *conn,
@@ -226,11 +233,12 @@ static ssize_t write_track_position(struct bt_conn *conn,
226233
if (offset != 0) {
227234
return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET);
228235
}
236+
229237
if (len != sizeof(position)) {
230238
return BT_GATT_ERR(BT_ATT_ERR_INVALID_ATTRIBUTE_LEN);
231239
}
232240

233-
memcpy(&position, buf, len);
241+
position = sys_get_le32((uint8_t *)buf);
234242

235243
media_proxy_sctrl_set_track_position(position);
236244

@@ -316,10 +324,14 @@ static ssize_t read_track_segments_id(struct bt_conn *conn,
316324
void *buf, uint16_t len, uint16_t offset)
317325
{
318326
uint64_t track_segments_id = media_proxy_sctrl_get_track_segments_id();
327+
uint8_t track_segments_id_le[BT_OTS_OBJ_ID_SIZE];
328+
329+
sys_put_le48(track_segments_id, track_segments_id_le);
319330

320331
LOG_DBG_OBJ_ID("Track segments ID read: ", track_segments_id);
332+
321333
return bt_gatt_attr_read(conn, attr, buf, len, offset,
322-
&track_segments_id, BT_OTS_OBJ_ID_SIZE);
334+
track_segments_id_le, sizeof(track_segments_id_le));
323335
}
324336

325337
static ssize_t read_current_track_id(struct bt_conn *conn,
@@ -328,13 +340,16 @@ static ssize_t read_current_track_id(struct bt_conn *conn,
328340
{
329341
struct client_state *client = &clients[bt_conn_index(conn)];
330342
uint64_t track_id = media_proxy_sctrl_get_current_track_id();
343+
uint8_t track_id_le[BT_OTS_OBJ_ID_SIZE];
344+
345+
sys_put_le48(track_id, track_id_le);
331346

332347
LOG_DBG_OBJ_ID("Current track ID read: ", track_id);
333348

334349
atomic_clear_bit(client->flags, FLAG_CURRENT_TRACK_OBJ_ID_CHANGED);
335350

336-
return bt_gatt_attr_read(conn, attr, buf, len, offset, &track_id,
337-
BT_OTS_OBJ_ID_SIZE);
351+
return bt_gatt_attr_read(conn, attr, buf, len, offset, track_id_le,
352+
sizeof(track_id_le));
338353
}
339354

340355
static ssize_t write_current_track_id(struct bt_conn *conn,
@@ -379,6 +394,9 @@ static ssize_t read_next_track_id(struct bt_conn *conn,
379394
{
380395
struct client_state *client = &clients[bt_conn_index(conn)];
381396
uint64_t track_id = media_proxy_sctrl_get_next_track_id();
397+
uint8_t track_id_le[BT_OTS_OBJ_ID_SIZE];
398+
399+
sys_put_le48(track_id, track_id_le);
382400

383401
atomic_clear_bit(client->flags, FLAG_NEXT_TRACK_OBJ_ID_CHANGED);
384402

@@ -391,7 +409,7 @@ static ssize_t read_next_track_id(struct bt_conn *conn,
391409

392410
LOG_DBG_OBJ_ID("Next track read: ", track_id);
393411
return bt_gatt_attr_read(conn, attr, buf, len, offset,
394-
&track_id, BT_OTS_OBJ_ID_SIZE);
412+
track_id_le, sizeof(track_id_le));
395413
}
396414

397415
static ssize_t write_next_track_id(struct bt_conn *conn,
@@ -436,13 +454,16 @@ static ssize_t read_parent_group_id(struct bt_conn *conn,
436454
{
437455
struct client_state *client = &clients[bt_conn_index(conn)];
438456
uint64_t group_id = media_proxy_sctrl_get_parent_group_id();
457+
uint8_t group_id_le[BT_OTS_OBJ_ID_SIZE];
458+
459+
sys_put_le48(group_id, group_id_le);
439460

440461
LOG_DBG_OBJ_ID("Parent group read: ", group_id);
441462

442463
atomic_clear_bit(client->flags, FLAG_PARENT_GROUP_OBJ_ID_CHANGED);
443464

444-
return bt_gatt_attr_read(conn, attr, buf, len, offset, &group_id,
445-
BT_OTS_OBJ_ID_SIZE);
465+
return bt_gatt_attr_read(conn, attr, buf, len, offset, group_id_le,
466+
sizeof(group_id_le));
446467
}
447468

448469
static void parent_group_id_cfg_changed(const struct bt_gatt_attr *attr,
@@ -457,13 +478,16 @@ static ssize_t read_current_group_id(struct bt_conn *conn,
457478
{
458479
struct client_state *client = &clients[bt_conn_index(conn)];
459480
uint64_t group_id = media_proxy_sctrl_get_current_group_id();
481+
uint8_t group_id_le[BT_OTS_OBJ_ID_SIZE];
482+
483+
sys_put_le48(group_id, group_id_le);
460484

461485
LOG_DBG_OBJ_ID("Current group read: ", group_id);
462486

463487
atomic_clear_bit(client->flags, FLAG_CURRENT_GROUP_OBJ_ID_CHANGED);
464488

465-
return bt_gatt_attr_read(conn, attr, buf, len, offset, &group_id,
466-
BT_OTS_OBJ_ID_SIZE);
489+
return bt_gatt_attr_read(conn, attr, buf, len, offset, group_id_le,
490+
sizeof(group_id_le));
467491
}
468492

469493
static ssize_t write_current_group_id(struct bt_conn *conn,
@@ -554,11 +578,12 @@ static ssize_t read_playing_orders_supported(struct bt_conn *conn,
554578
void *buf, uint16_t len, uint16_t offset)
555579
{
556580
uint16_t orders = media_proxy_sctrl_get_playing_orders_supported();
581+
uint16_t orders_le = sys_cpu_to_le16(orders);
557582

558583
LOG_DBG("Playing orders read: %d (0x%04x)", orders, orders);
559584

560-
return bt_gatt_attr_read(conn, attr, buf, len, offset, &orders,
561-
sizeof(orders));
585+
return bt_gatt_attr_read(conn, attr, buf, len, offset, &orders_le,
586+
sizeof(orders_le));
562587
}
563588

564589
static ssize_t read_media_state(struct bt_conn *conn,
@@ -630,9 +655,7 @@ static ssize_t write_control_point(struct bt_conn *conn,
630655
}
631656

632657
if (len == sizeof(command.opcode) + sizeof(command.param)) {
633-
memcpy(&command.param,
634-
(char *)buf + sizeof(command.opcode),
635-
sizeof(command.param));
658+
command.param = sys_get_le32((char *)buf + sizeof(command.opcode));
636659
command.use_param = true;
637660
LOG_DBG("Parameter: %d", command.param);
638661
}
@@ -654,13 +677,14 @@ static ssize_t read_opcodes_supported(struct bt_conn *conn,
654677
{
655678
struct client_state *client = &clients[bt_conn_index(conn)];
656679
uint32_t opcodes = media_proxy_sctrl_get_commands_supported();
680+
uint32_t opcodes_le = sys_cpu_to_le32(opcodes);
657681

658682
LOG_DBG("Opcodes_supported read: %d (0x%08x)", opcodes, opcodes);
659683

660684
atomic_clear_bit(client->flags, FLAG_MEDIA_CONTROL_OPCODES_CHANGED);
661685

662686
return bt_gatt_attr_read(conn, attr, buf, len, offset,
663-
&opcodes, BT_MCS_OPCODES_SUPPORTED_LEN);
687+
&opcodes_le, sizeof(opcodes_le));
664688
}
665689

666690
static void opcodes_supported_cfg_changed(const struct bt_gatt_attr *attr,
@@ -736,8 +760,12 @@ static ssize_t read_search_results_id(struct bt_conn *conn,
736760
return bt_gatt_attr_read(conn, attr, buf, len, offset,
737761
NULL, 0);
738762
} else {
763+
uint8_t search_id_le[BT_OTS_OBJ_ID_SIZE];
764+
765+
sys_put_le48(search_id, search_id_le);
766+
739767
return bt_gatt_attr_read(conn, attr, buf, len, offset,
740-
&search_id, BT_OTS_OBJ_ID_SIZE);
768+
&search_id_le, sizeof(search_id_le));
741769
}
742770
}
743771

@@ -993,16 +1021,18 @@ static void notify_cb(struct bt_conn *conn, void *data)
9931021

9941022
if (atomic_test_and_clear_bit(client->flags, FLAG_TRACK_DURATION_CHANGED)) {
9951023
int32_t duration = media_proxy_sctrl_get_track_duration();
1024+
int32_t duration_le = sys_cpu_to_le32(duration);
9961025

9971026
LOG_DBG("Notifying track duration: %d", duration);
998-
notify(BT_UUID_MCS_TRACK_DURATION, &duration, sizeof(duration));
1027+
notify(BT_UUID_MCS_TRACK_DURATION, &duration_le, sizeof(duration_le));
9991028
}
10001029

10011030
if (atomic_test_and_clear_bit(client->flags, FLAG_TRACK_POSITION_CHANGED)) {
10021031
int32_t position = media_proxy_sctrl_get_track_position();
1032+
int32_t position_le = sys_cpu_to_le32(position);
10031033

10041034
LOG_DBG("Notifying track position: %d", position);
1005-
notify(BT_UUID_MCS_TRACK_POSITION, &position, sizeof(position));
1035+
notify(BT_UUID_MCS_TRACK_POSITION, &position_le, sizeof(position_le));
10061036
}
10071037

10081038
if (atomic_test_and_clear_bit(client->flags, FLAG_PLAYBACK_SPEED_CHANGED)) {
@@ -1022,9 +1052,12 @@ static void notify_cb(struct bt_conn *conn, void *data)
10221052
#if defined(CONFIG_BT_OTS)
10231053
if (atomic_test_and_clear_bit(client->flags, FLAG_CURRENT_TRACK_OBJ_ID_CHANGED)) {
10241054
uint64_t track_id = media_proxy_sctrl_get_current_track_id();
1055+
uint8_t track_id_le[BT_OTS_OBJ_ID_SIZE];
1056+
1057+
sys_put_le48(track_id, track_id_le);
10251058

10261059
LOG_DBG_OBJ_ID("Notifying current track ID: ", track_id);
1027-
notify(BT_UUID_MCS_CURRENT_TRACK_OBJ_ID, &track_id, BT_OTS_OBJ_ID_SIZE);
1060+
notify(BT_UUID_MCS_CURRENT_TRACK_OBJ_ID, track_id_le, sizeof(track_id_le));
10281061
}
10291062

10301063
if (atomic_test_and_clear_bit(client->flags, FLAG_NEXT_TRACK_OBJ_ID_CHANGED)) {
@@ -1037,23 +1070,33 @@ static void notify_cb(struct bt_conn *conn, void *data)
10371070
LOG_DBG_OBJ_ID("Notifying EMPTY next track ID: ", track_id);
10381071
notify(BT_UUID_MCS_NEXT_TRACK_OBJ_ID, NULL, 0);
10391072
} else {
1073+
uint8_t track_id_le[BT_OTS_OBJ_ID_SIZE];
1074+
1075+
sys_put_le48(track_id, track_id_le);
1076+
10401077
LOG_DBG_OBJ_ID("Notifying next track ID: ", track_id);
1041-
notify(BT_UUID_MCS_NEXT_TRACK_OBJ_ID, &track_id, BT_OTS_OBJ_ID_SIZE);
1078+
notify(BT_UUID_MCS_NEXT_TRACK_OBJ_ID, track_id_le, sizeof(track_id_le));
10421079
}
10431080
}
10441081

10451082
if (atomic_test_and_clear_bit(client->flags, FLAG_PARENT_GROUP_OBJ_ID_CHANGED)) {
10461083
uint64_t group_id = media_proxy_sctrl_get_parent_group_id();
1084+
uint8_t group_id_le[BT_OTS_OBJ_ID_SIZE];
1085+
1086+
sys_put_le48(group_id, group_id_le);
10471087

10481088
LOG_DBG_OBJ_ID("Notifying parent group ID: ", group_id);
1049-
notify(BT_UUID_MCS_PARENT_GROUP_OBJ_ID, &group_id, BT_OTS_OBJ_ID_SIZE);
1089+
notify(BT_UUID_MCS_PARENT_GROUP_OBJ_ID, &group_id_le, sizeof(group_id_le));
10501090
}
10511091

10521092
if (atomic_test_and_clear_bit(client->flags, FLAG_CURRENT_GROUP_OBJ_ID_CHANGED)) {
10531093
uint64_t group_id = media_proxy_sctrl_get_current_group_id();
1094+
uint8_t group_id_le[BT_OTS_OBJ_ID_SIZE];
1095+
1096+
sys_put_le48(group_id, group_id_le);
10541097

10551098
LOG_DBG_OBJ_ID("Notifying current group ID: ", group_id);
1056-
notify(BT_UUID_MCS_CURRENT_GROUP_OBJ_ID, &group_id, BT_OTS_OBJ_ID_SIZE);
1099+
notify(BT_UUID_MCS_CURRENT_GROUP_OBJ_ID, &group_id_le, sizeof(group_id_le));
10571100
}
10581101
#endif /* CONFIG_BT_OTS */
10591102

@@ -1078,17 +1121,21 @@ static void notify_cb(struct bt_conn *conn, void *data)
10781121

10791122
if (atomic_test_and_clear_bit(client->flags, FLAG_MEDIA_CONTROL_OPCODES_CHANGED)) {
10801123
uint32_t opcodes = media_proxy_sctrl_get_commands_supported();
1124+
uint32_t opcodes_le = sys_cpu_to_le32(opcodes);
10811125

10821126
LOG_DBG("Notifying command opcodes supported: %d (0x%08x)", opcodes, opcodes);
1083-
notify(BT_UUID_MCS_MEDIA_CONTROL_OPCODES, &opcodes, BT_MCS_OPCODES_SUPPORTED_LEN);
1127+
notify(BT_UUID_MCS_MEDIA_CONTROL_OPCODES, &opcodes_le, sizeof(opcodes_le));
10841128
}
10851129

10861130
#if defined(CONFIG_BT_OTS)
10871131
if (atomic_test_and_clear_bit(client->flags, FLAG_SEARCH_RESULTS_OBJ_ID_CHANGED)) {
10881132
uint64_t search_id = media_proxy_sctrl_get_search_results_id();
1133+
uint8_t search_id_le[BT_OTS_OBJ_ID_SIZE];
1134+
1135+
sys_put_le48(search_id, search_id_le);
10891136

10901137
LOG_DBG_OBJ_ID("Notifying search results ID: ", search_id);
1091-
notify(BT_UUID_MCS_SEARCH_RESULTS_OBJ_ID, &search_id, BT_OTS_OBJ_ID_SIZE);
1138+
notify(BT_UUID_MCS_SEARCH_RESULTS_OBJ_ID, &search_id_le, sizeof(search_id_le));
10921139
}
10931140

10941141
if (atomic_test_and_clear_bit(client->flags, FLAG_SEARCH_CONTROL_POINT_RESULT)) {

0 commit comments

Comments
 (0)