• Stefan Richter's avatar
    firewire: core: add sysfs attribute for easier udev rules · 0210b66d
    Stefan Richter authored
    This adds the attribute /sys/bus/firewire/devices/fw[0-9]+/units.  It
    can be used in udev rules like the following ones:
    
    # IIDC devices: industrial cameras and some webcams
    SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x00010?*", GROUP="video"
    
    # AV/C devices: camcorders, set-top boxes, TV sets, audio devices, ...
    SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x010001*", GROUP="video"
    
    Background:
    
    firewire-core manages two device types:
      - fw_device is a FireWire node.  A character device file is associated
        with it.
      - fw_unit is a unit directory on a node.  Each fw_device may have 0..n
        children of type fw_unit.  The units tell us what kinds of protocols
        a node implements.
    
    We want to set ownership or ACLs or permissions of the character device
    file of an fw_device, or/and create symlinks to it, based on available
    protocols.  Until now udev rules had to look at the fw_unit devices and
    then modify their parent's character device file accordingly.  This is
    problematic for two reasons:  1) It happens sometime after the creation
    of the fw_device, 2) an access policy may require that information from
    all children is evaluated before a decision about the parent is made.
    
    Problem 1) can ultimately not be avoided since this is the nature of
    FireWire nodes:  They may add or remove unit directories at any point in
    time.
    
    However, we can still help userland a lot by providing the protocol type
    information of all units in a summary sysfs attribute directly at the
    fw_device.  This way,
       - the information is immediately available at the affected device
         when userspace goes about to handle an ADD or CHANGE event of the
         fw_device,
       - with most policies, it won't be necessary anymore to dig through
         child attributes.
    
    The new attribute is called "units".  It contains space-separated tuples
    of specifier_id and version of each present unit.  The delimiter within
    tuples is a colon.  Specifier_id and version are printed as 0x%06x.
    
    Here is an example of a node which implements an IPv4 unit and an IPv6
    unit:  $ cat /sys/bus/firewire/devices/fw2/units
    0x00005e:0x000001 0x00005e:0x000002
    Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
    0210b66d
fw-device.h 5.12 KB