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