From ae028d89cfd6aa7ee5531761f7029dd4f9e1a0cd Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 27 Jun 2018 13:39:31 +0200 Subject: [PATCH] driver_manager/sculpt: hook for manual USB policy This patch adds the /config/usb file to Sculpt, which allows then user to manually define rules for assigning USB devices to clients. The content is incorporated by the driver manager into the USB driver configuration. Note that this mechanism does not work for HID devices because these devices are claimed by the USB driver's built-in HID support. Issue #2890 --- repos/gems/run/driver_manager.run | 11 ++++++++--- repos/gems/run/sculpt.run | 3 +++ repos/gems/run/sculpt/usb.config | 13 +++++++++++++ repos/gems/src/app/driver_manager/main.cc | 20 ++++++++++++++++---- 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 repos/gems/run/sculpt/usb.config diff --git a/repos/gems/run/driver_manager.run b/repos/gems/run/driver_manager.run index 5a619f9854..d799f7be6b 100644 --- a/repos/gems/run/driver_manager.run +++ b/repos/gems/run/driver_manager.run @@ -53,9 +53,10 @@ install_config { - - - + + + + @@ -118,6 +119,10 @@ puts $fd { } close $fd +set fd [open [run_dir]/genode/usb_policy "w"] +puts $fd {} +close $fd + # # Override 'drivers.config' as supplied with the 'drivers_managed-pc' pkg diff --git a/repos/gems/run/sculpt.run b/repos/gems/run/sculpt.run index b6b451a082..db3bd3175b 100644 --- a/repos/gems/run/sculpt.run +++ b/repos/gems/run/sculpt.run @@ -102,6 +102,7 @@ install_config { + @@ -235,6 +236,8 @@ install_config { + + diff --git a/repos/gems/run/sculpt/usb.config b/repos/gems/run/sculpt/usb.config new file mode 100644 index 0000000000..7d42895d9c --- /dev/null +++ b/repos/gems/run/sculpt/usb.config @@ -0,0 +1,13 @@ + + + + + + diff --git a/repos/gems/src/app/driver_manager/main.cc b/repos/gems/src/app/driver_manager/main.cc index f75d229e4c..170a98d727 100644 --- a/repos/gems/src/app/driver_manager/main.cc +++ b/repos/gems/src/app/driver_manager/main.cc @@ -316,6 +316,7 @@ struct Driver_manager::Main : Block_devices_generator Attached_rom_dataspace _platform { _env, "platform_info" }; Attached_rom_dataspace _usb_devices { _env, "usb_devices" }; + Attached_rom_dataspace _usb_policy { _env, "usb_policy" }; Attached_rom_dataspace _pci_devices { _env, "pci_devices" }; Attached_rom_dataspace _ahci_ports { _env, "ahci_ports" }; Attached_rom_dataspace _nvme_ns { _env, "nvme_ns" }; @@ -349,6 +350,9 @@ struct Driver_manager::Main : Block_devices_generator Signal_handler
_usb_devices_update_handler { _env.ep(), *this, &Main::_handle_usb_devices_update }; + Signal_handler
_usb_policy_update_handler { + _env.ep(), *this, &Main::_handle_usb_devices_update }; + void _handle_ahci_ports_update(); Signal_handler
_ahci_ports_update_handler { @@ -365,7 +369,7 @@ struct Driver_manager::Main : Block_devices_generator }; void _generate_init_config (Reporter &) const; - void _generate_usb_drv_config (Reporter &, Xml_node) const; + void _generate_usb_drv_config (Reporter &, Xml_node, Xml_node) const; void _generate_block_devices (Reporter &) const; Ahci_driver::Default_label _default_block_device() const; @@ -383,11 +387,14 @@ struct Driver_manager::Main : Block_devices_generator _pci_devices.sigh(_pci_devices_update_handler); _usb_devices.sigh(_usb_devices_update_handler); + _usb_policy .sigh(_usb_policy_update_handler); _ahci_ports .sigh(_ahci_ports_update_handler); _nvme_ns .sigh(_nvme_ns_update_handler); _generate_init_config(_init_config); - _generate_usb_drv_config(_usb_drv_config, Xml_node("")); + _generate_usb_drv_config(_usb_drv_config, + Xml_node(""), + Xml_node("")); _handle_pci_devices_update(); _handle_usb_devices_update(); @@ -494,8 +501,9 @@ void Driver_manager::Main::_handle_nvme_ns_update() void Driver_manager::Main::_handle_usb_devices_update() { _usb_devices.update(); + _usb_policy.update(); - _generate_usb_drv_config(_usb_drv_config, _usb_devices.xml()); + _generate_usb_drv_config(_usb_drv_config, _usb_devices.xml(), _usb_policy.xml()); } @@ -635,7 +643,8 @@ void Driver_manager::Main::_generate_block_devices(Reporter &block_devices) cons void Driver_manager::Main::_generate_usb_drv_config(Reporter &usb_drv_config, - Xml_node devices) const + Xml_node devices, + Xml_node policy) const { Reporter::Xml_generator xml(usb_drv_config, [&] () { @@ -648,6 +657,9 @@ void Driver_manager::Main::_generate_usb_drv_config(Reporter &usb_drv_config, xml.node("raw", [&] () { xml.node("report", [&] () { xml.attribute("devices", true); }); + /* incorporate user-managed policy */ + xml.append(policy.content_base(), policy.content_size()); + devices.for_each_sub_node("device", [&] (Xml_node device) { typedef String<64> Label;