From: Lei Xia Date: Mon, 16 Nov 2009 23:13:01 +0000 (-0600) Subject: Move vnet code to src/palacios X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=3c073d909a9307685307ec597800fad9cca483cc Move vnet code to src/palacios --- diff --git a/palacios/include/palacios/vmm_vnet.h b/palacios/include/palacios/vmm_vnet.h new file mode 100644 index 0000000..0c2ded9 --- /dev/null +++ b/palacios/include/palacios/vmm_vnet.h @@ -0,0 +1,149 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2009, Lei Xia + * Copyright (c) 2009, Yuan Tang + * Copyright (c) 2009, Jack Lange + * Copyright (c) 2009, Peter Dinda + * All rights reserved. + * + * Author: Lei Xia + * Yuan Tang + * Jack Lange + * Peter Dinda +#include +#include +#include +#include +#include +#include + + +#define ETHERNET_HEADER_LEN 14 +#define ETHERNET_DATA_MIN 46 +#define ETHERNET_DATA_MAX 1500 +#define ETHERNET_PACKET_LEN (ETHERNET_HEADER_LEN + ETHERNET_DATA_MAX) + +#define SOCK int + +//the routing entry +struct routing{ + char src_mac[6]; + char dest_mac[6]; + + int src_mac_qual; + int dest_mac_qual; + + int dest; //link[dest] is the link to be used to send pkt + int type; //EDGE|INTERFACE|ANY + + int src; + int src_type; //EDGE|INTERFACE|ANY + + int use; + + int next; + int prev; + // struct list_head entry_list; +}; + +//struct gen_route { + // uint_t num_entries; + // struct list_head entries; +//} + + //This is the structure that stores the topology +struct topology { + SOCK link_sock; + + unsigned long dest; + + // Port for UDP + unsigned short remote_port; + + int use; + int type; //TCP=0, UDP=1,VTP=2, can be extended so on + + int next; + int prev; +}; + +struct sock_list { + SOCK sock; + + int next; + int prev; +}; + + +#define GENERAL_NIC 0 + +struct ethAddr{ + char addr[6]; +}; + +struct vnet_if_device { + char name[50]; + struct ethAddr device_addr; + + int (*input)(uchar_t * pkt, uint_t size); + + void * data; +}; + + +struct device_list { + struct vnet_if_device *device; + + int use; + int type; + + int next; + int prev; +}; + +// 14 (ethernet frame) + 20 bytes +struct HEADERS { + char ethernetdest[6]; + char ethernetsrc[6]; + unsigned char ethernettype[2]; // indicates layer 3 protocol type + char ip[20]; +}; + +#define FOREACH(iter, list, start) for (iter = start; iter != -1; iter = list[iter].next) +#define FOREACH_SOCK(iter, socks, start) FOREACH(iter, socks, start) +#define FOREACH_LINK(iter, links, start) FOREACH(iter, links, start) +#define FOREACH_ROUTE(iter, routes, start) FOREACH(iter, routes, start) +#define FOREACH_DEVICE(iter, devices, start) FOREACH(iter, devices, start) + + +int v3_Send_pkt(uchar_t *buf, int length); +int v3_Register_pkt_event(int (*netif_input)(uchar_t * pkt, uint_t size)); + + +int vnet_send_pkt(char *buf, int length); +int vnet_register_pkt_event(char *dev_name, int (*netif_input)(uchar_t * pkt, uint_t size), void *data); + +int v3_vnet_pkt_process(); + +void v3_vnet_init(); + +#endif + +