Merge Razvan's process management code.
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Tue, 26 Sep 2017 10:27:00 +0000 (12:27 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Tue, 26 Sep 2017 10:27:00 +0000 (12:27 +0200)
Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

46 files changed:
if/net_ARP.if
if/octopus.if
include/devif/backends/net/ip.h
include/devif/backends/net/udp.h
include/net/arp.h
include/net_sockets/net_sockets.h
include/octopus/definitions.h
kernel/capabilities.c
lib/devif/backends/net/ip/devif_backend_ip.c
lib/devif/backends/net/solarflare/hw_queue.h
lib/devif/backends/net/udp/devif_backend_udp.c
lib/devif/queue_interface.c
lib/net/Hakefile
lib/net/arp.c
lib/net/dhcp.c
lib/net/net.c
lib/net/net_filter.c
lib/net/net_queue.c
lib/net/netif.c
lib/net/networking_internal.h
lib/net_sockets/Hakefile
lib/net_sockets/net_sockets.c
lib/nfs/rpc.c
platforms/Hakefile
tools/flounder/UMPCommon.hs
tools/harness/tests/basicNetwork.py
tools/harness/tests/devif_test.py
tools/harness/tests/nfscat.py
tools/harness/tests/tftp.py
tools/harness/tests/vmkit.py
tools/harness/tests/webserver.py
tools/harness/tests/xeonphi.py
usr/drivers/e10k/e10k_cdriver.c
usr/drivers/solarflare/sfn5122f_cdriver.c
usr/kaluga/driver_domains.c
usr/kaluga/driver_startup.c
usr/kaluga/main.c
usr/kaluga/start_cpu.c
usr/kaluga/x86.c
usr/net_socket_server/Hakefile [moved from usr/drivers/net_socket_server/Hakefile with 69% similarity]
usr/net_socket_server/net_sockets_server.c [moved from usr/drivers/net_socket_server/e1000_net_sockets_server.c with 96% similarity]
usr/skb/programs/device_db.pl
usr/tests/devif/client.c
usr/tests/devif/echo.c
usr/tests/devif/udp_queue.c
usr/webserver/main.c

index 5dd32a6..d231962 100644 (file)
@@ -21,5 +21,6 @@ interface net_ARP "ARP Table" {
                     in bool force,
                     out errval err,
                     out uint64 mac);
+    message arp_force_lookup(ipv4addr ip);
 };
 
