diff --git a/devices/generic.c b/devices/generic.c
index 6831ccc08598fe21602e635ff2645870544292f4..84653bef22da5f6d55457a6d32eb23492e1e0915 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(