libnet: HW filter disable/enable on queue creation
[barrelfish] / lib / net / net_queue.c
index 34d22f5..d1e88cf 100644 (file)
@@ -48,6 +48,11 @@ static errval_t create_e1000_queue(const char* cardname, inthandler_t interrupt,
     if (parsed != 5) {
         return SYS_ERR_OK;
     }
+
+    struct net_state* st = get_default_net_state();
+    // disable HW filter since the card does not have them
+    st->hw_filter = false;
+
     return e1000_queue_create((struct e1000_queue**)retqueue, vendor, deviceid,
                               bus, device, function, 1, interrupt);
 }
@@ -56,9 +61,12 @@ static errval_t create_e10k_queue(const char* cardname, inthandler_t interrupt,
                                   bool default_q, bool poll, struct devq **retqueue)
 {
     errval_t err;
+    struct net_state* st = get_default_net_state();
+    // enable HW filter since they are enabled by default by the driver
+    st->hw_filter = true;
     err = e10k_queue_create((struct e10k_queue**)retqueue, interrupt,
                             false /*virtual functions*/,
-                            poll, /* user interrupts*/
+                            !poll, /* user interrupts*/
                             default_q);
     *queueid = e10k_queue_get_id((struct e10k_queue*)*retqueue);
     assert(retqueue != NULL);
@@ -69,9 +77,12 @@ static errval_t create_sfn5122f_queue(const char* cardname, inthandler_t interru
                                       bool default_q, bool poll, struct devq **retqueue)
 {
     errval_t err;
+    struct net_state* st = get_default_net_state();
+    // enable HW filter since they are enabled by default by the driver
+    st->hw_filter = true;
     err = sfn5122f_queue_create((struct sfn5122f_queue**)retqueue, interrupt,
                                 false /*userlevel network feature*/,
-                                poll /* user interrupts*/,
+                                !poll /* user interrupts*/,
                                 default_q);
     *queueid = sfn5122f_queue_get_id((struct sfn5122f_queue*)*retqueue);
     return err;
@@ -106,7 +117,8 @@ struct networking_card
  * @return SYS_ERR_OK on success, errval on failure
  */
 errval_t net_queue_internal_create(inthandler_t interrupt, const char *cardname,
-                                   uint64_t* queueid, bool default_q, bool poll, struct devq **retqueue)
+                                   uint64_t* queueid, bool default_q, bool poll, 
+                                   struct devq **retqueue)
 {
     struct networking_card *nc = networking_cards;
     while(nc->cardname != NULL) {