1 // SPDX-License-Identifier: LGPL-2.0
4 * Copyright (c) 2014, 2017, Intel Corporation.
8 * This file is part of Lustre, http://www.lustre.org/
10 * Author: Amir Shehata <amir.shehata@intel.com>
13 #ifndef LIB_LNET_CONFIG_API_H
14 #define LIB_LNET_CONFIG_API_H
19 #include <sys/socket.h>
21 #include <netlink/netlink.h>
22 #include <netlink/genl/genl.h>
23 #include <netlink/genl/ctrl.h>
25 #include <libcfs/util/ioctl.h>
26 #include <libcfs/util/string.h>
27 #include <linux/lnet/lnet-dlc.h>
28 #include <linux/lnet/nidstr.h>
30 #define LUSTRE_CFG_RC_NO_ERR 0 /* success */
31 #define LUSTRE_CFG_RC_BAD_PARAM -EINVAL /* 22 */
32 #define LUSTRE_CFG_RC_MISSING_PARAM -EFAULT /* 14 */
33 #define LUSTRE_CFG_RC_OUT_OF_RANGE_PARAM -ERANGE /* 34 */
34 #define LUSTRE_CFG_RC_OUT_OF_MEM -ENOMEM /* 12 */
35 #define LUSTRE_CFG_RC_GENERIC_ERR -ENODATA /* 61 */
36 #define LUSTRE_CFG_RC_NO_MATCH -ENOMSG /* 42 */
37 #define LUSTRE_CFG_RC_MATCH -EXFULL /* 54 */
38 #define LUSTRE_CFG_RC_SKIP -EBADSLT /* 57 */
39 #define LUSTRE_CFG_RC_LAST_ELEM -ECHRNG /* 48 */
40 #define LUSTRE_CFG_RC_MARSHAL_FAIL -ENOSTR /* 60 */
42 #define CONFIG_CMD "configure"
43 #define UNCONFIG_CMD "unconfigure"
46 #define SHOW_CMD "show"
48 #define MANAGE_CMD "manage"
50 #define MAX_NUM_IPS 128
51 #define INT_STRING_LEN 23
52 #define LNET_DEFAULT_INDENT 6
54 #define modparam_path "/sys/module/lnet/parameters/"
55 #define o2ib_modparam_path "/sys/module/ko2iblnd/parameters/"
56 #define gni_nid_path "/proc/cray_xt/"
59 LNETCTL_CONFIG_CMD = 1,
60 LNETCTL_UNCONFIG_CMD = 2,
65 LNETCTL_MANAGE_CMD = 7,
70 * Max number of nids we'll configure for a single peer via a single DLC
73 #define LNET_MAX_NIDS_PER_PEER 128
75 struct lnet_dlc_network_descr {
76 struct list_head network_on_rule;
78 struct list_head nw_intflist;
81 struct lnet_dlc_intf_descr {
82 struct list_head intf_on_network;
83 char intf_name[LNET_MAX_STR_LEN];
84 struct cfs_expr_list *cpt_expr;
87 /* This UDSP structures need to match the kernel space structures
88 * in order for the marshall and unmarshall functions to be the same.
91 /* Net is described as a
95 struct lnet_ud_net_descr {
97 struct list_head udn_net_num_range;
100 /* each NID range is defined as
102 * 2. address range descriptor
104 struct lnet_ud_nid_descr {
105 struct lnet_ud_net_descr ud_net_id;
106 struct list_head ud_addr_range;
109 /* a UDSP rule can have up to three user defined NID descriptors
110 * - src: defines the local NID range for the rule
111 * - dst: defines the peer NID range for the rule
112 * - rte: defines the router NID range for the rule
114 * An action union defines the action to take when the rule
118 struct list_head udsp_on_list;
120 struct lnet_ud_nid_descr udsp_src;
121 struct lnet_ud_nid_descr udsp_dst;
122 struct lnet_ud_nid_descr udsp_rte;
123 enum lnet_udsp_action_type udsp_action_type;
129 /* This union is passed from lnetctl to fill the action union in udsp
131 * TODO: The idea here is if we add extra actions, ex: drop, it can be
134 union lnet_udsp_action {
138 /* forward declaration of the cYAML structure. */
142 * lustre_lnet_config_lib_init()
143 * Initialize the Library to enable communication with the LNET kernel
144 * module. Returns the device ID or -EINVAL if there is an error
146 int lustre_lnet_config_lib_init();
149 * lustre_lnet_config_lib_uninit
150 * Uninitialize the DLC Library
152 void lustre_lnet_config_lib_uninit();
155 * lustre_lnet_config_ni_system
156 * Initialize/Uninitialize the lnet NI system.
158 * up - whehter to init or uninit the system
159 * load_ni_from_mod - load NI from mod params.
160 * seq_no - sequence number of the request
161 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
164 int lustre_lnet_config_ni_system(bool up, bool load_ni_from_mod,
165 int seq_no, struct cYAML **err_rc);
168 * lustre_lnet_config_route
169 * Send down an IOCTL to the kernel to configure the route
173 * hops - number of hops passed down by the user
174 * prio - priority of the route
175 * sen - health sensitivity value for the gateway
176 * seq_no - sequence number of the request
177 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
179 int lustre_lnet_config_route(char *nw, char *gw, int hops, int prio,
180 int sen, int seq_no, struct cYAML **err_rc);
183 * lustre_lnet_del_route
184 * Send down an IOCTL to the kernel to delete a route
188 * seq_no - sequence number of the request
189 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
191 int lustre_lnet_del_route(char *nw, char *gw, int seq_no,
192 struct cYAML **err_rc);
195 * lustre_lnet_show_route
196 * Send down an IOCTL to the kernel to show routes
197 * This function will get one route at a time and filter according to
198 * provided parameters. If no routes are available then it will dump all
199 * routes that are in the system.
201 * nw - network. Optional. Used to filter output
202 * gw - gateway. Optional. Used to filter ouptut
203 * hops - number of hops passed down by the user
204 * Optional. Used to filter output.
205 * prio - priority of the route. Optional. Used to filter output.
206 * detail - flag to indicate whether detail output is required
207 * seq_no - sequence number of the request
208 * show_rc - [OUT] The show output in YAML. Must be freed by caller.
209 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
210 * backup - true to output only what's necessary for reconfiguring
213 int lustre_lnet_show_route(char *nw, char *gw,
214 int hops, int prio, int detail,
215 int seq_no, struct cYAML **show_rc,
216 struct cYAML **err_rc, bool backup);
219 * lustre_lnet_config_ni
220 * Send down an IOCTL to configure a network interface. It implicitly
221 * creates a network if one doesn't exist..
223 * nw_descr - network and interface descriptor
224 * global_cpts - globally defined CPTs
225 * ip2net - this parameter allows configuring multiple networks.
226 * it takes precedence over the net and intf parameters
227 * tunables - LND tunables
228 * seq_no - sequence number of the request
229 * lnd_tunables - lnet specific tunable parameters
230 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
232 int lustre_lnet_config_ni(struct lnet_dlc_network_descr *nw_descr,
233 struct cfs_expr_list *global_cpts,
235 struct lnet_ioctl_config_lnd_tunables *tunables,
236 int seq_no, struct cYAML **err_rc);
240 * Send down an IOCTL to delete a network interface. It implicitly
241 * deletes a network if it becomes empty of nis
243 * nw - network and interface list
244 * seq_no - sequence number of the request
245 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
247 int lustre_lnet_del_ni(struct lnet_dlc_network_descr *nw,
248 int seq_no, struct cYAML **err_rc);
251 * lustre_lnet_show_net
252 * Send down an IOCTL to show networks.
253 * This function will use the nw paramter to filter the output. If it's
254 * not provided then all networks are listed.
256 * nw - network to show. Optional. Used to filter output.
257 * detail - flag to indicate if we require detail output.
258 * seq_no - sequence number of the request
259 * show_rc - [OUT] The show output in YAML. Must be freed by caller.
260 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
261 * backup - true to output only what's necessary for reconfiguring
264 int lustre_lnet_show_net(char *nw, int detail, int seq_no,
265 struct cYAML **show_rc, struct cYAML **err_rc,
269 * lustre_lnet_enable_routing
270 * Send down an IOCTL to enable or diable routing
272 * enable - 1 to enable routing, 0 to disable routing
273 * seq_no - sequence number of the request
274 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
276 int lustre_lnet_enable_routing(int enable, int seq_no,
277 struct cYAML **err_rc);
280 * lustre_lnet_config_numa_range
281 * Set the NUMA range which impacts the NIs to be selected
282 * during sending. If the NUMA range is large the NUMA
283 * distance between the message memory and the NI becomes
284 * less significant. The NUMA range is a relative number
285 * with no other meaning besides allowing a wider breadth
286 * for picking an NI to send from.
288 * range - numa range value.
289 * seq_no - sequence number of the request
290 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
293 int lustre_lnet_config_numa_range(int range, int seq_no,
294 struct cYAML **err_rc);
297 * lustre_lnet_show_num_range
298 * Get the currently set NUMA range
300 * seq_no - sequence number of the request
301 * show_rc - [OUT] struct cYAML tree containing NUMA range info
302 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
305 int lustre_lnet_show_numa_range(int seq_no, struct cYAML **show_rc,
306 struct cYAML **err_rc);
309 * lustre_lnet_config_ni_healthv
310 * set the health value of the NI. -1 resets the value to maximum.
312 * value: health value to set.
313 * all: true to set all local NIs to that value.
314 * ni_nid: NI NID to set its health value. all parameter always takes
316 * seq_no - sequence number of the request
317 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
320 int lustre_lnet_config_ni_healthv(int value, bool all, char *ni_nid,
321 int seq_no, struct cYAML **err_rc);
324 /* lustre_lnet_config_ni_conns_per_peer
325 * set the conns_per_peer value of the NI. Valid range is specific to
328 * value: conns_per_peer value to set.
329 * all: true to set all local NIs to that value.
330 * ni_nid: NI NID to set its conns_per_peer value. 'all' parameter always
332 * seq_no - sequence number of the request
333 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
336 int lustre_lnet_config_ni_conns_per_peer(int value, bool all, char *ni_nid,
337 int seq_no, struct cYAML **err_rc);
340 * lustre_lnet_config_peer_ni_healthv
341 * set the health value of the peer NI. -1 resets the value to maximum.
343 * value: health value to set.
344 * all: true to set all local NIs to that value.
345 * pni_nid: Peer NI NID to set its health value. all parameter always takes
347 * seq_no - sequence number of the request
348 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
351 int lustre_lnet_config_peer_ni_healthv(int value, bool all, char *pni_nid,
352 int seq_no, struct cYAML **err_rc);
355 * lustre_lnet_config_recov_intrv
356 * set the recovery interval in seconds. That's the interval to ping an
357 * unhealthy interface.
359 * intrv - recovery interval value to configure
360 * seq_no - sequence number of the request
361 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
364 int lustre_lnet_config_recov_intrv(int intrv, int seq_no, struct cYAML **err_rc);
367 * lustre_lnet_show_recov_intrv
368 * show the recovery interval set in the system
370 * seq_no - sequence number of the request
371 * show_rc - [OUT] struct cYAML tree containing health sensitivity info
372 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
375 int lustre_lnet_show_recov_intrv(int seq_no, struct cYAML **show_rc,
376 struct cYAML **err_rc);
379 * lustre_lnet_config_rtr_sensitivity
380 * sets the router sensitivity percentage. If the percentage health
381 * of a router interface drops below that it's considered failed
383 * sen - sensitivity value to configure
384 * seq_no - sequence number of the request
385 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
388 int lustre_lnet_config_rtr_sensitivity(int sen, int seq_no, struct cYAML **err_rc);
391 * lustre_lnet_config_hsensitivity
392 * sets the health sensitivity; the value by which to decrement the
393 * health value of a local or peer NI. If 0 then health is turned off
395 * sen - sensitivity value to configure
396 * seq_no - sequence number of the request
397 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
400 int lustre_lnet_config_hsensitivity(int sen, int seq_no, struct cYAML **err_rc);
403 * lustre_lnet_show_hsensitivity
404 * show the health sensitivity in the system
406 * seq_no - sequence number of the request
407 * show_rc - [OUT] struct cYAML tree containing health sensitivity info
408 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
411 int lustre_lnet_show_hsensitivity(int seq_no, struct cYAML **show_rc,
412 struct cYAML **err_rc);
415 * lustre_lnet_show_rtr_sensitivity
416 * show the router sensitivity percentage in the system
418 * seq_no - sequence number of the request
419 * show_rc - [OUT] struct cYAML tree containing health sensitivity info
420 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
423 int lustre_lnet_show_rtr_sensitivity(int seq_no, struct cYAML **show_rc,
424 struct cYAML **err_rc);
427 * lustre_lnet_config_transaction_to
428 * sets the timeout after which a message expires or a timeout event is
429 * propagated for an expired response.
431 * timeout - timeout value to configure
432 * seq_no - sequence number of the request
433 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
436 int lustre_lnet_config_transaction_to(int timeout, int seq_no, struct cYAML **err_rc);
439 * lustre_lnet_show_transaction_to
440 * show the transaction timeout in the system
442 * seq_no - sequence number of the request
443 * show_rc - [OUT] struct cYAML tree containing transaction timeout info
444 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
447 int lustre_lnet_show_transaction_to(int seq_no, struct cYAML **show_rc,
448 struct cYAML **err_rc);
451 * lustre_lnet_config_retry_count
452 * sets the maximum number of retries to resend a message
454 * count - maximum value to configure
455 * seq_no - sequence number of the request
456 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
459 int lustre_lnet_config_retry_count(int count, int seq_no, struct cYAML **err_rc);
462 * lustre_lnet_show_retry_count
463 * show current maximum number of retries in the system
465 * seq_no - sequence number of the request
466 * show_rc - [OUT] struct cYAML tree containing retry count info
467 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
470 int lustre_lnet_show_retry_count(int seq_no, struct cYAML **show_rc,
471 struct cYAML **err_rc);
473 int lustre_lnet_show_lnd_timeout(int seq_no, struct cYAML **show_rc,
474 struct cYAML **err_rc);
476 int lustre_lnet_show_local_ni_recovq(int seq_no, struct cYAML **show_rc,
477 struct cYAML **err_rc);
479 int lustre_lnet_show_peer_ni_recovq(int seq_no, struct cYAML **show_rc,
480 struct cYAML **err_rc);
481 int lustre_lnet_config_response_tracking(int count, int seq_no,
482 struct cYAML **err_rc);
483 int lustre_lnet_show_response_tracking(int seq_no, struct cYAML **show_rc,
484 struct cYAML **err_rc);
485 int lustre_lnet_config_recovery_limit(int val, int seq_no,
486 struct cYAML **err_rc);
487 int lustre_lnet_show_recovery_limit(int seq_no, struct cYAML **show_rc,
488 struct cYAML **err_rc);
489 int lustre_lnet_show_max_recovery_ping_interval(int seq_no,
490 struct cYAML **show_rc,
491 struct cYAML **err_rc);
494 * lustre_lnet_config_max_intf
495 * Sets the maximum number of interfaces per node. this tunable is
496 * primarily useful for sanity checks prior to allocating memory.
498 * max - maximum value to configure
499 * seq_no - sequence number of the request
500 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
503 int lustre_lnet_config_max_intf(int max, int seq_no, struct cYAML **err_rc);
506 * lustre_lnet_show_max_intf
507 * show current maximum interface setting
509 * seq_no - sequence number of the request
510 * show_rc - [OUT] struct cYAML tree containing NUMA range info
511 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
514 int lustre_lnet_show_max_intf(int seq_no, struct cYAML **show_rc,
515 struct cYAML **err_rc);
518 * lustre_lnet_calc_service_id
519 * Calculate the lustre service id to be used for qos
521 int lustre_lnet_calc_service_id(__u64 *service_id);
524 * lustre_lnet_setup_mrrouting
525 * configure linux routing tables for tcp interfaces
527 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
530 int lustre_lnet_setup_mrrouting(struct cYAML **err_rc);
533 * lustre_lnet_config_discovery
534 * Enable or disable peer discovery. Peer discovery is enabled by default.
536 * enable - non-0 enables, 0 disables
537 * seq_no - sequence number of the request
538 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
541 int lustre_lnet_config_discovery(int enable, int seq_no, struct cYAML **err_rc);
544 * lustre_lnet_show_discovery
545 * show current peer discovery setting
547 * seq_no - sequence number of the request
548 * show_rc - [OUT] struct cYAML tree containing NUMA range info
549 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
552 int lustre_lnet_show_discovery(int seq_no, struct cYAML **show_rc,
553 struct cYAML **err_rc);
556 * lustre_lnet_config_drop_asym_route
557 * Drop or accept asymmetrical route messages. Accept by default.
559 * drop - non-0 drops, 0 accepts
560 * seq_no - sequence number of the request
561 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
564 int lustre_lnet_config_drop_asym_route(int drop, int seq_no,
565 struct cYAML **err_rc);
568 * lustre_lnet_show_drop_asym_route
569 * show current drop asym route setting
571 * seq_no - sequence number of the request
572 * show_rc - [OUT] struct cYAML tree containing NUMA range info
573 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
576 int lustre_lnet_show_drop_asym_route(int seq_no, struct cYAML **show_rc,
577 struct cYAML **err_rc);
580 * lustre_lnet_config_buffers
581 * Send down an IOCTL to configure routing buffer sizes. A value of 0 means
582 * default that particular buffer to default size. A value of -1 means
583 * leave the value of the buffer un changed.
585 * tiny - tiny buffers
586 * small - small buffers
587 * large - large buffers.
588 * seq_no - sequence number of the request
589 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
591 int lustre_lnet_config_buffers(int tiny, int small, int large,
592 int seq_no, struct cYAML **err_rc);
595 * lustre_lnet_config_max_recovery_ping_interval
596 * Set the maximum recovery ping interval.
598 * interval - interval value in seconds
599 * seq_no - sequence number of the request
600 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
602 int lustre_lnet_config_max_recovery_ping_interval(int interval, int seq_no,
603 struct cYAML **err_rc);
606 * lustre_lnet_show_routing
607 * Send down an IOCTL to dump buffers and routing status
608 * This function is used to dump buffers for all CPU partitions.
610 * seq_no - sequence number of the request
611 * show_rc - [OUT] The show output in YAML. Must be freed by caller.
612 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
613 * backup - true to output only what's necessary for reconfiguring
616 int lustre_lnet_show_routing(int seq_no, struct cYAML **show_rc,
617 struct cYAML **err_rc, bool backup);
620 * lustre_lnet_show_stats
621 * Shows internal LNET statistics. This is useful to display the
622 * current LNET activity, such as number of messages route, etc
624 * seq_no - sequence number of the command
625 * show_rc - YAML structure of the resultant show
626 * err_rc - YAML strucutre of the resultant return code.
628 int lustre_lnet_show_stats(int seq_no, struct cYAML **show_rc,
629 struct cYAML **err_rc);
632 * lustre_lnet_reset_stats
633 * Resets internal LNET statistics.
635 * err_rc - YAML strucutre of the resultant return code.
637 int lustre_lnet_reset_stats(int seq_no, struct cYAML **err_rc);
640 * lustre_lnet_modify_peer
641 * Handle a peer config or delete operation.
644 * Add a peer NID to a peer with primary NID pnid.
645 * If the provided primary NID is unique, then a new peer is
646 * created with this primary NID, and the NIDs in the NID list are added as
647 * secondary NIDs to this new peer.
648 * If any of the NIDs in the NID list are not unique then the operation
649 * fails. Some peer NIDs might have already been added. It's the responsibility
650 * of the caller of this API to remove the added NIDs if so desired.
653 * Delete the NIDs given in the NID list from the peer with the primary NID
654 * pnid. If pnid is NULL, or it doesn't identify a peer, the operation fails,
655 * and no change happens to the system.
656 * The operation is aborted on the first NID that fails to be deleted.
658 * prim_nid - The desired primary NID of a new peer, or the primary NID of
660 * nids - a comma separated string of nids
661 * is_mr - Specifies whether this peer is MR capable.
662 * cmd - CONFIG or DELETE
663 * force - whether force-deleting a peer with locked primary nid
664 * seq_no - sequence number of the command
665 * err_rc - YAML structure of the resultant return code
667 int lustre_lnet_modify_peer(char *prim_nid, char *nids, bool is_mr, int cmd,
668 int force, int seq_no, struct cYAML **err_rc);
671 * lustre_lnet_show_peer
672 * Show the peer identified by nid, knid. If knid is NULL all
673 * peers in the system are shown.
675 * knid - A NID of the peer
676 * detail - display detailed information
677 * seq_no - sequence number of the command
678 * show_rc - YAML structure of the resultant show
679 * err_rc - YAML strucutre of the resultant return code.
680 * backup - true to output only what's necessary for reconfiguring
684 int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
685 struct cYAML **show_rc, struct cYAML **err_rc,
689 * lustre_lnet_list_peer
690 * List the known peers.
692 * seq_no - sequence number of the command
693 * show_rc - YAML structure of the resultant show
694 * err_rc - YAML strucutre of the resultant return code.
697 int lustre_lnet_list_peer(int seq_no,
698 struct cYAML **show_rc, struct cYAML **err_rc);
700 /* lustre_lnet_ping_nid
701 * Ping the nid list, pnids.
703 * pnids - NID list to ping.
704 * src_nidstr - source NID
705 * timeout - timeout(seconds) for ping.
706 * seq_no - sequence number of the command.
707 * show_rc - YAML structure of the resultant show.
708 * err_rc - YAML strucutre of the resultant return code.
711 int lustre_lnet_ping_nid(char *pnid, char *src_nidstr, int timeout, int seq_no,
712 struct cYAML **show_rc, struct cYAML **err_rc);
714 /* lustre_lnet_discover_nid
715 * Discover the nid list, pnids.
717 * pnids - NID list to discover.
718 * force - force discovery.
719 * seq_no - sequence number of the command.
720 * show_rc - YAML structure of the resultant show.
721 * err_rc - YAML strucutre of the resultant return code.
724 int lustre_lnet_discover_nid(char *pnid, int force, int seq_no,
725 struct cYAML **show_rc, struct cYAML **err_rc);
729 * Parses the provided YAML file and then calls the specific APIs
730 * to configure the entities identified in the file
733 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
735 int lustre_yaml_config(char *f, int len, struct cYAML **err_rc);
739 * Parses the provided YAML file and then calls the specific APIs
740 * to delete the entities identified in the file
743 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
745 int lustre_yaml_del(char *f, int len, struct cYAML **err_rc);
749 * Parses the provided YAML file and then calls the specific APIs
750 * to show the entities identified in the file
753 * show_rc - [OUT] The show output in YAML. Must be freed by caller.
754 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
756 int lustre_yaml_show(char *f, int len, struct cYAML **show_rc,
757 struct cYAML **err_rc);
761 * Parses the provided YAML file and then calls the specific APIs
762 * to execute the entities identified in the file
765 * show_rc - [OUT] The show output in YAML. Must be freed by caller.
766 * err_rc - [OUT] struct cYAML tree describing the error. Freed by caller
768 int lustre_yaml_exec(char *f, int len, struct cYAML **show_rc,
769 struct cYAML **err_rc);
772 char nidstr[LNET_MAX_STR_LEN * 2];
773 struct nl_list_head children;
774 struct nl_list_head list;
777 int lustre_lnet_parse_nid_range(struct nid_node *head, char *nidstr,
778 const char **errmsg);
779 void lustre_lnet_free_list(struct nid_node *head);
782 * yaml_lnet_configure
784 * Shared code for LNet setup and teardown.
786 * flags - Netlink flags that control setup behavior
787 * NLM_F_CREATE - initializes LNet stack
788 * NLM_F_EXCL - ignore module params
789 * 0 - tears down LNet stack
791 * msg error msg string returned.
793 int yaml_lnet_configure(int flags, const char **msg);
796 * yaml_emitter_set_output_netlink
798 * Special handling to integrate LNet handling into libyaml.
799 * This function sets up the ability to take the data stored in @emitter
800 * and formats into a netlink packet to send to the kernel.
802 * emitter - YAML emitter containing what the user specified
803 * nl - Netlink socket to be used by libyaml
804 * family - Netlink family
805 * version - notify kernel what version user land supports
806 * cmd - Netlink command to execute
807 * flags - Netlink flags
809 int yaml_emitter_set_output_netlink(yaml_emitter_t *emitter, struct nl_sock *nl,
810 char *family, int version, int cmd,
814 * yaml_parser_set_input_netlink
816 * Special handling to LNet handling into libyaml.
817 * This function sets up the ability to receive the Netlink data
818 * from the Linux kernel. That data is formated into a YAML document.
820 * parser - YAML parser that is used to present the data received
821 * from the kernel in Netlink format.
822 * nl - should be the Netlink socket receiving data from
824 * stream - Handle the case of continuous data coming in.
826 int yaml_parser_set_input_netlink(yaml_parser_t *parser, struct nl_sock *nl,
830 * yaml_parser_get_reader_proto_version
832 * This function retrieves the Neltink version the kernel module
835 * parser - YAML parser being used for Netlink communication.
837 int yaml_parser_get_reader_proto_version(yaml_parser_t *parser);
840 * yaml_parser_get_reader_error
842 * By default libyaml reports a generic write error. We need a way
843 * to report better parser errors so we can track down problems.
845 * parser - YAML parser that has reported an error.
847 const char *yaml_parser_get_reader_error(yaml_parser_t *parser);
850 * yaml_parser_log_error
852 * Helper function to report the parser error to @log.
854 * parser - YAML parser that has reported an error.
855 * log - file descriptor to write the error message out to.
856 * errmsg - Special extra string to append to error message.
858 void yaml_parser_log_error(yaml_parser_t *parser, FILE *log,
862 * yaml_emitter_log_error
864 * Helper function to report the emitter error to @log.
866 * emitter - YAML emitter that has reported an error.
867 * log - file descriptor to write the error message out to.
869 void yaml_emitter_log_error(yaml_emitter_t *emitter, FILE *log);
873 * lustre_lnet_init_nw_descr
874 * initialize the network descriptor structure for use
876 void lustre_lnet_init_nw_descr(struct lnet_dlc_network_descr *nw_descr);
879 * lustre_lnet_parse_interfaces
880 * prase an interface string and populate descriptor structures
881 * intf_str - interface string of the format
882 * <intf>[<expr>], <intf>[<expr>],..
883 * nw_descr - network descriptor to populate
884 * init - True to initialize nw_descr
886 int lustre_lnet_parse_interfaces(char *intf_str,
887 struct lnet_dlc_network_descr *nw_descr);
890 * lustre_lnet_parse_nidstr
891 * This is a small wrapper around cfs_parse_nidlist.
892 * nidstr - A string parseable by cfs_parse_nidlist
893 * lnet_nidlist - An array of lnet_nid_t to hold the nids specified
895 * max_nids - Size of the lnet_nidlist array, and the maximum number of
896 * nids that can be expressed by the nidstring. If the
897 * nidstring expands to a larger number of nids than max_nids
898 * then an error is returned.
899 * err_str - char pointer where we store an informative error
900 * message when an error is encountered
902 * The number (> 0) of lnet_nid_t stored in the supplied array, or
903 * LUSTRE_CFG_RC_BAD_PARAM if:
905 * - nidstr contains an asterisk. This character is not allowed
906 * because it would cause the size of the expanded nidlist to exceed
907 * the maximum number of nids that is supported by expected callers
909 * - cfs_parse_nidlist fails to parse the nidstring
910 * - The nidlist populated by cfs_parse_nidlist is empty
911 * - The nidstring expands to a larger number of nids than max_nids
912 * - The nidstring expands to zero nids
913 * LUSTRE_CFG_RC_OUT_OF_MEM if:
914 * - cfs_expand_nidlist can return ENOMEM. We return out of mem in
917 int lustre_lnet_parse_nidstr(char *nidstr, lnet_nid_t *lnet_nidlist,
918 int max_nids, char *err_str);
920 /* lustre_lnet_add_udsp
921 * Add a selection policy.
922 * src - source NID descriptor
923 * dst - destination NID descriptor
924 * rte - router NID descriptor
926 * action - union of the action
927 * idx - the index to delete
928 * seq_no - sequence number of the request
929 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
932 int lustre_lnet_add_udsp(char *src, char *dst, char *rte, char *type,
933 union lnet_udsp_action *action, int idx,
934 int seq_no, struct cYAML **err_rc);
936 /* lustre_lnet_del_udsp
937 * Delete a net selection policy.
938 * idx - the index to delete
939 * seq_no - sequence number of the request
940 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
943 int lustre_lnet_del_udsp(unsigned int idx, int seq_no, struct cYAML **err_rc);
945 /* lustre_lnet_show_udsp
946 * show selection policy.
947 * idx - the index to show. -1 to show all policies
948 * seq_no - sequence number of the request
949 * err_rc - [IN/OUT] struct cYAML tree containing udsp info
950 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
953 int lustre_lnet_show_udsp(int idx, int seq_no, struct cYAML **show_rc,
954 struct cYAML **err_rc);
956 /* lustre_lnet_show_peer_debug_info
957 * dump peer debug info
958 * peer_nid - nid of the peer to show
959 * seq_no - sequence number of the request
960 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
963 int lustre_lnet_show_peer_debug_info(char *peer_nid, int seq_no,
964 struct cYAML **err_rc);
966 /* lustre_lnet_set_peer_state
968 * lpni_nid - primary nid of the peer
969 * seq_no - sequence number of the request
970 * err_rc - [OUT] struct cYAML tree describing the error. Freed by
973 int lustre_lnet_set_peer_state(int state, char *lpni_nid, int seq_no,
974 struct cYAML **err_rc);
976 #endif /* LIB_LNET_CONFIG_API_H */