index ce0a787..b4cc923 100644 (file)
@@ -41,7 +41,7 @@ interface octopus "octopus RPC Interface" {
      * \param tid Id of registered trigger (0 in case no trigger registered).
      * \param error_code Error value of request.
      */
-    rpc get_names(in String query[4096], in trigger t, out String output[4096],
+    rpc get_names(in String query[8192], in trigger t, out String output[8192],
                   out trigger_id tid, out errval error_code);
 
     /**
@@ -51,7 +51,7 @@ interface octopus "octopus RPC Interface" {
      * \param tid Id of registered trigger (0 in case no trigger registered).
      * \param error_code Error value of request.
      */
-    rpc get(in String query[4096], in trigger t, out String output[4096],
+    rpc get(in String query[8192], in trigger t, out String output[8192],
             out trigger_id tid, out errval error_code);
 
     /**
@@ -64,8 +64,8 @@ interface octopus "octopus RPC Interface" {
      * \param tid Id of registered trigger (0 in case no trigger registered).
      * \param error_code Error value of request
      */
-    rpc set(in String query[4096], in uint64 mode, in trigger t, in bool get,
-            out String record[4096], out trigger_id tid, out errval error_code);
+    rpc set(in String query[8192], in uint64 mode, in trigger t, in bool get,
+            out String record[8192], out trigger_id tid, out errval error_code);
 
     /**
      * Find a record using an ID capability as the key/name of the record.
@@ -76,7 +76,7 @@ interface octopus "octopus RPC Interface" {
      * \param tid Id of registered trigger (0 in case no trigger registered).
      * \param error_code Error value of request.
      */
-    rpc get_with_idcap(in cap idcap, in trigger t, out String output[4096],
+    rpc get_with_idcap(in cap idcap, in trigger t, out String output[8192],
                        out trigger_id tid, out errval error_code);
 
     /**
@@ -102,7 +102,7 @@ interface octopus "octopus RPC Interface" {
      * \param tid Id of registered trigger (0 in case no trigger registered).
      * \param error_code Error value of request
      */
-    rpc del(in String query[4096], in trigger t, out trigger_id tid,
+    rpc del(in String query[8192], in trigger t, out trigger_id tid,
             out errval error_code);
 
     /**
@@ -111,7 +111,7 @@ interface octopus "octopus RPC Interface" {
      * \param tid Id of registered trigger (0 in case no trigger registered).
      * \param error_code Error value of request.
      */
-    rpc exists(in String query[4096], in trigger t, out trigger_id tid,
+    rpc exists(in String query[8192], in trigger t, out trigger_id tid,
                out errval error_code);
 
     /**
@@ -127,7 +127,7 @@ interface octopus "octopus RPC Interface" {
      * \param record
      * \param error_code
      */
-    rpc wait_for(in String query[4096], out String record[2048], out errval error_code);
+    rpc wait_for(in String query[8192], out String record[2048], out errval error_code);
 
     /**
      * \brief Used to remove Triggers in case they are not needed anymore.
@@ -153,7 +153,7 @@ interface octopus "octopus RPC Interface" {
      * \param id Identifier for this subscription supplied by server.
      * \param error_code Status of request.
      */
-    rpc subscribe(in String query[4096], in uint64 trigger_fn, in uint64 state,
+    rpc subscribe(in String query[8192], in uint64 trigger_fn, in uint64 state,
                   out uint64 id, out errval error_code);
 
     /**
index 6c65ba2..eeb1c8a 100644 (file)
@@ -38,12 +38,11 @@ errval_t ip_destroy(struct ip_q* q);
  * @param qid          the id of the hardware queue (used for filters)
  * @param prot         The protocol that is running on top of IP
  * @param dst_ip       Destination IP
- * @param dst_mac      Destination MAC address
  * @param interrupt    Interrupt handler
  * @param poll         If the queue is polled or should use interrupts             
  *
  */
 errval_t ip_create(struct ip_q** q, const char* card_name, uint64_t* qid,
-                   uint8_t prot, uint32_t dst_ip, struct eth_addr dst_mac, 
-                   void(*interrupt)(void*), bool poll);
+                   uint8_t prot, uint32_t dst_ip, void(*interrupt)(void*), 
+                   bool poll);
 #endif /* DEVIF_IP_H_ */
index 770cedb..0adc215 100644 (file)
@@ -31,15 +31,14 @@ errval_t udp_destroy(struct udp_q* q);
  * @param src_port     UDP source port
  * @param dst_port     UPD destination port
  * @param dst_ip       Destination IP
- * @param dst_mac      Destination MAC address
  * @param interrupt    Interrupt handler
  * @param poll         If the queue is polled or should use interrupts             
  *
  */
 errval_t udp_create(struct udp_q** q, const char* card_name, 
                     uint16_t src_port, uint16_t dst_port,
-                    uint32_t dst_ip, struct eth_addr dst_mac,
-                    void(*interrupt)(void*), bool poll);
+                    uint32_t dst_ip, void(*interrupt)(void*), 
+                    bool poll);
 /*
  * @brief  Writes into a buffer so that we still have space to add the headers
  *
index 4ec4fe2..9e6c05b 100644 (file)
@@ -21,4 +21,6 @@ errval_t arp_service_start(void);
 
 errval_t arp_service_subscribe(void);
 
+errval_t arp_service_get_mac(uint32_t ip, uint64_t* mac);
+
 #endif /* LIB_NET_INCLUDE_NETWORKING_ARP_H_ */
index 28a1cae..5c9b7af 100644 (file)
@@ -46,5 +46,6 @@ void net_set_on_closed(struct net_socket *socket, net_closed_callback_t cb);
 
 
 errval_t net_sockets_init(void);
+errval_t net_sockets_init_with_card(char* cardname);
 
 #endif
index 0a1d4f0..3d45ff8 100644 (file)
@@ -25,7 +25,7 @@
 //MAX(octopus__get_names_response_output_MAX_ARGUMENT_SIZE,
 //MAX(octopus__get_response_output_MAX_ARGUMENT_SIZE,
 //octopus__get_with_idcap_response_output_MAX_ARGUMENT_SIZE))
-#define MAX_QUERY_LENGTH 4096
+#define MAX_QUERY_LENGTH 8192
 
 
 //
index 15d6bba..0bb5b58 100644 (file)
@@ -1716,6 +1716,21 @@ errval_t caps_retype(enum objtype type, gensize_t objsize, size_t count,
         dest_cap->u.endpoint.listener = src_cap->u.dispatcher.dcb;
     }
 
+    // XXX: Treat full object retypes to same type as copies as calling
+    // is_copy(dst, src) will return true for such retypes.
+    if (count == 1 && objsize == get_size(src_cap) && type == src_cap->type) {
+        // sanity check: is_copy() really returns true for the two caps
+        assert(is_copy(&dest_cte[0].cap, src_cap));
+        // If we're not owner, and type needs locality
+        if (src_cte->mdbnode.owner != my_core_id &&
+            distcap_needs_locality(dest_cte[0].cap.type))
+        {
+            // fix owner for new cap and set remote_copies bit
+            dest_cte[0].mdbnode.owner = src_cte->mdbnode.owner;
+            dest_cte[0].mdbnode.remote_copies = true;
+        }
+    }
+
     /* Handle mapping */
     for (size_t i = 0; i < count; i++) {
         mdb_insert(&dest_cte[i]);
index e76d8e3..7c5db2b 100644 (file)
@@ -22,6 +22,7 @@
 #include <net/net_queue.h>
 #include <net/net_filter.h>
 #include <net/dhcp.h>
+#include <net/arp.h>
 #include "../../../queue_interface_internal.h"
 #include "../headers.h"
 
@@ -225,8 +226,7 @@ static errval_t ip_dequeue(struct devq* q, regionid_t* rid, genoffset_t* offset,
  *
  */
 errval_t ip_create(struct ip_q** q, const char* card_name, uint64_t* qid,
-                   uint8_t prot, uint32_t dst_ip,
-                   struct eth_addr dst_mac, inthandler_t interrupt, bool poll)
+                   uint8_t prot, uint32_t dst_ip, inthandler_t interrupt, bool poll)
 {
     errval_t err;
     struct ip_q* que;
@@ -257,9 +257,15 @@ errval_t ip_create(struct ip_q** q, const char* card_name, uint64_t* qid,
         return err;
     }
 
+    uint64_t mac;
+    err = arp_service_get_mac(htonl(dst_ip), &mac);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
     // fill in header that is reused for each packet
     // Ethernet
-    memcpy(&(que->header.eth.dest.addr), &dst_mac, ETH_HWADDR_LEN);
+    memcpy(&(que->header.eth.dest.addr), &mac, ETH_HWADDR_LEN);
     memcpy(&(que->header.eth.src.addr), &src_mac, ETH_HWADDR_LEN);
     que->header.eth.type = htons(ETHTYPE_IP);
 
index c94fb80..7186bbd 100644 (file)
@@ -366,6 +366,7 @@ static inline errval_t sfn5122f_queue_handle_rx_ev_devif(sfn5122f_queue_t* q,
         descriptor per packet  */
     struct devq_buf* buf;
     size_t rx_head;
+
     sfn5122f_q_rx_ev_t ev;
     //sfn5122f_q_rx_user_desc_t d_user= 0;
     //sfn5122f_q_rx_ker_desc_t d = 0;
@@ -382,13 +383,37 @@ static inline errval_t sfn5122f_queue_handle_rx_ev_devif(sfn5122f_queue_t* q,
     *flags = buf->flags;
 
     if(!sfn5122f_q_rx_ev_rx_ev_pkt_ok_extract(ev)) {   
-         if (sfn5122f_q_rx_ev_rx_ev_tobe_disc_extract(ev)) {
-            // packet discared by softare -> ok
+        if (sfn5122f_q_rx_ev_rx_ev_tobe_disc_extract(ev)) {
+            // packet discared by software -> ok
+            printf("Discard \n");
             err = NIC_ERR_RX_DISCARD;
-         } else if (sfn5122f_q_rx_ev_rx_ev_buf_owner_id_extract(ev)) {
-             printf("Wrong owner \n");
-             err = NIC_ERR_RX_PKT;
-         }
+        } else if (sfn5122f_q_rx_ev_rx_ev_buf_owner_id_extract(ev)) {
+            printf("Wrong owner \n");
+            err = NIC_ERR_RX_PKT;
+        } else if (sfn5122f_q_rx_ev_rx_ev_frm_trunc_extract(ev)) {
+            printf("Frame truncated \n");
+            err = NIC_ERR_RX_PKT;
+        } else if (sfn5122f_q_rx_ev_rx_ev_tcp_udp_chksum_err_extract(ev)) {
+            printf("UDP/TCP checksum error \n");
+            err = NIC_ERR_RX_PKT;
+        } else if (sfn5122f_q_rx_ev_rx_ev_pkt_not_parsed_extract(ev)) {
+            printf("Card error while parsing \n");
+            err = NIC_ERR_RX_PKT;
+        } else if (sfn5122f_q_rx_ev_rx_ev_ip_frag_err_extract(ev)) {
+            /*
+             * Seems like this should not really be handeled as an error even
+             * if the event itself seems to suggest so. Not even handeled in linux. 
+             * (pkt_ok()) is not even read out ...
+             */ 
+            err = SYS_ERR_OK;
+            *valid_length = sfn5122f_q_rx_ev_rx_ev_byte_ctn_extract(ev);
+        } else if (sfn5122f_q_rx_ev_rx_ev_ip_hdr_chksum_err_extract(ev)) {
+            printf("IP header ckecksum error \n");
+            err = NIC_ERR_RX_PKT;
+        } else {
+            printf("Unknown error \n");
+            err = NIC_ERR_RX_PKT;
+        }
     } else {
         *valid_length = sfn5122f_q_rx_ev_rx_ev_byte_ctn_extract(ev);
         /* Length of 0 is treated as 16384 bytes */
@@ -396,7 +421,6 @@ static inline errval_t sfn5122f_queue_handle_rx_ev_devif(sfn5122f_queue_t* q,
             *valid_length = 16384;
         }
     }
-
     /*
     if (q->userspace){
         d_user = q->tx_ring.user[q->tx_head];  
@@ -408,7 +432,6 @@ static inline errval_t sfn5122f_queue_handle_rx_ev_devif(sfn5122f_queue_t* q,
     */
     /* only have to reset event entry */
     sfn5122f_queue_clear_ev(ev);
-
     sfn5122f_queue_bump_rxhead(q);
     return err;
 }
index 1cc8181..68f7a93 100644 (file)
@@ -210,8 +210,7 @@ static errval_t udp_dequeue(struct devq* q, regionid_t* rid, genoffset_t* offset
  */
 errval_t udp_create(struct udp_q** q, const char* card_name, 
                     uint16_t src_port, uint16_t dst_port,
-                    uint32_t dst_ip, struct eth_addr dst_mac,
-                    void(*interrupt)(void*), bool poll)
+                    uint32_t dst_ip, void(*interrupt)(void*), bool poll)
 {
     errval_t err;
     struct udp_q* que;
@@ -227,7 +226,7 @@ errval_t udp_create(struct udp_q** q, const char* card_name,
     // init other queue
     uint64_t qid;
     err = ip_create((struct ip_q**) &que->q, card_name, &qid, UDP_PROT, dst_ip, 
-                    dst_mac, interrupt, poll);
+                    interrupt, poll);
     if (err_is_fail(err)) {
         return err;
     }
index e0ed19e..42f0fa8 100644 (file)
@@ -111,7 +111,7 @@ errval_t devq_dequeue(struct devq *q,
         return DEVQ_ERR_INVALID_BUFFER_ARGS;
     }
 
-    DQI_DEBUG("Dequeue q=%p rid=%d, bid=%d \n", q, *region_id, *buffer_id);
+    DQI_DEBUG("Dequeue q=%p rid=%u, offset=%lu \n", q, *region_id, *offset);
 
     return SYS_ERR_OK;
 }
index 0aa276e..cc08ca1 100644 (file)
@@ -14,8 +14,8 @@
     target       = "net",
     cFiles       = [ "net.c", "netbufs.c",  "netif.c", "pbuf.c", "dhcp.c",
                      "net_filter.c", "arp.c", "net_queue.c"],
-    flounderBindings = [ "net_filter"],
-    flounderDefs = [ "net_filter", "octopus" ],
+    flounderBindings = [ "net_filter", "net_ARP"],
+    flounderDefs = [ "net_filter", "octopus", "net_ARP" ],
     flounderExtraDefs = [ ("net_filter",["rpcclient"]) ],
     addLibraries = libDeps [ "lwip2", "devif", "devif_backend_idc",
                              "devif_backend_solarflare", "devif_backend_e10k",
index 0e01eb9..348c261 100644 (file)
 
 
 #include <barrelfish/barrelfish.h>
+#include <barrelfish/nameservice_client.h>
+#include <collections/list.h>
 
 
-#include <lwip/opt.h>
+#include <lwip/opt.h>       
 #include <lwip/netif.h>
 #include <lwip/timeouts.h>
 #include <net/netif.h>
@@ -25,6 +27,7 @@
 #include <netif/etharp.h>
 
 #include <if/octopus_defs.h>
+#include <if/net_ARP_defs.h>
 #include <octopus/octopus.h>
 #include <octopus/trigger.h>
 
 #define ARP_ENTRY "net.arp.%d {mac: %lu, ip: %d}"
 
 #define ARP_ENTRY_REGEX "r'net\\.arp\\.[0-9]+' { mac: _, ip: _}"
+#define ARP_RESEND_FREQ 500*1000
+
+struct arp_request {
+    uint32_t ip;
+};
+
+static void arp_timer_callback(void *data)
+{
+    errval_t err;
+    char* record;
+    char query[128];
+
+    struct net_state *st = (struct net_state*) data;
+
+    // remove all the outstanding ARPs that are finished
+    for (int i = 0; i < collections_list_size(st->outstanding_arp) ; i++) {
+        struct arp_request* req = (struct arp_request*) collections_list_get_ith_item(st->outstanding_arp, i);
+        sprintf(query, "net.arp.%d {mac: _ , ip: %d }", req->ip, req->ip);
+        err = oct_get(&record, query);
+        if (err_is_ok(err)) {
+            // remove from outstanding arps
+            collections_list_remove_ith_item(st->outstanding_arp, i);
+        }
+    }
+    
+    // no outstanding ARPs
+    if (collections_list_size(st->outstanding_arp) == 0) {
+        NETDEBUG("Stopping ARP periodic event \n");
+        err = periodic_event_cancel(&st->arp_send);
+        assert(err_is_ok(err));
+        return;
+    }
+
+    // Resend all other outstanding ARPs
+    for (int i = 0; i < collections_list_size(st->outstanding_arp) ; i++) {
+        struct arp_request* req = (struct arp_request*) collections_list_get_ith_item(st->outstanding_arp, i);
+        NETDEBUG("Starting ARP for ip %u \n", req->ip);
+        err = etharp_request(&st->netif, (ip4_addr_t*) &req->ip);
+        assert(err_is_ok(err));
+    }
+}
+
+static void arp_request_free(void *data)
+{
+    free(data);
+}
+
+// Reuse existing Flounder interface
+static void arp_force_lookup(struct net_ARP_binding *b,
+                             uint32_t ip)
+{
+    errval_t err;
+    struct net_state *sta = (struct net_state*) b->st;
+
+    if (sta->outstanding_arp == NULL) {
+       collections_list_create(&sta->outstanding_arp, arp_request_free);
+       assert(sta->outstanding_arp != NULL); 
+    }    
+
+    if (collections_list_size(sta->outstanding_arp) == 0) {
+        NETDEBUG("Starting ARP periodic event\n");
+        err = periodic_event_create(&sta->arp_send, get_default_waitset(),
+                                    ARP_RESEND_FREQ, MKCLOSURE(arp_timer_callback, sta));
+        assert(err_is_ok(err));
+    }
+
+    struct arp_request* new_arp = malloc(sizeof(struct arp_request));
+    collections_list_insert(sta->outstanding_arp, new_arp);
+
+    // send one but if it fails, periodic event will call it again
+    err = etharp_request(&sta->netif, (ip4_addr_t*) &ip);
+    assert(err_is_ok(err));
+} // end function: ARP_resolve_request
+
+
+static struct net_ARP_rx_vtbl rx_arp_vtbl = {
+    .arp_force_lookup = arp_force_lookup,
+};
+
+/*****************************************************************
+* Dealing with new connections
+*****************************************************************/
+static errval_t connect_ARP_cb(void *st, struct net_ARP_binding *b)
+{   
+    b->st = st;
+    b->rx_vtbl = rx_arp_vtbl;
+    return SYS_ERR_OK;
+} 
+
+/*****************************************************************
+* exporting service
+*****************************************************************/
+
+static void export_ARP_cb(void *st, errval_t err, iref_t iref)
+{
+    struct net_state *sta = st;
+
+    if (err_is_fail(err)) {
+        DEBUG_ERR(err, "service export failed");
+    }
+
+    // register this iref with the name service
+    err = nameservice_register("libnet_arp", iref);
+    if (err_is_fail(err)) {
+        DEBUG_ERR(err, "nameservice_register failed for [libnet_arp]");
+        abort(); // FIXME: Do I need abort after DEBUG_ERR?
+    }
+    sta->arp_running = true;
+}
 
 struct netif *arp_filter_netif(struct pbuf *p, struct netif *netif, uint16_t type)
 {
@@ -111,6 +223,12 @@ static errval_t arp_service_start_st(struct net_state *st)
         return err;
     }
 
+    err = net_ARP_export(st, export_ARP_cb, connect_ARP_cb,
+                         get_default_waitset(), IDC_EXPORT_FLAGS_DEFAULT);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
     st->arp_running = true;
 
     return SYS_ERR_OK;
@@ -148,6 +266,8 @@ static  void arp_change_event(octopus_mode_t mode, const char* record, void* st)
     }
 }
 
+
+
 static errval_t arp_service_subscribe_st(struct net_state *st)
 {
     NETDEBUG("subscribing to ARP updates..\n");
@@ -169,3 +289,82 @@ errval_t arp_service_subscribe(void)
     struct net_state *st = get_default_net_state();
     return arp_service_subscribe_st(st);
 }
+
+
+
+static void bind_cb(void *st, errval_t err, struct net_ARP_binding *b)
+{
+    assert(err_is_ok(err));
+    struct net_state* sta = (struct net_state*) st;
+
+    sta->arp = b;
+    sta->arp_connected = true;
+}
+
+static errval_t arp_connect(struct net_state* st)
+{
+    errval_t err;
+    if (!st->arp_connected) {
+        iref_t iref;
+        err = nameservice_blocking_lookup("libnet_arp", &iref);
+        if (err_is_fail(err)) {
+            return err;
+        }
+
+        err = net_ARP_bind(iref, bind_cb, st, get_default_waitset(), 
+                           IDC_BIND_FLAGS_DEFAULT);
+        if (err_is_fail(err)) {
+            return err;
+        }
+    
+        while(!st->arp_connected) {
+            event_dispatch(get_default_waitset());
+        }
+    }
+    return SYS_ERR_OK;
+}
+
+errval_t arp_service_get_mac(uint32_t ip, uint64_t* mac)
+{
+    errval_t err;
+
+    err = oct_init();
+    if (err_is_fail(err)) {
+        return err;
+    }
+    
+    char* record = NULL;
+    char query[256] ;
+
+    sprintf(query, "net.arp.%d {mac: _ , ip: %d }", ip, ip);
+    err = oct_get(&record, query);
+    if (err_no(err) == OCT_ERR_NO_RECORD) {
+        struct net_state *st = get_default_net_state();
+        err = arp_connect(st);
+        if (err_is_fail(err)) {
+            return err;
+        }       
+
+        err = st->arp->tx_vtbl.arp_force_lookup(st->arp, NOP_CONT, ip);
+        if (err_is_fail(err)) {
+            return err;
+        }
+
+        err = oct_wait_for(&record, query);
+        if (err_is_fail(err)) {
+            return err;
+        }
+    } else if (err_is_fail(err)) {
+        DEBUG_ERR(err, "cannot get mac address\n");
+        return err;
+    }
+
+    uint64_t ip_adr;
+    err = oct_read(record, "_" ARP_ENTRY_FIELDS, mac, &ip_adr);
+    if (err_is_fail(err)) {
+        DEBUG_ERR(err, "failed to read the entrie\n");
+    }
+
+    return SYS_ERR_OK;
+}
+
index 04c4633..050665c 100644 (file)
@@ -27,7 +27,8 @@
 #include "networking_internal.h"
 
 ///< the debug subsystem
-#define debug_printf_SUBSYSTEM "dhcpd"
+//
+#define NETDEBUG_SUBSYSTEM "dhcpd"
 
 ///< the DHCP timeout in milli seconds
 #define DHCP_TIMEOUT_MSECS (120UL * 1000)
index 5237c93..e62194c 100644 (file)
@@ -124,7 +124,7 @@ static errval_t networking_poll_st(struct net_state *st)
     if (st->flags & NET_FLAGS_POLLING) {
         return net_if_poll(&st->netif);
     } else {
-        return event_dispatch_non_block(get_default_waitset());
+        return event_dispatch(get_default_waitset());
     }
 }
 
@@ -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 34dde6d..1ed167b 100644 (file)
@@ -148,7 +148,20 @@ errval_t net_filter_init(struct net_filter_state** st,
     tmp->filters_mac.start = NULL;
     tmp->filters_mac.num_ele = 0;
 
-    err = connect_to_net_filter(tmp, cardname);
+    // cardname are of the form name:vendor:device:bus:function ..
+    int end = 0;
+    for (; end < strlen(cardname); end++) {
+        if (cardname[end] == ':') {
+            break;
+        }
+    }
+
+    char name[64];
+    strncpy(name, cardname, end);
+    name[end] = '\0';
+
+    printf("cardname %s \n", name);
+    err = connect_to_net_filter(tmp, name);
     *st = tmp;
     return err;
 }
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 8b7a8b0..43259cd 100644 (file)
@@ -76,6 +76,7 @@ static cycles_t bench_devq_deq_tx = 0;
 static size_t bench_devq_deq_count_tx = 0;
 #endif
 
+#define net_if_get_net_state(netif) ((struct net_state*)netif->state)
 
 errval_t net_if_get_hwaddr(struct netif *netif);
 
@@ -95,6 +96,7 @@ static void net_if_status_cb(struct netif *netif)
 {
     if (!ip_addr_cmp(&netif->ip_addr, IP_ADDR_ANY)) {
         printf("######################################\n");
+        printf("# Cardname %s\n", net_if_get_net_state(netif)->cardname);
         printf("# IP Addr %s\n", ip4addr_ntoa(netif_ip4_addr(netif)));
         printf("# GW Addr %s\n", ip4addr_ntoa(netif_ip4_gw(netif)));
         printf("# Netmask %s\n", ip4addr_ntoa(netif_ip4_netmask(netif)));
@@ -206,8 +208,6 @@ errval_t net_if_remove(struct netif *netif)
     return SYS_ERR_OK;
 }
 
-#define net_if_get_net_state(netif) ((struct net_state*)netif->state)
-
 /**
  * @brief obtains the hardware address of the interface
  *
index e874882..58b5acd 100644 (file)
 #include <net/dhcp.h>
 #include <net/arp.h>
 
+#include <collections/list.h>
+
+#include <if/net_ARP_defs.h>
+
 #include "debug.h"
 
 // enable benchmarking
@@ -62,13 +66,18 @@ struct net_state {
     bool dhcp_running;
 
     bool arp_running;
+    bool arp_connected;
     uint64_t arp_triggerid;
+    struct net_ARP_binding* arp;
+    collections_listnode *outstanding_arp;
+    struct periodic_event arp_send;
 
     struct waitset *waitset;
 
     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;
index de86644..1fe2c25 100644 (file)
 
 [ build library { target = "net_sockets",
                   cFiles = [ "net_sockets.c" ],
-                  flounderDefs = [ "net_sockets" ],
+                  flounderDefs = [ "net_sockets" , "octopus"],
                   flounderBindings = [ "net_sockets" ],
                   addIncludes  = [ "include", "/lib/lwip-2.0.2/src/include/" ],
-                  addLibraries = libDeps [ "lwip2", "devif", "devif_backend_idc", "debug_log" ]
+                  addLibraries = libDeps [ "lwip2", "devif", "devif_backend_idc", 
+                                           "debug_log", "octopus", "octopus_parser"
+]
                 }
 ]
index 9aa8b43..807e814 100644 (file)
@@ -9,6 +9,11 @@
 
 #include <barrelfish/waitset_chan.h>
 #include <barrelfish/waitset.h>
+#include <barrelfish/deferred.h>
+
+#include <if/octopus_defs.h>
+#include <octopus/octopus.h>
+#include <octopus/getset.h>
 
 #include <devif/queue_interface.h>
 #include <devif/backends/descq.h>
@@ -438,7 +443,9 @@ static errval_t q_notify(struct descq* q)
     return SYS_ERR_OK;
 }
 
-errval_t net_sockets_init(void)
+
+
+errval_t net_sockets_init_with_card(char* cardname) 
 {
     errval_t err;
     iref_t iref;
@@ -453,11 +460,19 @@ errval_t net_sockets_init(void)
     f.notify = q_notify;
 
     debug_printf("net socket client started \n");
-    err = descq_create(&descq_queue, DESCQ_DEFAULT_SIZE, "net_sockets_queue",
+    char service_name[64];
+    char queue_name[64];
+
+    sprintf(service_name, "net_sockets_service_%s", cardname);
+    sprintf(queue_name, "net_sockets_queue_%s", cardname);
+
+    printf("Client connecting to: %s \n", service_name);
+    printf("Client init queue: %s \n", queue_name);
+    err = descq_create(&descq_queue, DESCQ_DEFAULT_SIZE, queue_name,
                        false, true, true, &queue_id, &f);
     assert(err_is_ok(err));
 
-    err = nameservice_blocking_lookup("net_sockets", &iref);
+    err = nameservice_blocking_lookup(service_name, &iref);
     assert(err_is_ok(err));
     err = net_sockets_bind(iref, bind_cb, NULL, get_default_waitset(), IDC_BIND_FLAGS_DEFAULT);
     assert(err_is_ok(err));
@@ -487,4 +502,44 @@ errval_t net_sockets_init(void)
     assert(err_is_ok(err));
 
     return SYS_ERR_OK;
+
+}
+
+
+#define NAMESERVICE_ENTRY "r'net\\_sockets\\_service\\_.*' { iref: _ }"
+#define OFFSET 20
+
+errval_t net_sockets_init(void)
+{   
+    errval_t err;
+    char* record;
+    // lookup cards that are available
+    err = oct_init();
+    if (err_is_fail(err)) {
+        return err;
+    }
+
+    // Wait for an entry in the namserver to pop up
+    //
+    err = oct_wait_for(&record, NAMESERVICE_ENTRY);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
+    // Get all of them
+    char** records;
+    size_t len;
+    err = oct_get_names(&records, &len ,NAMESERVICE_ENTRY);
+    if (err_is_fail(err)) {
+        return err;
+    }
+    for (int i = 0; i < len; i++) {
+        // if we find any card other than e1000 start it with
+        // this card since in our case it is a 10G card
+        if (strcmp(&records[i][OFFSET],"e1000") != 0) {
+            return net_sockets_init_with_card(&records[i][OFFSET]);
+        }
+    }
+    return net_sockets_init_with_card("e1000");
 }
index 6079f99..d57d23e 100644 (file)
@@ -47,8 +47,8 @@ enum rpc_msg_type {
 };
 
 //#define RPC_TIMER_PERIOD (5000 * 1000) ///< Time between RPC timer firings (us)
-#define RPC_TIMER_PERIOD (1000 * 1000) ///< Time between RPC timer firings (us)
-#define RPC_RETRANSMIT_AFTER 8   ///< Number of timer firings before a retransmit
+#define RPC_TIMER_PERIOD (200 * 1000) ///< Time between RPC timer firings (us)
+#define RPC_RETRANSMIT_AFTER 3   ///< Number of timer firings before a retransmit
 #define RPC_MAX_RETRANSMIT  60  ///< Max number of retransmissions before giving up
 
 /* XXX: hardcoded data for authentication info */
index c753efd..e9368c3 100644 (file)
@@ -138,8 +138,6 @@ let bin_rcce_lu = [ "/sbin/" ++ f | f <- [
                         "bulkbench_micro_echo",
                         "bulkbench_micro_rtt",
                         "bulkbench_micro_throughput",
-                        "elb_app",
-                        "elb_app_tcp",
                         "lrpc_bench",
                         "mdb_bench",
                         "mdb_bench_old",
@@ -227,7 +225,8 @@ let bin_rcce_lu = [ "/sbin/" ++ f | f <- [
                            "vnode_map_test",
                            "webserver",
                            "xeon_phi",
-                           "xeon_phi_mgr"
+                           "xeon_phi_mgr",
+                           "net_sockets_server"
                            ]] ++ modules_common
 
     -- the following are broken in the newidc system
index 889e576..4b5af75 100644 (file)
@@ -901,7 +901,7 @@ tx_bind_msg p ifn =
           [C.Return (C.Variable "FLOUNDER_ERR_TX_BUSY")] [],
       C.SBlank,
       C.Ex $ C.Call "flounder_stub_ump_control_fill"
-                  [chanst, ctrladdr, C.Variable $ "FL_UMP_BIND" ], 
+                  [chanst, ctrladdr, C.Variable $ "FL_UMP_BIND" ],
 --      C.StmtList
 --          [C.Ex $ C.Assignment (msgword n) (fragment_word_to_expr (ump_arch p) ifn "___bind" (words !! n))
 --           | n <- [0 .. length(words) - 1], words !! n  /= []],
@@ -941,7 +941,7 @@ tx_bind_reply p ifn =
       C.If (C.Unary C.Not msgvar)
           [C.Return (C.Variable "FLOUNDER_ERR_TX_BUSY")] [],
       C.Ex $ C.Call "flounder_stub_ump_control_fill"
-                  [chanst, ctrladdr, C.Variable $ "FL_UMP_BIND_REPLY" ], 
+                  [chanst, ctrladdr, C.Variable $ "FL_UMP_BIND_REPLY" ],
 --      C.StmtList
 --          [C.Ex $ C.Assignment (msgword n) (fragment_word_to_expr (ump_arch p) ifn "___bind" (words !! n))
 --           | n <- [0 .. length(words) - 1], words !! n  /= []],
@@ -1445,6 +1445,7 @@ rx_handler p ifn typedefs msgdefs msgs =
 
         msgfrag_case msg@(Message _ mn _ _) (OverflowFragment (BufferFragment _ afn afl)) caps isFirst isLast = [
             C.Ex $ C.Assignment errvar (C.Call "flounder_stub_ump_recv_buf" args),
+            (if isFirst then C.Ex $ C.Assignment binding_incoming_token ump_token else C.SBlank),
             C.Ex $ C.Call "ump_chan_free_message" [C.Variable "msg"],
             C.If (C.Call "err_is_ok" [errvar])
                 (msgfrag_case_prolog msg caps isLast)
index ea637b8..1c63311 100644 (file)
@@ -49,7 +49,7 @@ class NetCommon(TestCommon):
     def get_modules(self, build, machine):
         cardName = "e1000"
         modules = super(NetCommon, self).get_modules(build, machine)
-        modules.add_module("e1000_net_sockets_server", ["auto"])
+        modules.add_module("net_sockets_server", ["auto"])
         nfsip = socket.gethostbyname(siteconfig.get('WEBSERVER_NFS_HOST'))
         modules.add_module("webserver", ["core=%d" % machine.get_coreids()[0], #2
                                cardName, nfsip,
index 09e22d4..8d032f0 100644 (file)
@@ -25,6 +25,13 @@ mac = {'babybel1': 130587495626,
        'ziger2': 65817495764,
        'ziger1': 116527143012, }
 
+# Fallback if gethostip does not work
+ip = {'babybel1': 174982272, 
+       'babybel2': 174982270,
+       'babybel3': 174982271,
+       'ziger2': 174982183,
+       'ziger1': 174982183, }
+
 
 class DevifTests(TestCommon):
 
@@ -39,8 +46,11 @@ class DevifTests(TestCommon):
         self.set_timeout(TEST_TIMEOUT)
 
     def get_decimal_ip(self, hostname):
-        iphex = subprocess.check_output('gethostip -x %s' % hostname, shell=True)
-        return '%d' % int(iphex, 16)
+        try:
+            iphex = subprocess.check_output('gethostip -x %s' % hostname, shell=True)
+            return '%d' % int(iphex, 16)
+        except:
+            return ip[hostname.split('-')[0]]
       
     def get_local_mac(self, ifname):
         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
@@ -52,6 +62,7 @@ class DevifTests(TestCommon):
         self.machine = machine.name
         modules = super(DevifTests, self).get_modules(build, machine)
         modules.add_module("e10k", ["auto", "function=0"])
+        modules.add_module("net_sockets_server", ["nospawn"])
         modules.add_module("sfn5122f", ["auto", "function=0"])
         modules.add_module("devif_idc", ["core=1"])
 
@@ -153,6 +164,7 @@ class DevifUDP(DevifTests):
     def get_modules(self, build, machine):
         self.machine = machine.name
         modules = super(DevifTests, self).get_modules(build, machine)
+        modules.add_module("net_sockets_server", ["nospawn"])
         hostname = '%s.in.barrelfish.org' % subprocess.check_output('hostname -s', shell=True).rstrip()
         dst_ip = self.get_decimal_ip(hostname)
         dst_mac = self.get_local_mac('eno2')
@@ -175,7 +187,7 @@ class DevifUDP(DevifTests):
         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         while True:
             s.sendto(self.data, (self.ip, 20000))
-            
+
     def start_loop(self):
         self.thread = thread.start_new_thread(self.thread_func, (self, 0))
 
@@ -203,3 +215,5 @@ class DevifUDP(DevifTests):
 #    def get_module_name(self):
 #        return "devif_echo"
 
+
+
index 08930af..f266c71 100644 (file)
@@ -22,7 +22,7 @@ class NFSTest(TestCommon):
     def get_modules(self, build, machine):
         cardName = "e1000"
         modules = super(NFSTest, self).get_modules(build, machine)
-        modules.add_module("e1000_net_sockets_server", ["auto"])
+        modules.add_module("net_sockets_server", ["auto"])
         nfsip = socket.gethostbyname(siteconfig.get('WEBSERVER_NFS_HOST'))
         nfspath = siteconfig.get('WEBSERVER_1G_PATH')
         nfsfile = siteconfig.get('WEBSERVER_1G_FILE')
@@ -46,3 +46,39 @@ class NFSTest(TestCommon):
             lastline = line
         passed = lastline.startswith(self.get_finish_string())
         return PassFailResult(passed)
+
+@tests.add_test
+class NFSTestE10k(NFSTest):
+    '''NFS benchmark'''
+    name = "nfscat_e10k"
+
+    def get_modules(self, build, machine):
+        modules = super(NFSTest, self).get_modules(build, machine)
+        modules.add_module("e10k", ["auto"])
+        modules.add_module("net_sockets_server", ["nospawn"])
+        nfsip = socket.gethostbyname(siteconfig.get('WEBSERVER_NFS_HOST'))
+        nfspath = siteconfig.get('WEBSERVER_1G_PATH')
+        nfsfile = siteconfig.get('WEBSERVER_1G_FILE')
+
+        modules.add_module("netthroughput",
+                ["core=%d" % machine.get_coreids()[2], "nfs://" + nfsip +
+                          nfspath , "/nfs/" + nfsfile])
+        return modules
+
+@tests.add_test
+class NFSTestSf(NFSTest):
+    '''NFS benchmark'''
+    name = "nfscat_sf"
+
+    def get_modules(self, build, machine):
+        modules = super(NFSTest, self).get_modules(build, machine)
+        modules.add_module("sfn5122f", ["auto"])
+        modules.add_module("net_sockets_server", ["nospawn"])
+        nfsip = socket.gethostbyname(siteconfig.get('WEBSERVER_NFS_HOST'))
+        nfspath = siteconfig.get('WEBSERVER_1G_PATH')
+        nfsfile = siteconfig.get('WEBSERVER_1G_FILE')
+
+        modules.add_module("netthroughput",
+                ["core=%d" % machine.get_coreids()[2], "nfs://" + nfsip +
+                          nfspath , "/nfs/" + nfsfile])
+        return modules
index f212389..8e2187f 100644 (file)
@@ -29,7 +29,7 @@ class TftpClientTest(TestCommon):
         modules.add_module("tests/tftpclient",
                 ['--server=tftp://10.110.4.4:69',
                  '--file=/%s/hello.txt' % tftpdir ])
-        modules.add_module("e1000_net_sockets_server", ["auto"])
+        modules.add_module("net_sockets_server", ["auto"])
         return modules
 
     def get_finish_string(self):
index 038db71..2f8baac 100644 (file)
@@ -25,7 +25,7 @@ class VMKitTest(TestCommon):
         modules.add_module("serial_pc16550d", ["auto"])
         modules.add_module("lpc_timer", ["auto"])
         modules.add_module("e1000n", ["auto"])
-        modules.add_module("e1000_net_sockets_server", ["auto"])
+        modules.add_module("net_sockets_server", ["auto"])
         modules.add_module("NGD_mng", ["auto"])
         modules.add_module("netd", ["auto"])
 
index bf820c5..c5a519d 100644 (file)
@@ -54,9 +54,8 @@ class WebCommon(TestCommon):
         self.ip = None
 
     def get_modules(self, build, machine):
-        cardName = "e1000"
         modules = super(WebCommon, self).get_modules(build, machine)
-        modules.add_module("e1000_net_sockets_server", ["auto"])
+        modules.add_module("net_sockets_server", ["auto"])
         nfsip = socket.gethostbyname(siteconfig.get('WEBSERVER_NFS_HOST'))
         modules.add_module("webserver", ["core=%d" % machine.get_coreids()[0], #2
                                nfsip, siteconfig.get('WEBSERVER_NFS_PATH')])
@@ -101,7 +100,7 @@ class WebserverTest(WebCommon):
         self.testlog = None
 
     def getpage_stress(self, server, page, count):
-        debug.verbose('requesting http://%s/%s' % (server, page))
+        debug.verbose('requesting http://%s/%s' % (server, page))  
         failure_count = 0;
         #c = httplib.HTTPConnection(server, timeout=WEBSERVER_TIMEOUT)
         for i in range(count):
@@ -214,6 +213,35 @@ class WebserverTest(WebCommon):
 
 
 @tests.add_test
+class WebserverTestSf(WebserverTest):
+    '''tests webserver functionality solarflare'''
+    name = "webserver_sf"
+    def get_modules(self, build, machine):
+        modules = super(WebCommon, self).get_modules(build, machine)
+        modules.add_module("sfn5122f", ["auto"])
+        modules.add_module("net_sockets_server", ["nospawn"])
+        nfsip = socket.gethostbyname(siteconfig.get('WEBSERVER_NFS_HOST'))
+        modules.add_module("webserver", ["core=%d" % machine.get_coreids()[0], #2
+                               nfsip, siteconfig.get('WEBSERVER_NFS_PATH')])
+        return modules
+   
+@tests.add_test
+class WebserverTestE10k(WebserverTest):
+    '''tests webserver functionality e10k'''
+    name = "webserver_e10k"
+    def get_modules(self, build, machine):
+        modules = super(WebCommon, self).get_modules(build, machine)
+        modules.add_module("e10k", ["auto"])
+        modules.add_module("net_sockets_server", ["nospawn"])
+        nfsip = socket.gethostbyname(siteconfig.get('WEBSERVER_NFS_HOST'))
+        modules.add_module("webserver", ["core=%d" % machine.get_coreids()[0], #2
+                               nfsip, siteconfig.get('WEBSERVER_NFS_PATH')])
+        return modules
+
+
+@tests.add_test
 class HTTPerfTest(WebCommon):
     '''httperf webserver performance benchmark'''
     name = "httperf"
@@ -379,7 +407,6 @@ class HTTPerfTest(WebCommon):
 
         return final
 
-
 class HTTPerfResults(ResultsBase):
     _err_fields = 'fd_unavail addrunavail ftab_full other_err'.split()
     _result_fields = ('client_timo socket_timo connrefused connreset'
index 49fb8a8..fc3a4fe 100644 (file)
@@ -104,7 +104,7 @@ class XeonPhi_Boot_Test(TestCommon):
         modules.add_module("xeon_phi", ["auto", 
                                         "--tftp=tftp://10.110.4.4:69",
                                         "--modlist=/" + tftpdir + "/menu.lst.k1om"])
-        modules.add_module("e1000_net_sockets_server", ["auto"])
+        modules.add_module("net_sockets_server", ["auto"])
         modules.add_module("dma_mgr", [""])
 
         return modules
index 2a295d7..020bb6c 100644 (file)
@@ -170,7 +170,6 @@ static bool exported = false;
 static e10k_t *d = NULL;
 static struct capref *regframe;
 
-static bool use_interrupts = true;
 static bool msix = false;
 
 /** Specifies if RX/TX is currently enabled on the device. */
@@ -1893,11 +1892,7 @@ static void eventloop(void)
     printf("Entering polling loop\n");
     ws = get_default_waitset();
     while (1) {
-        if (use_interrupts) {
-            event_dispatch(ws);
-        } else {
-            networking_poll();
-        }
+        event_dispatch(ws);
     }
 }
 
@@ -1935,17 +1930,6 @@ int e1000n_driver_init(int argc, char *argv[])
         event_dispatch(get_default_waitset());
     }
 
-    DEBUG("e10k driver networking init \n");
-    errval_t err;
-    if (use_interrupts){
-        err = networking_init("e10k", NET_FLAGS_DO_DHCP | NET_FLAGS_DEFAULT_QUEUE);
-    } else {
-        err = networking_init("e10k", NET_FLAGS_DO_DHCP | NET_FLAGS_POLLING |
-                              NET_FLAGS_DEFAULT_QUEUE);
-    }
-    DEBUG("e10k driver networking init done with error: %s \n", err_getstring(err));
-    assert(err_is_ok(err));
-
     qd_main();
     return 1;
 }
index 5fc09e6..61f3fb6 100644 (file)
@@ -1262,7 +1262,7 @@ static void cd_create_queue(struct sfn5122f_devif_binding *b, struct capref fram
     struct capref regs;
 
 
-    cd_create_queue_rpc(b, frame, user, interrupt, false, core,
+    cd_create_queue_rpc(b, frame, user, interrupt, qzero, core,
                         msix_vector, &mac, &queueid, &regs, &err);
 
     err = b->tx_vtbl.create_queue_response(b, NOP_CONT, mac, queueid, regs, err);
@@ -1619,11 +1619,7 @@ static void eventloop(void)
     ws = get_default_waitset();
     DEBUG("SFN5122F enter event loop \n");
     while (1) {
-        if (use_interrupt) {
-            event_dispatch(ws);
-        } else {
-            networking_poll();
-        }
+        event_dispatch(ws);
     }
 }
 
@@ -1660,7 +1656,6 @@ int main(int argc, char** argv)
 
     parse_cmdline(argc, argv);
 
-
     /* Register our device driver */
     err = pci_client_connect();
     assert(err_is_ok(err));
@@ -1674,17 +1669,6 @@ int main(int argc, char** argv)
         event_dispatch(get_default_waitset());
     }
     
-    DEBUG("SFN5122F driver networking init \n");
-    if (use_interrupt) {
-        err = networking_init("sfn5122f", NET_FLAGS_DO_DHCP |
-                              NET_FLAGS_DEFAULT_QUEUE);
-    } else {
-        err = networking_init("sfn5122f", NET_FLAGS_DO_DHCP | NET_FLAGS_POLLING |
-                              NET_FLAGS_DEFAULT_QUEUE);
-    }
-    assert(err_is_ok(err));
-
-    DEBUG("SFN5122F driver networking init done\n");
     start_all();
     
     /* loop myself */
index 936d626..746a712 100644 (file)
@@ -75,8 +75,9 @@ struct domain_instance* instantiate_driver_domain(coreid_t where) {
         USER_PANIC_ERR(err, "call failed.");
     }
     struct domain_instance* di = ddomain_create_domain_instance(did);
+    did++;
+    
     wait_for_id(di);
 
-    did++;
     return di;
 }
index 09a7fcf..deb7981 100644 (file)
@@ -49,6 +49,7 @@ errval_t default_start_function(coreid_t where,
     assert(mi != NULL);
     errval_t err = SYS_ERR_OK;
     coreid_t core;
+
     /*
      *  XXX: there may be more device using this driver, so starting it a second time
      *       may be needed.
@@ -128,9 +129,9 @@ errval_t start_networking(coreid_t core,
     assert(driver != NULL);
     errval_t err = SYS_ERR_OK;
 
-    uint64_t vendor_id, device_id, bus, dev, fun;
 
     /* check if we are using the supplied pci address of eth0 */
+    /*
     if (eth0.bus != 0xff || eth0.device != 0xff || eth0.function != 0xff) {
         err = oct_read(record, "_ { bus: %d, device: %d, function: %d, vendor: %d, device_id: %d }",
                             &bus, &dev, &fun, &vendor_id, &device_id);
@@ -139,56 +140,75 @@ errval_t start_networking(coreid_t core,
         if ((eth0.bus != (uint8_t)bus)
              | (eth0.device != (uint8_t)dev)
              | (eth0.function != (uint8_t)fun)) {
-            KALUGA_DEBUG("start_networking: skipping card %" PRIu64 ":%" PRIu64 ":%"
-                         PRIu64"\n", bus, dev, fun);
+            printf("start_networking: skipping card %" PRIu64 ":%" PRIu64 ":%"
+                    PRIu64"\n", bus, dev, fun);
+            printf("eth0 %" PRIu8 ":%" PRIu8 ":%"
+                    PRIu8"\n", eth0.bus, eth0.device, eth0.function);
             return KALUGA_ERR_DRIVER_NOT_AUTO;
         }
     }
+    */
+
 
     if (is_started(driver)) {
+        printf("Already started %s\n", driver->binary);
         return KALUGA_ERR_DRIVER_ALREADY_STARTED;
     }
 
     if (!is_auto_driver(driver)) {
+        printf("Not auto %s\n", driver->binary);
         return KALUGA_ERR_DRIVER_NOT_AUTO;
     }
 
-    struct module_info* netd = find_module("netd");
-    if (netd == NULL || !is_auto_driver(netd)) {
-        printf("Kaluga: netd not found or not declared as auto.\n");
-        return KALUGA_ERR_DRIVER_NOT_AUTO;
-    }
 
-    struct module_info* ngd_mng = find_module("NGD_mng");
-    if (ngd_mng == NULL || !is_auto_driver(ngd_mng)) {
-        printf("Kaluga: NGD_mng not found or not declared as auto.\n");
-        return KALUGA_ERR_DRIVER_NOT_AUTO;
-    }
+    if (!(strcmp(driver->binary, "net_sockets_server") == 0)) {
+        
+        err = default_start_function(core, driver, record, arg);
+        if (err_is_fail(err)) {
+            DEBUG_ERR(err, "Spawning %s failed.", driver->path);
+            return err;
+        }
 
-    err = default_start_function(core, driver, record, arg);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "Spawning %s failed.", driver->path);
-        return err;
-    }
+        // cards with driver in seperate process
+        struct module_info* net_sockets = find_module("net_sockets_server");
+        if (net_sockets == NULL) {
+            printf("Net sockets server not found\n");
+            return KALUGA_ERR_DRIVER_NOT_AUTO;
+        }
 
-    // XXX: Manually add cardname (overwrite first (auto) argument)
-    // +Weird convention, e1000n binary but cardname=e1000
-    char* cardname = strcmp(driver->binary, "e1000n") == 0 ? "e1000" : driver->binary;
+        uint64_t vendor_id, device_id, bus, dev, fun;
+        err = oct_read(record, "_ { bus: %d, device: %d, function: %d, vendor: %d, device_id: %d }",
+                       &bus, &dev, &fun, &vendor_id, &device_id);
 
-    size_t name_len = strlen("cardname=") + strlen(cardname) + 1;
-    char* card_argument = malloc(name_len);
-    sprintf(card_argument, "cardname=%s", cardname);
-    printf("############# starting network with arguments %s\n", card_argument);
+        char* pci_arg_str = malloc(26);
+        snprintf(pci_arg_str, 26, "%04"PRIx64":%04"PRIx64":%04"PRIx64":%04"
+                        PRIx64":%04"PRIx64, vendor_id, device_id, bus, dev, fun);
 
-    // Spawn netd and ngd_mng
-    netd->argv[0] = card_argument;
-    err = spawn_program(core, netd->path, netd->argv, environ, 0, get_did_ptr(netd));
+        // Spawn net_sockets_server
+        net_sockets->argv[0] = "net_sockets_server";
+        net_sockets->argv[1] = "auto";
+        net_sockets->argv[2] = driver->binary;
+        net_sockets->argv[3] = pci_arg_str;
+
+        err = spawn_program(core, net_sockets->path, net_sockets->argv, environ, 0,
+                            get_did_ptr(net_sockets));
+        free (pci_arg_str);
+    } else {
+        // TODO currently only for e1000, might be other cards that 
+        // start the driver by creating a queue
+        for (int i = 0; i < driver->argc; i++) {
+            printf("argv[%d]=%s \n", i, driver->argv[i]);
+        }        
+
+        if (!(driver->argc > 2)) {
+            driver->argv[driver->argc] = "e1000";        
+            driver->argc++;
+        }
 
-    ngd_mng->argv[0] = card_argument;
-    err = spawn_program(core, ngd_mng->path, ngd_mng->argv, environ, 0,
-                        get_did_ptr(ngd_mng));
+        // All cards that start the driver by creating a device queue
+        err = default_start_function(core, driver, record, arg);
+    }
 
-    free(card_argument);
     return err;
 }
 
index f03d3bf..b8cb215 100644 (file)
@@ -46,7 +46,10 @@ size_t cpu_count = 0;
 
 static void add_start_function_overrides(void)
 {
-    set_start_function("e1000n", start_networking);
+
+    set_start_function("e10k", start_networking);
+    set_start_function("net_sockets_server", start_networking);
+    set_start_function("sfn5122f", start_networking);
     set_start_function("rtl8029", start_networking);
     set_start_function("corectrl", start_boot_driver);
 #ifdef __ARM_ARCH_7A__
@@ -110,6 +113,7 @@ int main(int argc, char** argv)
     if (err_is_fail(err)) {
         USER_PANIC_ERR(err, "Parse boot modules.");
     }
+
     add_start_function_overrides();
 
     err = arch_startup(add_device_db_file);
index 5632ed3..9486024 100644 (file)
@@ -262,9 +262,9 @@ errval_t wait_for_all_spawnds(void)
     // still assumes a fixed set of cores and will deadlock
     // otherwise. Therefore we need to fix those parts first.
     errval_t err;
+    char* record = NULL;
 #if !defined(__ARM_ARCH_7A__)
     KALUGA_DEBUG("Waiting for acpi");
-    char* record = NULL;
     err = oct_wait_for(&record, "acpi { iref: _ }");
     if (err_is_fail(err)) {
         return err_push(err, KALUGA_ERR_WAITING_FOR_ACPI);
@@ -288,5 +288,10 @@ errval_t wait_for_all_spawnds(void)
 
     static char* spawnds = "r'spawn.[0-9]+' { iref: _ }";
     octopus_trigger_id_t tid;
-    return oct_trigger_existing_and_watch(spawnds, spawnd_change_event, (void*)count, &tid);
+    err = oct_trigger_existing_and_watch(spawnds, spawnd_change_event, (void*)count, &tid);
+    if (err_is_fail(err)) {
+        return err_push(err, KALUGA_ERR_QUERY_LOCAL_APIC);
+    }
+
+    return oct_wait_for(&record, "all_spawnds_up { iref: 0 }");
 }
index 48b7587..89321a8 100644 (file)
@@ -173,13 +173,6 @@ errval_t arch_startup(char * add_device_db_file)
         USER_PANIC_ERR(err, "Watching PCI root bridges.");
     }
 
-    KALUGA_DEBUG("Kaluga: pci_devices\n");
-
-    err = watch_for_pci_devices();
-    if (err_is_fail(err)) {
-        USER_PANIC_ERR(err, "Watching PCI devices.");
-    }
-
     KALUGA_DEBUG("Kaluga: int_controller_devices\n");
 
     err = watch_for_int_controller();
@@ -194,6 +187,13 @@ errval_t arch_startup(char * add_device_db_file)
         USER_PANIC_ERR(err, "Unable to wait for spawnds failed.");
     }
 
+    KALUGA_DEBUG("Kaluga: pci_devices\n");
+
+    err = watch_for_pci_devices();
+    if (err_is_fail(err)) {
+        USER_PANIC_ERR(err, "Watching PCI devices.");
+    }
+
     KALUGA_DEBUG("Kaluga: Starting serial...\n");
     err = start_serial();
     if (err_is_fail(err) && err != KALUGA_ERR_MODULE_NOT_FOUND) {
similarity index 69%
rename from usr/drivers/net_socket_server/Hakefile
rename to usr/net_socket_server/Hakefile
index 8a65e71..9ed408c 100644 (file)
@@ -1,18 +1,18 @@
 --------------------------------------------------------------------------
--- Copyright (c) 2007-2012, ETH Zurich.
+-- Copyright (c) 2017, ETH Zurich.
 -- All rights reserved.
 --
 -- This file is distributed under the terms in the attached LICENSE file.
 -- If you do not find this file, copies can be found by writing to:
--- ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+-- ETH Zurich D-INFK, Universit√§tstrasse 6, CH-8092 Zurich. Attn: Systems Group.
 --
 -- Hakefile for /lib/net
 --
 --------------------------------------------------------------------------
 
 [  build application {
-    target       = "e1000_net_sockets_server",
-    cFiles       = [ "e1000_net_sockets_server.c" ],
+    target       = "net_sockets_server",
+    cFiles       = [ "net_sockets_server.c" ],
     flounderBindings = [ "net_sockets" ],
     addLibraries = libDeps [ "net", "lwip2", "octopus", "debug_log" ]
   }
@@ -160,7 +160,7 @@ static void net_udp_receive(void *arg, struct udp_pcb *pcb, struct pbuf *p, cons
     nb->host_address.s_addr = addr->addr;
     nb->port = port;
     // debug_printf("%s(%d): %p -> %p %p %d\n", __func__, connection->descriptor, buffer, nb->user_callback, nb->user_state, nb->size);
-
+    
     void *shb_data = buffer + sizeof(struct net_buffer);
     
     struct pbuf *it;
@@ -174,13 +174,11 @@ static void net_udp_receive(void *arg, struct udp_pcb *pcb, struct pbuf *p, cons
         it = it->next;
     }
     pbuf_free(p);
-    // debug_printf("%s.%d: enqueue 1 %lx:%ld\n", __func__, __LINE__, buffer - nc->buffer_start, sizeof(struct net_buffer) + length);
     err = devq_enqueue((struct devq *)nc->queue, nc->region_id, buffer - nc->buffer_start, sizeof(struct net_buffer) + length,
                        0, 0, NET_EVENT_RECEIVED);
     assert(err_is_ok(err));
     err = devq_notify((struct devq *)nc->queue);
     assert(err_is_ok(err));
-
     // debug_printf("%s: notifing\n", __func__);
     // struct net_sockets_binding *binding = connection->connection->binding;
     // debug_printf("%s: done\n", __func__);
@@ -201,6 +199,7 @@ static err_t net_tcp_receive(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err
         // debug_printf("%s(%d): %d\n", __func__, socket->descriptor, p->tot_len);
         assert(p->len == p->tot_len);
         length = p->tot_len;
+
         if (!buffer) {
             debug_printf("%s: drop\n", __func__);
             pbuf_free(p);
@@ -238,6 +237,7 @@ static err_t net_tcp_receive(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err
     // debug_printf("%s.%d: enqueue 1 %lx:%ld %d\n", __func__, __LINE__, buffer - nc->buffer_start, sizeof(struct net_buffer) + length, nb->descriptor);
     err = devq_enqueue((struct devq *)nc->queue, nc->region_id, buffer - nc->buffer_start, sizeof(struct net_buffer) + length,
                        0, 0, NET_EVENT_RECEIVED);
+
     assert(err_is_ok(err));
     err = devq_notify((struct devq *)nc->queue);
     assert(err_is_ok(err));
@@ -328,6 +328,7 @@ static err_t net_tcp_sent(void *arg, struct tcp_pcb *pcb, uint16_t len)
             
             socket->send_frames[0].length += sizeof(struct net_buffer);
             // debug_printf_to_log("%s.%d: enqueue %lx:%zd\n", __func__, __LINE__, socket->send_frames[0].offset, socket->send_frames[0].length);
+            //
             err = devq_enqueue((struct devq *)nc->queue, nc->region_id, socket->send_frames[0].offset, socket->send_frames[0].length, 0, 0, NET_EVENT_SENT);
             if (!err_is_ok(err))
                 debug_printf("%s: err %zd\n", __func__, err);
@@ -658,7 +659,8 @@ static errval_t q_notify(struct descq* q)
             buffer = offset + nc->buffer_start;
             struct net_buffer *nb = buffer;
 
-            // debug_printf_to_log("%s: dequeue %lx:%ld %ld  %d:%d", __func__, offset, length, event, nb->descriptor, nb->size);
+            //debug_printf_to_log("%s: dequeue %lx:%ld %ld  %d:%d", __func__, offset, length, event, nb->descriptor, nb->size);
+            //debug_printf(" offset %lu length %lu \n", offset, length);
             if (event == NET_EVENT_RECEIVE) {
                 assert(!nc->buffers[nc->next_used]);
                 nc->buffers[nc->next_used] = nc->buffer_start + offset;
@@ -821,23 +823,25 @@ static errval_t connect_cb(void *st, struct net_sockets_binding *binding)
 
 static void export_cb(void *st, errval_t err, iref_t iref)
 {
+    char* service_name = (char* ) st;
     assert(err_is_ok(err));
-    err = nameservice_register("net_sockets", iref);
+    err = nameservice_register(service_name, iref);
     assert(err_is_ok(err));
 }
 
 int main(int argc, char *argv[])
 {
     errval_t err;
-
-    if (argc < 1) {
-        printf("%s: missing card argument!\n", argv[0]);
+    
+    if (argc < 4) {
+        printf("%s: missing arguments! \n", argv[0]);
         return -1;
     }
-    debug_printf("Net socket server started for e1000 %s.\n", argv[argc - 1]);
 
-    char servicename[64];
-    snprintf(servicename, sizeof(servicename), "e1000:%s", argv[argc - 1]);
+    debug_printf("Net socket server started for %s.\n", argv[2]);
+
+    char card_name[64];
+    snprintf(card_name, sizeof(card_name), "%s:%s", argv[2], argv[argc - 1]);
 
     char *ip = NULL;
     char *netmask = NULL;
@@ -886,7 +890,7 @@ int main(int argc, char *argv[])
     }
 
     /* connect to the network */
-    err = networking_init(servicename, (!ip ? NET_FLAGS_DO_DHCP: 0) | NET_FLAGS_NO_NET_FILTER | NET_FLAGS_BLOCKING_INIT);
+    err = networking_init(card_name, (!ip ? NET_FLAGS_DO_DHCP: 0) | NET_FLAGS_DEFAULT_QUEUE | NET_FLAGS_BLOCKING_INIT );
     if (err_is_fail(err)) {
         USER_PANIC_ERR(err, "Failed to initialize the network");
     }
@@ -901,12 +905,17 @@ int main(int argc, char *argv[])
     f.dereg = q_dereg;
     f.control = q_control;
 
-    err = descq_create(&exp_queue, DESCQ_DEFAULT_SIZE, "net_sockets_queue",
+    char queue_name[64];
+    char service_name[64];
+    sprintf(queue_name, "net_sockets_queue_%s", argv[2]);
+    sprintf(service_name, "net_sockets_service_%s", argv[2]);
+
+    err = descq_create(&exp_queue, DESCQ_DEFAULT_SIZE, queue_name,
                        true, true, 0, NULL, &f);
     assert(err_is_ok(err));
 
 
-    err = net_sockets_export(NULL, export_cb, connect_cb, get_default_waitset(),
+    err = net_sockets_export(service_name, export_cb, connect_cb, get_default_waitset(),
                             IDC_EXPORT_FLAGS_DEFAULT);
     assert(err_is_ok(err));
 
index 5f76a17..4d23f20 100644 (file)
@@ -37,7 +37,7 @@
 %
 
 pci_driver{
-    binary: "e1000_net_sockets_server",
+    binary: "net_sockets_server",
     supported_cards:
     [ pci_card{ vendor: 16'8086, device: 16'1521, function: _, subvendor: _, subdevice: _ },
       pci_card{ vendor: 16'8086, device: 16'107d, function: _, subvendor: _, subdevice: _ },
index 17a7cf1..c818446 100644 (file)
@@ -52,17 +52,6 @@ static void event_cb(void* q)
     return;
 }
 
-static void convert_mac(uint64_t int_mac, struct eth_addr* mac)
-{
-    // Also convert to network byte order
-    mac->addr[5] = int_mac & 0xFF;
-    mac->addr[4] = (int_mac & 0xFF00) >> 8;
-    mac->addr[3] = (int_mac & 0xFF0000) >> 16;
-    mac->addr[2] = (int_mac & 0xFF000000) >> 24;
-    mac->addr[1] = (int_mac & 0xFF00000000) >> 32;
-    mac->addr[0] = (int_mac & 0xFF0000000000) >> 40;
-}
-
 int main(int argc, char *argv[])
 {
     if (argc > 6) {
@@ -98,12 +87,8 @@ int main(int argc, char *argv[])
 
     phys_rx = id.base;
 
-    struct eth_addr dst_mac;
-    
-    convert_mac(mac_dst, &dst_mac);
-
     err = udp_create((struct udp_q**) &udp_q, cardname, port_src, port_dst,
-                     ip_dst, dst_mac, event_cb, true);
+                     ip_dst, event_cb, true);
     if (err_is_fail(err)) {
         USER_PANIC("Queue creation failed \n");
     }
index f5783cf..f96d428 100644 (file)
@@ -64,17 +64,6 @@ static uint64_t tsc_per_ms;
 
 static bool use_irq = false;
 
-static void convert_mac(uint64_t int_mac, struct eth_addr* mac)
-{
-    // Also convert to network byte order
-    mac->addr[5] = int_mac & 0xFF;
-    mac->addr[4] = (int_mac & 0xFF00) >> 8;
-    mac->addr[3] = (int_mac & 0xFF0000) >> 16;
-    mac->addr[2] = (int_mac & 0xFF000000) >> 24;
-    mac->addr[1] = (int_mac & 0xFF00000000) >> 32;
-    mac->addr[0] = (int_mac & 0xFF0000000000) >> 40;
-}
-
 static void event_cb(void* queue)
 {
     struct devq* q = (struct devq*) udp_q;
@@ -212,12 +201,8 @@ int main(int argc, char *argv[])
 
     phys_rx = id.base;
 
-    struct eth_addr dst_mac;
-    
-    convert_mac(mac_dst, &dst_mac);
-
     err = udp_create((struct udp_q**) &udp_q, cardname, port_src, port_dst,
-                     ip_dst, dst_mac, event_cb, true);
+                     ip_dst, event_cb, true);
     if (err_is_fail(err)) {
         USER_PANIC("Queue creation failed \n");
     }
index 1cb4870..5ec373b 100644 (file)
@@ -33,7 +33,6 @@ static uint32_t ip_dst;
 static uint64_t mac_dst;
 static uint16_t port_src;
 static uint16_t port_dst;
-static struct eth_addr dst_mac;
 
 static struct capref memory_rx;
 static struct capref memory_tx;
@@ -113,28 +112,14 @@ static void event_cb(void* queue)
     }
 }
 
-static void convert_mac(uint64_t int_mac, struct eth_addr* mac)
-{
-    // Also convert to network byte order
-    mac->addr[5] = int_mac & 0xFF;
-    mac->addr[4] = (int_mac & 0xFF00) >> 8;
-    mac->addr[3] = (int_mac & 0xFF0000) >> 16;
-    mac->addr[2] = (int_mac & 0xFF000000) >> 24;
-    mac->addr[1] = (int_mac & 0xFF00000000) >> 32;
-    mac->addr[0] = (int_mac & 0xFF0000000000) >> 40;
-}
-
 static void test_udp(void)
 {
     errval_t err;
     struct devq* q;
-
-    convert_mac(mac_dst, &dst_mac);
-
    
     // create queue with interrupts
     udp_create(&udp_q, cardname, port_src, port_dst, 
-               ip_dst, dst_mac, event_cb, !use_interrupts);
+               ip_dst, event_cb, !use_interrupts);
 
     q = (struct devq*) udp_q;
 
index 1a926e4..aaf50fd 100644 (file)
@@ -62,7 +62,10 @@ int main(int argc, char**argv)
 
     DEBUGPRINT("lwip_demo: lwip setup\n");
     printf("webserver:%u: initializing networking \n", disp_get_core_id());
-    net_sockets_init();
+    err = net_sockets_init();
+    if (err_is_fail(err)) {
+        USER_PANIC("Failed init %s \n", err_getstring(err));
+    }
     printf("webserver:%u: networking initialized\n", disp_get_core_id());
 
 //    lwip_benchmark_control(1, BMS_START_REQUEST, 0, 0);