#include <palacios/vmm_host_events.h>
#include <vnet/vnet.h>
+
#define __V3VEE__
#include <palacios/vmm_hashtable.h>
#include <palacios/vmm_ethernet.h>
#undef __V3VEE__
#include "palacios.h"
-#include "palacios-packet.h"
-
+#include "linux-exts.h"
struct palacios_packet_state {
struct socket * raw_sock;
uint8_t inited;
}
static int palacios_packet_del_recver(const char * mac,
- struct v3_vm_info * vm){
+ struct v3_vm_info * vm){
return 0;
}
-static int init_raw_socket (const char * eth_dev){
+static int init_raw_socket(const char * eth_dev){
int err;
struct sockaddr_ll sock_addr;
struct ifreq if_req;
int dev_idx;
err = sock_create(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL), &(packet_state.raw_sock));
+
if (err < 0) {
printk(KERN_WARNING "Could not create a PF_PACKET Socket, err %d\n", err);
return -1;
}
- if(eth_dev == NULL){
+ if (eth_dev == NULL){
eth_dev = "eth0"; /* default "eth0" */
}
memset(&if_req, 0, sizeof(if_req));
strncpy(if_req.ifr_name, eth_dev, IFNAMSIZ); //sizeof(if_req.ifr_name));
+
err = packet_state.raw_sock->ops->ioctl(packet_state.raw_sock, SIOCGIFINDEX, (long)&if_req);
- if(err < 0){
- printk(KERN_WARNING "Palacios Packet: Unable to get index for device %s, error %d\n", if_req.ifr_name, err);
+
+ if (err < 0){
+ printk(KERN_WARNING "Palacios Packet: Unable to get index for device %s, error %d\n",
+ if_req.ifr_name, err);
dev_idx = 2; /* match ALL 2:"eth0" */
- }
- else{
+ } else {
dev_idx = if_req.ifr_ifindex;
}
sock_addr.sll_protocol = htons(ETH_P_ALL);
sock_addr.sll_ifindex = dev_idx;
- err = packet_state.raw_sock->ops->bind(packet_state.raw_sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr));
+ err = packet_state.raw_sock->ops->bind(packet_state.raw_sock,
+ (struct sockaddr *)&sock_addr,
+ sizeof(sock_addr));
+
if (err < 0){
printk(KERN_WARNING "Error binding raw packet to device %s, %d\n", eth_dev, err);
return -1;
size = sock_sendmsg(packet_state.raw_sock, &msg, len);
set_fs(oldfs);
- if(vnet_debug >= 4){
- printk("Palacios Packet: send pkt to NIC (size: %d)\n", len);
- print_hex_dump(NULL, "pkt_header: ", 0, 20, 20, pkt, 20, 0);
- printk("palacios_packet_send return: %d\n", size);
- }
return size;
}
}
-void
+static void
send_raw_packet_to_palacios(char * pkt,
int len,
struct v3_vm_info * vm) {
while (!kthread_should_stop()) {
size = recv_pkt(pkt, ETHERNET_PACKET_LEN);
+
if (size < 0) {
printk(KERN_WARNING "Palacios raw packet receive error, Server terminated\n");
break;
}
- if(vnet_debug >= 4){
- printk("Palacios Packet: receive pkt from NIC (size: %d)\n",size);
- print_hex_dump(NULL, "pkt_header: ", 0, 10, 10, pkt, 20, 0);
- }
/* if VNET is enabled, send to VNET */
// ...
vm = (struct v3_vm_info *)v3_htable_search(packet_state.mac_vm_cache, (addr_t)pkt);
- if(vm != NULL){
+
+ if (vm != NULL){
printk("Find destinated VM 0x%p\n", vm);
send_raw_packet_to_palacios(pkt, size, vm);
}
}
-int palacios_init_packet(const char * eth_dev) {
+static int packet_init( void ) {
- if(packet_state.inited == 0){
+ const char * eth_dev = NULL;
+
+ if (packet_state.inited == 0){
packet_state.inited = 1;
- if(init_raw_socket(eth_dev) == -1){
+ if (init_raw_socket(eth_dev) == -1){
printk("Error to initiate palacios packet interface\n");
return -1;
}
packet_state.server_thread = kthread_run(packet_server, NULL, "raw-packet-server");
}
+
+ // REGISTER GLOBAL CONTROL to add interfaces...
+
return 0;
}
-void palacios_deinit_packet(const char * eth_dev) {
+static int packet_deinit( void ) {
+
kthread_stop(packet_state.server_thread);
packet_state.raw_sock->ops->release(packet_state.raw_sock);
v3_free_htable(packet_state.mac_vm_cache, 0, 1);
packet_state.inited = 0;
+
+ return 0;
}
+
+
+static struct linux_ext pkt_ext = {
+ .name = "PACKET_INTERFACE",
+ .init = packet_init,
+ .deinit = packet_deinit,
+ .guest_init = NULL,
+ .guest_deinit = NULL
+};
+
+
+register_extension(&pkt_ext);