X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fnic_bridge.c;h=ed1cd92bf67506f437a16f7a41ff9c16bb6e66cb;hb=bba68c448a941e0beb562f670f1a5901e5d07a54;hp=00ce9b68bfdee5eeb33f92afff1edf6212c73493;hpb=e2964f7234daa3429275c039769a313f0870c212;p=palacios.git diff --git a/palacios/src/devices/nic_bridge.c b/palacios/src/devices/nic_bridge.c index 00ce9b6..ed1cd92 100644 --- a/palacios/src/devices/nic_bridge.c +++ b/palacios/src/devices/nic_bridge.c @@ -37,7 +37,6 @@ struct nic_bridge_state { static int bridge_send(uint8_t * buf, uint32_t len, void * private_data) { - //struct nic_bridge_state *bridge = (struct nic_bridge_state *)private_data; #ifdef CONFIG_DEBUG_NIC_BRIDGE { @@ -49,13 +48,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 +66,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 +76,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 +89,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 +104,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)