1*de1e4e89SAndroid Build Coastguard Worker /* 2*de1e4e89SAndroid Build Coastguard Worker * rdma.c RDMA tool 3*de1e4e89SAndroid Build Coastguard Worker * 4*de1e4e89SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or 5*de1e4e89SAndroid Build Coastguard Worker * modify it under the terms of the GNU General Public License 6*de1e4e89SAndroid Build Coastguard Worker * as published by the Free Software Foundation; either version 7*de1e4e89SAndroid Build Coastguard Worker * 2 of the License, or (at your option) any later version. 8*de1e4e89SAndroid Build Coastguard Worker * 9*de1e4e89SAndroid Build Coastguard Worker * Authors: Leon Romanovsky <[email protected]> 10*de1e4e89SAndroid Build Coastguard Worker */ 11*de1e4e89SAndroid Build Coastguard Worker #ifndef _RDMA_TOOL_H_ 12*de1e4e89SAndroid Build Coastguard Worker #define _RDMA_TOOL_H_ 13*de1e4e89SAndroid Build Coastguard Worker 14*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h> 15*de1e4e89SAndroid Build Coastguard Worker #include <string.h> 16*de1e4e89SAndroid Build Coastguard Worker #include <errno.h> 17*de1e4e89SAndroid Build Coastguard Worker #include <getopt.h> 18*de1e4e89SAndroid Build Coastguard Worker #include <libmnl/libmnl.h> 19*de1e4e89SAndroid Build Coastguard Worker #include <rdma/rdma_netlink.h> 20*de1e4e89SAndroid Build Coastguard Worker #include <time.h> 21*de1e4e89SAndroid Build Coastguard Worker 22*de1e4e89SAndroid Build Coastguard Worker #include "list.h" 23*de1e4e89SAndroid Build Coastguard Worker #include "utils.h" 24*de1e4e89SAndroid Build Coastguard Worker #include "json_writer.h" 25*de1e4e89SAndroid Build Coastguard Worker 26*de1e4e89SAndroid Build Coastguard Worker #define pr_err(args...) fprintf(stderr, ##args) 27*de1e4e89SAndroid Build Coastguard Worker #define pr_out(args...) fprintf(stdout, ##args) 28*de1e4e89SAndroid Build Coastguard Worker 29*de1e4e89SAndroid Build Coastguard Worker #define RDMA_BITMAP_ENUM(name, bit_no) RDMA_BITMAP_##name = BIT(bit_no), 30*de1e4e89SAndroid Build Coastguard Worker #define RDMA_BITMAP_NAMES(name, bit_no) [bit_no] = #name, 31*de1e4e89SAndroid Build Coastguard Worker 32*de1e4e89SAndroid Build Coastguard Worker struct dev_map { 33*de1e4e89SAndroid Build Coastguard Worker struct list_head list; 34*de1e4e89SAndroid Build Coastguard Worker char *dev_name; 35*de1e4e89SAndroid Build Coastguard Worker uint32_t num_ports; 36*de1e4e89SAndroid Build Coastguard Worker uint32_t idx; 37*de1e4e89SAndroid Build Coastguard Worker }; 38*de1e4e89SAndroid Build Coastguard Worker 39*de1e4e89SAndroid Build Coastguard Worker struct rd { 40*de1e4e89SAndroid Build Coastguard Worker int argc; 41*de1e4e89SAndroid Build Coastguard Worker char **argv; 42*de1e4e89SAndroid Build Coastguard Worker char *filename; 43*de1e4e89SAndroid Build Coastguard Worker bool show_details; 44*de1e4e89SAndroid Build Coastguard Worker struct list_head dev_map_list; 45*de1e4e89SAndroid Build Coastguard Worker uint32_t dev_idx; 46*de1e4e89SAndroid Build Coastguard Worker uint32_t port_idx; 47*de1e4e89SAndroid Build Coastguard Worker struct mnl_socket *nl; 48*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *nlh; 49*de1e4e89SAndroid Build Coastguard Worker char *buff; 50*de1e4e89SAndroid Build Coastguard Worker json_writer_t *jw; 51*de1e4e89SAndroid Build Coastguard Worker bool json_output; 52*de1e4e89SAndroid Build Coastguard Worker bool pretty_output; 53*de1e4e89SAndroid Build Coastguard Worker }; 54*de1e4e89SAndroid Build Coastguard Worker 55*de1e4e89SAndroid Build Coastguard Worker struct rd_cmd { 56*de1e4e89SAndroid Build Coastguard Worker const char *cmd; 57*de1e4e89SAndroid Build Coastguard Worker int (*func)(struct rd *rd); 58*de1e4e89SAndroid Build Coastguard Worker }; 59*de1e4e89SAndroid Build Coastguard Worker 60*de1e4e89SAndroid Build Coastguard Worker /* 61*de1e4e89SAndroid Build Coastguard Worker * Parser interface 62*de1e4e89SAndroid Build Coastguard Worker */ 63*de1e4e89SAndroid Build Coastguard Worker bool rd_no_arg(struct rd *rd); 64*de1e4e89SAndroid Build Coastguard Worker void rd_arg_inc(struct rd *rd); 65*de1e4e89SAndroid Build Coastguard Worker 66*de1e4e89SAndroid Build Coastguard Worker char *rd_argv(struct rd *rd); 67*de1e4e89SAndroid Build Coastguard Worker uint32_t get_port_from_argv(struct rd *rd); 68*de1e4e89SAndroid Build Coastguard Worker 69*de1e4e89SAndroid Build Coastguard Worker /* 70*de1e4e89SAndroid Build Coastguard Worker * Commands interface 71*de1e4e89SAndroid Build Coastguard Worker */ 72*de1e4e89SAndroid Build Coastguard Worker int cmd_dev(struct rd *rd); 73*de1e4e89SAndroid Build Coastguard Worker int cmd_link(struct rd *rd); 74*de1e4e89SAndroid Build Coastguard Worker int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str); 75*de1e4e89SAndroid Build Coastguard Worker 76*de1e4e89SAndroid Build Coastguard Worker /* 77*de1e4e89SAndroid Build Coastguard Worker * Device manipulation 78*de1e4e89SAndroid Build Coastguard Worker */ 79*de1e4e89SAndroid Build Coastguard Worker void rd_free_devmap(struct rd *rd); 80*de1e4e89SAndroid Build Coastguard Worker struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index); 81*de1e4e89SAndroid Build Coastguard Worker struct dev_map *_dev_map_lookup(struct rd *rd, const char *dev_name); 82*de1e4e89SAndroid Build Coastguard Worker 83*de1e4e89SAndroid Build Coastguard Worker /* 84*de1e4e89SAndroid Build Coastguard Worker * Netlink 85*de1e4e89SAndroid Build Coastguard Worker */ 86*de1e4e89SAndroid Build Coastguard Worker int rd_send_msg(struct rd *rd); 87*de1e4e89SAndroid Build Coastguard Worker int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, uint32_t seq); 88*de1e4e89SAndroid Build Coastguard Worker void rd_prepare_msg(struct rd *rd, uint32_t cmd, uint32_t *seq, uint16_t flags); 89*de1e4e89SAndroid Build Coastguard Worker int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data); 90*de1e4e89SAndroid Build Coastguard Worker int rd_attr_cb(const struct nlattr *attr, void *data); 91*de1e4e89SAndroid Build Coastguard Worker #endif /* _RDMA_TOOL_H_ */ 92