From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v3 1/9] obexd: Add PSM support to session create
Date: Mon, 16 Sep 2024 15:28:05 +0200 [thread overview]
Message-ID: <20240916132813.165731-2-frederic.danis@collabora.com> (raw)
In-Reply-To: <20240916132813.165731-1-frederic.danis@collabora.com>
An OBEX session can be connected to a RFCOMM channel or a L2CAP PSM.
---
doc/org.bluez.obex.Client.rst | 4 ++++
doc/org.bluez.obex.Session.rst | 5 +++++
obexd/client/manager.c | 14 ++++++++++----
obexd/client/session.c | 27 ++++++++++++++++++++++++---
obexd/client/session.h | 1 +
5 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/doc/org.bluez.obex.Client.rst b/doc/org.bluez.obex.Client.rst
index 9f77a9abc..5ae7cc5e8 100644
--- a/doc/org.bluez.obex.Client.rst
+++ b/doc/org.bluez.obex.Client.rst
@@ -52,6 +52,10 @@ object CreateSession(string destination, dict args)
Channel to be used.
+ :uint16 PSM:
+
+ L2CAP PSM to be used.
+
Possible errors:
:org.bluez.obex.Error.InvalidArguments:
diff --git a/doc/org.bluez.obex.Session.rst b/doc/org.bluez.obex.Session.rst
index 1cef9a53d..fc5f14e5d 100644
--- a/doc/org.bluez.obex.Session.rst
+++ b/doc/org.bluez.obex.Session.rst
@@ -50,6 +50,11 @@ byte Channel [readonly]
Bluetooth channel
+uint16 PSM [readonly]
+```````````````````````
+
+ Bluetooth L2CAP PSM
+
string Target [readonly]
````````````````````````
diff --git a/obexd/client/manager.c b/obexd/client/manager.c
index ad1fbb04a..52c00fb0c 100644
--- a/obexd/client/manager.c
+++ b/obexd/client/manager.c
@@ -107,7 +107,8 @@ done:
}
static int parse_device_dict(DBusMessageIter *iter,
- const char **source, const char **target, uint8_t *channel)
+ const char **source, const char **target, uint8_t *channel,
+ uint16_t *psm)
{
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter entry, value;
@@ -130,6 +131,10 @@ static int parse_device_dict(DBusMessageIter *iter,
if (g_str_equal(key, "Channel") == TRUE)
dbus_message_iter_get_basic(&value, channel);
break;
+ case DBUS_TYPE_UINT16:
+ if (g_str_equal(key, "PSM") == TRUE)
+ dbus_message_iter_get_basic(&value, psm);
+ break;
}
dbus_message_iter_next(iter);
@@ -160,6 +165,7 @@ static DBusMessage *create_session(DBusConnection *connection,
struct send_data *data;
const char *source = NULL, *dest = NULL, *target = NULL;
uint8_t channel = 0;
+ uint16_t psm = 0;
dbus_message_iter_init(message, &iter);
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -175,8 +181,8 @@ static DBusMessage *create_session(DBusConnection *connection,
dbus_message_iter_recurse(&iter, &dict);
- parse_device_dict(&dict, &source, &target, &channel);
- if (dest == NULL || target == NULL)
+ parse_device_dict(&dict, &source, &target, &channel, &psm);
+ if (dest == NULL || target == NULL || (channel && psm))
return g_dbus_create_error(message,
ERROR_INTERFACE ".InvalidArguments", NULL);
@@ -188,7 +194,7 @@ static DBusMessage *create_session(DBusConnection *connection,
data->connection = dbus_connection_ref(connection);
data->message = dbus_message_ref(message);
- session = obc_session_create(source, dest, target, channel,
+ session = obc_session_create(source, dest, target, channel, psm,
dbus_message_get_sender(message),
create_callback, data);
if (session != NULL) {
diff --git a/obexd/client/session.c b/obexd/client/session.c
index 7d8ebb04e..13a834e14 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
@@ -88,6 +88,7 @@ struct obc_session {
char *source;
char *destination;
uint8_t channel;
+ uint16_t psm;
struct obc_transport *transport;
struct obc_driver *driver;
char *path; /* Session path */
@@ -471,6 +472,7 @@ static struct obc_session *session_find(const char *source,
const char *destination,
const char *service,
uint8_t channel,
+ uint16_t psm,
const char *owner)
{
GSList *l;
@@ -490,6 +492,9 @@ static struct obc_session *session_find(const char *source,
if (channel && session->channel != channel)
continue;
+ if (psm && session->psm != psm)
+ continue;
+
if (g_strcmp0(owner, session->owner))
continue;
@@ -541,8 +546,9 @@ static int session_connect(struct obc_session *session,
}
session->id = transport->connect(session->source, session->destination,
- driver->uuid, session->channel,
- transport_func, callback);
+ driver->uuid,
+ session->channel ? session->channel : session->psm,
+ transport_func, callback);
if (session->id == 0) {
obc_session_unref(callback->session);
g_free(callback);
@@ -558,6 +564,7 @@ struct obc_session *obc_session_create(const char *source,
const char *destination,
const char *service,
uint8_t channel,
+ uint16_t psm,
const char *owner,
session_callback_t function,
void *user_data)
@@ -570,7 +577,8 @@ struct obc_session *obc_session_create(const char *source,
if (destination == NULL)
return NULL;
- session = session_find(source, destination, service, channel, owner);
+ session = session_find(source, destination, service, channel, psm,
+ owner);
if (session != NULL)
goto proceed;
@@ -598,6 +606,7 @@ struct obc_session *obc_session_create(const char *source,
session->source = g_strdup(source);
session->destination = g_strdup(destination);
session->channel = channel;
+ session->psm = psm;
session->queue = g_queue_new();
session->folder = g_strdup("/");
@@ -762,6 +771,17 @@ static gboolean get_channel(const GDBusPropertyTable *property,
return TRUE;
}
+static gboolean get_psm(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct obc_session *session = data;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
+ &session->psm);
+
+ return TRUE;
+}
+
static const GDBusMethodTable session_methods[] = {
{ GDBUS_ASYNC_METHOD("GetCapabilities",
NULL, GDBUS_ARGS({ "capabilities", "s" }),
@@ -794,6 +814,7 @@ static const GDBusPropertyTable session_properties[] = {
{ "Source", "s", get_source, NULL, source_exists },
{ "Destination", "s", get_destination },
{ "Channel", "y", get_channel },
+ { "PSM", "q", get_psm },
{ "Target", "s", get_target, NULL, target_exists },
{ }
};
diff --git a/obexd/client/session.h b/obexd/client/session.h
index 2c646df1a..19c3f3687 100644
--- a/obexd/client/session.h
+++ b/obexd/client/session.h
@@ -22,6 +22,7 @@ struct obc_session *obc_session_create(const char *source,
const char *destination,
const char *service,
uint8_t channel,
+ uint16_t psm,
const char *owner,
session_callback_t function,
void *user_data);
--
2.34.1
next prev parent reply other threads:[~2024-09-16 13:28 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-16 13:28 [PATCH BlueZ v3 0/9] Add BIP for AVRCP covert art OBEX client Frédéric Danis
2024-09-16 13:28 ` Frédéric Danis [this message]
2024-09-16 18:47 ` bluez.test.bot
2024-09-16 13:28 ` [PATCH BlueZ v3 2/9] player: Add OBEX PSM port for cover art support Frédéric Danis
2024-09-16 13:28 ` [PATCH BlueZ v3 3/9] player: Add image handle support property Frédéric Danis
2024-09-16 13:28 ` [PATCH BlueZ v3 4/9] obexd: Add support for specific headers in obex transfer Frédéric Danis
2024-09-16 13:28 ` [PATCH BlueZ v3 5/9] obexd: Add BIP client for AVRCP cover art download Frédéric Danis
2024-09-16 17:27 ` Luiz Augusto von Dentz
2024-09-16 13:28 ` [PATCH BlueZ v3 6/9] obexd: Add GetImageProperties to bip-avrcp Frédéric Danis
2024-09-16 13:28 ` [PATCH BlueZ v3 7/9] obexd: Add GetImage " Frédéric Danis
2024-09-16 13:28 ` [PATCH BlueZ v3 8/9] avrcp: Update controller SDP record with cover art support Frédéric Danis
2024-09-16 13:28 ` [PATCH BlueZ v3 9/9] doc: Add description of org.bluez.obex.BipAvrcp Frédéric Danis
2024-09-16 17:40 ` Luiz Augusto von Dentz
2024-09-16 17:50 ` [PATCH BlueZ v3 0/9] Add BIP for AVRCP covert art OBEX client patchwork-bot+bluetooth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240916132813.165731-2-frederic.danis@collabora.com \
--to=frederic.danis@collabora.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox