Linux bluetooth development
 help / color / mirror / Atom feed
* [PATCH v1] profile: Set L2CAP IMTU for external profile listeners
@ 2026-05-22  5:40 Wei Deng
  2026-05-22  8:37 ` [v1] " bluez.test.bot
  2026-06-02  3:17 ` [PATCH v2] " Wei Deng
  0 siblings, 2 replies; 10+ messages in thread
From: Wei Deng @ 2026-05-22  5:40 UTC (permalink / raw)
  To: linux-bluetooth
  Cc: luiz.von.dentz, cheng.jiang, jinwang.li, shuai.zhang, wei.deng

bt_io_listen() in ext_start_servers() creates the L2CAP listening
socket for external profiles without an explicit IMTU, causing the
socket to default to the L2CAP minimum of 672 bytes. This is advertised
to the peer in L2CAP_CONFIGURATION_RSP and limits PDU size, degrading
Rx throughput.

The obexd client side (obexd/client/bluetooth.c) already sets IMTU to
BT_RX_MTU (32767) when connecting. Mirror that on the server side by
setting BT_IO_OPT_IMTU to 32767 in ext_start_servers().

Signed-off-by: Wei Deng <wei.deng@oss.qualcomm.com>
---
 src/profile.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/profile.c b/src/profile.c
index dfc5f7161..297959f3c 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -55,6 +55,8 @@
 #define MAS_DEFAULT_CHANNEL	16
 #define MNS_DEFAULT_CHANNEL	17
 
+#define BT_RX_MTU		32767
+
 #define BTD_PROFILE_PSM_AUTO	-1
 #define BTD_PROFILE_CHAN_AUTO	-1
 
