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@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net- [EMAIL PROTECTED]"



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@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"


_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to