iproute2/rdma/rdma.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
   2/*
   3 * rdma.c       RDMA tool
   4 * Authors:     Leon Romanovsky <leonro@mellanox.com>
   5 */
   6
   7#include "rdma.h"
   8#include "version.h"
   9#include "color.h"
  10
  11static void help(char *name)
  12{
  13        pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
  14               "       %s [ -f[orce] ] -b[atch] filename\n"
  15               "where  OBJECT := { dev | link | resource | system | statistic | help }\n"
  16               "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] -r[aw]}\n", name, name);
  17}
  18
  19static int cmd_help(struct rd *rd)
  20{
  21        help(rd->filename);
  22        return 0;
  23}
  24
  25static int rd_cmd(struct rd *rd, int argc, char **argv)
  26{
  27        const struct rd_cmd cmds[] = {
  28                { NULL,         cmd_help },
  29                { "help",       cmd_help },
  30                { "dev",        cmd_dev },
  31                { "link",       cmd_link },
  32                { "resource",   cmd_res },
  33                { "system",     cmd_sys },
  34                { "statistic",  cmd_stat },
  35                { 0 }
  36        };
  37
  38        rd->argc = argc;
  39        rd->argv = argv;
  40
  41        return rd_exec_cmd(rd, cmds, "object");
  42}
  43
  44static int rd_batch_cmd(int argc, char *argv[], void *data)
  45{
  46        struct rd *rd = data;
  47
  48        return rd_cmd(rd, argc, argv);
  49}
  50
  51static int rd_batch(struct rd *rd, const char *name, bool force)
  52{
  53        return do_batch(name, force, rd_batch_cmd, rd);
  54}
  55
  56static int rd_init(struct rd *rd, char *filename)
  57{
  58        uint32_t seq;
  59        int ret;
  60
  61        rd->filename = filename;
  62        INIT_LIST_HEAD(&rd->dev_map_list);
  63        INIT_LIST_HEAD(&rd->filter_list);
  64
  65        rd->buff = malloc(MNL_SOCKET_BUFFER_SIZE);
  66        if (!rd->buff)
  67                return -ENOMEM;
  68
  69        rd_prepare_msg(rd, RDMA_NLDEV_CMD_GET,
  70                       &seq, (NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP));
  71        ret = rd_send_msg(rd);
  72        if (ret)
  73                return ret;
  74
  75        return rd_recv_msg(rd, rd_dev_init_cb, rd, seq);
  76}
  77
  78static void rd_cleanup(struct rd *rd)
  79{
  80        rd_free(rd);
  81}
  82
  83int main(int argc, char **argv)
  84{
  85        static const struct option long_options[] = {
  86                { "version",            no_argument,            NULL, 'V' },
  87                { "help",               no_argument,            NULL, 'h' },
  88                { "json",               no_argument,            NULL, 'j' },
  89                { "pretty",             no_argument,            NULL, 'p' },
  90                { "details",            no_argument,            NULL, 'd' },
  91                { "raw",                no_argument,            NULL, 'r' },
  92                { "force",              no_argument,            NULL, 'f' },
  93                { "batch",              required_argument,      NULL, 'b' },
  94                { NULL, 0, NULL, 0 }
  95        };
  96        bool show_driver_details = false;
  97        const char *batch_file = NULL;
  98        bool show_details = false;
  99        bool json_output = false;
 100        bool show_raw = false;
 101        bool force = false;
 102        struct rd rd = {};
 103        char *filename;
 104        int opt;
 105        int err;
 106        filename = basename(argv[0]);
 107
 108        while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:",
 109                                  long_options, NULL)) >= 0) {
 110                switch (opt) {
 111                case 'V':
 112                        printf("%s utility, iproute2-%s\n",
 113                               filename, version);
 114                        return EXIT_SUCCESS;
 115                case 'p':
 116                        pretty = 1;
 117                        break;
 118                case 'd':
 119                        if (show_details)
 120                                show_driver_details = true;
 121                        else
 122                                show_details = true;
 123                        break;
 124                case 'r':
 125                        show_raw = true;
 126                        break;
 127                case 'j':
 128                        json_output = 1;
 129                        break;
 130                case 'f':
 131                        force = true;
 132                        break;
 133                case 'b':
 134                        batch_file = optarg;
 135                        break;
 136                case 'h':
 137                        help(filename);
 138                        return EXIT_SUCCESS;
 139                case ':':
 140                        pr_err("-%c option requires an argument\n", optopt);
 141                        return EXIT_FAILURE;
 142                default:
 143                        pr_err("Unknown option.\n");
 144                        help(filename);
 145                        return EXIT_FAILURE;
 146                }
 147        }
 148
 149        argc -= optind;
 150        argv += optind;
 151
 152        rd.show_details = show_details;
 153        rd.show_driver_details = show_driver_details;
 154        rd.json_output = json_output;
 155        rd.pretty_output = pretty;
 156        rd.show_raw = show_raw;
 157
 158        err = rd_init(&rd, filename);
 159        if (err)
 160                goto out;
 161
 162        if (batch_file)
 163                err = rd_batch(&rd, batch_file, force);
 164        else
 165                err = rd_cmd(&rd, argc, argv);
 166out:
 167        /* Always cleanup */
 168        rd_cleanup(&rd);
 169        return err ? EXIT_FAILURE : EXIT_SUCCESS;
 170}
 171