X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fnic_bridge.c;h=5eec5e67b8c2ed7d318e56fbe5fbdda0f02dc11f;hb=20795e931e9ceed9853351133fcd6adf4e6a2de9;hp=00ce9b68bfdee5eeb33f92afff1edf6212c73493;hpb=e2964f7234daa3429275c039769a313f0870c212;p=palacios-OLD.git diff --git a/palacios/src/devices/nic_bridge.c b/palacios/src/devices/nic_bridge.c index 00ce9b6..5eec5e6 100644 --- a/palacios/src/devices/nic_bridge.c +++ b/palacios/src/devices/nic_bridge.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #ifndef CONFIG_DEBUG_NIC_BRIDGE #undef PrintDebug @@ -36,8 +36,8 @@ struct nic_bridge_state { }; static int bridge_send(uint8_t * buf, uint32_t len, + int synchronize, void * private_data) { - //struct nic_bridge_state *bridge = (struct nic_bridge_state *)private_data; #ifdef CONFIG_DEBUG_NIC_BRIDGE { @@ -49,13 +49,17 @@ static int bridge_send(uint8_t * buf, uint32_t len, return V3_send_raw(buf, len); } - static int packet_input(struct v3_vm_info * vm, struct v3_packet_event * evt, void * private_data) { struct nic_bridge_state * bridge = (struct nic_bridge_state *)private_data; - - PrintDebug("NIC_BRIDGE: Incoming packet size: %d\n", evt->size); + +#ifdef CONFIG_DEBUG_NIC_BRIDGE + { + PrintDebug("NIC Bridge: recv pkt size: %d\n", evt->size); + v3_hexdump(evt->pkt, evt->size, NULL, 0); + } +#endif return bridge->net_ops.recv(evt->pkt, evt->size, @@ -63,8 +67,7 @@ static int packet_input(struct v3_vm_info * vm, } -static int vnet_nic_free(struct vm_device * dev) { - struct nic_bridge_state * bridge = dev->private_data; +static int nic_bridge_free(struct nic_bridge_state * bridge) { /*detach from front device */ @@ -74,11 +77,11 @@ static int vnet_nic_free(struct vm_device * dev) { } static struct v3_device_ops dev_ops = { - .free = vnet_nic_free, + .free = (int (*)(void *))nic_bridge_free, }; -static int vnet_nic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { +static int nic_bridge_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { struct nic_bridge_state * bridge = NULL; char * dev_id = v3_cfg_val(cfg, "ID"); @@ -87,10 +90,11 @@ static int vnet_nic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { bridge = (struct nic_bridge_state *)V3_Malloc(sizeof(struct nic_bridge_state)); memset(bridge, 0, sizeof(struct nic_bridge_state)); - struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, bridge); + struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, bridge); - if (v3_attach_device(vm, dev) == -1) { + if (dev == NULL) { PrintError("Could not attach device %s\n", dev_id); + V3_Free(bridge); return -1; } @@ -101,15 +105,18 @@ static int vnet_nic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { &(bridge->net_ops), frontend_cfg, bridge) == -1) { PrintError("Could not connect %s to frontend %s\n", dev_id, v3_cfg_val(frontend_cfg, "tag")); + v3_remove_device(dev); return -1; } PrintDebug("NIC-Bridge: Connect %s to frontend %s\n", dev_id, v3_cfg_val(frontend_cfg, "tag")); + + V3_packet_add_recver(bridge->net_ops.fnt_mac, vm); v3_hook_host_event(vm, HOST_PACKET_EVT, V3_HOST_EVENT_HANDLER(packet_input), bridge); return 0; } -device_register("NIC_BRIDGE", vnet_nic_init) +device_register("NIC_BRIDGE", nic_bridge_init)