3 * This file is part of the Palacios Virtual Machine Monitor developed
4 * by the V3VEE Project with funding from the United States National
5 * Science Foundation and the Department of Energy.
7 * The V3VEE Project is a joint project between Northwestern University
8 * and the University of New Mexico. You can find out more at
11 * Copyright (c) 2010, Lei Xia <lxia@northwestern.edu>
12 * Copyright (c) 2009, Yuan Tang <ytang@northwestern.edu>
13 * Copyright (c) 2010, The V3VEE Project <http://www.v3vee.org>
14 * All rights reserved.
16 * Author: Lei Xia <lxia@northwestern.edu>
17 * Yuan Tang <ytang@northwestern.edu>
19 * This is free software. You are permitted to use,
20 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
26 #include <palacios/vmm_ethernet.h>
27 #include <vnet/vnet_base.h>
28 #include <vnet/vnet_host.h>
29 #include <vnet/vnet_vmm.h>
38 #define LINK_INTERFACE 11
42 #define VNET_HASH_SIZE 17
44 #define VNET_MAX_HEADER_LEN 128
47 A VNET header is the data that needs to be
48 prefaced to an outgoing packet for a specific
49 MAC pair and qualifiers
51 struct v3_vnet_header {
52 // this header is for data that match
53 uint8_t src_mac[ETH_ALEN];
54 uint8_t dst_mac[ETH_ALEN];
59 #define VNET_HEADER_NOMATCH 0 // Could not find a header
60 #define VNET_HEADER_NONE 1 // There is no header, send/receive without change
61 #define VNET_HEADER_RAW 2 // Prepend the following data on a send, remove this much data on a receive
62 #define VNET_HEADER_UDP 3 // Prepend this UDP header and then send this as a UDP packet / dual on receive
63 #define VNET_HEADER_TCP 4 // Prepend this TCP header and then send this as a TCP segment / dual on receive
64 #define VNET_HEADER_VXLAN 5 // Prepend this UDP header + VXLAN ID / dual on receive
69 uint8_t header_data[VNET_MAX_HEADER_LEN];
72 } __attribute__((packed));
75 struct v3_vnet_route {
76 uint8_t src_mac[ETH_ALEN];
77 uint8_t dst_mac[ETH_ALEN];
88 } __attribute__((packed));
98 * IMPORTANT The next three fields must be grouped and packed together
99 * They are used to generate a hash value
102 uint8_t hash_buf[VNET_HASH_SIZE];
106 uint8_t header[ETHERNET_HEADER_LEN];
108 } __attribute__((packed));
109 } __attribute__((packed));
110 } __attribute__((packed));
121 struct v3_vnet_bridge_ops {
122 int (*input)(struct v3_vm_info * vm,
123 struct v3_vnet_pkt * pkt,
124 void * private_data);
125 void (*poll)(struct v3_vm_info * vm,
126 void * private_data);
129 #define HOST_LNX_BRIDGE 1
130 #define CTL_VM_BRIDGE 2
132 int v3_vnet_add_bridge(struct v3_vm_info * vm,
133 struct v3_vnet_bridge_ops * ops,
137 void v3_vnet_del_bridge(uint8_t type);
139 int v3_vnet_add_route(struct v3_vnet_route route);
140 void v3_vnet_del_route(uint32_t route_idx);
142 int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data);
143 int v3_vnet_find_dev(uint8_t * mac);
144 int v3_vnet_stat(struct vnet_stat * stats);
148 struct v3_vnet_dev_ops {
149 int (*input)(struct v3_vm_info * vm,
150 struct v3_vnet_pkt * pkt,
153 /* return >0 means there are more pkts in the queue to be sent */
154 int (*poll)(struct v3_vm_info * vm,
159 int v3_init_vnet(void);
160 void v3_deinit_vnet(void);
162 int v3_vnet_add_dev(struct v3_vm_info * info, uint8_t * mac,
163 struct v3_vnet_dev_ops * ops, int quote, int poll_state,
165 int v3_vnet_del_dev(int dev_id);
167 int v3_vnet_query_header(uint8_t src_mac[6],
170 struct v3_vnet_header *header);