Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: CI

on: [pull_request]

jobs:
ci:
runs-on: ubuntu-latest
name: CI for Pull Request
steps:
- name: Checkout the source code
uses: actions/checkout@v3
with:
path: src/src

- name: CI
uses: tedd-an/bzcafe@main
with:
task: ci
base_folder: src
space: user
github_token: ${{ secrets.ACTION_TOKEN }}
email_token: ${{ secrets.EMAIL_TOKEN }}
patchwork_token: ${{ secrets.PATCHWORK_TOKEN }}
patchwork_user: ${{ secrets.PATCHWORK_USER }}

26 changes: 26 additions & 0 deletions .github/workflows/code_scan.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Code Scan

on:
schedule:
- cron: "40 7 * * FRI"

jobs:
code-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout the source
uses: actions/checkout@v2
with:
fetch-depth: 0
path: src
- name: Code Scan
uses: BluezTestBot/action-code-scan@main
with:
src_path: src
github_token: ${{ secrets.GITHUB_TOKEN }}
email_token: ${{ secrets.EMAIL_TOKEN }}
- uses: actions/upload-artifact@v2
with:
name: scan_report
path: scan_report.tar.gz

43 changes: 43 additions & 0 deletions .github/workflows/sync.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Sync

on:
schedule:
- cron: "*/30 * * * *"

jobs:
sync_repo:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: master

- name: Sync Repo
uses: tedd-an/bzcafe@main
with:
task: sync
upstream_repo: 'https://git.kernel.org/pub/scm/bluetooth/bluez.git'
github_token: ${{ secrets.GITHUB_TOKEN }}

- name: Cleanup PR
uses: tedd-an/bzcafe@main
with:
task: cleanup
github_token: ${{ secrets.ACTION_TOKEN }}

sync_patchwork:
needs: sync_repo
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Sync Patchwork
uses: tedd-an/bzcafe@main
with:
task: patchwork
space: user
github_token: ${{ secrets.ACTION_TOKEN }}
email_token: ${{ secrets.EMAIL_TOKEN }}
patchwork_token: ${{ secrets.PATCHWORK_TOKEN }}
patchwork_user: ${{ secrets.PATCHWORK_USER }}

29 changes: 28 additions & 1 deletion btio/btio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1649,6 +1649,27 @@ static gboolean sco_get(int sock, GError **err, BtIOOption opt1, va_list args)
return TRUE;
}

static bool get_bc_sid(int sock, uint8_t *sid, GError **err)
{
struct {
struct sockaddr_iso iso;
struct sockaddr_iso_bc bc;
} addr;
socklen_t olen;

olen = sizeof(addr);
memset(&addr, 0, olen);
if (getpeername(sock, (void *)&addr, &olen) < 0 ||
olen != sizeof(addr)) {
ERROR_FAILED(err, "getpeername", errno);
return false;
}

*sid = addr.iso.iso_bc->bc_sid;

return true;
}

