Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Separate VNET from Palacios, add its own host_hooks for interfaces from host OS for...
[palacios.git] / palacios / src / vnet / vnet_core.c
index 5d454e8..946de1f 100644 (file)
  */
  
 #include <vnet/vnet.h>
-#include <palacios/vm_guest_mem.h>
-#include <palacios/vmm_lock.h>
-#include <palacios/vmm_queue.h>
-#include <palacios/vmm_sprintf.h>
-#include <palacios/vmm_ethernet.h>
+#include <vnet/vnet_hashtable.h>
+#include <vnet/vnet_host.h>
+#include <vnet/vnet_vmm.h>
 
 #ifndef V3_CONFIG_DEBUG_VNET
-#undef PrintDebug
-#define PrintDebug(fmt, args...)
+#undef Vnet_Debug
+#define Vnet_Debug(fmt, args...)
 #endif
 
-int v3_net_debug = 0;
+int vnet_debug = 0;
 
 struct eth_hdr {
     uint8_t dst_mac[ETH_ALEN];
@@ -93,7 +91,7 @@ struct vnet_queue {
        struct queue_entry buf[VNET_QUEUE_SIZE];
        int head, tail;
        int count;
-       v3_lock_t lock;
+       vnet_lock_t lock;
 };
 
 static struct {
@@ -105,7 +103,7 @@ static struct {
 
     struct vnet_brg_dev * bridge;
 
-    v3_lock_t lock;
+    vnet_lock_t lock;
     struct vnet_stat stats;
 
     struct vnet_thread * pkt_flush_thread;
@@ -127,15 +125,15 @@ static void print_route(struct v3_vnet_route * route){
     char str[50];
 
     mac_to_string(route->src_mac, str);
-    PrintDebug("Src Mac (%s),  src_qual (%d)\n", 
+    Vnet_Debug("Src Mac (%s),  src_qual (%d)\n", 
               str, route->src_mac_qual);
     mac_to_string(route->dst_mac, str);
-    PrintDebug("Dst Mac (%s),  dst_qual (%d)\n", 
+    Vnet_Debug("Dst Mac (%s),  dst_qual (%d)\n", 
               str, route->dst_mac_qual);
-    PrintDebug("Src dev id (%d), src type (%d)", 
+    Vnet_Debug("Src dev id (%d), src type (%d)", 
               route->src_id, 
               route->src_type);
-    PrintDebug("Dst dev id (%d), dst type (%d)\n", 
+    Vnet_Debug("Dst dev id (%d), dst type (%d)\n", 
               route->dst_id, 
               route->dst_type);
 }
@@ -144,13 +142,13 @@ static void dump_routes(){
     struct vnet_route_info *route;
 
     int i = 0;
-    PrintDebug("\n========Dump routes starts ============\n");
+    Vnet_Debug("\n========Dump routes starts ============\n");
     list_for_each_entry(route, &(vnet_state.routes), node) {
-       PrintDebug("\nroute %d:\n", i++);
+       Vnet_Debug("\nroute %d:\n", i++);
                
        print_route(&(route->route_def));
        if (route->route_def.dst_type == LINK_INTERFACE) {
-           PrintDebug("dst_dev (%p), dst_dev_id (%d), dst_dev_ops(%p), dst_dev_data (%p)\n",
+           Vnet_Debug("dst_dev (%p), dst_dev_id (%d), dst_dev_ops(%p), dst_dev_data (%p)\n",
                route->dst_dev,
                route->dst_dev->dev_id,
                (void *)&(route->dst_dev->dev_ops),
@@ -158,7 +156,7 @@ static void dump_routes(){
        }
     }
 
-    PrintDebug("\n========Dump routes end ============\n");
+    Vnet_Debug("\n========Dump routes end ============\n");
 }
 
 #endif
@@ -171,7 +169,7 @@ static void dump_routes(){
 static inline uint_t hash_fn(addr_t hdr_ptr) {    
     uint8_t * hdr_buf = (uint8_t *)hdr_ptr;
 
-    return v3_hash_buffer(hdr_buf, VNET_HASH_SIZE);
+    return vnet_hash_buffer(hdr_buf, VNET_HASH_SIZE);
 }
 
 static inline int hash_eq(addr_t key1, addr_t key2) {  
@@ -181,7 +179,7 @@ static inline int hash_eq(addr_t key1, addr_t key2) {
 static int add_route_to_cache(const struct v3_vnet_pkt * pkt, struct route_list * routes) {
     memcpy(routes->hash_buf, pkt->hash_buf, VNET_HASH_SIZE);    
 
-    if (v3_htable_insert(vnet_state.route_cache, (addr_t)routes->hash_buf, (addr_t)routes) == 0) {
+    if (vnet_htable_insert(vnet_state.route_cache, (addr_t)routes->hash_buf, (addr_t)routes) == 0) {
        PrintError("VNET/P Core: Failed to insert new route entry to the cache\n");
        return -1;
     }
@@ -190,15 +188,15 @@ static int add_route_to_cache(const struct v3_vnet_pkt * pkt, struct route_list
 }
 
 static int clear_hash_cache() {
-    v3_free_htable(vnet_state.route_cache, 1, 1);
-    vnet_state.route_cache = v3_create_htable(0, &hash_fn, &hash_eq);
+    vnet_free_htable(vnet_state.route_cache, 1, 1);
+    vnet_state.route_cache = vnet_create_htable(0, &hash_fn, &hash_eq);
 
     return 0;
 }
 
 static int look_into_cache(const struct v3_vnet_pkt * pkt, 
                           struct route_list ** routes) {
-    *routes = (struct route_list *)v3_htable_search(vnet_state.route_cache, (addr_t)(pkt->hash_buf));
+    *routes = (struct route_list *)vnet_htable_search(vnet_state.route_cache, (addr_t)(pkt->hash_buf));
    
     return 0;
 }
@@ -247,11 +245,11 @@ int v3_vnet_add_route(struct v3_vnet_route route) {
     struct vnet_route_info * new_route = NULL;
     unsigned long flags; 
 
-    new_route = (struct vnet_route_info *)V3_Malloc(sizeof(struct vnet_route_info));
+    new_route = (struct vnet_route_info *)Vnet_Malloc(sizeof(struct vnet_route_info));
     memset(new_route, 0, sizeof(struct vnet_route_info));
 
 #ifdef V3_CONFIG_DEBUG_VNET
-    PrintDebug("VNET/P Core: add_route_entry:\n");
+    Vnet_Debug("VNET/P Core: add_route_entry:\n");
     print_route(&route);
 #endif
     
@@ -273,12 +271,12 @@ int v3_vnet_add_route(struct v3_vnet_route route) {
     }
 
 
-    flags = v3_lock_irqsave(vnet_state.lock);
+    flags = vnet_lock_irqsave(vnet_state.lock);
 
     list_add(&(new_route->node), &(vnet_state.routes));
     clear_hash_cache();
 
-    v3_unlock_irqrestore(vnet_state.lock, flags);
+    vnet_unlock_irqrestore(vnet_state.lock, flags);
    
 
 #ifdef V3_CONFIG_DEBUG_VNET
@@ -294,7 +292,7 @@ static void inline del_routes_by_dev(int dev_id){
     struct vnet_route_info * route = NULL;
     unsigned long flags; 
 
-    flags = v3_lock_irqsave(vnet_state.lock);
+    flags = vnet_lock_irqsave(vnet_state.lock);
 
     list_for_each_entry(route, &(vnet_state.routes), node) {
        if((route->route_def.dst_type == LINK_INTERFACE &&
@@ -304,11 +302,11 @@ static void inline del_routes_by_dev(int dev_id){
              
            list_del(&(route->node));
            list_del(&(route->match_node));
-           V3_Free(route);    
+           Vnet_Free(route);    
        }
     }
 
-    v3_unlock_irqrestore(vnet_state.lock, flags);
+    vnet_unlock_irqrestore(vnet_state.lock, flags);
 }
 
 /* At the end allocate a route_list
@@ -331,7 +329,7 @@ static struct route_list * match_route(const struct v3_vnet_pkt * pkt) {
 
        mac_to_string(hdr->src_mac, src_str);  
        mac_to_string(hdr->dst_mac, dst_str);
-       PrintDebug("VNET/P Core: match_route. pkt: SRC(%s), DEST(%s)\n", src_str, dst_str);
+       Vnet_Debug("VNET/P Core: match_route. pkt: SRC(%s), DEST(%s)\n", src_str, dst_str);
     }
 #endif
 
@@ -418,13 +416,13 @@ static struct route_list * match_route(const struct v3_vnet_pkt * pkt) {
        }
     }
 
-    PrintDebug("VNET/P Core: match_route: Matches=%d\n", num_matches);
+    Vnet_Debug("VNET/P Core: match_route: Matches=%d\n", num_matches);
 
     if (num_matches == 0) {
        return NULL;
     }
 
-    matches = (struct route_list *)V3_Malloc(sizeof(struct route_list) + 
+    matches = (struct route_list *)Vnet_Malloc(sizeof(struct route_list) + 
                                (sizeof(struct vnet_route_info *) * num_matches));
 
     matches->num_routes = num_matches;
@@ -446,36 +444,36 @@ int vnet_tx_one_pkt(struct v3_vnet_pkt * pkt, void * private_data) {
     int i;
 
     int cpu = V3_Get_CPU();
-    V3_Net_Print(2, "VNET/P Core: cpu %d: pkt (size %d, src_id:%d, src_type: %d, dst_id: %d, dst_type: %d)\n",
+    Vnet_Print(2, "VNET/P Core: cpu %d: pkt (size %d, src_id:%d, src_type: %d, dst_id: %d, dst_type: %d)\n",
                  cpu, pkt->size, pkt->src_id, 
                  pkt->src_type, pkt->dst_id, pkt->dst_type);
-    if(v3_net_debug >= 4){
+    if(vnet_debug >= 4){
            v3_hexdump(pkt->data, pkt->size, NULL, 0);
     }
 
-    flags = v3_lock_irqsave(vnet_state.lock);
+    flags = vnet_lock_irqsave(vnet_state.lock);
 
     vnet_state.stats.rx_bytes += pkt->size;
     vnet_state.stats.rx_pkts++;
 
     look_into_cache(pkt, &matched_routes);
     if (matched_routes == NULL) {  
-       PrintDebug("VNET/P Core: send pkt Looking into routing table\n");
+       Vnet_Debug("VNET/P Core: send pkt Looking into routing table\n");
        
        matched_routes = match_route(pkt);
        
        if (matched_routes) {
            add_route_to_cache(pkt, matched_routes);
        } else {
-           PrintDebug("VNET/P Core: Could not find route for packet... discards packet\n");
-           v3_unlock_irqrestore(vnet_state.lock, flags);
+           Vnet_Debug("VNET/P Core: Could not find route for packet... discards packet\n");
+           vnet_unlock_irqrestore(vnet_state.lock, flags);
            return 0; /* do we return -1 here?*/
        }
     }
 
-    v3_unlock_irqrestore(vnet_state.lock, flags);
+    vnet_unlock_irqrestore(vnet_state.lock, flags);
 
-    PrintDebug("VNET/P Core: send pkt route matches %d\n", matched_routes->num_routes);
+    Vnet_Debug("VNET/P Core: send pkt route matches %d\n", matched_routes->num_routes);
 
     for (i = 0; i < matched_routes->num_routes; i++) {
        struct vnet_route_info * route = matched_routes->routes[i];
@@ -486,30 +484,30 @@ int vnet_tx_one_pkt(struct v3_vnet_pkt * pkt, void * private_data) {
            pkt->dst_id = route->route_def.dst_id;
 
            if (bridge == NULL) {
-               V3_Net_Print(2, "VNET/P Core: No active bridge to sent data to\n");
+               Vnet_Print(2, "VNET/P Core: No active bridge to sent data to\n");
                 continue;
            }
 
            if(bridge->brg_ops.input(bridge->vm, pkt, bridge->private_data) < 0){
-                V3_Net_Print(2, "VNET/P Core: Packet not sent properly to bridge\n");
+                Vnet_Print(2, "VNET/P Core: Packet not sent properly to bridge\n");
                 continue;
            }         
            vnet_state.stats.tx_bytes += pkt->size;
            vnet_state.stats.tx_pkts ++;
         } else if (route->route_def.dst_type == LINK_INTERFACE) {
             if (route->dst_dev == NULL){
-                 V3_Net_Print(2, "VNET/P Core: No active device to sent data to\n");
+                 Vnet_Print(2, "VNET/P Core: No active device to sent data to\n");
                continue;
             }
 
            if(route->dst_dev->dev_ops.input(route->dst_dev->vm, pkt, route->dst_dev->private_data) < 0) {
-                V3_Net_Print(2, "VNET/P Core: Packet not sent properly\n");
+                Vnet_Print(2, "VNET/P Core: Packet not sent properly\n");
                 continue;
            }
            vnet_state.stats.tx_bytes += pkt->size;
            vnet_state.stats.tx_pkts ++;
         } else {
-            PrintError("VNET/P Core: Wrong dst type\n");
+            Vnet_Print(0, "VNET/P Core: Wrong dst type\n");
         }
     }
     
@@ -523,11 +521,11 @@ static int vnet_pkt_enqueue(struct v3_vnet_pkt * pkt){
     struct vnet_queue * q = &(vnet_state.pkt_q);
     uint16_t num_pages;
 
-    flags = v3_lock_irqsave(q->lock);
+    flags = vnet_lock_irqsave(q->lock);
 
     if (q->count >= VNET_QUEUE_SIZE){
-       V3_Net_Print(1, "VNET Queue overflow!\n");
-       v3_unlock_irqrestore(q->lock, flags);
+       Vnet_Print(1, "VNET Queue overflow!\n");
+       vnet_unlock_irqrestore(q->lock, flags);
        return -1;
     }
        
@@ -535,19 +533,19 @@ static int vnet_pkt_enqueue(struct v3_vnet_pkt * pkt){
     entry = &(q->buf[q->tail++]);
     q->tail %= VNET_QUEUE_SIZE;
        
-    v3_unlock_irqrestore(q->lock, flags);
+    vnet_unlock_irqrestore(q->lock, flags);
 
     /* this is ugly, but should happen very unlikely */
     while(entry->use);
 
     if(entry->size_alloc < pkt->size){
        if(entry->data != NULL){
-           V3_FreePages(V3_PAddr(entry->data), (entry->size_alloc / PAGE_SIZE));
+           Vnet_FreePages(Vnet_PAddr(entry->data), (entry->size_alloc / PAGE_SIZE));
            entry->data = NULL;
        }
 
        num_pages = 1 + (pkt->size / PAGE_SIZE);
-       entry->data = V3_VAddr(V3_AllocPages(num_pages));
+       entry->data = Vnet_VAddr(Vnet_AllocPages(num_pages));
        if(entry->data == NULL){
            return -1;
        }
@@ -569,7 +567,7 @@ int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data, int synchron
        vnet_tx_one_pkt(pkt, NULL);
     }else {
        vnet_pkt_enqueue(pkt);
-       V3_Net_Print(2, "VNET/P Core: Put pkt into Queue: pkt size %d\n", pkt->size);
+       Vnet_Print(2, "VNET/P Core: Put pkt into Queue: pkt size %d\n", pkt->size);
     }
        
     return 0;
@@ -581,10 +579,10 @@ int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t * mac,
     struct vnet_dev * new_dev = NULL;
     unsigned long flags;
 
-    new_dev = (struct vnet_dev *)V3_Malloc(sizeof(struct vnet_dev)); 
+    new_dev = (struct vnet_dev *)Vnet_Malloc(sizeof(struct vnet_dev)); 
 
     if (new_dev == NULL) {
-       PrintError("Malloc fails\n");
+       Vnet_Print(0, "Malloc fails\n");
        return -1;
     }
    
@@ -594,22 +592,22 @@ int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t * mac,
     new_dev->vm = vm;
     new_dev->dev_id = 0;
 
-    flags = v3_lock_irqsave(vnet_state.lock);
+    flags = vnet_lock_irqsave(vnet_state.lock);
 
     if (dev_by_mac(mac) == NULL) {
        list_add(&(new_dev->node), &(vnet_state.devs));
        new_dev->dev_id = ++vnet_state.num_devs;
     }
 
-    v3_unlock_irqrestore(vnet_state.lock, flags);
+    vnet_unlock_irqrestore(vnet_state.lock, flags);
 
     /* if the device was found previosly the id should still be 0 */
     if (new_dev->dev_id == 0) {
-       PrintError("VNET/P Core: Device Already exists\n");
+       Vnet_Print(0, "VNET/P Core: Device Already exists\n");
        return -1;
     }
 
-    PrintDebug("VNET/P Core: Add Device: dev_id %d\n", new_dev->dev_id);
+    Vnet_Debug("VNET/P Core: Add Device: dev_id %d\n", new_dev->dev_id);
 
     return new_dev->dev_id;
 }
@@ -619,7 +617,7 @@ int v3_vnet_del_dev(int dev_id){
     struct vnet_dev * dev = NULL;
     unsigned long flags;
 
-    flags = v3_lock_irqsave(vnet_state.lock);
+    flags = vnet_lock_irqsave(vnet_state.lock);
        
     dev = dev_by_id(dev_id);
     if (dev != NULL){
@@ -627,11 +625,11 @@ int v3_vnet_del_dev(int dev_id){
        del_routes_by_dev(dev_id);
     }
        
-    v3_unlock_irqrestore(vnet_state.lock, flags);
+    vnet_unlock_irqrestore(vnet_state.lock, flags);
 
-    V3_Free(dev);
+    Vnet_Free(dev);
 
-    PrintDebug("VNET/P Core: Remove Device: dev_id %d\n", dev_id);
+    Vnet_Debug("VNET/P Core: Remove Device: dev_id %d\n", dev_id);
 
     return 0;
 }
@@ -652,7 +650,7 @@ static void free_devices(){
 
     list_for_each_entry(dev, &(vnet_state.devs), node) {
        list_del(&(dev->node));
-       V3_Free(dev);
+       Vnet_Free(dev);
     }
 }
 
@@ -662,7 +660,7 @@ static void free_routes(){
     list_for_each_entry(route, &(vnet_state.routes), node) {
        list_del(&(route->node));
        list_del(&(route->match_node));
-       V3_Free(route);
+       Vnet_Free(route);
     }
 }
 
@@ -674,19 +672,19 @@ int v3_vnet_add_bridge(struct v3_vm_info * vm,
     int bridge_free = 0;
     struct vnet_brg_dev * tmp_bridge = NULL;    
     
-    flags = v3_lock_irqsave(vnet_state.lock);
+    flags = vnet_lock_irqsave(vnet_state.lock);
     if (vnet_state.bridge == NULL) {
        bridge_free = 1;
        vnet_state.bridge = (void *)1;
     }
-    v3_unlock_irqrestore(vnet_state.lock, flags);
+    vnet_unlock_irqrestore(vnet_state.lock, flags);
 
     if (bridge_free == 0) {
        PrintError("VNET/P Core: Bridge already set\n");
        return -1;
     }
 
-    tmp_bridge = (struct vnet_brg_dev *)V3_Malloc(sizeof(struct vnet_brg_dev));
+    tmp_bridge = (struct vnet_brg_dev *)Vnet_Malloc(sizeof(struct vnet_brg_dev));
 
     if (tmp_bridge == NULL) {
        PrintError("Malloc Fails\n");
@@ -701,9 +699,9 @@ int v3_vnet_add_bridge(struct v3_vm_info * vm,
     tmp_bridge->type = type;
        
     /* make this atomic to avoid possible race conditions */
-    flags = v3_lock_irqsave(vnet_state.lock);
+    flags = vnet_lock_irqsave(vnet_state.lock);
     vnet_state.bridge = tmp_bridge;
-    v3_unlock_irqrestore(vnet_state.lock, flags);
+    vnet_unlock_irqrestore(vnet_state.lock, flags);
 
     return 0;
 }
@@ -713,23 +711,21 @@ static int vnet_tx_flush(void *args){
     struct queue_entry * entry;
     struct vnet_queue * q = &(vnet_state.pkt_q);
 
-    V3_Print("VNET/P Handing Pkt Thread Starting ....\n");
+    Vnet_Print(0, "VNET/P Handing Pkt Thread Starting ....\n");
 
-    //V3_THREAD_SLEEP();
     /* we need thread sleep/wakeup in Palacios */
-    while(1){
-       flags = v3_lock_irqsave(q->lock);
+    while(!vnet_thread_should_stop()){
+       flags = vnet_lock_irqsave(q->lock);
 
        if (q->count <= 0){
-           v3_unlock_irqrestore(q->lock, flags);
-           v3_yield(NULL);
-           //V3_THREAD_SLEEP();
+           vnet_unlock_irqrestore(q->lock, flags);
+           Vnet_Yield();
        }else {
            q->count --;
            entry = &(q->buf[q->head++]);
            q->head %= VNET_QUEUE_SIZE;
 
-           v3_unlock_irqrestore(q->lock, flags);
+           vnet_unlock_irqrestore(q->lock, flags);
 
            /* this is ugly, but should happen very unlikely */
            while(!entry->use);
@@ -738,9 +734,11 @@ static int vnet_tx_flush(void *args){
            /* asynchronizely release allocated memory for buffer entry here */     
            entry->use = 0;
 
-           V3_Net_Print(2, "vnet_tx_flush: pkt (size %d)\n", entry->pkt.size);   
+           Vnet_Print(2, "vnet_tx_flush: pkt (size %d)\n", entry->pkt.size);   
        }
     }
+
+    return 0;
 }
 
 int v3_init_vnet() {
@@ -752,21 +750,21 @@ int v3_init_vnet() {
     vnet_state.num_devs = 0;
     vnet_state.num_routes = 0;
 
-    if (v3_lock_init(&(vnet_state.lock)) == -1){
+    if (vnet_lock_init(&(vnet_state.lock)) == -1){
         PrintError("VNET/P Core: Fails to initiate lock\n");
     }
 
-    vnet_state.route_cache = v3_create_htable(0, &hash_fn, &hash_eq);
+    vnet_state.route_cache = vnet_create_htable(0, &hash_fn, &hash_eq);
     if (vnet_state.route_cache == NULL) {
         PrintError("VNET/P Core: Fails to initiate route cache\n");
         return -1;
     }
 
-    v3_lock_init(&(vnet_state.pkt_q.lock));
+    vnet_lock_init(&(vnet_state.pkt_q.lock));
 
-    vnet_state.pkt_flush_thread = vnet_thread_create(vnet_tx_flush, NULL, "VNET_Pkts");
+    vnet_state.pkt_flush_thread = vnet_start_thread(vnet_tx_flush, NULL, "VNET_Pkts");
 
-    PrintDebug("VNET/P Core is initiated\n");
+    Vnet_Debug("VNET/P Core is initiated\n");
 
     return 0;
 }
@@ -774,13 +772,13 @@ int v3_init_vnet() {
 
 void v3_deinit_vnet(){
 
-    v3_lock_deinit(&(vnet_state.lock));
+    vnet_lock_deinit(&(vnet_state.lock));
 
     free_devices();
     free_routes();
 
-    v3_free_htable(vnet_state.route_cache, 1, 1);
-    V3_Free(vnet_state.bridge);
+    vnet_free_htable(vnet_state.route_cache, 1, 1);
+    Vnet_Free(vnet_state.bridge);
 }