X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_vnet.h;h=eef724c08280ae976cdc6355a9f8d60fbc35dd8c;hp=d6fd9b15c44c2baf49372892ae369ec021cf99a0;hb=68521eca0f94f8c22aa60e762c83e24beec7233c;hpb=9cabe082ba8acd1b88e6414199b5cc544aadf826 diff --git a/palacios/include/palacios/vmm_vnet.h b/palacios/include/palacios/vmm_vnet.h index d6fd9b1..eef724c 100644 --- a/palacios/include/palacios/vmm_vnet.h +++ b/palacios/include/palacios/vmm_vnet.h @@ -9,8 +9,6 @@ * * Copyright (c) 2009, Lei Xia * Copyright (c) 2009, Yuan Tang - * Copyright (c) 2009, Jack Lange - * Copyright (c) 2009, Peter Dinda * All rights reserved. * @@ -36,10 +34,12 @@ #define ETHERNET_DATA_MAX 1500 #define ETHERNET_PACKET_LEN (ETHERNET_HEADER_LEN + ETHERNET_DATA_MAX) -typedef enum {MAC_ANY, MAC_NOT, MAC_NONE, MAC_EMPTY} mac_type_t; //for 'src_mac_qual' and 'dst_mac_qual' +typedef enum {MAC_ANY, MAC_NOT, MAC_NONE} mac_type_t; //for 'src_mac_qual' and 'dst_mac_qual' typedef enum {LINK_INTERFACE, LINK_EDGE, LINK_ANY} link_type_t; //for 'type' and 'src_type' in struct routing typedef enum {TCP_TYPE, UDP_TYPE, NONE_TYPE} prot_type_t; +#define VNET_INITAB_HCALL 0xca00 + //routing table entry struct routing_entry{ char src_mac[6]; @@ -56,8 +56,43 @@ struct routing_entry{ }__attribute__((packed)); +struct eth_header { + uchar_t dest[6]; + uchar_t src[6]; + uint16_t type; // indicates layer 3 protocol type +}__attribute__((packed)); + +struct ip_header { + uint8_t version: 4; + uint8_t hdr_len: 4; + uchar_t tos; + uint16_t total_len; + uint16_t id; + uint8_t flags: 3; + uint16_t offset: 13; + uchar_t ttl; + uchar_t proto; + uint16_t cksum; + uint32_t src_addr; + uint32_t dst_addr; +}__attribute__((packed)); + +struct udp_header { + uint16_t src_port; + uint16_t dst_port; + uint16_t len; + uint16_t csum;//set to zero, disable the xsum +}__attribute__((packed)); + +struct udp_link_header { + struct eth_header eth_hdr; + struct ip_header ip_hdr; + struct udp_header udp_hdr; +}__attribute__((packed)); + +#define DEVICE_NAME_LEN 20 struct vnet_if_device { - char name[50]; + char name[DEVICE_NAME_LEN]; uchar_t mac_addr[6]; struct vm_device *dev; @@ -67,14 +102,12 @@ struct vnet_if_device { }__attribute__((packed)); -#define VNET_HEADER_LEN 64 struct vnet_if_link { - prot_type_t pro_type; //protocal type of this link + prot_type_t pro_type; //transport layer protocal type of this link unsigned long dest_ip; uint16_t dest_port; - uchar_t vnet_header[VNET_HEADER_LEN]; //header applied to the packet in/out from this link - uint16_t hdr_len; + struct udp_link_header vnet_header; //header applied to the packet in/out from this link int (*input)(uchar_t *data, uint32_t len, void *private_data); @@ -82,7 +115,6 @@ struct vnet_if_link { }__attribute__((packed)); -//link table entry struct link_entry { link_type_t type; @@ -94,18 +126,34 @@ struct link_entry { int use; }__attribute__((packed)); +struct ethernet_pkt { + uint32_t size; //size of data field + uint16_t type; + uint8_t use_header; + struct udp_link_header ext_hdr; + char data[ETHERNET_PACKET_LEN]; +}__attribute__((packed)); -int v3_vnet_send_pkt(uchar_t *buf, int length); +int v3_vnet_send_rawpkt(uchar_t *buf, int len, void *private_data); +int v3_vnet_send_udppkt(uchar_t *buf, int len, void *private_data); int vnet_register_device(struct vm_device *vdev, - char *dev_name, - uchar_t mac[6], - int (*netif_input)(uchar_t * pkt, uint_t size, void *private_data), - void *data); -int vnet_unregister_device(char *dev_name); + char *dev_name, + uchar_t mac[6], + int (*netif_input)(uchar_t * pkt, uint_t size, void *private_data), + void *data); + +int vnet_add_route_entry(char src_mac[6], + char dest_mac[6], + int src_mac_qual, + int dest_mac_qual, + int link_idx, + link_type_t link_type, + int src_link_idx, + link_type_t src_link_type); int v3_vnet_pkt_process(); -void v3_vnet_init(struct guest_info *vm); +void v3_init_vnet(); #endif