/*
 * Copyright (c) 2012,2018, The Linux Foundation. All rights reserved.
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */



#ifndef _GARUDA_REDUCED_ACL_H_
#define _GARUDA_REDUCED_ACL_H_

#ifdef __cplusplus
extern "C" {
#endif                          /* __cplusplus */

#include "sw.h"

    sw_error_t
    garuda_acl_rule_write(a_uint32_t dev_id, a_uint32_t rule_idx, a_uint32_t vlu[8],
                          a_uint32_t msk[8]);

    sw_error_t
    garuda_acl_action_write(a_uint32_t dev_id, a_uint32_t act_idx,
                            a_uint32_t act);

    sw_error_t
    garuda_acl_slct_write(a_uint32_t dev_id, a_uint32_t slct_idx,
                          a_uint32_t slct[8]);

    sw_error_t
    garuda_acl_rule_read(a_uint32_t dev_id, a_uint32_t rule_idx, a_uint32_t vlu[8],
                         a_uint32_t msk[8]);

    sw_error_t
    garuda_acl_action_read(a_uint32_t dev_id, a_uint32_t act_idx,
                           a_uint32_t * act);

    sw_error_t
    garuda_acl_slct_read(a_uint32_t dev_id, a_uint32_t slct_idx,
                         a_uint32_t slct[8]);

#ifdef __cplusplus
}
#endif                          /* __cplusplus */
#endif                          /* _GARUDA_REDUCED_ACL_H_ */

