From 2d355d5490f7487d7a57e25d13f478a5f274114f Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Thu, 15 Oct 2009 18:01:41 +0200 Subject: [PATCH] Implemented poll(); receiving on generic device also works. --- devices/generic.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/devices/generic.c b/devices/generic.c index 6831ccc0..84653bef 100644 --- a/devices/generic.c +++ b/devices/generic.c @@ -75,6 +75,7 @@ typedef struct { int ec_gen_device_open(ec_gen_device_t *); int ec_gen_device_stop(ec_gen_device_t *); int ec_gen_device_start_xmit(ec_gen_device_t *, struct sk_buff *); +void ec_gen_device_poll(ec_gen_device_t *); /*****************************************************************************/ @@ -107,6 +108,8 @@ static int ec_gen_netdev_start_xmit( void ec_gen_poll(struct net_device *dev) { + ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev)); + ec_gen_device_poll(gendev); } /*****************************************************************************/ @@ -271,6 +274,35 @@ int ec_gen_device_start_xmit( /*****************************************************************************/ +/** Polls the device. + */ +void ec_gen_device_poll( + ec_gen_device_t *dev + ) +{ + struct msghdr msg; + struct kvec iov; + char buf[2000]; // FIXME + int ret, budget = 10; // FIXME + + iov.iov_base = buf; + iov.iov_len = 2000; + memset(&msg, 0, sizeof(msg)); + + do { + ret = kernel_recvmsg(dev->socket, &msg, &iov, 1, iov.iov_len, + MSG_DONTWAIT); + if (ret > 0) { + ecdev_receive(dev->ecdev, buf, ret); + } else if (ret < 0) { + break; + } + budget--; + } while (budget); +} + +/*****************************************************************************/ + /** Offer device. */ int offer_device( -- GitLab