Whamcloud - gitweb
LU-11894 lnet: check for asymmetrical route messages
[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 #define LUSTRE_CFG_RC_SKIP                      -8
44 #define LUSTRE_CFG_RC_LAST_ELEM                 -9
45
46 struct lnet_dlc_network_descr {
47         struct list_head network_on_rule;
48         __u32 nw_id;
49         struct list_head nw_intflist;
50 };
51
52 struct lnet_dlc_intf_descr {
53         struct list_head intf_on_network;
54         char intf_name[IFNAMSIZ];
55         struct cfs_expr_list *cpt_expr;
56 };
57
58 /* forward declaration of the cYAML structure. */
59 struct cYAML;
60
61 /*
62  * lustre_lnet_config_lib_init()
63  *   Initialize the Library to enable communication with the LNET kernel
64  *   module.  Returns the device ID or -EINVAL if there is an error
65  */
66 int lustre_lnet_config_lib_init();
67
68 /*
69  * lustre_lnet_config_lib_uninit
70  *      Uninitialize the DLC Library
71  */
72 void lustre_lnet_config_lib_uninit();
73
74 /*
75  * lustre_lnet_config_ni_system
76  *   Initialize/Uninitialize the lnet NI system.
77  *
78  *   up - whehter to init or uninit the system
79  *   load_ni_from_mod - load NI from mod params.
80  *   seq_no - sequence number of the request
81  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
82  *            caller
83  */
84 int lustre_lnet_config_ni_system(bool up, bool load_ni_from_mod,
85                                  int seq_no, struct cYAML **err_rc);
86
87 /*
88  * lustre_lnet_config_route
89  *   Send down an IOCTL to the kernel to configure the route
90  *
91  *   nw - network
92  *   gw - gateway
93  *   hops - number of hops passed down by the user
94  *   prio - priority of the route
95  *   seq_no - sequence number of the request
96  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
97  */
98 int lustre_lnet_config_route(char *nw, char *gw, int hops, int prio,
99                              int seq_no, struct cYAML **err_rc);
100
101 /*
102  * lustre_lnet_del_route
103  *   Send down an IOCTL to the kernel to delete a route
104  *
105  *   nw - network
106  *   gw - gateway
107  *   seq_no - sequence number of the request
108  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
109  */
110 int lustre_lnet_del_route(char *nw, char *gw, int seq_no,
111                           struct cYAML **err_rc);
112
113 /*
114  * lustre_lnet_show_route
115  *   Send down an IOCTL to the kernel to show routes
116  *   This function will get one route at a time and filter according to
117  *   provided parameters. If no routes are available then it will dump all
118  *   routes that are in the system.
119  *
120  *   nw - network.  Optional.  Used to filter output
121  *   gw - gateway. Optional. Used to filter ouptut
122  *   hops - number of hops passed down by the user
123  *          Optional.  Used to filter output.
124  *   prio - priority of the route.  Optional.  Used to filter output.
125  *   detail - flag to indicate whether detail output is required
126  *   seq_no - sequence number of the request
127  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
128  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
129  *   backup - true to output only what's necessary for reconfiguring
130  *            a node.
131  */
132 int lustre_lnet_show_route(char *nw, char *gw,
133                            int hops, int prio, int detail,
134                            int seq_no, struct cYAML **show_rc,
135                            struct cYAML **err_rc, bool backup);
136
137 /*
138  * lustre_lnet_config_ni
139  *   Send down an IOCTL to configure a network interface. It implicitly
140  *   creates a network if one doesn't exist..
141  *
142  *   nw_descr - network and interface descriptor
143  *   global_cpts - globally defined CPTs
144  *   ip2net - this parameter allows configuring multiple networks.
145  *      it takes precedence over the net and intf parameters
146  *   tunables - LND tunables
147  *   seq_no - sequence number of the request
148  *   lnd_tunables - lnet specific tunable parameters
149  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
150  */
151 int lustre_lnet_config_ni(struct lnet_dlc_network_descr *nw_descr,
152                           struct cfs_expr_list *global_cpts,
153                           char *ip2net,
154                           struct lnet_ioctl_config_lnd_tunables *tunables,
155                           int seq_no, struct cYAML **err_rc);
156
157 /*
158  * lustre_lnet_del_ni
159  *   Send down an IOCTL to delete a network interface. It implicitly
160  *   deletes a network if it becomes empty of nis
161  *
162  *   nw  - network and interface list
163  *   seq_no - sequence number of the request
164  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
165  */
166 int lustre_lnet_del_ni(struct lnet_dlc_network_descr *nw,
167                        int seq_no, struct cYAML **err_rc);
168
169 /*
170  * lustre_lnet_show_net
171  *   Send down an IOCTL to show networks.
172  *   This function will use the nw paramter to filter the output.  If it's
173  *   not provided then all networks are listed.
174  *
175  *   nw - network to show.  Optional.  Used to filter output.
176  *   detail - flag to indicate if we require detail output.
177  *   seq_no - sequence number of the request
178  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
179  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
180  *   backup - true to output only what's necessary for reconfiguring
181  *            a node.
182  */
183 int lustre_lnet_show_net(char *nw, int detail, int seq_no,
184                          struct cYAML **show_rc, struct cYAML **err_rc,
185                          bool backup);
186
187 /*
188  * lustre_lnet_enable_routing
189  *   Send down an IOCTL to enable or diable routing
190  *
191  *   enable - 1 to enable routing, 0 to disable routing
192  *   seq_no - sequence number of the request
193  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
194  */
195 int lustre_lnet_enable_routing(int enable, int seq_no,
196                                struct cYAML **err_rc);
197
198 /*
199  * lustre_lnet_config_numa_range
200  *   Set the NUMA range which impacts the NIs to be selected
201  *   during sending. If the NUMA range is large the NUMA
202  *   distance between the message memory and the NI becomes
203  *   less significant. The NUMA range is a relative number
204  *   with no other meaning besides allowing a wider breadth
205  *   for picking an NI to send from.
206  *
207  *   range - numa range value.
208  *   seq_no - sequence number of the request
209  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
210  *   caller
211  */
212 int lustre_lnet_config_numa_range(int range, int seq_no,
213                                   struct cYAML **err_rc);
214
215 /*
216  * lustre_lnet_show_num_range
217  *   Get the currently set NUMA range
218  *
219  *   seq_no - sequence number of the request
220  *   show_rc - [OUT] struct cYAML tree containing NUMA range info
221  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
222  *   caller
223  */
224 int lustre_lnet_show_numa_range(int seq_no, struct cYAML **show_rc,
225                                 struct cYAML **err_rc);
226
227 /*
228  * lustre_lnet_config_ni_healthv
229  *   set the health value of the NI. -1 resets the value to maximum.
230  *
231  *   value: health value to set.
232  *   all: true to set all local NIs to that value.
233  *   ni_nid: NI NID to set its health value. all parameter always takes
234  *   precedence
235  *   seq_no - sequence number of the request
236  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
237  *   caller
238  */
239 int lustre_lnet_config_ni_healthv(int value, bool all, char *ni_nid,
240                                   int seq_no, struct cYAML **err_rc);
241
242 /*
243  * lustre_lnet_config_peer_ni_healthv
244  *   set the health value of the peer NI. -1 resets the value to maximum.
245  *
246  *   value: health value to set.
247  *   all: true to set all local NIs to that value.
248  *   pni_nid: Peer NI NID to set its health value. all parameter always takes
249  *   precedence
250  *   seq_no - sequence number of the request
251  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
252  *   caller
253  */
254 int lustre_lnet_config_peer_ni_healthv(int value, bool all, char *pni_nid,
255                                        int seq_no, struct cYAML **err_rc);
256
257 /*
258  * lustre_lnet_config_recov_intrv
259  *   set the recovery interval in seconds. That's the interval to ping an
260  *   unhealthy interface.
261  *
262  *   intrv - recovery interval value to configure
263  *   seq_no - sequence number of the request
264  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
265  *   caller
266  */
267 int lustre_lnet_config_recov_intrv(int intrv, int seq_no, struct cYAML **err_rc);
268
269 /*
270  * lustre_lnet_show_recov_intrv
271  *    show the recovery interval set in the system
272  *
273  *   seq_no - sequence number of the request
274  *   show_rc - [OUT] struct cYAML tree containing health sensitivity info
275  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
276  *   caller
277  */
278 int lustre_lnet_show_recov_intrv(int seq_no, struct cYAML **show_rc,
279                                  struct cYAML **err_rc);
280
281 /*
282  * lustre_lnet_config_hsensitivity
283  *   sets the health sensitivity; the value by which to decrement the
284  *   health value of a local or peer NI. If 0 then health is turned off
285  *
286  *   sen - sensitivity value to configure
287  *   seq_no - sequence number of the request
288  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
289  *   caller
290  */
291 int lustre_lnet_config_hsensitivity(int sen, int seq_no, struct cYAML **err_rc);
292
293 /*
294  * lustre_lnet_show_hsensitivity
295  *    show the health sensitivity in the system
296  *
297  *   seq_no - sequence number of the request
298  *   show_rc - [OUT] struct cYAML tree containing health sensitivity info
299  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
300  *   caller
301  */
302 int lustre_lnet_show_hsensitivity(int seq_no, struct cYAML **show_rc,
303                                   struct cYAML **err_rc);
304
305 /*
306  * lustre_lnet_config_transaction_to
307  *   sets the timeout after which a message expires or a timeout event is
308  *   propagated for an expired response.
309  *
310  *   timeout - timeout value to configure
311  *   seq_no - sequence number of the request
312  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
313  *   caller
314  */
315 int lustre_lnet_config_transaction_to(int timeout, int seq_no, struct cYAML **err_rc);
316
317 /*
318  * lustre_lnet_show_transaction_to
319  *    show the transaction timeout in the system
320  *
321  *   seq_no - sequence number of the request
322  *   show_rc - [OUT] struct cYAML tree containing transaction timeout info
323  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
324  *   caller
325  */
326 int lustre_lnet_show_transaction_to(int seq_no, struct cYAML **show_rc,
327                                     struct cYAML **err_rc);
328
329 /*
330  * lustre_lnet_config_retry_count
331  *   sets the maximum number of retries to resend a message
332  *
333  *   count - maximum value to configure
334  *   seq_no - sequence number of the request
335  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
336  *   caller
337  */
338 int lustre_lnet_config_retry_count(int count, int seq_no, struct cYAML **err_rc);
339
340 /*
341  * lustre_lnet_show_retry_count
342  *    show current maximum number of retries in the system
343  *
344  *   seq_no - sequence number of the request
345  *   show_rc - [OUT] struct cYAML tree containing retry count info
346  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
347  *   caller
348  */
349 int lustre_lnet_show_retry_count(int seq_no, struct cYAML **show_rc,
350                                  struct cYAML **err_rc);
351
352 int lustre_lnet_show_local_ni_recovq(int seq_no, struct cYAML **show_rc,
353                                      struct cYAML **err_rc);
354
355 int lustre_lnet_show_peer_ni_recovq(int seq_no, struct cYAML **show_rc,
356                                     struct cYAML **err_rc);
357
358 /*
359  * lustre_lnet_config_max_intf
360  *   Sets the maximum number of interfaces per node. this tunable is
361  *   primarily useful for sanity checks prior to allocating memory.
362  *
363  *   max - maximum value to configure
364  *   seq_no - sequence number of the request
365  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
366  *   caller
367  */
368 int lustre_lnet_config_max_intf(int max, int seq_no, struct cYAML **err_rc);
369
370 /*
371  * lustre_lnet_show_max_intf
372  *    show current maximum interface setting
373  *
374  *   seq_no - sequence number of the request
375  *   show_rc - [OUT] struct cYAML tree containing NUMA range info
376  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
377  *   caller
378  */
379 int lustre_lnet_show_max_intf(int seq_no, struct cYAML **show_rc,
380                               struct cYAML **err_rc);
381
382 /*
383  * lustre_lnet_config_discovery
384  *   Enable or disable peer discovery. Peer discovery is enabled by default.
385  *
386  *   enable - non-0 enables, 0 disables
387  *   seq_no - sequence number of the request
388  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
389  *   caller
390  */
391 int lustre_lnet_config_discovery(int enable, int seq_no, struct cYAML **err_rc);
392
393 /*
394  * lustre_lnet_show_discovery
395  *    show current peer discovery setting
396  *
397  *   seq_no - sequence number of the request
398  *   show_rc - [OUT] struct cYAML tree containing NUMA range info
399  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
400  *   caller
401  */
402 int lustre_lnet_show_discovery(int seq_no, struct cYAML **show_rc,
403                                struct cYAML **err_rc);
404
405 /*
406  * lustre_lnet_config_drop_asym_route
407  *   Drop or accept asymmetrical route messages. Accept by default.
408  *
409  *   drop - non-0 drops, 0 accepts
410  *   seq_no - sequence number of the request
411  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
412  *   caller
413  */
414 int lustre_lnet_config_drop_asym_route(int drop, int seq_no,
415                                        struct cYAML **err_rc);
416
417 /*
418  * lustre_lnet_show_drop_asym_route
419  *    show current drop asym route setting
420  *
421  *   seq_no - sequence number of the request
422  *   show_rc - [OUT] struct cYAML tree containing NUMA range info
423  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by
424  *   caller
425  */
426 int lustre_lnet_show_drop_asym_route(int seq_no, struct cYAML **show_rc,
427                                      struct cYAML **err_rc);
428
429 /*
430  * lustre_lnet_config_buffers
431  *   Send down an IOCTL to configure routing buffer sizes.  A value of 0 means
432  *   default that particular buffer to default size. A value of -1 means
433  *   leave the value of the buffer un changed.
434  *
435  *   tiny - tiny buffers
436  *   small - small buffers
437  *   large - large buffers.
438  *   seq_no - sequence number of the request
439  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
440  */
441 int lustre_lnet_config_buffers(int tiny, int small, int large,
442                                int seq_no, struct cYAML **err_rc);
443
444 /*
445  * lustre_lnet_show_routing
446  *   Send down an IOCTL to dump buffers and routing status
447  *   This function is used to dump buffers for all CPU partitions.
448  *
449  *   seq_no - sequence number of the request
450  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
451  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
452  *   backup - true to output only what's necessary for reconfiguring
453  *            a node.
454  */
455 int lustre_lnet_show_routing(int seq_no, struct cYAML **show_rc,
456                              struct cYAML **err_rc, bool backup);
457
458 /*
459  * lustre_lnet_show_stats
460  *   Shows internal LNET statistics.  This is useful to display the
461  *   current LNET activity, such as number of messages route, etc
462  *
463  *     seq_no - sequence number of the command
464  *     show_rc - YAML structure of the resultant show
465  *     err_rc - YAML strucutre of the resultant return code.
466  */
467 int lustre_lnet_show_stats(int seq_no, struct cYAML **show_rc,
468                            struct cYAML **err_rc);
469
470 /*
471  * lustre_lnet_config_peer_nid
472  *   Add a peer nid to a peer with primary nid pnid. If no pnid is given
473  *   then the first nid in the nid list becomes the primary nid for
474  *   a newly created peer.
475  *   Otherwise if pnid is provided and it's unique then a new peer is
476  *   created with pnid as the primary NID and the nids in the nid list as
477  *   secondary nids.
478  *   If any of the peers nids provided in with exception to the pnid is
479  *   not unique the operation fails. Some peer nids might have already
480  *   been added. It's the role of the caller of this API to remove the
481  *   added NIDs if they wish.
482  *
483  *     pnid - Primary NID of the peer
484  *     nid - list of nids to add
485  *     num_nids - number of nids in the nid array
486  *     mr - true if this peer is MR capable.
487  *     ip2nets - true if a list of nid expressions are given to configure
488  *     multiple peers
489  *     seq_no - sequence number of the command
490  *     err_rc - YAML strucutre of the resultant return code.
491  */
492 int lustre_lnet_config_peer_nid(char *pnid, char **nid, int num_nids,
493                                 bool mr, bool ip2nets, int seq_no,
494                                 struct cYAML **err_rc);
495
496 /*
497  * lustre_lnet_del_peer_nid
498  *  Delete the nids given in the nid list from the peer with primary NID
499  *  pnid. If pnid is NULL or it doesn't identify a peer the operation
500  *  fails and no change happens to the system.
501  *  The operation is aborted on the first NID that fails to be deleted.
502  *
503  *     pnid - Primary NID of the peer
504  *     nid - list of nids to add
505  *     num_nids - number of nids in the nid array
506  *     ip2nets - used to specify a range of nids
507  *     seq_no - sequence number of the command
508  *     err_rc - YAML strucutre of the resultant return code.
509  */
510 int lustre_lnet_del_peer_nid(char *pnid, char **nid, int num_nids,
511                              bool ip2nets, int seq_no, struct cYAML **err_rc);
512
513 /*
514  * lustre_lnet_show_peer
515  *   Show the peer identified by nid, knid. If knid is NULL all
516  *   peers in the system are shown.
517  *
518  *     knid - A NID of the peer
519  *     detail - display detailed information
520  *     seq_no - sequence number of the command
521  *     show_rc - YAML structure of the resultant show
522  *     err_rc - YAML strucutre of the resultant return code.
523  *     backup - true to output only what's necessary for reconfiguring
524  *              a node.
525  *
526  */
527 int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
528                           struct cYAML **show_rc, struct cYAML **err_rc,
529                           bool backup);
530
531 /*
532  * lustre_lnet_list_peer
533  *   List the known peers.
534  *
535  *     seq_no - sequence number of the command
536  *     show_rc - YAML structure of the resultant show
537  *     err_rc - YAML strucutre of the resultant return code.
538  *
539  */
540 int lustre_lnet_list_peer(int seq_no,
541                           struct cYAML **show_rc, struct cYAML **err_rc);
542
543 /* lustre_lnet_ping_nid
544  *   Ping the nid list, pnids.
545  *
546  *    pnids - NID list to ping.
547  *    timeout - timeout(seconds) for ping.
548  *    seq_no - sequence number of the command.
549  *    show_rc - YAML structure of the resultant show.
550  *    err_rc - YAML strucutre of the resultant return code.
551  *
552  */
553 int lustre_lnet_ping_nid(char *pnid, int timeout, int seq_no,
554                         struct cYAML **show_rc, struct cYAML **err_rc);
555
556 /* lustre_lnet_discover_nid
557  *   Discover the nid list, pnids.
558  *
559  *    pnids - NID list to discover.
560  *    force - force discovery.
561  *    seq_no - sequence number of the command.
562  *    show_rc - YAML structure of the resultant show.
563  *    err_rc - YAML strucutre of the resultant return code.
564  *
565  */
566 int lustre_lnet_discover_nid(char *pnid, int force, int seq_no,
567                              struct cYAML **show_rc, struct cYAML **err_rc);
568
569 /*
570  * lustre_yaml_config
571  *   Parses the provided YAML file and then calls the specific APIs
572  *   to configure the entities identified in the file
573  *
574  *   f - YAML file
575  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
576  */
577 int lustre_yaml_config(char *f, struct cYAML **err_rc);
578
579 /*
580  * lustre_yaml_del
581  *   Parses the provided YAML file and then calls the specific APIs
582  *   to delete the entities identified in the file
583  *
584  *   f - YAML file
585  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
586  */
587 int lustre_yaml_del(char *f, struct cYAML **err_rc);
588
589 /*
590  * lustre_yaml_show
591  *   Parses the provided YAML file and then calls the specific APIs
592  *   to show the entities identified in the file
593  *
594  *   f - YAML file
595  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
596  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
597  */
598 int lustre_yaml_show(char *f, struct cYAML **show_rc,
599                      struct cYAML **err_rc);
600
601 /*
602  * lustre_yaml_exec
603  *   Parses the provided YAML file and then calls the specific APIs
604  *   to execute the entities identified in the file
605  *
606  *   f - YAML file
607  *   show_rc - [OUT] The show output in YAML.  Must be freed by caller.
608  *   err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
609  */
610 int lustre_yaml_exec(char *f, struct cYAML **show_rc,
611                      struct cYAML **err_rc);
612
613 /*
614  * lustre_lnet_init_nw_descr
615  *      initialize the network descriptor structure for use
616  */
617 void lustre_lnet_init_nw_descr(struct lnet_dlc_network_descr *nw_descr);
618
619 /*
620  * lustre_lnet_parse_interfaces
621  *      prase an interface string and populate descriptor structures
622  *              intf_str - interface string of the format
623  *                      <intf>[<expr>], <intf>[<expr>],..
624  *              nw_descr - network descriptor to populate
625  *              init - True to initialize nw_descr
626  */
627 int lustre_lnet_parse_interfaces(char *intf_str,
628                                  struct lnet_dlc_network_descr *nw_descr);
629
630 /*
631  * lustre_lnet_parse_nids
632  *      Parse a set of nids into a locally allocated array and return the
633  *      pointer of the array to the caller. The caller is responsible for
634  *      freeing the array. If an initial array is provided then copy over
635  *      the contents of that array into the new array and append to it the
636  *      new content.
637  *      The nids can be of the form "nid [,nid, nid, nid]"
638  *              nids: nids string to be parsed
639  *              array: initial array of content
640  *              size: num of elements in the array
641  *              out_array: [OUT] new allocated array.
642  *      Returns size of array
643  *              sets the out_array to NULL on failure.
644  */
645 int lustre_lnet_parse_nids(char *nids, char **array, int size,
646                            char ***out_array);
647
648 #endif /* LIB_LNET_CONFIG_API_H */