Annotation of qemu/roms/ipxe/src/hci/commands/fcmgmt_cmd.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (C) 2010 Michael Brown <[email protected]>.
                      3:  *
                      4:  * This program is free software; you can redistribute it and/or
                      5:  * modify it under the terms of the GNU General Public License as
                      6:  * published by the Free Software Foundation; either version 2 of the
                      7:  * License, or any later version.
                      8:  *
                      9:  * This program is distributed in the hope that it will be useful, but
                     10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     12:  * General Public License for more details.
                     13:  *
                     14:  * You should have received a copy of the GNU General Public License
                     15:  * along with this program; if not, write to the Free Software
                     16:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     17:  */
                     18: 
                     19: FILE_LICENCE ( GPL2_OR_LATER );
                     20: 
                     21: #include <stdio.h>
                     22: #include <errno.h>
                     23: #include <getopt.h>
                     24: #include <strings.h>
                     25: #include <ipxe/fc.h>
                     26: #include <ipxe/fcels.h>
                     27: #include <ipxe/command.h>
                     28: #include <ipxe/parseopt.h>
                     29: #include <ipxe/tables.h>
                     30: #include <usr/fcmgmt.h>
                     31: 
                     32: /** @file
                     33:  *
                     34:  * Fibre Channel management commands
                     35:  *
                     36:  */
                     37: 
                     38: /**
                     39:  * Parse Fibre Channel port name
                     40:  *
                     41:  * @v text             Text
                     42:  * @ret port           Fibre Channel port
                     43:  * @ret rc             Return status code
                     44:  */
                     45: static int parse_fc_port ( const char *text, struct fc_port **port ) {
                     46: 
                     47:        /* Sanity check */
                     48:        assert ( text != NULL );
                     49: 
                     50:        /* Find Fibre Channel port */
                     51:        *port = fc_port_find ( text );
                     52:        if ( ! *port ) {
                     53:                printf ( "\"%s\": no such port\n", text );
                     54:                return -ENODEV;
                     55:        }
                     56: 
                     57:        return 0;
                     58: }
                     59: 
                     60: /**
                     61:  * Parse Fibre Channel port ID
                     62:  *
                     63:  * @v text             Text
                     64:  * @ret port_id                Fibre Channel port ID
                     65:  * @ret rc             Return status code
                     66:  */
                     67: static int parse_fc_port_id ( const char *text, struct fc_port_id *port_id ) {
                     68:        int rc;
                     69: 
                     70:        /* Sanity check */
                     71:        assert ( text != NULL );
                     72: 
                     73:        /* Parse port ID */
                     74:        if ( ( rc = fc_id_aton ( text, port_id ) ) != 0 ) {
                     75:                printf ( "\"%s\": invalid port ID\n", text );
                     76:                return -EINVAL;
                     77:        }
                     78: 
                     79:        return 0;
                     80: }
                     81: 
                     82: /**
                     83:  * Parse Fibre Channel ELS handler name
                     84:  *
                     85:  * @v text             Text
                     86:  * @ret handler                Fibre Channel ELS handler
                     87:  * @ret rc             Return status code
                     88:  */
                     89: static int parse_fc_els_handler ( const char *text,
                     90:                                  struct fc_els_handler **handler ) {
                     91: 
                     92:        for_each_table_entry ( (*handler), FC_ELS_HANDLERS ) {
                     93:                if ( strcasecmp ( (*handler)->name, text ) == 0 )
                     94:                        return 0;
                     95:        }
                     96: 
                     97:        printf ( "\"%s\": unrecognised ELS\n", text );
                     98:        return -ENOENT;
                     99: }
                    100: 
                    101: /** "fcstat" options */
                    102: struct fcstat_options {};
                    103: 
                    104: /** "fcstat" option list */
                    105: static struct option_descriptor fcstat_opts[] = {};
                    106: 
                    107: /** "fcstat" command descriptor */
                    108: static struct command_descriptor fcstat_cmd =
                    109:        COMMAND_DESC ( struct fcstat_options, fcstat_opts, 0, 0, "" );
                    110: 
                    111: /**
                    112:  * The "fcstat" command
                    113:  *
                    114:  * @v argc             Argument count
                    115:  * @v argv             Argument list
                    116:  * @ret rc             Return status code
                    117:  */
                    118: static int fcstat_exec ( int argc, char **argv ) {
                    119:        struct fcstat_options opts;
                    120:        struct fc_port *port;
                    121:        struct fc_peer *peer;
                    122:        int rc;
                    123: 
                    124:        /* Parse options */
                    125:        if ( ( rc = parse_options ( argc, argv, &fcstat_cmd, &opts ) ) != 0 )
                    126:                return rc;
                    127: 
                    128:        list_for_each_entry ( port, &fc_ports, list )
                    129:                fcportstat ( port );
                    130:        list_for_each_entry ( peer, &fc_peers, list )
                    131:                fcpeerstat ( peer );
                    132: 
                    133:        return 0;
                    134: }
                    135: 
                    136: /** "fcels" options */
                    137: struct fcels_options {
                    138:        /** Fibre Channel port */
                    139:        struct fc_port *port;
                    140:        /** Fibre Channel peer port ID */
                    141:        struct fc_port_id peer_port_id;
                    142: };
                    143: 
                    144: /** "fcels" option list */
                    145: static struct option_descriptor fcels_opts[] = {
                    146:        OPTION_DESC ( "port", 'p', required_argument,
                    147:                      struct fcels_options, port, parse_fc_port ),
                    148:        OPTION_DESC ( "id", 'i', required_argument,
                    149:                      struct fcels_options, peer_port_id, parse_fc_port_id ),
                    150: };
                    151: 
                    152: /** "fcels" command descriptor */
                    153: static struct command_descriptor fcels_cmd =
                    154:        COMMAND_DESC ( struct fcels_options, fcels_opts, 1, 1,
                    155:                       "[--port <port>] [--id <peer port id>] <request>" );
                    156: 
                    157: /**
                    158:  * The "fcels" command
                    159:  *
                    160:  * @v argc             Argument count
                    161:  * @v argv             Argument list
                    162:  * @ret rc             Return status code
                    163:  */
                    164: static int fcels_exec ( int argc, char **argv ) {
                    165:        struct fcels_options opts;
                    166:        struct fc_els_handler *handler;
                    167:        struct fc_port_id *id;
                    168:        int rc;
                    169: 
                    170:        /* Parse options */
                    171:        if ( ( rc = parse_options ( argc, argv, &fcels_cmd, &opts ) ) != 0 )
                    172:                return rc;
                    173: 
                    174:        /* Parse ELS handler */
                    175:        if ( ( rc = parse_fc_els_handler ( argv[optind], &handler ) ) != 0 )
                    176:                return rc;
                    177: 
                    178:        /* Use first port if no port specified */
                    179:        if ( ! opts.port ) {
                    180:                opts.port = list_first_entry ( &fc_ports, struct fc_port,
                    181:                                               list );
                    182:                if ( ! opts.port ) {
                    183:                        printf ( "No ports\n" );
                    184:                        return -ENODEV;
                    185:                }
                    186:        }
                    187: 
                    188:        /* Use link peer port ID if no peer port ID specified */
                    189:        id = &opts.peer_port_id;
                    190:        if ( memcmp ( id, &fc_empty_port_id, sizeof ( *id ) ) == 0 ) {
                    191:                if ( fc_link_ok ( &opts.port->link ) &&
                    192:                     ! ( opts.port->flags & FC_PORT_HAS_FABRIC ) ) {
                    193:                        id = &opts.port->ptp_link_port_id;
                    194:                } else {
                    195:                        id = &fc_f_port_id;
                    196:                }
                    197:        }
                    198: 
                    199:        /** Issue ELS */
                    200:        if ( ( rc = fcels ( opts.port, id, handler ) ) != 0 )
                    201:                return rc;
                    202: 
                    203:        return 0;
                    204: }
                    205: 
                    206: /** Fibre Channel management commands */
                    207: struct command fcmgmt_commands[] __command = {
                    208:        {
                    209:                .name = "fcstat",
                    210:                .exec = fcstat_exec,
                    211:        },
                    212:        {
                    213:                .name = "fcels",
                    214:                .exec = fcels_exec,
                    215:        },
                    216: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.