Pseudo-device driver & select ??

Pete Heerboth pheerboth at apple.com
Fri May 27 16:43:28 PDT 2005


You might want to take a look at the bpf pseudo device and how it  
handles polls int bpf.c.  You need to use the selrecord() and  
selwakeup() functions.

Check out:

http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/net/

On May 26, 2005, at 6:00 PM, Aziz Kezzou wrote:

>>>
>>> Aziz Kezzou wrote:
>>>
>>>> Hi all,
>>>> I am trying to implement a small kld pseudo-device driver on  
>>>> FreeBSD 5.3 that
>>>> behaves just like a socket with regards to the select system call.
>>>>
>>>> Currently, I am using the sample echo pseudo-device driver from
>>>> http://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/ 
>>>> driverbasics-char.html
>>>>  as an example. However, whenever  I call select on the file
>>>> descriptor of "/dev/echo" it always returns even when there is  
>>>> no data
>>>> to be read.
>>>>
>>>> I looked at the socket code and it looks like I need to provide  
>>>> my own
>>>> "fo_select" function in the fileops data structure. Am i right ?  
>>>> How
>>>> do I do that ? The sample echo pseudo-device driver above uses
>>>> "struct cdevsw"  instead...
>>>>
>>>> Thanks
>>>> -aziz
>>>> _______________________________________________
>>>> freebsd-net at freebsd.org mailing list
>>>> http://lists.freebsd.org/mailman/listinfo/freebsd-net
>>>> To unsubscribe, send any mail to "freebsd-net- 
>>>> unsubscribe at freebsd.org"
>>>>
>>>>
>>>>
>>> look at spec_poll()
>>> I beleive that when your device is opened the fileops{} will
>>> point to the spec ops and you're code will be entered via
>>> spec_poll() - now you just need to implement the poll/select notion
>>> for your device.
>>>
>>>
>>
>> Thanks,
>> Actually, il turned out to be very simple.
>> I needed only to provide a "d_poll" function as part of the structure
>> cdevsw, as follows :
>>
>> /* Character device entry points */
>> static struct cdevsw echo_cdevsw = {
>>     .d_version = D_VERSION,
>>     .d_open = echo_open,
>>     .d_close = echo_close,
>>     .d_read = echo_read,
>>     .d_write = echo_write,
>>     .d_poll = echo_poll,
>>     .d_name = "echo",
>> };
>>
>> with echo_poll :
>> static  int
>> echo_poll(struct cdev *dev, int events, struct thread *td)
>> {
>>
>>   uprintf( "echo_poll called : data_available = %d!\n",  
>> data_available );
>>   if(data_available == 0)
>>     return 0;
>>   data_available = 0;
>>   return 1;
>> }
>>
>>
>
> Now the question is, if I don't have any data available when select
> (i.e d_poll ) is called, how do I notify select  when data arrives ?
> looks like "d_poll" is called only once (the name is a bit misleading
> here ;-) , isn't it ?
>
> Any hints ?
> Thanks.
> -aziz
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>



More information about the freebsd-hackers mailing list