41 |
#include "registry.h" |
#include "registry.h" |
42 |
#include "hypervisor.h" |
#include "hypervisor.h" |
43 |
|
|
|
/* Create a C2691 instance */ |
|
|
static int cmd_create(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
c2691_t *router; |
|
|
|
|
|
if (!(router = c2691_create_instance(argv[0],atoi(argv[1])))) { |
|
|
hypervisor_send_reply(conn,HSC_ERR_CREATE,1, |
|
|
"unable to create C2691 instance '%s'", |
|
|
argv[0]); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
router->vm->vtty_con_type = VTTY_TYPE_NONE; |
|
|
router->vm->vtty_aux_type = VTTY_TYPE_NONE; |
|
|
|
|
|
vm_release(router->vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"C2691 '%s' created",argv[0]); |
|
|
return(0); |
|
|
} |
|
|
|
|
|
/* Delete a C2691 instance */ |
|
|
static int cmd_delete(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
int res; |
|
|
|
|
|
res = c2691_delete_instance(argv[0]); |
|
|
|
|
|
if (res == 1) { |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"C2691 '%s' deleted",argv[0]); |
|
|
} else { |
|
|
hypervisor_send_reply(conn,HSC_ERR_DELETE,1, |
|
|
"unable to delete C2691 '%s'",argv[0]); |
|
|
} |
|
|
|
|
|
return(res); |
|
|
} |
|
|
|
|
44 |
/* Set the I/O mem size */ |
/* Set the I/O mem size */ |
45 |
static int cmd_set_iomem(hypervisor_conn_t *conn,int argc,char *argv[]) |
static int cmd_set_iomem(hypervisor_conn_t *conn,int argc,char *argv[]) |
46 |
{ |
{ |
47 |
vm_instance_t *vm; |
vm_instance_t *vm; |
48 |
|
|
49 |
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
if (!(vm = hypervisor_find_vm(conn,argv[0]))) |
50 |
return(-1); |
return(-1); |
51 |
|
|
52 |
VM_C2691(vm)->nm_iomem_size = 0x8000 | atoi(optarg); |
vm->nm_iomem_size = 0x8000 | atoi(argv[1]); |
53 |
|
|
54 |
vm_release(vm); |
vm_release(vm); |
55 |
hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); |
hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); |
61 |
{ |
{ |
62 |
vm_instance_t *vm; |
vm_instance_t *vm; |
63 |
|
|
64 |
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
if (!(vm = hypervisor_find_vm(conn,argv[0]))) |
65 |
return(-1); |
return(-1); |
66 |
|
|
67 |
if ((c2691_chassis_set_mac_addr(VM_C2691(vm),argv[1])) == -1) { |
if ((c2691_chassis_set_mac_addr(VM_C2691(vm),argv[1])) == -1) { |
77 |
return(0); |
return(0); |
78 |
} |
} |
79 |
|
|
|
/* Start a C2691 instance */ |
|
|
static int cmd_start(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
|
|
|
if (router->vm->vtty_con_type == VTTY_TYPE_NONE) { |
|
|
hypervisor_send_reply(conn,HSC_INFO_MSG,0, |
|
|
"Warning: no console port defined for " |
|
|
"C2691 '%s'",argv[0]); |
|
|
} |
|
|
|
|
|
if (c2691_init_instance(router) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_START,1, |
|
|
"unable to start instance '%s'", |
|
|
argv[0]); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"C2691 '%s' started",argv[0]); |
|
|
return(0); |
|
|
} |
|
|
|
|
|
/* Stop a C2691 instance */ |
|
|
static int cmd_stop(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
|
|
|
if (c2691_stop_instance(router) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_STOP,1, |
|
|
"unable to stop instance '%s'", |
|
|
argv[0]); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"C2691 '%s' stopped",argv[0]); |
|
|
return(0); |
|
|
} |
|
|
|
|
|
/* Show NM bindings */ |
|
|
static int cmd_nm_bindings(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
char *nm_type; |
|
|
int i; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
|
|
|
for(i=0;i<C2691_MAX_NM_BAYS;i++) { |
|
|
nm_type = c2691_nm_get_type(router,i); |
|
|
if (nm_type) |
|
|
hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%u: %s",i,nm_type); |
|
|
} |
|
|
|
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); |
|
|
return(0); |
|
|
} |
|
|
|
|
|
/* Show NM NIO bindings */ |
|
|
static int cmd_nm_nio_bindings(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
struct c2691_nio_binding *nb; |
|
|
struct c2691_nm_bay *bay; |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
u_int nm_bay; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
nm_bay = atoi(argv[1]); |
|
|
|
|
|
if (!(bay = c2691_nm_get_info(router,nm_bay))) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_UNK_OBJ,1,"Invalid slot %u",nm_bay); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
for(nb=bay->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 NM binding for the specified slot */ |
|
|
static int cmd_add_nm_binding(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
u_int nm_bay; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
nm_bay = atoi(argv[1]); |
|
|
|
|
|
if (c2691_nm_add_binding(router,argv[2],nm_bay) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_BINDING,1, |
|
|
"C2691 %s: unable to add NM binding for slot %u", |
|
|
argv[0],nm_bay); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); |
|
|
return(0); |
|
|
} |
|
|
|
|
|
/* Remove a NM binding for the specified slot */ |
|
|
static int cmd_remove_nm_binding(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
u_int nm_bay; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
nm_bay = atoi(argv[1]); |
|
|
|
|
|
if (c2691_nm_remove_binding(router,nm_bay) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_BINDING,1, |
|
|
"C2691 %s: unable to remove NM binding for " |
|
|
"slot %u",argv[0],nm_bay); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); |
|
|
return(0); |
|
|
} |
|
|
|
|
|
/* Add a NIO binding to the specified slot/port */ |
|
|
static int cmd_add_nio_binding(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
u_int nm_bay,port_id; |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
|
|
|
nm_bay = atoi(argv[1]); |
|
|
port_id = atoi(argv[2]); |
|
|
|
|
|
if (c2691_nm_add_nio_binding(router,nm_bay,port_id,argv[3]) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_BINDING,1, |
|
|
"C2691 %s: unable to add NIO binding for " |
|
|
"interface %u/%u",argv[0],nm_bay,port_id); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); |
|
|
return(0); |
|
|
} |
|
|
|
|
|
/* Remove a NIO binding from the specified slot/port */ |
|
|
static int cmd_remove_nio_binding(hypervisor_conn_t *conn, |
|
|
int argc,char *argv[]) |
|
|
{ |
|
|
u_int nm_bay,port_id; |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
|
|
|
nm_bay = atoi(argv[1]); |
|
|
port_id = atoi(argv[2]); |
|
|
|
|
|
if (c2691_nm_remove_nio_binding(router,nm_bay,port_id) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_BINDING,1, |
|
|
"C2691 %s: unable to remove NIO binding for " |
|
|
"interface %u/%u",argv[0],nm_bay,port_id); |
|
|
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_nm_enable_nio(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
u_int nm_bay,port_id; |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
|
|
|
nm_bay = atoi(argv[1]); |
|
|
port_id = atoi(argv[2]); |
|
|
|
|
|
if (c2691_nm_enable_nio(router,nm_bay,port_id) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_BINDING,1, |
|
|
"C2691 %s: unable to enable NIO for " |
|
|
"interface %u/%u",argv[0],nm_bay,port_id); |
|
|
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_nm_disable_nio(hypervisor_conn_t *conn,int argc,char *argv[]) |
|
|
{ |
|
|
u_int nm_bay,port_id; |
|
|
vm_instance_t *vm; |
|
|
c2691_t *router; |
|
|
|
|
|
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
|
|
return(-1); |
|
|
|
|
|
router = VM_C2691(vm); |
|
|
|
|
|
nm_bay = atoi(argv[1]); |
|
|
port_id = atoi(argv[2]); |
|
|
|
|
|
if (c2691_nm_disable_nio(router,nm_bay,port_id) == -1) { |
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_ERR_BINDING,1, |
|
|
"C2691 %s: unable to unset NIO for " |
|
|
"interface %u/%u", |
|
|
argv[0],nm_bay,port_id); |
|
|
return(-1); |
|
|
} |
|
|
|
|
|
vm_release(vm); |
|
|
hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); |
|
|
return(0); |
|
|
} |
|
|
|
|
80 |
/* Show C2691 hardware */ |
/* Show C2691 hardware */ |
81 |
static int cmd_show_hardware(hypervisor_conn_t *conn,int argc,char *argv[]) |
static int cmd_show_hardware(hypervisor_conn_t *conn,int argc,char *argv[]) |
82 |
{ |
{ |
83 |
vm_instance_t *vm; |
vm_instance_t *vm; |
84 |
c2691_t *router; |
c2691_t *router; |
85 |
|
|
86 |
if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C2691))) |
if (!(vm = hypervisor_find_vm(conn,argv[0]))) |
87 |
return(-1); |
return(-1); |
88 |
|
|
89 |
router = VM_C2691(vm); |
router = VM_C2691(vm); |
100 |
hypervisor_conn_t *conn = opt; |
hypervisor_conn_t *conn = opt; |
101 |
vm_instance_t *vm = entry->data; |
vm_instance_t *vm = entry->data; |
102 |
|
|
103 |
if (vm->type == VM_TYPE_C2691) |
if (vm->platform == conn->cur_module->opt) |
104 |
hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%s",entry->name); |
hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%s",entry->name); |
105 |
} |
} |
106 |
|
|
115 |
|
|
116 |
/* C2691 commands */ |
/* C2691 commands */ |
117 |
static hypervisor_cmd_t c2691_cmd_array[] = { |
static hypervisor_cmd_t c2691_cmd_array[] = { |
|
{ "create", 2, 2, cmd_create, NULL }, |
|
|
{ "delete", 1, 1, cmd_delete, NULL }, |
|
118 |
{ "set_iomem", 2, 2, cmd_set_iomem, NULL }, |
{ "set_iomem", 2, 2, cmd_set_iomem, NULL }, |
119 |
{ "set_mac_addr", 2, 2, cmd_set_mac_addr, NULL }, |
{ "set_mac_addr", 2, 2, cmd_set_mac_addr, NULL }, |
|
{ "start", 1, 1, cmd_start, NULL }, |
|
|
{ "stop", 1, 1, cmd_stop, NULL }, |
|
|
{ "nm_bindings", 1, 1, cmd_nm_bindings, NULL }, |
|
|
{ "nm_nio_bindings", 2, 2, cmd_nm_nio_bindings, NULL }, |
|
|
{ "add_nm_binding", 3, 3, cmd_add_nm_binding, NULL }, |
|
|
{ "remove_nm_binding", 2, 2, cmd_remove_nm_binding, NULL }, |
|
|
{ "add_nio_binding", 4, 4, cmd_add_nio_binding, NULL }, |
|
|
{ "remove_nio_binding", 3, 3, cmd_remove_nio_binding, NULL }, |
|
|
{ "nm_enable_nio", 3, 3, cmd_nm_enable_nio, NULL }, |
|
|
{ "nm_disable_nio", 3, 3, cmd_nm_disable_nio, NULL }, |
|
120 |
{ "show_hardware", 1, 1, cmd_show_hardware, NULL }, |
{ "show_hardware", 1, 1, cmd_show_hardware, NULL }, |
121 |
{ "list", 0, 0, cmd_c2691_list, NULL }, |
{ "list", 0, 0, cmd_c2691_list, NULL }, |
122 |
{ NULL, -1, -1, NULL, NULL }, |
{ NULL, -1, -1, NULL, NULL }, |
123 |
}; |
}; |
124 |
|
|
125 |
/* Hypervisor C2691 initialization */ |
/* Hypervisor C2691 initialization */ |
126 |
int hypervisor_c2691_init(void) |
int hypervisor_c2691_init(vm_platform_t *platform) |
127 |
{ |
{ |
128 |
hypervisor_module_t *module; |
hypervisor_module_t *module; |
129 |
|
|
130 |
module = hypervisor_register_module("c2691"); |
module = hypervisor_register_module(platform->name,platform); |
131 |
assert(module != NULL); |
assert(module != NULL); |
132 |
|
|
133 |
hypervisor_register_cmd_array(module,c2691_cmd_array); |
hypervisor_register_cmd_array(module,c2691_cmd_array); |