Re: Pseudo-device driver & select ??

From: Pete Heerboth (pheerboth_at_apple.com)
Date: 05/28/05

  • Next message: Tom Farrell: "Re: two ISP connections, three nics, and a NAT"
    Date: Fri, 27 May 2005 16:43:23 -0700
    To: Aziz Kezzou <french.linuxian@gmail.com>
    
    

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

    _______________________________________________
    freebsd-net@freebsd.org mailing list
    http://lists.freebsd.org/mailman/listinfo/freebsd-net
    To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"


  • Next message: Tom Farrell: "Re: two ISP connections, three nics, and a NAT"