2017-12-14 00:13:09

by John Klug

[permalink] [raw]
Subject: Profile1 close question

The file descriptor that is placed as a parameter to the NewConnection
callback does not close the connection when it is called with the OS's
close. This is using Bluez 5.47 on Linux.

Bluetoothctl still shows the connection as being up, as does the remote.

What method should one use to close the connection?

I am using Python and GObject Introspection.

Before connection:
rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]

After Connection:
NewConnection(/org/bluez/hci0/dev_BC_44_86_56_6B_95, 8)

rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]
rw.py 3983 root 8u sock 0,7 0t0 23050 protocol: RFCOMM

After Close:
rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]


Device BC:44:86:56:6B:95
...
Connected: yes


2017-12-14 16:08:21

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: Profile1 close question

Hi John,

On Thu, Dec 14, 2017 at 1:35 PM, Szymon Janc <[email protected]> wrote:
> Hi John,
>
> On Thursday, 14 December 2017 16:21:32 CET John Klug wrote:
>> What is holding the connection open is bluetoothd.
>>
>> After closing the file descriptor for RFCOMM, there are two file
>> descriptors in the Bluetooth daemon that are left:
>>
>> bluetooth 1406 root 18u sock 0,7 0t0 26587 protocol:
>> RFCOMM bluetooth 1406 root 19u sock 0,7 0t0 26602
>> protocol: RFCOMM
>>
>> By terminating the application these go away, but what if I wish to
>> keep the daemon running? How do I tell the Bluetooth daemon to close
>> the RFCOMM sockets?
>
> I think you need to shutdown() socket.

Yep, shutdown must be used since bluetoothd keeps a reference in case
it has to disconnect and to keep track of the service state. We should
perhaps document that we expect the user application to shutdown the
fd in case it want it to be disconnected.

--
Luiz Augusto von Dentz

2017-12-14 15:35:44

by Szymon Janc

[permalink] [raw]
Subject: Re: Profile1 close question

Hi John,

On Thursday, 14 December 2017 16:21:32 CET John Klug wrote:
> What is holding the connection open is bluetoothd.
>
> After closing the file descriptor for RFCOMM, there are two file
> descriptors in the Bluetooth daemon that are left:
>
> bluetooth 1406 root 18u sock 0,7 0t0 26587 protocol:
> RFCOMM bluetooth 1406 root 19u sock 0,7 0t0 26602
> protocol: RFCOMM
>
> By terminating the application these go away, but what if I wish to
> keep the daemon running? How do I tell the Bluetooth daemon to close
> the RFCOMM sockets?

I think you need to shutdown() socket.

>
> On Wed, Dec 13, 2017 at 6:13 PM, John Klug <[email protected]> wrote:
> > The file descriptor that is placed as a parameter to the NewConnection
> > callback does not close the connection when it is called with the OS's
> > close. This is using Bluez 5.47 on Linux.
> >
> > Bluetoothctl still shows the connection as being up, as does the remote.
> >
> > What method should one use to close the connection?
> >
> > I am using Python and GObject Introspection.
> >
> > Before connection:
> > rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
> > rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
> > rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]
> >
> > After Connection:
> > NewConnection(/org/bluez/hci0/dev_BC_44_86_56_6B_95, 8)
> >
> > rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
> > rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
> > rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]
> > rw.py 3983 root 8u sock 0,7 0t0 23050 protocol:
> > RFCOMM
> >
> > After Close:
> > rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
> > rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
> > rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
> > rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]
> >
> >
> > Device BC:44:86:56:6B:95
> > ...
> > Connected: yes
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth"
> in the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html


--
pozdrawiam
Szymon Janc

2017-12-14 15:21:32

by John Klug

[permalink] [raw]
Subject: Re: Profile1 close question

What is holding the connection open is bluetoothd.

After closing the file descriptor for RFCOMM, there are two file
descriptors in the Bluetooth daemon that are left:

bluetooth 1406 root 18u sock 0,7 0t0 26587 protocol: RFCOMM
bluetooth 1406 root 19u sock 0,7 0t0 26602 protocol: RFCOMM

By terminating the application these go away, but what if I wish to
keep the daemon running? How do I tell the Bluetooth daemon to close
the RFCOMM sockets?

On Wed, Dec 13, 2017 at 6:13 PM, John Klug <[email protected]> wrote:
> The file descriptor that is placed as a parameter to the NewConnection
> callback does not close the connection when it is called with the OS's
> close. This is using Bluez 5.47 on Linux.
>
> Bluetoothctl still shows the connection as being up, as does the remote.
>
> What method should one use to close the connection?
>
> I am using Python and GObject Introspection.
>
> Before connection:
> rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
> rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
> rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]
>
> After Connection:
> NewConnection(/org/bluez/hci0/dev_BC_44_86_56_6B_95, 8)
>
> rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
> rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
> rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]
> rw.py 3983 root 8u sock 0,7 0t0 23050 protocol: RFCOMM
>
> After Close:
> rw.py 3983 root 0u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 1u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 2u CHR 136,3 0t0 6 /dev/pts/3
> rw.py 3983 root 3u unix 0xceaf54a0 0t0 22976 type=STREAM
> rw.py 3983 root 4u a_inode 0,9 0 7 [eventfd]
> rw.py 3983 root 5u a_inode 0,9 0 7 [eventfd]
>
>
> Device BC:44:86:56:6B:95
> ...
> Connected: yes