⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hv_vm.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 2 页
字号:
   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->conf_reg_setup = strtol(argv[1],NULL,0);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set TCP port for console */static int cmd_set_con_tcp_port(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->vtty_con_type = VTTY_TYPE_TCP;   vm->vtty_con_tcp_port = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Set TCP port for AUX port */static int cmd_set_aux_tcp_port(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm->vtty_aux_type = VTTY_TYPE_TCP;   vm->vtty_aux_tcp_port = atoi(argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Read an IOS configuration file from a given router */static int cmd_extract_config(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   u_char *cfg_buffer,*cfg_base64;   ssize_t cfg_len;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!vm->platform->nvram_extract_config)      goto err_no_extract_method;   /* Extract the IOS configuration */   if (((cfg_len = vm->platform->nvram_extract_config(vm,&cfg_buffer)) < 0) ||       (cfg_buffer == NULL))       goto err_nvram_extract;   /*     * Convert config to base64. base64 is about 1/3 larger than input,    * let's be on the safe side with twice longer.    */   if (!(cfg_base64 = malloc(cfg_len * 2)))      goto err_alloc_base64;   base64_encode(cfg_base64,cfg_buffer,cfg_len);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"conf '%s' %s",argv[0],cfg_base64);   free(cfg_buffer);   free(cfg_base64);   return(0); err_alloc_base64:   free(cfg_buffer); err_nvram_extract: err_no_extract_method:   vm_release(vm);   hypervisor_send_reply(conn,HSC_ERR_CREATE,1,                         "unable to extract config of VM '%s'",argv[0]);   return(-1);}/* Push an IOS configuration file */static int cmd_push_config(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   u_char *cfg_buffer;   ssize_t len;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   if (!vm->platform->nvram_push_config)      goto err_no_push_method;   /* Convert base64 input to standard text */   if (!(cfg_buffer = malloc(3 * strlen(argv[1]))))      goto err_alloc_base64;   if ((len = base64_decode(cfg_buffer,(u_char *)argv[1],0)) < 0)      goto err_decode_base64;   /* Push configuration */   if (vm->platform->nvram_push_config(vm,cfg_buffer,len) < 0)      goto err_nvram_push;   free(cfg_buffer);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,                         "IOS config file pushed tm VM '%s'",                         argv[0]);   return(0); err_nvram_push: err_decode_base64:   free(cfg_buffer); err_alloc_base64: err_no_push_method:   vm_release(vm);   hypervisor_send_reply(conn,HSC_ERR_CREATE,1,                         "unable to push IOS config for VM '%s'",                         argv[0]);   return(-1);}/* Show info about the specified CPU */static int cmd_show_cpu_info(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   cpu_gen_t *cpu;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   cpu = cpu_group_find_id(vm->cpu_group,atoi(argv[1]));   if (cpu) {      cpu->reg_dump(cpu);      cpu->mmu_dump(cpu);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Suspend a VM instance */static int cmd_suspend(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm_suspend(vm);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"VM '%s' suspended",argv[0]);   return(0);}/* Resume a VM instance */static int cmd_resume(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vm_resume(vm);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"VM '%s' resumed",argv[0]);   return(0);}/* Send a message on the console */static int cmd_send_con_msg(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vtty_store_str(vm->vtty_con,argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Send a message on the AUX port */static int cmd_send_aux_msg(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   vtty_store_str(vm->vtty_aux,argv[1]);   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Show slot bindings */static int cmd_slot_bindings(hypervisor_conn_t *conn,int argc,char *argv[]){   struct cisco_card *card,*sc;   vm_instance_t *vm;   int i,j;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   for(i=0;i<vm->nr_slots;i++) {      if (!(card = vm_slot_get_card_ptr(vm,i)))         continue;      /* main module */      hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%u/%u: %s",                            card->slot_id,card->subslot_id,card->dev_type);      /* sub-slots */      for(j=0;j<CISCO_CARD_MAX_SUBSLOTS;j++) {         if (!(sc = card->sub_slots[j]))            continue;         hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%u/%u: %s",                               card->slot_id,card->subslot_id,card->dev_type);      }   }      vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Show NIO bindings for the specified slot */static int cmd_slot_nio_bindings(hypervisor_conn_t *conn,int argc,char *argv[]){        struct cisco_nio_binding *nb;   struct cisco_card *card,*sc;   vm_instance_t *vm;   u_int i,slot;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   slot = atoi(argv[1]);   if ((card = vm_slot_get_card_ptr(vm,slot)))   {      /* main module */      for(nb=card->nio_list;nb;nb=nb->next) {         hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%u: %s",                               nb->port_id,nb->nio->name);      }      /* sub-slots */      for(i=0;i<CISCO_CARD_MAX_SUBSLOTS;i++) {         if (!(sc = card->sub_slots[i]))            continue;         for(nb=sc->nio_list;nb;nb=nb->next) {            hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%u: %s",                                  nb->port_id,nb->nio->name);         }      }   }      vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Add a slot binding */static int cmd_slot_add_binding(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   u_int slot,port;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   slot = atoi(argv[1]);   port = atoi(argv[2]);   if (vm_slot_add_binding(vm,argv[3],slot,port) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_BINDING,1,                            "VM %s: unable to add binding for slot %u/%u",                            argv[0],slot,port);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Remove a slot binding */static int cmd_slot_remove_binding(hypervisor_conn_t *conn,                                   int argc,char *argv[]){   vm_instance_t *vm;   u_int slot,port;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   slot = atoi(argv[1]);   port = atoi(argv[2]);   if (vm_slot_remove_binding(vm,slot,port) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_BINDING,1,                            "VM %s: unable to remove binding for slot %u/%u",                            argv[0],slot,port);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Add a NIO binding for a slot/port */static int cmd_slot_add_nio_binding(hypervisor_conn_t *conn,                                    int argc,char *argv[]){   vm_instance_t *vm;   u_int slot,port;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   slot = atoi(argv[1]);   port = atoi(argv[2]);   if (vm_slot_add_nio_binding(vm,slot,port,argv[3]) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_BINDING,1,                            "VM %s: unable to add binding "                            "for slot %u/%u",argv[0],slot,port);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Remove a NIO binding for a slot/port */static int cmd_slot_remove_nio_binding(hypervisor_conn_t *conn,                                       int argc,char *argv[]){   vm_instance_t *vm;   u_int slot,port;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   slot = atoi(argv[1]);   port = atoi(argv[2]);   if (vm_slot_remove_nio_binding(vm,slot,port) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_BINDING,1,                            "VM %s: unable to remove NIO binding "                            "for slot %u/%u",argv[0],slot,port);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Enable NIO of the specified slot/port */static int cmd_slot_enable_nio(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   u_int slot,port;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   slot = atoi(argv[1]);   port = atoi(argv[2]);   if (vm_slot_enable_nio(vm,slot,port) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_BINDING,1,                            "VM %s: unable to enable NIO for slot %u/%u",                            argv[0],slot,port);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Disable NIO of the specified slot/port */static int cmd_slot_disable_nio(hypervisor_conn_t *conn,int argc,char *argv[]){   vm_instance_t *vm;   u_int slot,port;   if (!(vm = hypervisor_find_object(conn,argv[0],OBJ_TYPE_VM)))      return(-1);   slot = atoi(argv[1]);   port = atoi(argv[2]);   if (vm_slot_disable_nio(vm,slot,port) == -1) {      vm_release(vm);      hypervisor_send_reply(conn,HSC_ERR_BINDING,1,                            "VM %s: unable to disable NIO for slot %u/%u",                            argv[0],slot,port);      return(-1);   }   vm_release(vm);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Show info about VM object */static void cmd_show_vm_list(registry_entry_t *entry,void *opt,int *err){   hypervisor_conn_t *conn = opt;   vm_instance_t *vm = entry->data;   hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%s (%s)",                         entry->name,vm_get_type(vm));}/* VM List */static int cmd_vm_list(hypervisor_conn_t *conn,int argc,char *argv[]){   int err = 0;   registry_foreach_type(OBJ_TYPE_VM,cmd_show_vm_list,conn,&err);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* Show console TCP port info about VM object */static void cmd_show_vm_list_con_ports(registry_entry_t *entry,void *opt,                                       int *err){   hypervisor_conn_t *conn = opt;   vm_instance_t *vm = entry->data;   if (vm->vtty_con_type == VTTY_TYPE_TCP)      hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%s (%d)",                            vm->name,vm->vtty_con_tcp_port);}/* VM console TCP port list */static int cmd_vm_list_con_ports(hypervisor_conn_t *conn,int argc,char *argv[]){   int err = 0;   registry_foreach_type(OBJ_TYPE_VM,cmd_show_vm_list_con_ports,conn,&err);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* VM commands */static hypervisor_cmd_t vm_cmd_array[] = {   { "create", 3, 3, cmd_create, NULL },   { "delete", 1, 1, cmd_delete, NULL },   { "start", 1, 1, cmd_start, NULL },   { "stop", 1, 1, cmd_stop, NULL },   { "set_debug_level", 2, 2, cmd_set_debug_level, NULL },   { "set_ios", 2, 2, cmd_set_ios, NULL },   { "set_config", 2, 2, cmd_set_config, NULL },   { "set_ram", 2, 2, cmd_set_ram, NULL },   { "set_nvram", 2, 2, cmd_set_nvram, NULL },   { "set_ram_mmap", 2, 2, cmd_set_ram_mmap, NULL },   { "set_sparse_mem", 2, 2, cmd_set_sparse_mem, NULL },   { "set_clock_divisor", 2, 2, cmd_set_clock_divisor, NULL },   { "set_blk_direct_jump", 2, 2, cmd_set_blk_direct_jump, NULL },   { "set_exec_area", 2, 2, cmd_set_exec_area, NULL },   { "set_disk0", 2, 2, cmd_set_disk0, NULL },   { "set_disk1", 2, 2, cmd_set_disk1, NULL },   { "set_conf_reg", 2, 2, cmd_set_conf_reg, NULL },   { "set_idle_pc", 2, 2, cmd_set_idle_pc, NULL },   { "set_idle_pc_online", 3, 3, cmd_set_idle_pc_online, NULL },   { "get_idle_pc_prop", 2, 2, cmd_get_idle_pc_prop, NULL },   { "show_idle_pc_prop", 2, 2, cmd_show_idle_pc_prop, NULL },   { "set_idle_max", 3, 3, cmd_set_idle_max, NULL },   { "set_idle_sleep_time", 3, 3, cmd_set_idle_sleep_time, NULL },   { "show_timer_drift", 2, 2, cmd_show_timer_drift, NULL },   { "set_ghost_file", 2, 2, cmd_set_ghost_file, NULL },   { "set_ghost_status", 2, 2, cmd_set_ghost_status, NULL },   { "set_con_tcp_port", 2, 2, cmd_set_con_tcp_port, NULL },   { "set_aux_tcp_port", 2, 2, cmd_set_aux_tcp_port, NULL },   { "extract_config", 1, 1, cmd_extract_config, NULL },   { "push_config", 2, 2, cmd_push_config, NULL },   { "cpu_info", 2, 2, cmd_show_cpu_info, NULL },   { "suspend", 1, 1, cmd_suspend, NULL },   { "resume", 1, 1, cmd_resume, NULL },   { "send_con_msg", 2, 2, cmd_send_con_msg, NULL },   { "send_aux_msg", 2, 2, cmd_send_aux_msg, NULL },   { "slot_bindings", 1, 1, cmd_slot_bindings, NULL },   { "slot_nio_bindings", 2, 2, cmd_slot_nio_bindings, NULL },   { "slot_add_binding", 4, 4, cmd_slot_add_binding, NULL },   { "slot_remove_binding", 3, 3, cmd_slot_remove_binding, NULL },   { "slot_add_nio_binding", 4, 4, cmd_slot_add_nio_binding, NULL },   { "slot_remove_nio_binding", 3, 3, cmd_slot_remove_nio_binding, NULL },   { "slot_enable_nio", 3, 3, cmd_slot_enable_nio, NULL },   { "slot_disable_nio", 3, 3, cmd_slot_disable_nio, NULL },   { "list", 0, 0, cmd_vm_list, NULL },   { "list_con_ports", 0, 0, cmd_vm_list_con_ports, NULL },   { NULL, -1, -1, NULL, NULL },};/* Hypervisor VM initialization */int hypervisor_vm_init(void){   hypervisor_module_t *module;   module = hypervisor_register_module("vm",NULL);   assert(module != NULL);   hypervisor_register_cmd_array(module,vm_cmd_array);   return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -