* All rights reserved.
*
* Author: Lei Xia <lxia@northwestern.edu>
- * Yuan Tang <ytang@northwestern.edu>
+ * Yuan Tang <ytang@northwestern.edu>
*
* This is free software. You are permitted to use,
* redistribute, and modify it as specified in the file "V3VEE_LICENSE".
};
int v3_init_vnet(void);
+void v3_deinit_vnet(void);
+
int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data);
+
void v3_vnet_poll(struct v3_vm_info * vm);
int v3_vnet_add_route(struct v3_vnet_route route);
struct v3_vnet_bridge_ops * ops,
uint8_t type,
void * priv_data);
+
+
int v3_vnet_add_dev(struct v3_vm_info * info, uint8_t mac[6],
struct v3_vnet_dev_ops * ops,
void * priv_data);
+int v3_vnet_del_dev(int dev_id);
#endif
{
PrintDebug("VNET-NIC: send pkt (size: %d, src_id: %d, src_type: %d)\n",
pkt.size, pkt.src_id, pkt.src_type);
- //v3_hexdump(buf, len, NULL, 0);
+ v3_hexdump(buf, len, NULL, 0);
}
#endif
static int vnet_nic_free(struct vnet_nic_state * vnetnic) {
-
+ v3_vnet_del_dev(vnetnic->vnet_dev_id);
V3_Free(vnetnic);
+
return 0;
}
.stop_tx = stop_tx,
};
-
-static int register_to_vnet(struct v3_vm_info * vm,
- struct vnet_nic_state * vnet_nic,
- char * dev_name, uchar_t mac[6]) {
-
- PrintDebug("Vnet-nic: register Vnet-nic device %s, state %p to VNET\n", dev_name, vnet_nic);
-
- return v3_vnet_add_dev(vm, mac, &vnet_dev_ops, (void *)vnet_nic);
-}
-
-
static int str2mac(char * macstr, char mac[6]){
char hex[2], *s = macstr;
int i = 0;
v3_cfg_tree_t * frontend_cfg = v3_cfg_subtree(cfg, "frontend");
macstr = v3_cfg_val(frontend_cfg, "mac");
- if (macstr == NULL) {
- PrintDebug("Vnet-nic: No Mac specified\n");
- } else {
+ if (macstr != NULL) {
+ PrintDebug("Vnet-nic: Mac specified %s\n", macstr);
str2mac(macstr, mac);
}
memset(vnetnic, 0, sizeof(struct vnet_nic_state));
struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, vnetnic);
-
if (dev == NULL) {
PrintError("Could not attach device %s\n", dev_id);
V3_Free(vnetnic);
PrintDebug("Vnet-nic: Connect %s to frontend %s\n",
dev_id, v3_cfg_val(frontend_cfg, "tag"));
- if ((vnet_dev_id = register_to_vnet(vm, vnetnic, dev_id, vnetnic->mac)) == -1) {
+ if ((vnet_dev_id = v3_vnet_add_dev(vm, vnetnic->mac, &vnet_dev_ops, (void *)vnetnic)) == -1) {
PrintError("Vnet-nic device %s (mac: %s) fails to registered to VNET\n", dev_id, macstr);
v3_remove_device(dev);
return 0;
}
-
vnetnic->vnet_dev_id = vnet_dev_id;
PrintDebug("Vnet-nic device %s (mac: %s, %ld) registered to VNET\n",
//for temporary hack for vnet bridge test
-#if 1
+#if 0
{
uchar_t zeromac[6] = {0,0,0,0,0,0};
/* if the device was found previosly the id should still be 0 */
if (new_dev->dev_id == 0) {
- PrintError("Device Alrady exists\n");
+ PrintError("Device Already exists\n");
return -1;
}
}
+
+int v3_vnet_del_dev(int dev_id){
+ struct vnet_dev * dev = NULL;
+ unsigned long flags;
+
+ flags = v3_lock_irqsave(vnet_state.lock);
+
+ dev = find_dev_by_id(dev_id);
+ if (dev != NULL){
+ list_del(&(dev->node));
+ }
+
+ v3_unlock_irqrestore(vnet_state.lock, flags);
+
+ V3_Free(dev);
+
+ PrintDebug("Vnet: Remove Device: dev_id %d\n", dev_id);
+
+ return 0;
+}
+
+
+static void free_devices(){
+ struct vnet_dev * dev = NULL;
+
+ list_for_each_entry(dev, &(vnet_state.devs), node) {
+ list_del(&(dev->node));
+ V3_Free(dev);
+ }
+}
+
+static void free_routes(){
+ struct vnet_route_info * route = NULL;
+
+ list_for_each_entry(route, &(vnet_state.routes), node) {
+ list_del(&(route->node));
+ list_del(&(route->match_node));
+ V3_Free(route);
+ }
+}
+
+
void v3_vnet_poll(struct v3_vm_info * vm){
struct vnet_dev * dev = NULL;
struct vnet_brg_dev *bridge = vnet_state.bridge;
return 0;
}
+
+
+void v3_deinit_vnet(){
+
+ v3_lock_deinit(&(vnet_state.lock));
+
+ free_devices();
+ free_routes();
+
+ v3_free_htable(vnet_state.route_cache, 1, 1);
+ V3_Free(vnet_state.bridge);
+}
+
+