static gboolean iso_get(int sock, GError **err, BtIOOption opt1, va_list args)
{
BtIOOption opt = opt1;
Expand All @@ -1657,6 +1678,7 @@ static gboolean iso_get(int sock, GError **err, BtIOOption opt1, va_list args)
struct bt_iso_base base;
socklen_t len;
uint32_t phy;
uint8_t bc_sid;

len = sizeof(qos);
memset(&qos, 0, len);
Expand Down Expand Up @@ -1721,6 +1743,12 @@ static gboolean iso_get(int sock, GError **err, BtIOOption opt1, va_list args)
case BT_IO_OPT_BASE:
*(va_arg(args, struct bt_iso_base *)) = base;
break;
case BT_IO_OPT_ISO_BC_SID:
if (!get_bc_sid(sock, &bc_sid, err))
return FALSE;

*(va_arg(args, uint8_t *)) = bc_sid;
break;
case BT_IO_OPT_HANDLE:
case BT_IO_OPT_CLASS:
case BT_IO_OPT_DEFER_TIMEOUT:
Expand All @@ -1736,7 +1764,6 @@ static gboolean iso_get(int sock, GError **err, BtIOOption opt1, va_list args)
case BT_IO_OPT_FLUSHABLE:
case BT_IO_OPT_PRIORITY:
case BT_IO_OPT_VOICE:
case BT_IO_OPT_ISO_BC_SID:
case BT_IO_OPT_ISO_BC_NUM_BIS:
case BT_IO_OPT_ISO_BC_BIS:
case BT_IO_OPT_INVALID:
Expand Down
32 changes: 29 additions & 3 deletions emulator/btdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,14 @@ struct le_ext_adv {
uint8_t scan_data_len;
unsigned int broadcast_id;
unsigned int timeout_id;
uint8_t sid;
};

struct le_per_adv {
struct btdev *dev;
uint8_t addr_type;
uint8_t addr[6];
uint8_t sid;
uint16_t sync_handle;
};

Expand Down Expand Up @@ -4923,6 +4925,7 @@ static int cmd_set_ext_adv_params(struct btdev *dev, const void *data,
ext_adv->direct_addr_type = cmd->peer_addr_type;
memcpy(ext_adv->direct_addr, cmd->peer_addr, 6);
ext_adv->filter_policy = cmd->filter_policy;
ext_adv->sid = cmd->sid;

rsp.status = BT_HCI_ERR_SUCCESS;
rsp.tx_power = 0;
Expand Down Expand Up @@ -5019,6 +5022,7 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote,
/* Right now we dont care about phy in adv report */
meta_event.lear.primary_phy = 0x01;
meta_event.lear.secondary_phy = 0x01;
meta_event.lear.sid = ext_adv->sid;

/* Scan or advertising response */
if (is_scan_rsp) {
Expand Down Expand Up @@ -5420,17 +5424,32 @@ static bool match_dev(const void *data, const void *match_data)
per_adv->addr_type);
}

static bool match_sid(const void *data, const void *match_data)
{
const struct le_ext_adv *ext_adv = data;
uint8_t sid = PTR_TO_UINT(match_data);

return ext_adv->sid == sid;
}

static void le_pa_sync_estabilished(struct btdev *dev, struct btdev *remote,
uint8_t status)
{
struct bt_hci_evt_le_per_sync_established ev;
struct le_per_adv *per_adv;
struct le_ext_adv *ext_adv;
uint16_t sync_handle = SYNC_HANDLE;

per_adv = queue_find(dev->le_per_adv, match_dev, remote);
if (!per_adv)
return;

/* Match SID */
ext_adv = queue_find(remote->le_ext_adv, match_sid,
UINT_TO_PTR(per_adv->sid));
if (!ext_adv)
return;

memset(&ev, 0, sizeof(ev));
ev.status = status;

Expand Down Expand Up @@ -5701,8 +5720,8 @@ static int cmd_ext_create_conn_complete(struct btdev *dev, const void *data,
return 0;
}

static struct le_per_adv *le_per_adv_new(struct btdev *btdev,
uint8_t addr_type, const uint8_t *addr)
static struct le_per_adv *le_per_adv_new(struct btdev *btdev, uint8_t addr_type,
const uint8_t *addr, uint8_t sid)
{
struct le_per_adv *per_adv;

Expand All @@ -5711,6 +5730,7 @@ static struct le_per_adv *le_per_adv_new(struct btdev *btdev,
per_adv->dev = btdev;
per_adv->addr_type = addr_type;
memcpy(per_adv->addr, addr, 6);
per_adv->sid = sid;
per_adv->sync_handle = INV_HANDLE;

/* Add to queue */
Expand All @@ -5728,8 +5748,14 @@ static int cmd_pa_create_sync(struct btdev *dev, const void *data, uint8_t len)
uint8_t status = BT_HCI_ERR_SUCCESS;
struct le_per_adv *per_adv;

if (cmd->sid > 0x0f) {
cmd_status(dev, BT_HCI_ERR_INVALID_PARAMETERS,
BT_HCI_CMD_LE_PA_CREATE_SYNC);
return 0;
}

/* Create new train */
per_adv = le_per_adv_new(dev, cmd->addr_type, cmd->addr);
per_adv = le_per_adv_new(dev, cmd->addr_type, cmd->addr, cmd->sid);
if (!per_adv)
status = BT_HCI_ERR_MEM_CAPACITY_EXCEEDED;

Expand Down
32 changes: 19 additions & 13 deletions profiles/audio/bap.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ struct bap_setup {
unsigned int io_id;
bool recreate;
bool cig_active;
uint8_t sid;
struct iovec *caps;
struct iovec *metadata;
unsigned int id;
Expand Down Expand Up @@ -1053,8 +1054,9 @@ static void iso_bcast_confirm_cb(GIOChannel *io, GError *err, void *user_data)
}

static void create_stream_for_bis(struct bap_data *bap_data,
struct bt_bap_pac *lpac, struct bt_bap_qos *qos,
struct iovec *caps, struct iovec *meta, char *path)
struct bt_bap_pac *lpac, uint8_t sid,
struct bt_bap_qos *qos, struct iovec *caps,
struct iovec *meta, char *path)
{
struct bap_setup *setup;

Expand All @@ -1072,36 +1074,35 @@ static void create_stream_for_bis(struct bap_data *bap_data,
setup->stream = bt_bap_stream_new(bap_data->bap,
lpac, NULL, &setup->qos, caps);

setup->sid = sid;
bt_bap_stream_set_user_data(setup->stream, path);
bt_bap_stream_config(setup->stream, &setup->qos,
caps, NULL, NULL);
bt_bap_stream_metadata(setup->stream, meta,
NULL, NULL);
}

static void bis_handler(uint8_t bis, uint8_t sgrp, struct iovec *caps,
struct iovec *meta, struct bt_bap_qos *qos, void *user_data)
static void bis_handler(uint8_t sid, uint8_t bis, uint8_t sgrp,
struct iovec *caps, struct iovec *meta,
struct bt_bap_qos *qos, void *user_data)
{
struct bap_data *data = user_data;
struct bt_bap_pac *lpac;
char *path;

bt_bap_bis_probe(data->bap, bis, sgrp, caps, meta, qos);
bt_bap_bis_probe(data->bap, sid, bis, sgrp, caps, meta, qos);

/* Check if this BIS matches any local PAC */
bt_bap_verify_bis(data->bap, bis,
caps, &lpac);
bt_bap_verify_bis(data->bap, bis, caps, &lpac);

if (!lpac)
return;

if (asprintf(&path, "%s/bis%d",
device_get_path(data->device),
bis) < 0)
if (asprintf(&path, "%s/sid%d/bis%d", device_get_path(data->device),
sid, bis) < 0)
return;

create_stream_for_bis(data, lpac, qos,
caps, meta, path);
create_stream_for_bis(data, lpac, sid, qos, caps, meta, path);
}

static gboolean big_info_report_cb(GIOChannel *io, GIOCondition cond,
Expand All @@ -1113,12 +1114,14 @@ static gboolean big_info_report_cb(GIOChannel *io, GIOCondition cond,
struct bt_iso_qos qos;
struct iovec iov;
struct bt_bap_qos bap_qos = {0};
uint8_t sid;

DBG("BIG Info received");

bt_io_get(io, &err,
BT_IO_OPT_BASE, &base,
BT_IO_OPT_QOS, &qos,
BT_IO_OPT_ISO_BC_SID, &sid,
BT_IO_OPT_INVALID);
if (err) {
error("%s", err->message);
Expand Down Expand Up @@ -1147,7 +1150,7 @@ static gboolean big_info_report_cb(GIOChannel *io, GIOCondition cond,
/* Create BAP QoS structure */
bt_bap_iso_qos_to_bap_qos(&qos, &bap_qos);

bt_bap_parse_base(&iov, &bap_qos, bap_debug, bis_handler, data);
bt_bap_parse_base(sid, &iov, &bap_qos, bap_debug, bis_handler, data);

util_iov_free(bap_qos.bcast.bcode, 1);

Expand Down Expand Up @@ -2813,6 +2816,7 @@ static void bap_detached(struct bt_bap *bap, void *user_data)
static int pa_sync(struct bap_data *data)
{
GError *err = NULL;
uint8_t sid = 0xff;

if (data->listen_io) {
DBG("Already probed");
Expand All @@ -2833,6 +2837,7 @@ static int pa_sync(struct bap_data *data)
btd_device_get_bdaddr_type(data->device),
BT_IO_OPT_MODE, BT_IO_MODE_ISO,
BT_IO_OPT_QOS, &bap_sink_pa_qos,
BT_IO_OPT_ISO_BC_SID, sid,
BT_IO_OPT_INVALID);
if (!data->listen_io) {
error("%s", err->message);
Expand Down Expand Up @@ -2939,6 +2944,7 @@ static void pa_and_big_sync(struct bap_setup *setup)
btd_device_get_bdaddr_type(bap_data->device),
BT_IO_OPT_MODE, BT_IO_MODE_ISO,
BT_IO_OPT_QOS, &bap_sink_pa_qos,
BT_IO_OPT_ISO_BC_SID, setup->sid,
BT_IO_OPT_INVALID);
if (!bap_data->listen_io) {
error("%s", err->message);
Expand Down
Loading