#ifndef __VNET_H__
#define __VNET_H__
-#ifdef __V3VEE__
-
#include <palacios/vmm.h>
-typedef enum {MAC_ANY=0, MAC_NOT, MAC_NONE, MAC_ADDR} mac_type_t; //for 'src_mac_qual' and 'dst_mac_qual'
-typedef enum {LINK_INTERFACE=0, LINK_EDGE, LINK_ANY} link_type_t; //for 'type' and 'src_type' in struct routing
+#define MAC_ANY 0
+#define MAC_NOT 1
+#define MAC_NONE 2
+#define MAC_ADDR 3
+
+#define LINK_INTERFACE 0
+#define LINK_EDGE 1
+#define LINK_ANY 2
#define VNET_HASH_SIZE 17
#define ETHERNET_HEADER_LEN 14
uint8_t src_mac_qual;
uint8_t dst_mac_qual;
- uint32_t dst_id; //link[dest] is the link to be used to send pkt
- uint8_t dst_type; //EDGE|INTERFACE|ANY
+ uint32_t dst_id;
+ uint8_t dst_type;
uint32_t src_id;
- uint8_t src_type; //EDGE|INTERFACE|ANY
+ uint8_t src_type;
} __attribute__((packed));
void * private_data);
};
-int v3_init_vnet();
-int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void *private_data);
-void v3_vnet_poll(struct v3_vm_info *vm);
+int v3_init_vnet(void);
+int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data);
+void v3_vnet_poll(struct v3_vm_info * vm);
int v3_vnet_add_route(struct v3_vnet_route route);
int v3_vnet_add_bridge(struct v3_vm_info * vm,
- struct v3_vnet_bridge_ops *ops,
+ struct v3_vnet_bridge_ops * ops,
uint8_t type,
void * priv_data);
-int v3_vnet_add_dev(struct v3_vm_info *info, uint8_t mac[6],
- struct v3_vnet_dev_ops *ops,
+int v3_vnet_add_dev(struct v3_vm_info * info, uint8_t mac[6],
+ struct v3_vnet_dev_ops * ops,
void * priv_data);
-#endif
#endif
virtio->virtio_cfg.host_features = 0; // (1 << VIRTIO_NET_F_MAC);
if ((v3_lock_init(&(virtio->rx_lock)) == -1) ||
- (v3_lock_init(&(virtio->tx_lock)) == -1)){
+ (v3_lock_init(&(virtio->tx_lock)) == -1)){
PrintError("Virtio NIC: Failure to init locks for net_state\n");
}
return 0;
}
-static int pkt_tx(struct guest_info * core, struct virtio_net_state * virtio, struct vring_desc * buf_desc)
+static int
+pkt_tx(struct guest_info * core,
+ struct virtio_net_state * virtio,
+ struct vring_desc * buf_desc)
{
uint8_t * buf = NULL;
uint32_t len = buf_desc->length;
}
-static int copy_data_to_desc(struct guest_info * core,
- struct virtio_net_state * virtio_state,
- struct vring_desc * desc,
- uchar_t * buf,
- uint_t buf_len,
- uint_t offset)
+static int
+copy_data_to_desc(struct guest_info * core,
+ struct virtio_net_state * virtio_state,
+ struct vring_desc * desc,
+ uchar_t * buf,
+ uint_t buf_len,
+ uint_t offset)
{
uint32_t len;
uint8_t * desc_buf = NULL;
/* guest free some pkts from rx queue */
-static int handle_rx_kick(struct guest_info *core, struct virtio_net_state * virtio)
+static int handle_rx_kick(struct guest_info *core,
+ struct virtio_net_state * virtio)
{
unsigned long flags;
}
-static int handle_ctrl(struct guest_info *core, struct virtio_net_state * virtio) {
+static int handle_ctrl(struct guest_info *core,
+ struct virtio_net_state * virtio) {
return 0;
}
-static int handle_pkt_tx(struct guest_info *core, struct virtio_net_state * virtio_state)
+static int handle_pkt_tx(struct guest_info *core,
+ struct virtio_net_state * virtio_state)
{
struct virtio_queue * q = &(virtio_state->tx_vq);
struct virtio_net_hdr * hdr = NULL;
static int virtio_setup_queue(struct guest_info *core,
- struct virtio_net_state * virtio_state,
- struct virtio_queue * queue,
- addr_t pfn,
- addr_t page_addr) {
+ struct virtio_net_state * virtio_state,
+ struct virtio_queue * queue,
+ addr_t pfn, addr_t page_addr) {
queue->pfn = pfn;
queue->ring_desc_addr = page_addr;
return 0;
}
-static int virtio_io_write(struct guest_info *core, uint16_t port, void * src, uint_t length, void * private_data)
+static int virtio_io_write(struct guest_info *core,
+ uint16_t port, void * src,
+ uint_t length, void * private_data)
{
struct virtio_net_state * virtio = (struct virtio_net_state *)private_data;
int port_idx = port % virtio->io_range_size;
return length;
}
-static int virtio_io_read(struct guest_info *core, uint16_t port, void * dst, uint_t length, void * private_data)
+static int virtio_io_read(struct guest_info *core,
+ uint16_t port, void * dst,
+ uint_t length, void * private_data)
{
struct virtio_net_state * virtio = (struct virtio_net_state *)private_data;
int port_idx = port % virtio->io_range_size;
-static int register_dev(struct virtio_dev_state * virtio, struct virtio_net_state * net_state)
+static int register_dev(struct virtio_dev_state * virtio,
+ struct virtio_net_state * net_state)
{
struct pci_device * pci_dev = NULL;
struct v3_pci_bar bars[6];
-static int handle_cmd_kick(struct guest_info * core, struct virtio_vnet_state * vnet_state) {
+static int handle_cmd_kick(struct guest_info * core,
+ struct virtio_vnet_state * vnet_state) {
struct virtio_queue * q = &(vnet_state->queue[0]);
PrintDebug("VNET Bridge: Handling command queue\n");
static int vnet_pkt_input_cb(struct v3_vm_info * vm,
- struct v3_vnet_pkt * pkt,
- void * private_data){
+ struct v3_vnet_pkt * pkt,
+ void * private_data){
struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
struct virtio_queue * q = &(vnet_state->queue[RECV_QUEUE]);
int ret_val = -1;
return ret_val;
}
-static int handle_pkt_kick(struct guest_info *core, struct virtio_vnet_state * vnet_state)
+static int handle_pkt_kick(struct guest_info * core,
+ struct virtio_vnet_state * vnet_state)
{
struct virtio_queue * q = &(vnet_state->queue[XMIT_QUEUE]);
int recvd = 0;
return 0;
}
-static void vnet_virtio_poll(struct v3_vm_info * vm, void *private_data){
+static void vnet_virtio_poll(struct v3_vm_info * vm, void * private_data){
struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
if(vm == vnet_state->vm){
}
}
-static int handle_rx_kick(struct guest_info *core, struct virtio_vnet_state * vnet_state)
+static int handle_rx_kick(struct guest_info *core,
+ struct virtio_vnet_state * vnet_state)
{
//v3_vnet_enable_bridge();
return 0;
}
-static int vnet_virtio_io_write(struct guest_info * core, uint16_t port, void * src, uint_t length, void * private_data) {
+static int vnet_virtio_io_write(struct guest_info * core,
+ uint16_t port, void * src,
+ uint_t length, void * private_data) {
struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
int port_idx = port % vnet_state->io_range_size;
}
-static int vnet_virtio_io_read(struct guest_info * core, uint16_t port, void * dst, uint_t length, void * private_data) {
+static int vnet_virtio_io_read(struct guest_info * core,
+ uint16_t port, void * dst,
+ uint_t length, void * private_data) {
struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
int port_idx = port % vnet_state->io_range_size;
/* called by frontend, send pkt to VNET */
static int vnet_nic_send(uint8_t * buf, uint32_t len,
- void * private_data,
- struct vm_device * dest_dev){
+ void * private_data,
+ struct vm_device * dest_dev){
struct vnet_nic_state *vnetnic = (struct vnet_nic_state *)private_data;
struct v3_vnet_pkt pkt;
/* send pkt to frontend device */
static int virtio_input(struct v3_vm_info * info,
- struct v3_vnet_pkt * pkt,
- void * private_data){
+ struct v3_vnet_pkt * pkt,
+ void * private_data){
struct vnet_nic_state *vnetnic = (struct vnet_nic_state *)private_data;
return vnetnic->net_ops.recv(pkt->data,
/* tell frontend device to poll data from guest */
static void virtio_poll(struct v3_vm_info * info,
- void * private_data){
+ void * private_data){
struct vnet_nic_state *vnetnic = (struct vnet_nic_state *)private_data;
vnetnic->net_ops.poll(info, vnetnic->net_ops.frontend_data);
/* tell the frontend to start sending pkt to VNET*/
-static void start_tx(void *private_data){
+static void start_tx(void * private_data){
struct vnet_nic_state *vnetnic = (struct vnet_nic_state *)private_data;
vnetnic->net_ops.start_tx(vnetnic->net_ops.frontend_data);
}
/* tell the frontend device to stop sending pkt to VNET*/
-static void stop_tx(void *private_data){
+static void stop_tx(void * private_data){
struct vnet_nic_state *vnetnic = (struct vnet_nic_state *)private_data;
vnetnic->net_ops.stop_tx(vnetnic->net_ops.frontend_data);
static int register_to_vnet(struct v3_vm_info * vm,
- struct vnet_nic_state *vnet_nic,
- char *dev_name,
- uchar_t mac[6]) {
+ struct vnet_nic_state * vnet_nic,
+ char * dev_name, uchar_t mac[6]) {
PrintDebug("Vnet-nic: register Vnet-nic device %s, state %p to VNET\n", dev_name, vnet_nic);
}
-static int str2mac(char *macstr, char mac[6]){
+static int str2mac(char * macstr, char mac[6]){
char hex[2], *s = macstr;
int i = 0;
}
PrintDebug("Vnet-nic: Connect %s to frontend %s\n",
- name, v3_cfg_val(frontend_cfg, "tag"));
+ name, v3_cfg_val(frontend_cfg, "tag"));
if ((vnet_dev_id = register_to_vnet(vm, vnetnic, name, vnetnic->mac)) == -1) {
PrintError("Vnet-nic device %s (mac: %s) fails to registered to VNET\n", name, macstr);
vnetnic->vnet_dev_id = vnet_dev_id;
PrintDebug("Vnet-nic device %s (mac: %s, %ld) registered to VNET\n",
- name, macstr, *((ulong_t *)vnetnic->mac));
+ name, macstr, *((ulong_t *)vnetnic->mac));
//for temporary hack for vnet bridge test
mac[3], mac[4], mac[5]);
}
-static void print_route(struct vnet_route_info *route){
+static void print_route(struct vnet_route_info * route){
char str[50];
mac_to_string(route->route_def.src_mac, str);
PrintDebug("Src Mac (%s), src_qual (%d)\n",
- str, route->route_def.src_mac_qual);
+ str, route->route_def.src_mac_qual);
mac_to_string(route->route_def.dst_mac, str);
PrintDebug("Dst Mac (%s), dst_qual (%d)\n",
- str, route->route_def.dst_mac_qual);
+ str, route->route_def.dst_mac_qual);
PrintDebug("Src dev id (%d), src type (%d)",
- route->route_def.src_id,
- route->route_def.src_type);
+ route->route_def.src_id,
+ route->route_def.src_type);
PrintDebug("Dst dev id (%d), dst type (%d)\n",
- route->route_def.dst_id,
- route->route_def.dst_type);
+ route->route_def.dst_id,
+ route->route_def.dst_type);
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",
- route->dst_dev,
- route->dst_dev->dev_id,
- (void *)&(route->dst_dev->dev_ops),
- route->dst_dev->private_data);
+ route->dst_dev,
+ route->dst_dev->dev_id,
+ (void *)&(route->dst_dev->dev_ops),
+ route->dst_dev->private_data);
}
}
int i = 0;
PrintDebug("\n========Dump routes starts ============\n");
list_for_each_entry(route, &(vnet_state.routes), node) {
- PrintDebug("\nroute %d:\n", ++i);
+ PrintDebug("\nroute %d:\n", ++i);
- print_route(route);
+ print_route(route);
}
PrintDebug("\n========Dump routes end ============\n");
}
return 0;
}
-int v3_vnet_add_dev(struct v3_vm_info *vm, uint8_t mac[6],
+int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t mac[6],
struct v3_vnet_dev_ops *ops,
void * priv_data){
struct vnet_dev * new_dev = NULL;