@@ -1411,6 +1413,7 @@ static uint32_t ext_start_servers(struct ext_profile *ext,
 					BT_IO_OPT_MODE, ext->mode,
 					BT_IO_OPT_PSM, psm,
 					BT_IO_OPT_SEC_LEVEL, ext->sec_level,
+					BT_IO_OPT_IMTU, BT_RX_MTU,
 					BT_IO_OPT_INVALID);
 		if (err != NULL) {
 			error("L2CAP server failed for %s: %s",
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* RE: [v1] profile: Set L2CAP IMTU for external profile listeners
  2026-05-22  5:40 [PATCH v1] profile: Set L2CAP IMTU for external profile listeners Wei Deng
@ 2026-05-22  8:37 ` bluez.test.bot
  2026-06-02  3:17 ` [PATCH v2] " Wei Deng
  1 sibling, 0 replies; 10+ messages in thread
From: bluez.test.bot @ 2026-05-22  8:37 UTC (permalink / raw)
  To: linux-bluetooth, wei.deng

[-- Attachment #1: Type: text/plain, Size: 825 bytes --]

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=1099144

---Test result---

Test Summary:
CheckPatch                    PASS      0.39 seconds
GitLint                       PASS      0.28 seconds
BuildEll                      PASS      15.97 seconds
BluezMake                     PASS      489.53 seconds
CheckSmatch                   PASS      252.95 seconds
bluezmakeextell               PASS      129.96 seconds
IncrementalBuild              PASS      493.87 seconds
ScanBuild                     PASS      719.71 seconds



https://github.com/bluez/bluez/pull/2144

---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2] profile: Set L2CAP IMTU for external profile listeners
  2026-05-22  5:40 [PATCH v1] profile: Set L2CAP IMTU for external profile listeners Wei Deng
  2026-05-22  8:37 ` [v1] " bluez.test.bot
@ 2026-06-02  3:17 ` Wei Deng
  2026-06-02  7:08   ` [v2] " bluez.test.bot
                     ` (2 more replies)
  1 sibling, 3 replies; 10+ messages in thread
From: Wei Deng @ 2026-06-02  3:17 UTC (permalink / raw)
  To: linux-bluetooth

bt_io_listen() in ext_start_servers() creates the L2CAP listening
socket for external profiles without an explicit IMTU. This causes
the socket to use the L2CAP minimum of 672 bytes, which is advertised
to the peer in L2CAP_CONFIGURATION_RSP.

As a result, when acting as a server (receiver), the peer limits its
outgoing PDU size to our advertised 672 bytes. This leads to small
OBEX body chunks (~669 bytes) and severely degraded Rx throughput,
while Tx throughput is unaffected since the peer's IMTU is not
constrained by our setting.

The obexd client side (obexd/client/bluetooth.c) already sets IMTU to
BT_RX_MTU (32767) for outgoing connections. Mirror that on the server
side by setting BT_IO_OPT_IMTU to BT_RX_MTU in ext_start_servers(),
so incoming connections advertise the same maximum receive capability.

Signed-off-by: Wei Deng <wei.deng@oss.qualcomm.com>
---
 src/profile.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/profile.c b/src/profile.c
index dfc5f7161..297959f3c 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -55,6 +55,8 @@
 #define MAS_DEFAULT_CHANNEL	16
 #define MNS_DEFAULT_CHANNEL	17
 
+#define BT_RX_MTU		32767
+
 #define BTD_PROFILE_PSM_AUTO	-1
 #define BTD_PROFILE_CHAN_AUTO	-1
 
@@ -1411,6 +1413,7 @@ static uint32_t ext_start_servers(struct ext_profile *ext,
 					BT_IO_OPT_MODE, ext->mode,
 					BT_IO_OPT_PSM, psm,
 					BT_IO_OPT_SEC_LEVEL, ext->sec_level,
+					BT_IO_OPT_IMTU, BT_RX_MTU,
 					BT_IO_OPT_INVALID);
 		if (err != NULL) {
 			error("L2CAP server failed for %s: %s",
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* RE: [v2] profile: Set L2CAP IMTU for external profile listeners
  2026-06-02  3:17 ` [PATCH v2] " Wei Deng
@ 2026-06-02  7:08   ` bluez.test.bot
  2026-06-02 14:21   ` [PATCH v2] " Luiz Augusto von Dentz
  2026-06-04  9:30   ` [PATCH v3] profile: Set L2CAP IMTU for OBEX " Wei Deng
  2 siblings, 0 replies; 10+ messages in thread
From: bluez.test.bot @ 2026-06-02  7:08 UTC (permalink / raw)
  To: linux-bluetooth, wei.deng

[-- Attachment #1: Type: text/plain, Size: 826 bytes --]

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=1104327

---Test result---

Test Summary:
CheckPatch                    PASS      0.42 seconds
GitLint                       PASS      1.32 seconds
BuildEll                      PASS      20.60 seconds
BluezMake                     PASS      666.26 seconds
CheckSmatch                   PASS      365.80 seconds
bluezmakeextell               PASS      187.14 seconds
IncrementalBuild              PASS      659.47 seconds
ScanBuild                     PASS      1050.72 seconds



https://github.com/bluez/bluez/pull/2164

---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] profile: Set L2CAP IMTU for external profile listeners
  2026-06-02  3:17 ` [PATCH v2] " Wei Deng
  2026-06-02  7:08   ` [v2] " bluez.test.bot
@ 2026-06-02 14:21   ` Luiz Augusto von Dentz
  2026-06-02 14:42     ` Luiz Augusto von Dentz
  2026-06-04  9:30   ` [PATCH v3] profile: Set L2CAP IMTU for OBEX " Wei Deng
  2 siblings, 1 reply; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2026-06-02 14:21 UTC (permalink / raw)
  To: Wei Deng; +Cc: linux-bluetooth

Hi,

On Mon, Jun 1, 2026 at 11:18 PM Wei Deng <wei.deng@oss.qualcomm.com> wrote:
>
> bt_io_listen() in ext_start_servers() creates the L2CAP listening
> socket for external profiles without an explicit IMTU. This causes
> the socket to use the L2CAP minimum of 672 bytes, which is advertised
> to the peer in L2CAP_CONFIGURATION_RSP.
>
> As a result, when acting as a server (receiver), the peer limits its
> outgoing PDU size to our advertised 672 bytes. This leads to small
> OBEX body chunks (~669 bytes) and severely degraded Rx throughput,
> while Tx throughput is unaffected since the peer's IMTU is not
> constrained by our setting.
>
> The obexd client side (obexd/client/bluetooth.c) already sets IMTU to
> BT_RX_MTU (32767) for outgoing connections. Mirror that on the server
> side by setting BT_IO_OPT_IMTU to BT_RX_MTU in ext_start_servers(),
> so incoming connections advertise the same maximum receive capability.
>
> Signed-off-by: Wei Deng <wei.deng@oss.qualcomm.com>
> ---
>  src/profile.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/src/profile.c b/src/profile.c
> index dfc5f7161..297959f3c 100644
> --- a/src/profile.c
> +++ b/src/profile.c
> @@ -55,6 +55,8 @@
>  #define MAS_DEFAULT_CHANNEL    16
>  #define MNS_DEFAULT_CHANNEL    17
>
> +#define BT_RX_MTU              32767
> +
>  #define BTD_PROFILE_PSM_AUTO   -1
>  #define BTD_PROFILE_CHAN_AUTO  -1
>
> @@ -1411,6 +1413,7 @@ static uint32_t ext_start_servers(struct ext_profile *ext,
>                                         BT_IO_OPT_MODE, ext->mode,
>                                         BT_IO_OPT_PSM, psm,
>                                         BT_IO_OPT_SEC_LEVEL, ext->sec_level,
> +                                       BT_IO_OPT_IMTU, BT_RX_MTU,

This is doing it for all service registered via ProfileManager which
is not going to fly, instead we probably need to add a MTU option so
the profile entity can pass it instead of getting the default.

>                                         BT_IO_OPT_INVALID);
>                 if (err != NULL) {
>                         error("L2CAP server failed for %s: %s",
> --
> 2.34.1
>
>


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] profile: Set L2CAP IMTU for external profile listeners
  2026-06-02 14:21   ` [PATCH v2] " Luiz Augusto von Dentz
@ 2026-06-02 14:42     ` Luiz Augusto von Dentz
  2026-06-03 13:31       ` Wei Deng
  0 siblings, 1 reply; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2026-06-02 14:42 UTC (permalink / raw)
  To: Wei Deng; +Cc: linux-bluetooth

Hi,

On Tue, Jun 2, 2026 at 10:21 AM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> Hi,
>
> On Mon, Jun 1, 2026 at 11:18 PM Wei Deng <wei.deng@oss.qualcomm.com> wrote:
> >
> > bt_io_listen() in ext_start_servers() creates the L2CAP listening
> > socket for external profiles without an explicit IMTU. This causes
> > the socket to use the L2CAP minimum of 672 bytes, which is advertised
> > to the peer in L2CAP_CONFIGURATION_RSP.
> >
> > As a result, when acting as a server (receiver), the peer limits its
> > outgoing PDU size to our advertised 672 bytes. This leads to small
> > OBEX body chunks (~669 bytes) and severely degraded Rx throughput,
> > while Tx throughput is unaffected since the peer's IMTU is not
> > constrained by our setting.
> >
> > The obexd client side (obexd/client/bluetooth.c) already sets IMTU to
> > BT_RX_MTU (32767) for outgoing connections. Mirror that on the server
> > side by setting BT_IO_OPT_IMTU to BT_RX_MTU in ext_start_servers(),
> > so incoming connections advertise the same maximum receive capability.
> >
> > Signed-off-by: Wei Deng <wei.deng@oss.qualcomm.com>
> > ---
> >  src/profile.c | 3 +++
> >  1 file changed, 3 insertions(+)
> >
> > diff --git a/src/profile.c b/src/profile.c
> > index dfc5f7161..297959f3c 100644
> > --- a/src/profile.c
> > +++ b/src/profile.c
> > @@ -55,6 +55,8 @@
> >  #define MAS_DEFAULT_CHANNEL    16
> >  #define MNS_DEFAULT_CHANNEL    17
> >
> > +#define BT_RX_MTU              32767
> > +
> >  #define BTD_PROFILE_PSM_AUTO   -1
> >  #define BTD_PROFILE_CHAN_AUTO  -1
> >
> > @@ -1411,6 +1413,7 @@ static uint32_t ext_start_servers(struct ext_profile *ext,
> >                                         BT_IO_OPT_MODE, ext->mode,
> >                                         BT_IO_OPT_PSM, psm,
> >                                         BT_IO_OPT_SEC_LEVEL, ext->sec_level,
> > +                                       BT_IO_OPT_IMTU, BT_RX_MTU,
>
> This is doing it for all service registered via ProfileManager which
> is not going to fly, instead we probably need to add a MTU option so
> the profile entity can pass it instead of getting the default.

Actually there are no options, it's built from `default_setting`,
which doesn't set any MTU for some reason. For the OBEX profiles it
probably makes sense to add an MTU field so it gets properly set.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] profile: Set L2CAP IMTU for external profile listeners
  2026-06-02 14:42     ` Luiz Augusto von Dentz
@ 2026-06-03 13:31       ` Wei Deng
  0 siblings, 0 replies; 10+ messages in thread
From: Wei Deng @ 2026-06-03 13:31 UTC (permalink / raw)
  To: Luiz Augusto von Dentz
  Cc: linux-bluetooth, luiz.von.dentz, cheng.jiang, jinwang.li,
	shuai.zhang

Hi Luiz,

On Tue, Jun 2, 2026 at 10:42 AM Luiz Augusto von Dentz <luiz.dentz@gmail.com> wrote:
>
> Actually there are no options, it's built from `default_setting`,
> which doesn't set any MTU for some reason. For the OBEX profiles it
> probably makes sense to add an MTU field so it gets properly set.

Thanks for the clarification. Agreed -- I'll add an imtu field to
default_settings and populate it only for the OBEX profiles (OPP, FTP,
PSE, MAS, MNS), then have ext_start_servers() apply it via bt_io_set()
only when the field is set, so non-OBEX listeners keep their current
behavior.

I'll send V3 with that approach shortly.

-- 
Best Regards,
Wei Deng

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3] profile: Set L2CAP IMTU for OBEX profile listeners
  2026-06-02  3:17 ` [PATCH v2] " Wei Deng
  2026-06-02  7:08   ` [v2] " bluez.test.bot
  2026-06-02 14:21   ` [PATCH v2] " Luiz Augusto von Dentz
@ 2026-06-04  9:30   ` Wei Deng
  2026-06-04 12:09     ` [v3] " bluez.test.bot
  2026-06-04 18:10     ` [PATCH v3] " patchwork-bot+bluetooth
  2 siblings, 2 replies; 10+ messages in thread
From: Wei Deng @ 2026-06-04  9:30 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.von.dentz, cheng.jiang, jinwang.li, shuai.zhang

The default_settings entries for OBEX profiles (OPP, FTP, PBAP, MAS,
MNS) have no imtu field, so ext_start_servers() creates the L2CAP
listening socket without an explicit IMTU. This causes the socket to
advertise the L2CAP minimum of 672 bytes in L2CAP_CONFIGURATION_RSP,
limiting the peer's outgoing PDU size and degrading Rx throughput.

Add an imtu field to default_settings and set it to 32767 for all
OBEX profiles that use L2CAP. Copy the value in ext_set_defaults()
and apply it to the listening socket via bt_io_set() after
bt_io_listen() succeeds.

Signed-off-by: Wei Deng <wei.deng@oss.qualcomm.com>
---
 src/profile.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/profile.c b/src/profile.c
index dfc5f7161..65df0f7a0 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -55,6 +55,8 @@
 #define MAS_DEFAULT_CHANNEL	16
 #define MNS_DEFAULT_CHANNEL	17
 
+#define BT_RX_MTU		32767
+
 #define BTD_PROFILE_PSM_AUTO	-1
 #define BTD_PROFILE_CHAN_AUTO	-1
 
@@ -678,6 +680,7 @@ struct ext_profile {
 
 	uint16_t version;
 	uint16_t features;
+	uint16_t imtu;
 
 	GSList *records;
 	GSList *servers;
@@ -1423,6 +1426,9 @@ static uint32_t ext_start_servers(struct ext_profile *ext,
 			if (psm == 0)
 				bt_io_get(io, NULL, BT_IO_OPT_PSM, &psm,
 							BT_IO_OPT_INVALID);
+			if (ext->imtu)
+				bt_io_set(io, NULL, BT_IO_OPT_IMTU, ext->imtu,
+							BT_IO_OPT_INVALID);
 			l2cap->io = io;
 			l2cap->proto = BTPROTO_L2CAP;
 			l2cap->psm = psm;
@@ -2075,6 +2081,7 @@ static struct default_settings {
 					struct ext_io *rfcomm);
 	uint16_t	version;
 	uint16_t	features;
+	uint16_t	imtu;
 } defaults[] = {
 	{
 		.uuid		= SPP_UUID,
@@ -2142,6 +2149,7 @@ static struct default_settings {
 		.authorize	= false,
 		.get_record	= get_opp_record,
 		.version	= 0x0102,
+		.imtu		= BT_RX_MTU,
 	}, {
 		.uuid		= OBEX_FTP_UUID,
 		.name		= "File Transfer",
@@ -2151,6 +2159,7 @@ static struct default_settings {
 		.authorize	= true,
 		.get_record	= get_ftp_record,
 		.version	= 0x0103,
+		.imtu		= BT_RX_MTU,
 	}, {
 		.uuid		= OBEX_SYNC_UUID,
 		.name		= "Synchronization",
@@ -2167,6 +2176,7 @@ static struct default_settings {
 		.authorize	= true,
 		.get_record	= get_pse_record,
 		.version	= 0x0101,
+		.imtu		= BT_RX_MTU,
 	}, {
 		.uuid		= OBEX_PCE_UUID,
 		.name		= "Phone Book Access Client",
@@ -2182,7 +2192,8 @@ static struct default_settings {
 		.mode		= BT_IO_MODE_ERTM,
 		.authorize	= true,
 		.get_record	= get_mas_record,
-		.version	= 0x0100
+		.version	= 0x0100,
+		.imtu		= BT_RX_MTU,
 	}, {
 		.uuid		= OBEX_MNS_UUID,
 		.name		= "Message Notification",
@@ -2191,7 +2202,8 @@ static struct default_settings {
 		.mode		= BT_IO_MODE_ERTM,
 		.authorize	= true,
 		.get_record	= get_mns_record,
-		.version	= 0x0104
+		.version	= 0x0104,
+		.imtu		= BT_RX_MTU,
 	},
 };
 
@@ -2249,6 +2261,9 @@ static void ext_set_defaults(struct ext_profile *ext)
 		if (settings->features)
 			ext->features = settings->features;
 
+		if (settings->imtu)
+			ext->imtu = settings->imtu;
+
 		if (settings->name)
 			ext->name = g_strdup(settings->name);
 	}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* RE: [v3] profile: Set L2CAP IMTU for OBEX profile listeners
  2026-06-04  9:30   ` [PATCH v3] profile: Set L2CAP IMTU for OBEX " Wei Deng
@ 2026-06-04 12:09     ` bluez.test.bot
  2026-06-04 18:10     ` [PATCH v3] " patchwork-bot+bluetooth
  1 sibling, 0 replies; 10+ messages in thread
From: bluez.test.bot @ 2026-06-04 12:09 UTC (permalink / raw)
  To: linux-bluetooth, wei.deng

[-- Attachment #1: Type: text/plain, Size: 825 bytes --]

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=1105837

---Test result---

Test Summary:
CheckPatch                    PASS      0.36 seconds
GitLint                       PASS      0.23 seconds
BuildEll                      PASS      17.80 seconds
BluezMake                     PASS      634.83 seconds
CheckSmatch                   PASS      311.82 seconds
bluezmakeextell               PASS      166.60 seconds
IncrementalBuild              PASS      599.14 seconds
ScanBuild                     PASS      913.59 seconds



https://github.com/bluez/bluez/pull/2176

---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3] profile: Set L2CAP IMTU for OBEX profile listeners
  2026-06-04  9:30   ` [PATCH v3] profile: Set L2CAP IMTU for OBEX " Wei Deng
  2026-06-04 12:09     ` [v3] " bluez.test.bot
@ 2026-06-04 18:10     ` patchwork-bot+bluetooth
  1 sibling, 0 replies; 10+ messages in thread
From: patchwork-bot+bluetooth @ 2026-06-04 18:10 UTC (permalink / raw)
  To: Wei Deng
  Cc: linux-bluetooth, luiz.von.dentz, cheng.jiang, jinwang.li,
	shuai.zhang

Hello:

This patch was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Thu,  4 Jun 2026 15:00:24 +0530 you wrote:
> The default_settings entries for OBEX profiles (OPP, FTP, PBAP, MAS,
> MNS) have no imtu field, so ext_start_servers() creates the L2CAP
> listening socket without an explicit IMTU. This causes the socket to
> advertise the L2CAP minimum of 672 bytes in L2CAP_CONFIGURATION_RSP,
> limiting the peer's outgoing PDU size and degrading Rx throughput.
> 
> Add an imtu field to default_settings and set it to 32767 for all
> OBEX profiles that use L2CAP. Copy the value in ext_set_defaults()
> and apply it to the listening socket via bt_io_set() after
> bt_io_listen() succeeds.
> 
> [...]

Here is the summary with links:
  - [v3] profile: Set L2CAP IMTU for OBEX profile listeners
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=646014a6a246

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2026-06-04 18:10 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-22  5:40 [PATCH v1] profile: Set L2CAP IMTU for external profile listeners Wei Deng
2026-05-22  8:37 ` [v1] " bluez.test.bot
2026-06-02  3:17 ` [PATCH v2] " Wei Deng
2026-06-02  7:08   ` [v2] " bluez.test.bot
2026-06-02 14:21   ` [PATCH v2] " Luiz Augusto von Dentz
2026-06-02 14:42     ` Luiz Augusto von Dentz
2026-06-03 13:31       ` Wei Deng
2026-06-04  9:30   ` [PATCH v3] profile: Set L2CAP IMTU for OBEX " Wei Deng
2026-06-04 12:09     ` [v3] " bluez.test.bot
2026-06-04 18:10     ` [PATCH v3] " patchwork-bot+bluetooth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox