• David Herrmann's avatar
    Bluetooth: l2cap: add l2cap_user sub-modules · 2c8e1411
    David Herrmann authored
    Several sub-modules like HIDP, rfcomm, ... need to track l2cap
    connections. The l2cap_conn->hcon->dev object is used as parent for sysfs
    devices so the sub-modules need to be notified when the hci_conn object is
    removed from sysfs.
    
    As submodules normally use the l2cap layer, the l2cap_user objects are
    registered there instead of on the underlying hci_conn object. This avoids
    any direct dependency on the HCI layer and lets the l2cap core handle any
    specifics.
    
    This patch introduces l2cap_user objects which contain a "probe" and
    "remove" callback. You can register them on any l2cap_conn object and if
    it is active, the "probe" callback will get called. Otherwise, an error is
    returned.
    
    The l2cap_conn object will call your "remove" callback directly before it
    is removed from user-space. This allows you to remove your submodules
    _before_ the parent l2cap_conn and hci_conn object is removed.
    
    At any time you can asynchronously unregister your l2cap_user object if
    your submodule vanishes before the l2cap_conn object does.
    
    There is no way around l2cap_user. If we want wire-protocols in the
    kernel, we always want the hci_conn object as parent in the sysfs tree. We
    cannot use a channel here since we might need multiple channels for a
    single protocol.
    But the problem is, we _must_ get notified when an l2cap_conn object is
    removed. We cannot use reference-counting for object-removal! This is not
    how it works. If a hardware is removed, we should immediately remove the
    object from sysfs. Any other behavior would be inconsistent with the rest
    of the system. Also note that device_del() might sleep, but it doesn't
    wait for user-space or block very long. It only _unlinks_ the object from
    sysfs and the whole device-tree. Everything else is handled by ref-counts!
    This is exactly what the other sub-modules must do: unlink their devices
    when the "remove" l2cap_user callback is called. They should not do any
    cleanup or synchronous shutdowns.
    Signed-off-by: default avatarDavid Herrmann <dh.herrmann@gmail.com>
    Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
    2c8e1411
l2cap_core.c 157 KB