|
|
1.1 ! root 1: /* ! 2: * Cisco 7200 (Predator) simulation platform. ! 3: * Copyright (c) 2006 Christophe Fillot ([email protected]) ! 4: * ! 5: * Hypervisor C7200 routines. ! 6: */ ! 7: ! 8: #include <stdio.h> ! 9: #include <stdlib.h> ! 10: #include <unistd.h> ! 11: #include <string.h> ! 12: #include <sys/types.h> ! 13: #include <sys/stat.h> ! 14: #include <sys/mman.h> ! 15: #include <signal.h> ! 16: #include <fcntl.h> ! 17: #include <errno.h> ! 18: #include <assert.h> ! 19: #include <stdarg.h> ! 20: #include <sys/ioctl.h> ! 21: #include <sys/types.h> ! 22: #include <sys/socket.h> ! 23: #include <arpa/inet.h> ! 24: #include <pthread.h> ! 25: ! 26: #include "mips64.h" ! 27: #include "dynamips.h" ! 28: #include "device.h" ! 29: #include "dev_c7200.h" ! 30: #include "dev_vtty.h" ! 31: #include "utils.h" ! 32: #include "net.h" ! 33: #include "atm.h" ! 34: #include "frame_relay.h" ! 35: #include "crc.h" ! 36: #include "net_io.h" ! 37: #include "net_io_bridge.h" ! 38: #ifdef GEN_ETH ! 39: #include "gen_eth.h" ! 40: #endif ! 41: #include "registry.h" ! 42: #include "hypervisor.h" ! 43: ! 44: /* Create a C7200 instance */ ! 45: static int cmd_create(hypervisor_conn_t *conn,int argc,char *argv[]) ! 46: { ! 47: c7200_t *router; ! 48: ! 49: if (!(router = c7200_create_instance(argv[0],atoi(argv[1])))) { ! 50: hypervisor_send_reply(conn,HSC_ERR_CREATE,1, ! 51: "unable to create C7200 instance '%s'", ! 52: argv[0]); ! 53: return(-1); ! 54: } ! 55: ! 56: router->vm->vtty_con_type = VTTY_TYPE_NONE; ! 57: router->vm->vtty_aux_type = VTTY_TYPE_NONE; ! 58: ! 59: vm_release(router->vm); ! 60: hypervisor_send_reply(conn,HSC_INFO_OK,1,"C7200 '%s' created",argv[0]); ! 61: return(0); ! 62: } ! 63: ! 64: /* Delete a C7200 instance */ ! 65: static int cmd_delete(hypervisor_conn_t *conn,int argc,char *argv[]) ! 66: { ! 67: int res; ! 68: ! 69: res = c7200_delete_instance(argv[0]); ! 70: ! 71: if (res == 1) { ! 72: hypervisor_send_reply(conn,HSC_INFO_OK,1,"C7200 '%s' deleted",argv[0]); ! 73: } else { ! 74: hypervisor_send_reply(conn,HSC_ERR_DELETE,1, ! 75: "unable to delete C7200 '%s'",argv[0]); ! 76: } ! 77: ! 78: return(res); ! 79: } ! 80: ! 81: /* Set the NPE type */ ! 82: static int cmd_set_npe(hypervisor_conn_t *conn,int argc,char *argv[]) ! 83: { ! 84: vm_instance_t *vm; ! 85: ! 86: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 87: return(-1); ! 88: ! 89: if ((c7200_npe_set_type(VM_C7200(vm),argv[1])) == -1) { ! 90: vm_release(vm); ! 91: hypervisor_send_reply(conn,HSC_ERR_CREATE,1, ! 92: "unable to set NPE type for router '%s'", ! 93: argv[0]); ! 94: return(-1); ! 95: } ! 96: ! 97: vm_release(vm); ! 98: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 99: return(0); ! 100: } ! 101: ! 102: /* Set the Midplane type */ ! 103: static int cmd_set_midplane(hypervisor_conn_t *conn,int argc,char *argv[]) ! 104: { ! 105: vm_instance_t *vm; ! 106: ! 107: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 108: return(-1); ! 109: ! 110: if ((c7200_midplane_set_type(VM_C7200(vm),argv[1])) == -1) { ! 111: vm_release(vm); ! 112: hypervisor_send_reply(conn,HSC_ERR_CREATE,1, ! 113: "unable to set Midplane type for router '%s'", ! 114: argv[0]); ! 115: return(-1); ! 116: } ! 117: ! 118: vm_release(vm); ! 119: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 120: return(0); ! 121: } ! 122: ! 123: /* Set the base MAC address for the chassis */ ! 124: static int cmd_set_mac_addr(hypervisor_conn_t *conn,int argc,char *argv[]) ! 125: { ! 126: vm_instance_t *vm; ! 127: ! 128: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 129: return(-1); ! 130: ! 131: if ((c7200_midplane_set_mac_addr(VM_C7200(vm),argv[1])) == -1) { ! 132: vm_release(vm); ! 133: hypervisor_send_reply(conn,HSC_ERR_CREATE,1, ! 134: "unable to set MAC address for router '%s'", ! 135: argv[0]); ! 136: return(-1); ! 137: } ! 138: ! 139: vm_release(vm); ! 140: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 141: return(0); ! 142: } ! 143: ! 144: /* Start a C7200 instance */ ! 145: static int cmd_start(hypervisor_conn_t *conn,int argc,char *argv[]) ! 146: { ! 147: vm_instance_t *vm; ! 148: c7200_t *router; ! 149: ! 150: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 151: return(-1); ! 152: ! 153: router = VM_C7200(vm); ! 154: ! 155: if (router->vm->vtty_con_type == VTTY_TYPE_NONE) { ! 156: hypervisor_send_reply(conn,HSC_INFO_MSG,0, ! 157: "Warning: no console port defined for " ! 158: "C7200 '%s'",argv[0]); ! 159: } ! 160: ! 161: if (c7200_init_instance(router) == -1) { ! 162: vm_release(vm); ! 163: hypervisor_send_reply(conn,HSC_ERR_START,1, ! 164: "unable to start instance '%s'", ! 165: argv[0]); ! 166: return(-1); ! 167: } ! 168: ! 169: vm_release(vm); ! 170: hypervisor_send_reply(conn,HSC_INFO_OK,1,"C7200 '%s' started",argv[0]); ! 171: return(0); ! 172: } ! 173: ! 174: /* Stop a C7200 instance */ ! 175: static int cmd_stop(hypervisor_conn_t *conn,int argc,char *argv[]) ! 176: { ! 177: vm_instance_t *vm; ! 178: c7200_t *router; ! 179: ! 180: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 181: return(-1); ! 182: ! 183: router = VM_C7200(vm); ! 184: ! 185: if (c7200_stop_instance(router) == -1) { ! 186: vm_release(vm); ! 187: hypervisor_send_reply(conn,HSC_ERR_STOP,1, ! 188: "unable to stop instance '%s'", ! 189: argv[0]); ! 190: return(-1); ! 191: } ! 192: ! 193: vm_release(vm); ! 194: hypervisor_send_reply(conn,HSC_INFO_OK,1,"C7200 '%s' stopped",argv[0]); ! 195: return(0); ! 196: } ! 197: ! 198: /* Show PA bindings */ ! 199: static int cmd_pa_bindings(hypervisor_conn_t *conn,int argc,char *argv[]) ! 200: { ! 201: vm_instance_t *vm; ! 202: c7200_t *router; ! 203: char *pa_type; ! 204: int i; ! 205: ! 206: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 207: return(-1); ! 208: ! 209: router = VM_C7200(vm); ! 210: ! 211: for(i=0;i<C7200_MAX_PA_BAYS;i++) { ! 212: pa_type = c7200_pa_get_type(router,i); ! 213: if (pa_type) ! 214: hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%u: %s",i,pa_type); ! 215: } ! 216: ! 217: vm_release(vm); ! 218: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 219: return(0); ! 220: } ! 221: ! 222: /* Show PA NIO bindings */ ! 223: static int cmd_pa_nio_bindings(hypervisor_conn_t *conn,int argc,char *argv[]) ! 224: { ! 225: struct c7200_nio_binding *nb; ! 226: struct c7200_pa_bay *bay; ! 227: vm_instance_t *vm; ! 228: c7200_t *router; ! 229: u_int pa_bay; ! 230: ! 231: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 232: return(-1); ! 233: ! 234: router = VM_C7200(vm); ! 235: pa_bay = atoi(argv[1]); ! 236: ! 237: if (!(bay = c7200_pa_get_info(router,pa_bay))) { ! 238: vm_release(vm); ! 239: hypervisor_send_reply(conn,HSC_ERR_UNK_OBJ,1,"Invalid slot %u",pa_bay); ! 240: return(-1); ! 241: } ! 242: ! 243: for(nb=bay->nio_list;nb;nb=nb->next) ! 244: hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%u: %s", ! 245: nb->port_id,nb->nio->name); ! 246: ! 247: vm_release(vm); ! 248: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 249: return(0); ! 250: } ! 251: ! 252: /* Add a PA binding for the specified slot */ ! 253: static int cmd_add_pa_binding(hypervisor_conn_t *conn,int argc,char *argv[]) ! 254: { ! 255: vm_instance_t *vm; ! 256: c7200_t *router; ! 257: u_int pa_bay; ! 258: ! 259: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 260: return(-1); ! 261: ! 262: router = VM_C7200(vm); ! 263: pa_bay = atoi(argv[1]); ! 264: ! 265: if (c7200_pa_add_binding(router,argv[2],pa_bay) == -1) { ! 266: vm_release(vm); ! 267: hypervisor_send_reply(conn,HSC_ERR_BINDING,1, ! 268: "C7200 %s: unable to add PA binding for slot %u", ! 269: argv[0],pa_bay); ! 270: return(-1); ! 271: } ! 272: ! 273: vm_release(vm); ! 274: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 275: return(0); ! 276: } ! 277: ! 278: /* Remove a PA binding for the specified slot */ ! 279: static int cmd_remove_pa_binding(hypervisor_conn_t *conn,int argc,char *argv[]) ! 280: { ! 281: vm_instance_t *vm; ! 282: c7200_t *router; ! 283: u_int pa_bay; ! 284: ! 285: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 286: return(-1); ! 287: ! 288: router = VM_C7200(vm); ! 289: pa_bay = atoi(argv[1]); ! 290: ! 291: if (c7200_pa_remove_binding(router,pa_bay) == -1) { ! 292: vm_release(vm); ! 293: hypervisor_send_reply(conn,HSC_ERR_BINDING,1, ! 294: "C7200 %s: unable to remove PA binding for " ! 295: "slot %u",argv[0],pa_bay); ! 296: return(-1); ! 297: } ! 298: ! 299: vm_release(vm); ! 300: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 301: return(0); ! 302: } ! 303: ! 304: /* Add a NIO binding to the specified slot/port */ ! 305: static int cmd_add_nio_binding(hypervisor_conn_t *conn,int argc,char *argv[]) ! 306: { ! 307: u_int pa_bay,port_id; ! 308: vm_instance_t *vm; ! 309: c7200_t *router; ! 310: ! 311: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 312: return(-1); ! 313: ! 314: router = VM_C7200(vm); ! 315: ! 316: pa_bay = atoi(argv[1]); ! 317: port_id = atoi(argv[2]); ! 318: ! 319: if (c7200_pa_add_nio_binding(router,pa_bay,port_id,argv[3]) == -1) { ! 320: vm_release(vm); ! 321: hypervisor_send_reply(conn,HSC_ERR_BINDING,1, ! 322: "C7200 %s: unable to add NIO binding for " ! 323: "interface %u/%u",argv[0],pa_bay,port_id); ! 324: return(-1); ! 325: } ! 326: ! 327: vm_release(vm); ! 328: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 329: return(0); ! 330: } ! 331: ! 332: /* Remove a NIO binding from the specified slot/port */ ! 333: static int cmd_remove_nio_binding(hypervisor_conn_t *conn, ! 334: int argc,char *argv[]) ! 335: { ! 336: u_int pa_bay,port_id; ! 337: vm_instance_t *vm; ! 338: c7200_t *router; ! 339: ! 340: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 341: return(-1); ! 342: ! 343: router = VM_C7200(vm); ! 344: ! 345: pa_bay = atoi(argv[1]); ! 346: port_id = atoi(argv[2]); ! 347: ! 348: if (c7200_pa_remove_nio_binding(router,pa_bay,port_id) == -1) { ! 349: vm_release(vm); ! 350: hypervisor_send_reply(conn,HSC_ERR_BINDING,1, ! 351: "C7200 %s: unable to remove NIO binding for " ! 352: "interface %u/%u",argv[0],pa_bay,port_id); ! 353: return(-1); ! 354: } ! 355: ! 356: vm_release(vm); ! 357: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 358: return(0); ! 359: } ! 360: ! 361: /* Enable NIO of the specified slot/port */ ! 362: static int cmd_pa_enable_nio(hypervisor_conn_t *conn,int argc,char *argv[]) ! 363: { ! 364: u_int pa_bay,port_id; ! 365: vm_instance_t *vm; ! 366: c7200_t *router; ! 367: ! 368: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 369: return(-1); ! 370: ! 371: router = VM_C7200(vm); ! 372: ! 373: pa_bay = atoi(argv[1]); ! 374: port_id = atoi(argv[2]); ! 375: ! 376: if (c7200_pa_enable_nio(router,pa_bay,port_id) == -1) { ! 377: vm_release(vm); ! 378: hypervisor_send_reply(conn,HSC_ERR_BINDING,1, ! 379: "C7200 %s: unable to enable NIO for " ! 380: "interface %u/%u",argv[0],pa_bay,port_id); ! 381: return(-1); ! 382: } ! 383: ! 384: vm_release(vm); ! 385: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 386: return(0); ! 387: } ! 388: ! 389: /* Disable NIO of the specified slot/port */ ! 390: static int cmd_pa_disable_nio(hypervisor_conn_t *conn,int argc,char *argv[]) ! 391: { ! 392: u_int pa_bay,port_id; ! 393: vm_instance_t *vm; ! 394: c7200_t *router; ! 395: ! 396: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 397: return(-1); ! 398: ! 399: router = VM_C7200(vm); ! 400: ! 401: pa_bay = atoi(argv[1]); ! 402: port_id = atoi(argv[2]); ! 403: ! 404: if (c7200_pa_disable_nio(router,pa_bay,port_id) == -1) { ! 405: vm_release(vm); ! 406: hypervisor_send_reply(conn,HSC_ERR_BINDING,1, ! 407: "C7200 %s: unable to unset NIO for " ! 408: "interface %u/%u", ! 409: argv[0],pa_bay,port_id); ! 410: return(-1); ! 411: } ! 412: ! 413: vm_release(vm); ! 414: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 415: return(0); ! 416: } ! 417: ! 418: /* Initialize a PA while the router is running */ ! 419: static int cmd_pa_init_online(hypervisor_conn_t *conn,int argc,char *argv[]) ! 420: { ! 421: vm_instance_t *vm; ! 422: c7200_t *router; ! 423: u_int pa_bay; ! 424: ! 425: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 426: return(-1); ! 427: ! 428: router = VM_C7200(vm); ! 429: ! 430: pa_bay = atoi(argv[1]); ! 431: c7200_pa_init_online(router,pa_bay); ! 432: ! 433: vm_release(vm); ! 434: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 435: return(0); ! 436: } ! 437: ! 438: /* Stop a PA while the router is running */ ! 439: static int cmd_pa_stop_online(hypervisor_conn_t *conn,int argc,char *argv[]) ! 440: { ! 441: vm_instance_t *vm; ! 442: c7200_t *router; ! 443: u_int pa_bay; ! 444: ! 445: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 446: return(-1); ! 447: ! 448: router = VM_C7200(vm); ! 449: ! 450: pa_bay = atoi(argv[1]); ! 451: c7200_pa_stop_online(router,pa_bay); ! 452: ! 453: vm_release(vm); ! 454: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 455: return(0); ! 456: } ! 457: ! 458: /* Show C7200 hardware */ ! 459: static int cmd_show_hardware(hypervisor_conn_t *conn,int argc,char *argv[]) ! 460: { ! 461: vm_instance_t *vm; ! 462: c7200_t *router; ! 463: ! 464: if (!(vm = hypervisor_find_vm(conn,argv[0],VM_TYPE_C7200))) ! 465: return(-1); ! 466: ! 467: router = VM_C7200(vm); ! 468: c7200_show_hardware(router); ! 469: ! 470: vm_release(vm); ! 471: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 472: return(0); ! 473: } ! 474: ! 475: /* Show info about C7200 object */ ! 476: static void cmd_show_c7200_list(registry_entry_t *entry,void *opt,int *err) ! 477: { ! 478: hypervisor_conn_t *conn = opt; ! 479: vm_instance_t *vm = entry->data; ! 480: ! 481: if (vm->type == VM_TYPE_C7200) ! 482: hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%s",entry->name); ! 483: } ! 484: ! 485: /* C7200 List */ ! 486: static int cmd_c7200_list(hypervisor_conn_t *conn,int argc,char *argv[]) ! 487: { ! 488: int err = 0; ! 489: registry_foreach_type(OBJ_TYPE_VM,cmd_show_c7200_list,conn,&err); ! 490: hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK"); ! 491: return(0); ! 492: } ! 493: ! 494: /* C7200 commands */ ! 495: static hypervisor_cmd_t c7200_cmd_array[] = { ! 496: { "create", 2, 2, cmd_create, NULL }, ! 497: { "delete", 1, 1, cmd_delete, NULL }, ! 498: { "set_npe", 2, 2, cmd_set_npe, NULL }, ! 499: { "set_midplane", 2, 2, cmd_set_midplane, NULL }, ! 500: { "set_mac_addr", 2, 2, cmd_set_mac_addr, NULL }, ! 501: { "start", 1, 1, cmd_start, NULL }, ! 502: { "stop", 1, 1, cmd_stop, NULL }, ! 503: { "pa_bindings", 1, 1, cmd_pa_bindings, NULL }, ! 504: { "pa_nio_bindings", 2, 2, cmd_pa_nio_bindings, NULL }, ! 505: { "add_pa_binding", 3, 3, cmd_add_pa_binding, NULL }, ! 506: { "remove_pa_binding", 2, 2, cmd_remove_pa_binding, NULL }, ! 507: { "add_nio_binding", 4, 4, cmd_add_nio_binding, NULL }, ! 508: { "remove_nio_binding", 3, 3, cmd_remove_nio_binding, NULL }, ! 509: { "pa_enable_nio", 3, 3, cmd_pa_enable_nio, NULL }, ! 510: { "pa_disable_nio", 3, 3, cmd_pa_disable_nio, NULL }, ! 511: { "pa_init_online", 2, 2, cmd_pa_init_online, NULL }, ! 512: { "pa_stop_online", 2, 2, cmd_pa_stop_online, NULL }, ! 513: { "show_hardware", 1, 1, cmd_show_hardware, NULL }, ! 514: { "list", 0, 0, cmd_c7200_list, NULL }, ! 515: { NULL, -1, -1, NULL, NULL }, ! 516: }; ! 517: ! 518: /* Hypervisor C7200 initialization */ ! 519: int hypervisor_c7200_init(void) ! 520: { ! 521: hypervisor_module_t *module; ! 522: ! 523: module = hypervisor_register_module("c7200"); ! 524: assert(module != NULL); ! 525: ! 526: hypervisor_register_cmd_array(module,c7200_cmd_array); ! 527: return(0); ! 528: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.