Whamcloud - gitweb
LU-9934 build: support for gcc7
[fs/lustre-release.git] / lnet / utils / lnetconfig / liblnetconfig.h
1 /*
2  * LGPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of the
9  * License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
18  *
19  * LGPL HEADER END
20  *
21  * Copyright (c) 2014, 2017, Intel Corporation.
22  *
23  * Author:
24  *   Amir Shehata <amir.shehata@intel.com>
25  */
26
27 #ifndef LIB_LNET_CONFIG_API_H
28 #define LIB_LNET_CONFIG_API_H
29
30 #include <net/if.h>
31 #include <libcfs/util/string.h>
32 #include <linux/lnet/lnet-dlc.h>
33 #include <linux/lnet/nidstr.h>
34
35 #define LUSTRE_CFG_RC_NO_ERR                     0
36 #define LUSTRE_CFG_RC_BAD_PARAM                 -1
37 #define LUSTRE_CFG_RC_MISSING_PARAM             -2
38 #define LUSTRE_CFG_RC_OUT_OF_RANGE_PARAM        -3
39 #define LUSTRE_CFG_RC_OUT_OF_MEM                -4
40 #define LUSTRE_CFG_RC_GENERIC_ERR               -5
41 #define LUSTRE_CFG_RC_NO_MATCH                  -6
42 #define LUSTRE_CFG_RC_MATCH                     -7
43
44 struct lnet_dlc_network_descr {
45         struct list_head network_on_rule;
46         __u32 nw_id;
47         struct list_head nw_intflist;
48 };
49
50 struct lnet_dlc_intf_descr {
51         struct list_head intf_on_network;
52         char intf_name[IFNAMSIZ];
53         struct cfs_expr_list *cpt_expr;
54 };
55
56 /* forward declaration of the cYAML structure. */
57 struct cYAML;
58
59 /*
60  * lustre_lnet_config_lib_init()
61  *   Initialize the Library to enable communication with the LNET kernel
62  *   module.  Returns the device ID or -EINVAL if there is an error
63  */
64 int lustre_lnet_config_lib_init();
65
66 /*
67  * lustre_lnet_config_lib_uninit
68  *      Uninitialize the DLC Library
69  */
70 void lustre_lnet_config_lib_uninit();
71
72 /*
73  * lustre_lnet_config_ni_system
74  *   Initialize/Uninitialize the lnet NI system.
75  *
76  *   up - whehter to init or uninit the system
77  *   load_ni_from_mod - load NI from mod params.
78  *   seq_no - sequence number of the request
79  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
80  *            caller
81  */
82 int lustre_lnet_config_ni_system(bool up, bool load_ni_from_mod,
83                                  int seq_no, struct cYAML **err_rc);
84
85 /*
86  * lustre_lnet_config_route
87  *   Send down an IOCTL to the kernel to configure the route
88  *
89  *   nw - network
90  *   gw - gateway
91  *   hops - number of hops passed down by the user
92  *   prio - priority of the route
93  *   seq_no - sequence number of the request
94  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
95  */
96 int lustre_lnet_config_route(char *nw, char *gw, int hops, int prio,
97                              int seq_no, struct cYAML **err_rc);
98
99 /*
100  * lustre_lnet_del_route
101  *   Send down an IOCTL to the kernel to delete a route
102  *
103  *   nw - network
104  *   gw - gateway
105  *   seq_no - sequence number of the request
106  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
107  */
108 int lustre_lnet_del_route(char *nw, char *gw, int seq_no,
109                           struct cYAML **err_rc);
110
111 /*
112  * lustre_lnet_show_route
113  *   Send down an IOCTL to the kernel to show routes
114  *   This function will get one route at a time and filter according to
115  *   provided parameters. If no routes are available then it will dump all
116  *   routes that are in the system.
117  *
118  *   nw - network.  Optional.  Used to filter output
119  *   gw - gateway. Optional. Used to filter ouptut
120  *   hops - number of hops passed down by the user
121  *          Optional.  Used to filter output.
122  *   prio - priority of the route.  Optional.  Used to filter output.
123  *   detail - flag to indicate whether detail output is required
124  *   seq_no - sequence number of the request
125  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
126  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
127  *   backup - true to output only what's necessary for reconfiguring
128  *            a node.
129  */
130 int lustre_lnet_show_route(char *nw, char *gw,
131                            int hops, int prio, int detail,
132                            int seq_no, struct cYAML **show_rc,
133                            struct cYAML **err_rc, bool backup);
134
135 /*
136  * lustre_lnet_config_ni
137  *   Send down an IOCTL to configure a network interface. It implicitly
138  *   creates a network if one doesn't exist..
139  *
140  *   nw_descr - network and interface descriptor
141  *   global_cpts - globally defined CPTs
142  *   ip2net - this parameter allows configuring multiple networks.
143  *      it takes precedence over the net and intf parameters
144  *   tunables - LND tunables
145  *   seq_no - sequence number of the request
146  *   lnd_tunables - lnet specific tunable parameters
147  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
148  */
149 int lustre_lnet_config_ni(struct lnet_dlc_network_descr *nw_descr,
150                           struct cfs_expr_list *global_cpts,
151                           char *ip2net,
152                           struct lnet_ioctl_config_lnd_tunables *tunables,
153                           int seq_no, struct cYAML **err_rc);
154
155 /*
156  * lustre_lnet_del_ni
157  *   Send down an IOCTL to delete a network interface. It implicitly
158  *   deletes a network if it becomes empty of nis
159  *
160  *   nw  - network and interface list
161  *   seq_no - sequence number of the request
162  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
163  */
164 int lustre_lnet_del_ni(struct lnet_dlc_network_descr *nw,
165                        int seq_no, struct cYAML **err_rc);
166
167 /*
168  * lustre_lnet_show_net
169  *   Send down an IOCTL to show networks.
170  *   This function will use the nw paramter to filter the output.  If it's
171  *   not provided then all networks are listed.
172  *
173  *   nw - network to show.  Optional.  Used to filter output.
174  *   detail - flag to indicate if we require detail output.
175  *   seq_no - sequence number of the request
176  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
177  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
178  *   backup - true to output only what's necessary for reconfiguring
179  *            a node.
180  */
181 int lustre_lnet_show_net(char *nw, int detail, int seq_no,
182                          struct cYAML **show_rc, struct cYAML **err_rc,
183                          bool backup);
184
185 /*
186  * lustre_lnet_enable_routing
187  *   Send down an IOCTL to enable or diable routing
188  *
189  *   enable - 1 to enable routing, 0 to disable routing
190  *   seq_no - sequence number of the request
191  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
192  */
193 int lustre_lnet_enable_routing(int enable, int seq_no,
194                                struct cYAML **err_rc);
195
196 /*
197  * lustre_lnet_config_numa_range
198  *   Set the NUMA range which impacts the NIs to be selected
199  *   during sending. If the NUMA range is large the NUMA
200  *   distance between the message memory and the NI becomes
201  *   less significant. The NUMA range is a relative number
202  *   with no other meaning besides allowing a wider breadth
203  *   for picking an NI to send from.
204  *
205  *   range - numa range value.
206  *   seq_no - sequence number of the request
207  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
208  *   caller
209  */
210 int lustre_lnet_config_numa_range(int range, int seq_no,
211                                   struct cYAML **err_rc);
212
213 /*
214  * lustre_lnet_show_num_range
215  *   Get the currently set NUMA range
216  *
217  *   seq_no - sequence number of the request
218  *   show_rc - [OUT] struct cYAML tree containing NUMA range info
219  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
220  *   caller
221  */
222 int lustre_lnet_show_numa_range(int seq_no, struct cYAML **show_rc,
223                                 struct cYAML **err_rc);
224
225 /*
226  * lustre_lnet_config_max_intf
227  *   Sets the maximum number of interfaces per node. this tunable is
228  *   primarily useful for sanity checks prior to allocating memory.
229  *
230  *   max - maximum value to configure
231  *   seq_no - sequence number of the request
232  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
233  *   caller
234  */
235 int lustre_lnet_config_max_intf(int max, int seq_no, struct cYAML **err_rc);
236
237 /*
238  * lustre_lnet_show_max_intf
239  *    show current maximum interface setting
240  *
241  *   seq_no - sequence number of the request
242  *   show_rc - [OUT] struct cYAML tree containing NUMA range info
243  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
244  *   caller
245  */
246 int lustre_lnet_show_max_intf(int seq_no, struct cYAML **show_rc,
247                               struct cYAML **err_rc);
248
249 /*
250  * lustre_lnet_config_discovery
251  *   Enable or disable peer discovery. Peer discovery is enabled by default.
252  *
253  *   enable - non-0 enables, 0 disables
254  *   seq_no - sequence number of the request
255  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
256  *   caller
257  */
258 int lustre_lnet_config_discovery(int enable, int seq_no, struct cYAML **err_rc);
259
260 /*
261  * lustre_lnet_show_discovery
262  *    show current peer discovery setting
263  *
264  *   seq_no - sequence number of the request
265  *   show_rc - [OUT] struct cYAML tree containing NUMA range info
266  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
267  *   caller
268  */
269 int lustre_lnet_show_discovery(int seq_no, struct cYAML **show_rc,
270                                struct cYAML **err_rc);
271
272 /*
273  * lustre_lnet_config_buffers
274  *   Send down an IOCTL to configure routing buffer sizes.  A value of 0 means
275  *   default that particular buffer to default size. A value of -1 means
276  *   leave the value of the buffer un changed.
277  *
278  *   tiny - tiny buffers
279  *   small - small buffers
280  *   large - large buffers.
281  *   seq_no - sequence number of the request
282  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
283  */
284 int lustre_lnet_config_buffers(int tiny, int small, int large,
285                                int seq_no, struct cYAML **err_rc);
286
287 /*
288  * lustre_lnet_show_routing
289  *   Send down an IOCTL to dump buffers and routing status
290  *   This function is used to dump buffers for all CPU partitions.
291  *
292  *   seq_no - sequence number of the request
293  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
294  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
295  *   backup - true to output only what's necessary for reconfiguring
296  *            a node.
297  */
298 int lustre_lnet_show_routing(int seq_no, struct cYAML **show_rc,
299                              struct cYAML **err_rc, bool backup);
300
301 /*
302  * lustre_lnet_show_stats
303  *   Shows internal LNET statistics.  This is useful to display the
304  *   current LNET activity, such as number of messages route, etc
305  *
306  *     seq_no - sequence number of the command
307  *     show_rc - YAML structure of the resultant show
308  *     err_rc - YAML strucutre of the resultant return code.
309  */
310 int lustre_lnet_show_stats(int seq_no, struct cYAML **show_rc,
311                            struct cYAML **err_rc);
312
313 /*
314  * lustre_lnet_config_peer_nid
315  *   Add a peer nid to a peer with primary nid pnid. If no pnid is given
316  *   then the first nid in the nid list becomes the primary nid for
317  *   a newly created peer.
318  *   Otherwise if pnid is provided and it's unique then a new peer is
319  *   created with pnid as the primary NID and the nids in the nid list as
320  *   secondary nids.
321  *   If any of the peers nids provided in with exception to the pnid is
322  *   not unique the operation fails. Some peer nids might have already
323  *   been added. It's the role of the caller of this API to remove the
324  *   added NIDs if they wish.
325  *
326  *     pnid - Primary NID of the peer
327  *     nid - list of nids to add
328  *     num_nids - number of nids in the nid array
329  *     mr - true if this peer is MR capable.
330  *     seq_no - sequence number of the command
331  *     err_rc - YAML strucutre of the resultant return code.
332  */
333 int lustre_lnet_config_peer_nid(char *pnid, char **nid, int num_nids,
334                                 bool mr, int seq_no, struct cYAML **err_rc);
335
336 /*
337  * lustre_lnet_del_peer_nid
338  *  Delete the nids given in the nid list from the peer with primary NID
339  *  pnid. If pnid is NULL or it doesn't identify a peer the operation
340  *  fails and no change happens to the system.
341  *  The operation is aborted on the first NID that fails to be deleted.
342  *
343  *     pnid - Primary NID of the peer
344  *     nid - list of nids to add
345  *     num_nids - number of nids in the nid array
346  *     seq_no - sequence number of the command
347  *     err_rc - YAML strucutre of the resultant return code.
348  */
349 int lustre_lnet_del_peer_nid(char *pnid, char **nid, int num_nids,
350                              int seq_no, struct cYAML **err_rc);
351
352 /*
353  * lustre_lnet_show_peer
354  *   Show the peer identified by nid, knid. If knid is NULL all
355  *   peers in the system are shown.
356  *
357  *     knid - A NID of the peer
358  *     detail - display detailed information
359  *     seq_no - sequence number of the command
360  *     show_rc - YAML structure of the resultant show
361  *     err_rc - YAML strucutre of the resultant return code.
362  *     backup - true to output only what's necessary for reconfiguring
363  *              a node.
364  *
365  */
366 int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
367                           struct cYAML **show_rc, struct cYAML **err_rc,
368                           bool backup);
369
370 /*
371  * lustre_lnet_list_peer
372  *   List the known peers.
373  *
374  *     seq_no - sequence number of the command
375  *     show_rc - YAML structure of the resultant show
376  *     err_rc - YAML strucutre of the resultant return code.
377  *
378  */
379 int lustre_lnet_list_peer(int seq_no,
380                           struct cYAML **show_rc, struct cYAML **err_rc);
381
382 /* lustre_lnet_ping_nid
383  *   Ping the nid list, pnids.
384  *
385  *    pnids - NID list to ping.
386  *    timeout - timeout(seconds) for ping.
387  *    seq_no - sequence number of the command.
388  *    show_rc - YAML structure of the resultant show.
389  *    err_rc - YAML strucutre of the resultant return code.
390  *
391  */
392 int lustre_lnet_ping_nid(char *pnid, int timeout, int seq_no,
393                         struct cYAML **show_rc, struct cYAML **err_rc);
394
395 /* lustre_lnet_discover_nid
396  *   Discover the nid list, pnids.
397  *
398  *    pnids - NID list to discover.
399  *    force - force discovery.
400  *    seq_no - sequence number of the command.
401  *    show_rc - YAML structure of the resultant show.
402  *    err_rc - YAML strucutre of the resultant return code.
403  *
404  */
405 int lustre_lnet_discover_nid(char *pnid, int force, int seq_no,
406                              struct cYAML **show_rc, struct cYAML **err_rc);
407
408 /*
409  * lustre_yaml_config
410  *   Parses the provided YAML file and then calls the specific APIs
411  *   to configure the entities identified in the file
412  *
413  *   f - YAML file
414  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
415  */
416 int lustre_yaml_config(char *f, struct cYAML **err_rc);
417
418 /*
419  * lustre_yaml_del
420  *   Parses the provided YAML file and then calls the specific APIs
421  *   to delete the entities identified in the file
422  *
423  *   f - YAML file
424  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
425  */
426 int lustre_yaml_del(char *f, struct cYAML **err_rc);
427
428 /*
429  * lustre_yaml_show
430  *   Parses the provided YAML file and then calls the specific APIs
431  *   to show the entities identified in the file
432  *
433  *   f - YAML file
434  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
435  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
436  */
437 int lustre_yaml_show(char *f, struct cYAML **show_rc,
438                      struct cYAML **err_rc);
439
440 /*
441  * lustre_yaml_exec
442  *   Parses the provided YAML file and then calls the specific APIs
443  *   to execute the entities identified in the file
444  *
445  *   f - YAML file
446  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
447  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
448  */
449 int lustre_yaml_exec(char *f, struct cYAML **show_rc,
450                      struct cYAML **err_rc);
451
452 /*
453  * lustre_lnet_init_nw_descr
454  *      initialize the network descriptor structure for use
455  */
456 void lustre_lnet_init_nw_descr(struct lnet_dlc_network_descr *nw_descr);
457
458 /*
459  * lustre_lnet_parse_interfaces
460  *      prase an interface string and populate descriptor structures
461  *              intf_str - interface string of the format
462  *                      <intf>[<expr>], <intf>[<expr>],..
463  *              nw_descr - network descriptor to populate
464  *              init - True to initialize nw_descr
465  */
466 int lustre_lnet_parse_interfaces(char *intf_str,
467                                  struct lnet_dlc_network_descr *nw_descr);
468
469 /*
470  * lustre_lnet_parse_nids
471  *      Parse a set of nids into a locally allocated array and return the
472  *      pointer of the array to the caller. The caller is responsible for
473  *      freeing the array. If an initial array is provided then copy over
474  *      the contents of that array into the new array and append to it the
475  *      new content.
476  *      The nids can be of the form "nid [,nid, nid, nid]"
477  *              nids: nids string to be parsed
478  *              array: initial array of content
479  *              size: num of elements in the array
480  *              out_array: [OUT] new allocated array.
481  *      Returns size of array
482  *              sets the out_array to NULL on failure.
483  */
484 int lustre_lnet_parse_nids(char *nids, char **array, int size,
485                            char ***out_array);
486
487 #endif /* LIB_LNET_CONFIG_API_H */