[driver-discuss] Ioctl with multiplexers.

max at bruningsystems.com max at bruningsystems.com
Sat May 12 02:19:10 PDT 2007


Garrett D'Amore wrote:
> Zimmer Sébastien wrote:
>> Hi community,
>>
>> I was wondering about handling of ioctl on multiplexer. The small 
>> architecture I have in mind is the following: StreamDriver <-> Module 
>> <-> multiplexer. The driver is opened and the module is I_PUSH'ed on 
>> it, then the muxer is opened and I_LINK'ed to the module. In another 
>> process, I reopen the driver and try to send an ioctl request. It 
>> fails and the encountered error is the following: "[Errno 22] Invalid 
>> argument".
>>
>> I already checked that the ioctl is correctly handled when the muxer 
>> is not linked. I add a lot of debug logging and apparently the driver 
>> does *not* receive a mblk of type M_IOCTL. So the first question is: 
>> "why don't I receive a mblk of type M_IOCTL when the muxer is linked 
>> ?". Neither the muxer, nor the module, nor the driver ... is it 
>> possible the stream framework is rejecting any ioctl for the linked 
>> stream ?
The q_next pointers from above streams end at the mux.  In other words, 
you can't just putnext() the message down.  If you want to pass M_IOCTL 
messages down lower streams, you need to keep track of the lower queues 
to find which queue(s) to pass the message down to.  Also, the mux acts 
as a stream head to the lower streams, so you'll have to handle 
M_IOCACK/M_IOCNAK in the lower part of the mux and figure out how to 
communicate the ack/nak to the appropriate upper stream.  All in all, 
you're better off opening the device, pushing the module, sending the 
ioctl(s), and then linking with the mux.  You can take a look at the 
consms driver which acts as a mux and allows mulitple lower streams to 
be linked and which does M_IOCTL handling for those stream.  
Specifically, start with consms_mux_disp_ioctl() in consms.c
>>
>> I also though of a work-around for this problem. Maybe I can open the 
>> muxer instead of the driver and the muxer would forward the ioctl to 
>> the driver. However the forwarding wasn't mention in the stream 
>> framework pdf, so I didn't implement it. I also fail to find any 
>> reference to such a technique in the source of opensolaris, that's 
>> why I'm asking: "Should the muxer forward the ioctl downstream ?". I 
>> don't think so as it a driver (it should drop unknown ioctl) but it's 
>> a special driver, so I'm a bit perplex here :)
>
> I think that depends on the mux driver.  mux drivers are weird.  Some 
> times it can pass down an ioctl, but then it also needs to be prepared 
> to pass up the reply.  And if the mux sends an ioctl down multiple 
> paths, it has to resolve multiple responses.
>
> I've done work like this in the past... its not hard, but its not 
> trivial either.  There are lots of edge cases.
>
> Best bet is to avoid having to pass an ioctl thru a mux, if you have a 
> choice.
>
>>
>> Last thing I tested. I open the driver and push the module on it. In 
>> another process, I reopen the driver, push the module and link the 
>> muxer. Then I used the first handle to the driver and send the ioctl 
>> request and it works. So, driver and module ioctl handling are 
>> working but it doesn't work anymore once I linked the muxer and 
>> reopen the driver after the I_LINK.
>
> I think we need more information about the mux driver you're working 
> with, and the anticipated plumbing.  It could a bug in the the bottom 
> driver, as well (perhaps doing qreply to the wrong queue?)
>
>
>    -- Garrett
>>
>> Thanks for any clue you can provide me with,
>> Sebastien
>> _______________________________________________
>> driver-discuss mailing list
>> driver-discuss at opensolaris.org
>> http://mail.opensolaris.org/mailman/listinfo/driver-discuss
>
> _______________________________________________
> driver-discuss mailing list
> driver-discuss at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/driver-discuss
>




More information about the driver-discuss mailing list