2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2010, Lei Xia <lxia@northwestern.edu>
11 * Copyright (c) 2009, Yuan Tang <ytang@northwestern.edu>
12 * Copyright (c) 2010, The V3VEE Project <http://www.v3vee.org>
13 * All rights reserved.
15 * Author: Lei Xia <lxia@northwestern.edu>
16 * Yuan Tang <ytang@northwestern.edu>
18 * This is free software. You are permitted to use,
19 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
27 #include <palacios/vmm.h>
29 typedef enum {MAC_ANY=0, MAC_NOT, MAC_NONE, MAC_ADDR} mac_type_t; //for 'src_mac_qual' and 'dst_mac_qual'
30 typedef enum {LINK_INTERFACE=0, LINK_EDGE, LINK_ANY} link_type_t; //for 'type' and 'src_type' in struct routing
32 #define VNET_HASH_SIZE 17
33 #define ETHERNET_HEADER_LEN 14
34 #define ETHERNET_MTU 1500
35 #define ETHERNET_PACKET_LEN (ETHERNET_HEADER_LEN + ETHERNET_MTU)
38 #define GUEST_DRIVERN 0
40 #define HOST_LNX_BRIDGE 1
41 #define CTL_VM_BRIDGE 2
44 struct v3_vnet_route {
51 uint32_t dst_id; //link[dest] is the link to be used to send pkt
52 uint8_t dst_type; //EDGE|INTERFACE|ANY
55 uint8_t src_type; //EDGE|INTERFACE|ANY
56 } __attribute__((packed));
66 * IMPORTANT The next three fields must be grouped and packed together
67 * They are used to generate a hash value
70 uint8_t hash_buf[VNET_HASH_SIZE];
74 uint8_t header[ETHERNET_HEADER_LEN];
76 } __attribute__((packed));
77 } __attribute__((packed));
78 } __attribute__((packed));
81 struct v3_vnet_dev_ops {
82 int (*input)(struct v3_vm_info * vm,
83 struct v3_vnet_pkt * pkt,
85 void (*poll) (struct v3_vm_info * vm, void * dev_data);
87 void (*start_tx)(void * dev_data);
88 void (*stop_tx)(void * dev_data);
91 struct v3_vnet_bridge_ops {
92 int (*input)(struct v3_vm_info * vm,
93 struct v3_vnet_pkt * pkt,
95 void (*poll)(struct v3_vm_info * vm,
100 int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void *private_data);
101 void v3_vnet_poll(struct v3_vm_info *vm);
103 int v3_vnet_add_route(struct v3_vnet_route route);
104 int v3_vnet_add_bridge(struct v3_vm_info * vm,
105 struct v3_vnet_bridge_ops *ops,
108 int v3_vnet_add_dev(struct v3_vm_info *info, uint8_t mac[6],
109 struct v3_vnet_dev_ops *ops,