This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author bsder
Recipients bsder
Date 2019-02-27.11:10:31
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1551265831.42.0.956760803512.issue36132@roundup.psfhosted.org>
In-reply-to
Content
On Linux, sockaddr_hci is:

struct sockaddr_hci {
        sa_family_t     hci_family;
        unsigned short  hci_dev;
        unsigned short  hci_channel;
};

Unfortunately, it seems like python does not allow any way to initialize hci_channel, so you can't use a user channel socket (hci_channel == 0) or a monitor channel.  There is probably a larger discussion of how to enable people to use a new field that appears in a structure like this, but that's above my pay grade ...

Even worse, this appears to have been known for a while (since 2013 at least! by Chromium), but while people complained, nobody actually took the time to file it upstream with Python.

So, I'm filing it upstream.  Hopefully this is easy to fix by someone who knows what's up.

Thanks.


See:
https://chromium.googlesource.com/chromiumos/platform/btsocket/+/factory-4455.B


https://github.com/w3h/isf/blob/master/lib/thirdparty/scapy/layers/bluetooth.py


class BluetoothUserSocket(SuperSocket):
    desc = "read/write H4 over a Bluetooth user channel"
    def __init__(self, adapter=0):
        # s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI)
        # s.bind((0,1))

        # yeah, if only
        # thanks to Python's weak ass socket and bind implementations, we have
        # to call down into libc with ctypes

        sockaddr_hcip = POINTER(sockaddr_hci)
        cdll.LoadLibrary("libc.so.6")
        libc = CDLL("libc.so.6")

        socket_c = libc.socket
        socket_c.argtypes = (c_int, c_int, c_int);
        socket_c.restype = c_int

        bind = libc.bind
        bind.argtypes = (c_int, POINTER(sockaddr_hci), c_int)
        bind.restype = c_int

        ########
        ## actual code

        s = socket_c(31, 3, 1) # (AF_BLUETOOTH, SOCK_RAW, HCI_CHANNEL_USER)
        if s < 0:
            raise BluetoothSocketError("Unable to open PF_BLUETOOTH socket")

        sa = sockaddr_hci()
        sa.sin_family = 31  # AF_BLUETOOTH
        sa.hci_dev = adapter # adapter index
        sa.hci_channel = 1   # HCI_USER_CHANNEL

r = bind(s, sockaddr_hcip(sa), sizeof(sa))
History
Date User Action Args
2019-02-27 11:10:31bsdersetrecipients: + bsder
2019-02-27 11:10:31bsdersetmessageid: <1551265831.42.0.956760803512.issue36132@roundup.psfhosted.org>
2019-02-27 11:10:31bsderlinkissue36132 messages
2019-02-27 11:10:31bsdercreate