* and the University of New Mexico. You can find out more at
* http://www.v3vee.org
*
- * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
- * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
+ * Copyright (c) 2009, Lei Xia <lxia@northwestern.edu>
+ * Copyright (c) 2009, Yuan Tang <ytang@northwestern.edu>
+ * Copyright (c) 2009, Jack Lange <jarusl@cs.northwestern.edu>
+ * Copyright (c) 2009, Peter Dinda <pdinda@northwestern.edu
+ * Copyright (c) 2009, The V3VEE Project <http://www.v3vee.org>
* All rights reserved.
*
- * Author: Jack Lange <jarusl@cs.northwestern.edu>
+ * Author: Lei Xia <lxia@northwestern.edu>
+ * Yuan Tang <ytang@northwestern.edu>
+ * Jack Lange <jarusl@cs.northwestern.edu>
+ * Peter Dinda <pdinda@northwestern.edu
*
* This is free software. You are permitted to use,
* redistribute, and modify it as specified in the file "V3VEE_LICENSE".
*/
+#ifndef __VNET_H__
+#define __VNET_H__
-#ifndef __DEVICES_VNET_H__
-#define __DEVICES_VNET_H__
+#include <palacios/vmm.h>
+#include <palacios/vmm_string.h>
+#include <palacios/vmm_types.h>
+#include <palacios/vmm_queue.h>
+#include <palacios/vmm_socket.h>
+#include <palacios/vmm_hashtable.h>
-#ifdef __V3VEE__
-#include <palacios/vmm_socket.h>
+#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)
+
+//the routing entry
+struct routing {
+ char src_mac[6];
+ char dest_mac[6];
+
+ int src_mac_qual;
+ int dest_mac_qual;
+
+ int dest;
+ int type; //EDGE_TYPE|INTERFACE_TYPE
+
+ int src;
+ int src_type;
-struct v3_vnet {
- int vnet_sock;
- void * private_data;
+ int use;
+
+ int next;
+ int prev;
};
-int v3_init_vnet(struct v3_vnet * vnet,
- int (*rx_pkt)(), //Fix this...
- uint32_t ip, uint16_t port,
- void * private_data);
+ //This is the structure that stores the topology
+struct topology {
+ SOCK link_sock;
-int v3_send_vnet_pkt(struct v3_vnet * vnet, uchar_t * pkt, uint_t pkt_len);
+ unsigned long dest;
-#endif
+ // Port for UDP
+ unsigned short remote_port;
+
+ // LINK OR GATEWAY
+ // int link_class;
+
+ 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 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 vnet_pkt_process();
+
+void vnet_init();
#endif
+
+