X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_vnet.h;h=90e3ca13319aba1ccfc122d751d21a2761d5ab41;hp=51d99c48183d955fe1b65263e6dcf22417879fab;hb=ca0524fbe3facc7acc0fa57d2449dffeb48d1ef6;hpb=9e9d28b5fe29fcf8fbed010c981254b5e25a6eac diff --git a/palacios/include/palacios/vmm_vnet.h b/palacios/include/palacios/vmm_vnet.h index 51d99c4..90e3ca1 100644 --- a/palacios/include/palacios/vmm_vnet.h +++ b/palacios/include/palacios/vmm_vnet.h @@ -36,7 +36,7 @@ #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; @@ -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); @@ -95,13 +128,22 @@ struct link_entry { }__attribute__((packed)); -int v3_vnet_send_pkt(uchar_t *buf, int length); -//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); +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_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();