I have been looking into your suggestions and I have some questions about it.
On 13-01-17 11:32, Norman Feske wrote:
You are already on the right track. Running rump_fs as a slave is good. You just missed a tiny piece of the puzzle: The 'Slave::Connection' does not only provide the session interface of the slave's service but also the corresponding 'Session_capability' (it inherits 'CONNECTION::Client', so the 'Slave::Connection' _is_ a session capability). Instead of calling the 'File_system' methods, the media component would pass this 'Session_capability' to init as response to the 'File_system' session request that originated from init.
I assume here the session() method inherited from Genode::Root has to be implemented such that it returns the capability that is the Slave::Connection after that connection has been initiated?
On 14-01-17 20:58, Nobody III wrote:
I have personally done some work related to this issue. First off, I would suggest adding code to allow init to share child services with its parent. I also have a service_router component that I wrote. You may not be able to use it directly, but feel free to take some of the code to use in your media component. Here's a link to the code: https://github.com/NobodyIII/genode/tree/master/repos/os/src/server/service_...
The code is a bit messy, so any help on making it ready to merge into the official Genode repo would be very welcome.
Here, you create a Forwarded_capability struct, which wraps a session capability. It inherits from Id_spaceParent::Client::Element. Why if I may ask? Do I need to do that too?
It eventually invokes env.session() to create a new capability for the forwarded service. Why does it not get its capability from the server, but instead seems to create a new session for a certain service? It seems to me that the Service router does not forward capabilities from children, or am I wrong? Does the cap live somewhere else?
I'm missing the picture a bit here. Can you explain how it works with those capabilities?