Whamcloud - gitweb
LU-16460 lnet: validate data sent from user land properly
[fs/lustre-release.git] / lnet / utils / lnetconfig / liblnetconfig.h
index 2d34038..32a985f 100644 (file)
 #ifndef LIB_LNET_CONFIG_API_H
 #define LIB_LNET_CONFIG_API_H
 
+#include <errno.h>
 #include <net/if.h>
+#include <stdbool.h>
+#include <sys/socket.h>
+#include <yaml.h>
+#include <netlink/netlink.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/ctrl.h>
+
+#include <libcfs/util/ioctl.h>
 #include <libcfs/util/string.h>
 #include <linux/lnet/lnet-dlc.h>
 #include <linux/lnet/nidstr.h>
 #define LUSTRE_CFG_RC_MATCH                    -7
 #define LUSTRE_CFG_RC_SKIP                     -8
 #define LUSTRE_CFG_RC_LAST_ELEM                        -9
+#define LUSTRE_CFG_RC_MARSHAL_FAIL             -10
+
+#define CONFIG_CMD             "configure"
+#define UNCONFIG_CMD           "unconfigure"
+#define ADD_CMD                        "add"
+#define DEL_CMD                        "del"
+#define SHOW_CMD               "show"
+#define DBG_CMD                        "dbg"
+#define MANAGE_CMD             "manage"
+
+#define MAX_NUM_IPS            128
+
+#define modparam_path "/sys/module/lnet/parameters/"
+#define o2ib_modparam_path "/sys/module/ko2iblnd/parameters/"
+#define gni_nid_path "/proc/cray_xt/"
 
 enum lnetctl_cmd {
        LNETCTL_CONFIG_CMD      = 1,
@@ -72,11 +96,60 @@ struct lnet_dlc_intf_descr {
        struct cfs_expr_list *cpt_expr;
 };
 
+/* This UDSP structures need to match the kernel space structures
+ * in order for the marshall and unmarshall functions to be the same.
+ */
+
+/* Net is described as a
+ *  1. net type
+ *  2. num range
+ */
+struct lnet_ud_net_descr {
+       __u32 udn_net_type;
+       struct list_head udn_net_num_range;
+};
+
+/* each NID range is defined as
+ *  1. net descriptor
+ *  2. address range descriptor
+ */
+struct lnet_ud_nid_descr {
+       struct lnet_ud_net_descr ud_net_id;
+       struct list_head ud_addr_range;
+};
+
+/* a UDSP rule can have up to three user defined NID descriptors
+ *     - src: defines the local NID range for the rule
+ *     - dst: defines the peer NID range for the rule
+ *     - rte: defines the router NID range for the rule
+ *
+ * An action union defines the action to take when the rule
+ * is matched
+ */
+struct lnet_udsp {
+       struct list_head udsp_on_list;
+       __u32 udsp_idx;
+       struct lnet_ud_nid_descr udsp_src;
+       struct lnet_ud_nid_descr udsp_dst;
+       struct lnet_ud_nid_descr udsp_rte;
+       enum lnet_udsp_action_type udsp_action_type;
+       union {
+               __u32 udsp_priority;
+       } udsp_action;
+};
+
+/* This union is passed from lnetctl to fill the action union in udsp
+ * structure
+ * TODO: The idea here is if we add extra actions, ex: drop, it can be
+ * added to the union
+ */
+union lnet_udsp_action {
+       int udsp_priority;
+};
+
 /* forward declaration of the cYAML structure. */
 struct cYAML;
 
-int tokenize_nidstr(char *nidstr, char *out[LNET_MAX_STR_LEN], char *err_str);
-
 /*
  * lustre_lnet_config_lib_init()
  *   Initialize the Library to enable communication with the LNET kernel
@@ -259,6 +332,22 @@ int lustre_lnet_show_numa_range(int seq_no, struct cYAML **show_rc,
 int lustre_lnet_config_ni_healthv(int value, bool all, char *ni_nid,
                                  int seq_no, struct cYAML **err_rc);
 
+
+/* lustre_lnet_config_ni_conns_per_peer
+ *   set the conns_per_peer value of the NI. Valid range is specific to
+ *   network type.
+ *
+ *   value: conns_per_peer value to set.
+ *   all: true to set all local NIs to that value.
+ *   ni_nid: NI NID to set its conns_per_peer value. 'all' parameter always
+ *   takes precedence
+ *   seq_no - sequence number of the request
+ *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
+ *   caller
+ */
+int lustre_lnet_config_ni_conns_per_peer(int value, bool all, char *ni_nid,
+                                        int seq_no, struct cYAML **err_rc);
+
 /*
  * lustre_lnet_config_peer_ni_healthv
  *   set the health value of the peer NI. -1 resets the value to maximum.
@@ -401,6 +490,17 @@ int lustre_lnet_show_local_ni_recovq(int seq_no, struct cYAML **show_rc,
 
 int lustre_lnet_show_peer_ni_recovq(int seq_no, struct cYAML **show_rc,
                                    struct cYAML **err_rc);
+int lustre_lnet_config_response_tracking(int count, int seq_no,
+                                        struct cYAML **err_rc);
+int lustre_lnet_show_response_tracking(int seq_no, struct cYAML **show_rc,
+                                      struct cYAML **err_rc);
+int lustre_lnet_config_recovery_limit(int val, int seq_no,
+                                     struct cYAML **err_rc);
+int lustre_lnet_show_recovery_limit(int seq_no, struct cYAML **show_rc,
+                                   struct cYAML **err_rc);
+int lustre_lnet_show_max_recovery_ping_interval(int seq_no,
+                                               struct cYAML **show_rc,
+                                               struct cYAML **err_rc);
 
 /*
  * lustre_lnet_config_max_intf
@@ -433,6 +533,21 @@ int lustre_lnet_show_max_intf(int seq_no, struct cYAML **show_rc,
 int lustre_lnet_calc_service_id(__u64 *service_id);
 
 /*
+ * lustre_lnet_setup_mrrouting
+ *    configure linux routing tables for tcp interfaces
+ *
+ *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
+ *   caller
+ */
+int lustre_lnet_setup_mrrouting(struct cYAML **err_rc);
+
+/*
+ * lustre_lnet_calc_cpt_of_nid
+ *     Return the cpt number of the NID provided
+ */
+int lustre_lnet_calc_cpt_of_nid(char *nidc, long int ncpts);
+
+/*
  * lustre_lnet_config_discovery
  *   Enable or disable peer discovery. Peer discovery is enabled by default.
  *
@@ -495,6 +610,17 @@ int lustre_lnet_config_buffers(int tiny, int small, int large,
                               int seq_no, struct cYAML **err_rc);
 
 /*
+ * lustre_lnet_config_max_recovery_ping_interval
+ *   Set the maximum recovery ping interval.
+ *
+ *   interval - interval value in seconds
+ *   seq_no - sequence number of the request
+ *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
+ */
+int lustre_lnet_config_max_recovery_ping_interval(int interval, int seq_no,
+                                                 struct cYAML **err_rc);
+
+/*
  * lustre_lnet_show_routing
  *   Send down an IOCTL to dump buffers and routing status
  *   This function is used to dump buffers for all CPU partitions.
@@ -521,45 +647,43 @@ int lustre_lnet_show_stats(int seq_no, struct cYAML **show_rc,
                           struct cYAML **err_rc);
 
 /*
- * lustre_lnet_config_peer_nidlist
- *  Add a peer NID to a peer with primary NID pnid. If a pnid is not provided
- *  then the first NID in the NID list becomes the primary NID for a newly
- *  created peer.
- *  Otherwise, if the provided primary NID is unique, then a new peer is
+ * lustre_lnet_reset_stats
+ *   Resets internal LNET statistics.
+ *
+ *     err_rc - YAML strucutre of the resultant return code.
+ */
+int lustre_lnet_reset_stats(int seq_no, struct cYAML **err_rc);
+
+/*
+ * lustre_lnet_modify_peer
+ *  Handle a peer config or delete operation.
+ *
+ *  Config Operation:
+ *  Add a peer NID to a peer with primary NID pnid. 
+ *  If the provided primary NID is unique, then a new peer is
  *  created with this primary NID, and the NIDs in the NID list are added as
  *  secondary NIDs to this new peer.
  *  If any of the NIDs in the NID list are not unique then the operation
  *  fails. Some peer NIDs might have already been added. It's the responsibility
  *  of the caller of this API to remove the added NIDs if so desired.
  *
- *     pnid - The desired primary NID of a new peer, or the primary NID of
- *            an existing peer.
- *     lnet_nidlist - List of LNet NIDs to add to the peer
- *     num_nids - The number of LNet NIDs in the lnet_nidlist array
- *     mr - Specifies whether this peer is MR capable.
- *     seq_no - sequence number of the command
- *     err_rc - YAML structure of the resultant return code
- */
-int lustre_lnet_config_peer_nidlist(char *pnid, lnet_nid_t *lnet_nidlist,
-                                   int num_nids, bool mr, int seq_no,
-                                   struct cYAML **err_rc);
-
-/*
- * lustre_lnet_del_peer_nidlist
+ *  Delete Operation:
  *  Delete the NIDs given in the NID list from the peer with the primary NID
  *  pnid. If pnid is NULL, or it doesn't identify a peer, the operation fails,
  *  and no change happens to the system.
  *  The operation is aborted on the first NID that fails to be deleted.
  *
- *     pnid - The primary NID of the peer to be modified
- *     lnet_nidlist - The list of LNet NIDs to delete from the peer
- *     num_nids - the number of nids in the lnet_nidlist array
+ *     prim_nid - The desired primary NID of a new peer, or the primary NID of
+ *                an existing peer.
+ *     nids - a comma separated string of nids
+ *     is_mr - Specifies whether this peer is MR capable.
+ *     cmd - CONFIG or DELETE
  *     seq_no - sequence number of the command
  *     err_rc - YAML structure of the resultant return code
  */
-int lustre_lnet_del_peer_nidlist(char *pnid, lnet_nid_t *lnet_nidlist,
-                                int num_nids, int seq_no,
-                                struct cYAML **err_rc);
+int lustre_lnet_modify_peer(char *prim_nid, char *nids, bool is_mr,
+                           int cmd, int seq_no, struct cYAML **err_rc);
+
 /*
  * lustre_lnet_show_peer
  *   Show the peer identified by nid, knid. If knid is NULL all
@@ -594,13 +718,14 @@ int lustre_lnet_list_peer(int seq_no,
  *   Ping the nid list, pnids.
  *
  *    pnids - NID list to ping.
+ *    src_nidstr - source NID
  *    timeout - timeout(seconds) for ping.
  *    seq_no - sequence number of the command.
  *    show_rc - YAML structure of the resultant show.
  *    err_rc - YAML strucutre of the resultant return code.
  *
  */
-int lustre_lnet_ping_nid(char *pnid, int timeout, int seq_no,
+int lustre_lnet_ping_nid(char *pnid, char *src_nidstr, int timeout, int seq_no,
                        struct cYAML **show_rc, struct cYAML **err_rc);
 
 /* lustre_lnet_discover_nid
@@ -660,6 +785,83 @@ int lustre_yaml_show(char *f, struct cYAML **show_rc,
 int lustre_yaml_exec(char *f, struct cYAML **show_rc,
                     struct cYAML **err_rc);
 
+/**
+ * yaml_emitter_set_output_netlink
+ *
+ *   Special handling to integrate LNet handling into libyaml.
+ *   This function sets up the ability to take the data stored in @emitter
+ *   and formats into a netlink packet to send to the kernel.
+ *
+ *   emitter   - YAML emitter containing what the user specified
+ *   nl                - Netlink socket to be used by libyaml
+ *   family    - Netlink family
+ *   version   - notify kernel what version user land supports
+ *   cmd       - Netlink command to execute
+ *   flags     - Netlink flags
+ */
+int yaml_emitter_set_output_netlink(yaml_emitter_t *emitter, struct nl_sock *nl,
+                                   char *family, int version, int cmd,
+                                   int flags);
+
+/**
+ * yaml_parser_set_input_netlink
+ *
+ *   Special handling to LNet handling into libyaml.
+ *   This function sets up the ability to receive the Netlink data
+ *   from the Linux kernel. That data is formated into a YAML document.
+ *
+ *   parser    - YAML parser that is used to present the data received
+ *               from the kernel in Netlink format.
+ *   nl                - should be the Netlink socket receiving data from
+ *               the kernel.
+ *   stream    - Handle the case of continuous data coming in.
+ */
+int yaml_parser_set_input_netlink(yaml_parser_t *parser, struct nl_sock *nl,
+                                 bool stream);
+
+/**
+ * yaml_parser_get_reader_proto_version
+ *
+ *   This function retrieves the Neltink version the kernel module
+ *   is set to.
+ *
+ *   parser    - YAML parser being used for Netlink communication.
+ */
+int yaml_parser_get_reader_proto_version(yaml_parser_t *parser);
+
+/**
+ * yaml_parser_get_reader_error
+ *
+ *   By default libyaml reports a generic write error. We need a way
+ *   to report better parser errors so we can track down problems.
+ *
+ *   parser    - YAML parser that has reported an error.
+ */
+const char *yaml_parser_get_reader_error(yaml_parser_t *parser);
+
+/**
+ * yaml_parser_log_error
+ *
+ *   Helper function to report the parser error to @log.
+ *
+ *   parser    - YAML parser that has reported an error.
+ *   log       - file descriptor to write the error message out to.
+ *   errmsg    - Special extra string to append to error message.
+ */
+void yaml_parser_log_error(yaml_parser_t *parser, FILE *log,
+                          const char *errmsg);
+
+/**
+ * yaml_emitter_log_error
+ *
+ *   Helper function to report the emitter error to @log.
+ *
+ *   emitter   - YAML emitter that has reported an error.
+ *   log       - file descriptor to write the error message out to.
+ */
+void yaml_emitter_log_error(yaml_emitter_t *emitter, FILE *log);
+
+
 /*
  * lustre_lnet_init_nw_descr
  *     initialize the network descriptor structure for use
@@ -708,4 +910,50 @@ int lustre_lnet_parse_interfaces(char *intf_str,
 int lustre_lnet_parse_nidstr(char *nidstr, lnet_nid_t *lnet_nidlist,
                             int max_nids, char *err_str);
 
+/* lustre_lnet_add_udsp
+ *     Add a selection policy.
+ *     src - source NID descriptor
+ *     dst - destination NID descriptor
+ *     rte - router NID descriptor
+ *     type - action type
+ *     action - union of the action
+ *     idx - the index to delete
+ *     seq_no - sequence number of the request
+ *     err_rc - [OUT] struct cYAML tree describing the error. Freed by
+ *               caller
+ */
+int lustre_lnet_add_udsp(char *src, char *dst, char *rte, char *type,
+                        union lnet_udsp_action *action, int idx,
+                        int seq_no, struct cYAML **err_rc);
+
+/* lustre_lnet_del_udsp
+ *     Delete a net selection policy.
+ *     idx - the index to delete
+ *     seq_no - sequence number of the request
+ *     err_rc - [OUT] struct cYAML tree describing the error. Freed by
+ *     caller
+ */
+int lustre_lnet_del_udsp(unsigned int idx, int seq_no, struct cYAML **err_rc);
+
+/* lustre_lnet_show_udsp
+ *     show selection policy.
+ *     idx - the index to show. -1 to show all policies
+ *     seq_no - sequence number of the request
+ *     err_rc - [IN/OUT] struct cYAML tree containing udsp info
+ *     err_rc - [OUT] struct cYAML tree describing the error. Freed by
+ *     caller
+ */
+int lustre_lnet_show_udsp(int idx, int seq_no, struct cYAML **show_rc,
+                         struct cYAML **err_rc);
+
+/* lustre_lnet_show_peer_debug_info
+ *     dump peer debug info
+ *     peer_nid - nid of the peer to show
+ *     seq_no - sequence number of the request
+ *     err_rc - [OUT] struct cYAML tree describing the error. Freed by
+ *     caller
+ */
+int lustre_lnet_show_peer_debug_info(char *peer_nid, int seq_no,
+                                    struct cYAML **err_rc);
+
 #endif /* LIB_LNET_CONFIG_API_H */