// SPDX-License-Identifier: GPL-2.0

/* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
 *
 * Copyright (c) 2011, 2017, Intel Corporation.
 *
 * Copyright (c) 2018-2020 Data Direct Networks.
 */

/* This file is part of Lustre, http://www.lustre.org/
 *
 * Author: Amir Shehata
 */

#ifndef UDSP_H
#define UDSP_H

#include <lnet/lib-lnet.h>

/**
 * lnet_udsp_add_policy
 *	Add a policy \new in position \idx
 *	Must be called with api_mutex held
 */
int lnet_udsp_add_policy(struct lnet_udsp *new, int idx);

/**
 * lnet_udsp_get_policy
 *	get a policy in position \idx
 *	Must be called with api_mutex held
 */
struct lnet_udsp *lnet_udsp_get_policy(int idx);

/**
 * lnet_udsp_del_policy
 *	Delete a policy from position \idx
 *	Must be called with api_mutex held
 */
int lnet_udsp_del_policy(int idx);

/**
 * lnet_udsp_apply_policies
 *	apply all stored policies across the system
 *	Must be called with api_mutex held
 *	Must NOT be called with lnet_net_lock held
 *	udsp: NULL to apply on all existing udsps
 *	      non-NULL to apply to specified udsp
 *	revert: true to revert policy application
 */
int lnet_udsp_apply_policies(struct lnet_udsp *udsp, bool revert);

/**
 * lnet_udsp_apply_policies_on_lpni
 *	apply all stored policies on specified \lpni
 *	Must be called with api_mutex held
 *	Must be called with LNET_LOCK_EX
 */
int lnet_udsp_apply_policies_on_lpni(struct lnet_peer_ni *lpni);

/**
 * lnet_udsp_apply_policies_on_lpn
 *	Must be called with api_mutex held
 *	apply all stored policies on specified \lpn
 *	Must be called with LNET_LOCK_EX
 */
int lnet_udsp_apply_policies_on_lpn(struct lnet_peer_net *lpn);

/**
 * lnet_udsp_apply_policies_on_ni
 *	apply all stored policies on specified \ni
 *	Must be called with api_mutex held
 *	Must be called with LNET_LOCK_EX
 */
int lnet_udsp_apply_policies_on_ni(struct lnet_ni *ni);

/**
 * lnet_udsp_apply_policies_on_net
 *	apply all stored policies on specified \net
 *	Must be called with api_mutex held
 *	Must be called with LNET_LOCK_EX
 */
int lnet_udsp_apply_policies_on_net(struct lnet_net *net);

/**
 * lnet_udsp_alloc
 *	Allocates a UDSP block and initializes it.
 *	Return NULL if allocation fails
 *	pointer to UDSP otherwise.
 */
struct lnet_udsp *lnet_udsp_alloc(void);

/**
 * lnet_udsp_free
 *	Free a UDSP and all its descriptors
 */
void lnet_udsp_free(struct lnet_udsp *udsp);

/**
 * lnet_udsp_destroy
 *	Free all the UDSPs
 *	force: true to indicate shutdown in progress
 */
void lnet_udsp_destroy(bool shutdown);

/**
 * lnet_get_udsp_size
 *	Return the size needed to store the marshalled UDSP
 */
size_t lnet_get_udsp_size(struct lnet_udsp *udsp);

/**
 * lnet_udsp_marshal
 *	Marshal the udsp into the bulk memory provided.
 *	Return success/failure.
 */
int lnet_udsp_marshal(struct lnet_udsp *udsp,
		      struct lnet_ioctl_udsp *ioc_udsp);
/**
 * lnet_udsp_demarshal_add
 *	Given a bulk containing a single UDSP,
 *	demarshal and populate a udsp structure then add policy
 */
int lnet_udsp_demarshal_add(void *bulk, __u32 bulk_size);

/**
 * lnet_udsp_get_construct_info
 *	get information of how the UDSP policies impacted the given
 *	construct.
 */
void lnet_udsp_get_construct_info(struct lnet_ioctl_construct_udsp_info *info,
				  struct lnet_nid *nid);

#endif /* UDSP_H */
