libnet: HW filter disable/enable on queue creation
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 4 Sep 2017 08:02:24 +0000 (10:02 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 4 Sep 2017 08:02:24 +0000 (10:02 +0200)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

lib/net/net.c
lib/net/net_queue.c
lib/net/networking_internal.h

index 5237c93..104dbec 100644 (file)
@@ -184,7 +184,7 @@ static errval_t networking_init_with_queue_st(struct net_state *st, struct devq
         goto out_err1;
     }
 
-    if (!(flags & NET_FLAGS_NO_NET_FILTER)) {
+    if (!(flags & NET_FLAGS_NO_NET_FILTER) || !st->hw_filter) {
         NETDEBUG("initializing hw filter...\n");
 
         err = net_filter_init(&st->filter, st->cardname);
@@ -272,6 +272,8 @@ static errval_t networking_init_st(struct net_state *st, const char *nic,
 
     st->cardname = nic;
     st->flags = flags;
+    // default no hw filters
+    st->hw_filter = false;
 
     /* create the queue wit the given nic and card name */
     err = networking_create_queue(nic, &st->queueid, &st->queue);
index fe794cd..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,9 @@ static errval_t create_e10k_queue(const char* cardname, inthandler_t interrupt,
                                   bool default_q, bool poll, struct devq **retqueue)
 {
     errval_t err;
-
-    printf("Default Q %d Interrupt %d \n", default_q, !poll);
-
+    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*/
@@ -72,6 +77,9 @@ 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*/,
@@ -109,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) {
index 6196916..58b5acd 100644 (file)
@@ -77,6 +77,7 @@ struct net_state {
     struct devq *queue;
     struct net_buf_pool *pool;
     struct netif netif;
+    bool hw_filter;
     struct net_filter_state* filter;
 
   //  ip4_addr_t ipaddr, netmask, gw;