/* Set mainboard type */ int c1700_mainboard_set_type(c1700_t *router,char *mainboard_type) { struct c1700_mb_id *mb_info; if (router->vm->status == VM_STATUS_RUNNING) { vm_error(router->vm,"unable to change mainboard type when online.\n"); return(-1); } if (!(mb_info = c1700_get_mb_info(mainboard_type))) { vm_error(router->vm,"unknown mainboard '%s'\n",mainboard_type); return(-1); } router->mainboard_type = mainboard_type; /* Set the cookie */ memcpy(router->vm->chassis_cookie, eeprom_c1700_mb_data,sizeof(eeprom_c1700_mb_data)); router->vm->chassis_cookie[6] = mb_info->id; /* Set the chassis base MAC address */ c1700_burn_mac_addr(router,&router->mac_addr); /* Set the mainboard driver */ if (vm_slot_active(router->vm,0,0)) vm_slot_remove_binding(router->vm,0,0); vm_slot_add_binding(router->vm,mb_info->mb_driver,0,0); c1700_refresh_systemid(router); return(0); }
/* Create a Network Module (command line) */ int vm_slot_cmd_create(vm_instance_t *vm,char *str) { char *tokens[SLOT_DESC_MAX_TOKENS]; int i,count,res; u_int slot_id,port_id; /* A port adapter description is like "1:0:NM-1FE" */ count = m_strsplit(str,':',tokens,SLOT_DESC_MAX_TOKENS); if ((count < 2) || (count > 3)) { vm_error(vm,"unable to parse slot description '%s'.\n",str); return(-1); } /* Parse the slot id */ slot_id = atoi(tokens[0]); /* Parse the sub-slot id */ if (count == 3) port_id = atoi(tokens[1]); else port_id = 0; /* Add this new slot to the current slot list */ res = vm_slot_add_binding(vm,tokens[count-1],slot_id,port_id); /* The complete array was cleaned by strsplit */ for(i=0;i<SLOT_DESC_MAX_TOKENS;i++) free(tokens[i]); return(res); }
/* Initialize default parameters for a C3725 */ static void c3725_init_defaults(c3725_t *router) { vm_instance_t *vm = router->vm; n_eth_addr_t *m; m_uint16_t pid; /* Set platform slots characteristics */ vm->nr_slots = C3725_MAX_NM_BAYS; vm->slots_type = CISCO_CARD_TYPE_NM; vm->slots_drivers = nm_drivers; pid = (m_uint16_t)getpid(); /* Generate a chassis MAC address based on the instance ID */ m = &router->mac_addr; m->eth_addr_byte[0] = vm_get_mac_addr_msb(vm); m->eth_addr_byte[1] = vm->instance_id & 0xFF; m->eth_addr_byte[2] = pid >> 8; m->eth_addr_byte[3] = pid & 0xFF; m->eth_addr_byte[4] = 0x00; m->eth_addr_byte[5] = 0x00; router->board_id[0] = 0x00; c3725_init_eeprom_groups(router); cisco_eeprom_copy(&router->mb_eeprom,&eeprom_c3725_mainboard); c3725_burn_mac_addr(router,&router->mac_addr); /* The GT96100 system controller has 2 integrated FastEthernet ports */ vm_slot_add_binding(vm,"GT96100-FE",0,0); vm->ram_mmap = C3725_DEFAULT_RAM_MMAP; vm->ram_size = C3725_DEFAULT_RAM_SIZE; vm->rom_size = C3725_DEFAULT_ROM_SIZE; vm->nvram_size = C3725_DEFAULT_NVRAM_SIZE; vm->conf_reg_setup = C3725_DEFAULT_CONF_REG; vm->clock_divisor = C3725_DEFAULT_CLOCK_DIV; vm->nvram_rom_space = C3725_NVRAM_ROM_RES_SIZE; vm->nm_iomem_size = C3725_DEFAULT_IOMEM_SIZE; vm->pcmcia_disk_size[0] = C3725_DEFAULT_DISK0_SIZE; vm->pcmcia_disk_size[1] = C3725_DEFAULT_DISK1_SIZE; }
/* 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); }