/*
 * Copyright (c) 2012, 2015, 2017-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.
 */


/**
 * @defgroup fal_ip FAL_IP
 * @{
 */
#ifndef _FAL_IP_H_
#define _FAL_IP_H_

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

#include "sw.h"
#include "fal/fal_type.h"
#include "fal_multi.h"


#define FAL_MIN_VRF_ID 0
#define FAL_MAX_VRF_ID 7
    /* IP WCMP hash key flags */
#define FAL_WCMP_HASH_KEY_SIP             0x1
#define FAL_WCMP_HASH_KEY_DIP             0x2
#define FAL_WCMP_HASH_KEY_SPORT           0x4
#define FAL_WCMP_HASH_KEY_DPORT           0x8

    /* IP entry operation flags */
#define FAL_IP_ENTRY_ID_EN               0x1
#define FAL_IP_ENTRY_INTF_EN             0x2
#define FAL_IP_ENTRY_PORT_EN             0x4
#define FAL_IP_ENTRY_STATUS_EN           0x8
#define FAL_IP_ENTRY_IPADDR_EN           0x10
#define FAL_IP_ENTRY_ALL_EN              0x20

    /* IP host entry structure flags field */
#define FAL_IP_IP4_ADDR                         0x1
#define FAL_IP_IP6_ADDR                         0x2
#define FAL_IP_CPU_ADDR                         0x4
#define FAL_IP_IP4_ADDR_MCAST              0x8
#define FAL_IP_IP6_ADDR_MCAST              0x10

typedef struct {
	a_uint8_t vsi; /*vsi value for l2 multicast*/
	fal_ip4_addr_t sip4_addr; /*source ipv4 address*/
	fal_ip6_addr_t sip6_addr; /*source ipv4 address*/
} fal_host_mcast_t;

typedef struct
{
	a_uint32_t rx_pkt_counter; /*rx packet counter*/
	a_uint64_t rx_byte_counter; /*rx byte counter*/
	a_uint32_t rx_drop_pkt_counter; /*rx drop packet counter*/
	a_uint64_t rx_drop_byte_counter; /*rx drop byte counter*/
	a_uint32_t tx_pkt_counter; /*tx packet counter*/
	a_uint64_t tx_byte_counter; /*tx byte counter*/
	a_uint32_t tx_drop_pkt_counter; /*tx drop packet counter*/
	a_uint64_t tx_drop_byte_counter; /*tx drop byte counter*/
} fal_ip_counter_t;

typedef struct
{
	a_uint32_t entry_id; /*index for host table*/
	a_uint32_t flags; /*1:ipv4 uni 2:ipv6 uni 8:ipv4 multi 0x10:ipv6 multi*/
	a_uint32_t status; /* valid status: 0 or 1*/
	fal_ip4_addr_t ip4_addr; /* ipv4 address */
	fal_ip6_addr_t ip6_addr; /* ipv6 address */
	fal_mac_addr_t mac_addr; /* unused for ppe */
	a_uint32_t intf_id; /* unused for ppe */
	a_uint32_t lb_num; /* unused for ppe */
	a_uint32_t vrf_id; /* unused for ppe */
	a_uint32_t expect_vid; /* unused for ppe */
	fal_port_t port_id; /* unused for ppe */
	a_bool_t mirror_en; /* unused for ppe */
	a_bool_t counter_en; /* unused for ppe */
	a_uint32_t counter_id; /* unused for ppe */
	a_uint32_t packet; /* unused for ppe */
	a_uint32_t byte; /* unused for ppe */
	a_bool_t pppoe_en; /* unused for ppe */
	a_uint32_t pppoe_id; /* unused for ppe */
	fal_fwd_cmd_t action; /*forward action*/
	a_uint32_t dst_info; /*bit 12:13: 1.nexthop, 2.port id, 3.port bitmap*/
	a_uint8_t syn_toggle; /* sync toggle */
	a_uint8_t lan_wan; /*0: ip over lan side ; 1: ip over wan side*/
	fal_host_mcast_t mcast_info; /* multicast information */
} fal_host_entry_t;

    typedef enum
    {
        FAL_MAC_IP_GUARD = 0,
        FAL_MAC_IP_PORT_GUARD,
        FAL_MAC_IP_VLAN_GUARD,
        FAL_MAC_IP_PORT_VLAN_GUARD,
        FAL_NO_SOURCE_GUARD,
    } fal_source_guard_mode_t;

    typedef enum
    {
        FAL_DEFAULT_FLOW_FORWARD = 0,
        FAL_DEFAULT_FLOW_DROP,
        FAL_DEFAULT_FLOW_RDT_TO_CPU,
        FAL_DEFAULT_FLOW_ADMIT_ALL,
    } fal_default_flow_cmd_t;

    typedef enum
    {
        FAL_FLOW_LAN_TO_LAN = 0,
        FAL_FLOW_WAN_TO_LAN,
        FAL_FLOW_LAN_TO_WAN,
        FAL_FLOW_WAN_TO_WAN,
    } fal_flow_type_t;

    typedef enum
    {
        FAL_GLB_LOCK_TIME_DISABLE = 0,
        FAL_GLB_LOCK_TIME_100US,
        FAL_GLB_LOCK_TIME_1MS,
        FAL_GLB_LOCK_TIME_10MS,
    } fal_glb_lock_time_t;

    typedef enum
    {
        FAL_ARP_LEARN_LOCAL = 0,
        FAL_ARP_LEARN_ALL,
    } fal_arp_learn_mode_t;

    /* IP host entry auto learn arp packets type */
#define FAL_ARP_LEARN_REQ                0x1
#define FAL_ARP_LEARN_ACK                0x2

    typedef struct
    {
        a_uint32_t entry_id;
        a_uint32_t vrf_id;
        a_uint16_t vid_low;
        a_uint16_t vid_high;
        fal_mac_addr_t mac_addr;
        a_bool_t ip4_route;
        a_bool_t ip6_route;
    } fal_intf_mac_entry_t;

    typedef struct
    {
        a_uint32_t nh_nr;
        a_uint32_t nh_id[16];
    } fal_ip_wcmp_t;

    typedef struct
    {
        fal_mac_addr_t mac_addr;
        fal_ip4_addr_t ip4_addr;
		a_uint32_t     vid;
		a_uint8_t      load_balance;
    } fal_ip4_rfs_t;

	typedef struct
    {
        fal_mac_addr_t mac_addr;
        fal_ip6_addr_t ip6_addr;
		a_uint32_t     vid;
		a_uint8_t      load_balance;
    } fal_ip6_rfs_t;

    typedef struct
    {
        a_bool_t valid;
        a_uint32_t vrf_id;
        fal_addr_type_t ip_version; /*0 for IPv4 and 1 for IPv6*/
        a_uint32_t droute_type; /*0 for ARP and 1 for WCMP*/
        a_uint32_t index;/*when droute_type equals 0, means ARP entry index or means WCMP indexs*/
    } fal_default_route_t;

    typedef struct
    {
        a_bool_t valid;
        a_uint32_t vrf_id;
        a_uint32_t ip_version; /*0 for IPv4 and 1 for IPv6*/
        union {
        fal_ip4_addr_t ip4_addr;
        fal_ip6_addr_t ip6_addr;
	}route_addr;
        a_uint32_t prefix_length;/*For IPv4, up to 32 and for IPv6, up to 128*/
    } fal_host_route_t;

typedef struct
{
	a_bool_t ipv4_arp_sg_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t ipv4_arp_sg_vio_action; /* check fail action for arp source guard */
	a_bool_t ipv4_arp_sg_port_en; /* source port based arp source guard enable */
	a_bool_t ipv4_arp_sg_svlan_en; /* source svlan based arp source guard enable */
	a_bool_t ipv4_arp_sg_cvlan_en; /* source cvlan based arp source guard enable */
	fal_fwd_cmd_t ipv4_arp_src_unk_action; /* unknown action for arp source guard */
	a_bool_t ip_nd_sg_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t ip_nd_sg_vio_action; /* check fail action for nd source guard */
	a_bool_t ip_nd_sg_port_en; /* source port based nd source guard enable */
	a_bool_t ip_nd_sg_svlan_en; /* source svlan based nd source guard enable */
	a_bool_t ip_nd_sg_cvlan_en; /* source cvlan based nd source guard enable */
	fal_fwd_cmd_t ip_nd_src_unk_action; /* unknown action for nd source guard */
} fal_arp_sg_cfg_t;

typedef enum
{
	FAL_MC_MODE_GV = 0, /*not support igmpv3 source filter*/
	FAL_MC_MODE_SGV /*support igmpv3 source filter*/
} fal_mc_mode_t;

typedef struct
{
	a_bool_t l2_ipv4_mc_en; /*0 for disable and 1 for enable*/
	fal_mc_mode_t l2_ipv4_mc_mode; /*two modes*/
	a_bool_t l2_ipv6_mc_en; /*0 for disable and 1 for enable*/
	fal_mc_mode_t l2_ipv6_mc_mode; /*same with IPv4*/
} fal_mc_mode_cfg_t;

typedef struct
{
	a_uint8_t type; /*0 for IPv4 and 1 for IPv6*/
	fal_fwd_cmd_t action; /* forward action */
	a_uint32_t dst_info; /*bit 12:13: 1.nexthop, 2.port id, 3.port bitmap*/
	a_uint8_t lan_wan; /* 0:ip over lan side; 1:ip over wan side */
	union {
		fal_ip4_addr_t ip4_addr; /* ipv4 address */
		fal_ip6_addr_t ip6_addr; /* ipv6 address */
	} route_addr;
	union {
		fal_ip4_addr_t ip4_addr_mask; /* ipv4 address mask */
		fal_ip6_addr_t ip6_addr_mask; /* ipv6 address mask */
	} route_addr_mask;
} fal_network_route_entry_t;

typedef struct {
	a_uint16_t mru; /* Maximum Receive Unit*/
	a_uint16_t mtu; /* Maximum Transmission Unit*/
	a_bool_t ttl_dec_bypass_en; /* Bypass TTL Decrement enable*/
	a_bool_t ipv4_uc_route_en; /*0 for disble and 1 for enable*/
	a_bool_t ipv6_uc_route_en; /*0 for disble and 1 for enable*/
	a_bool_t icmp_trigger_en; /* ICMP trigger flag enable*/
	fal_fwd_cmd_t ttl_exceed_action; /*action for ttl 0*/
	a_bool_t ttl_exceed_deacclr_en; /*0 for disble and 1 for enable*/
	a_uint8_t mac_addr_bitmap; /* bitmap for mac address*/
	fal_mac_addr_t mac_addr; /* mac address */
	fal_ip_counter_t counter; /* interface related counter */
} fal_intf_entry_t;

typedef struct
{
	a_bool_t l3_if_valid; /*0 for disable and 1 for enable*/
	a_uint32_t l3_if_index; /*index for interface table*/        	  
} fal_intf_id_t;

typedef enum
{
	FAL_NEXTHOP_L3 = 0,
	FAL_NEXTHOP_VP,
} fal_nexthop_type_t;

typedef struct
{
	fal_nexthop_type_t type; /* 0: L3 1:port*/
	a_uint8_t vsi; /* output vsi value if type is 0 */
	fal_port_t port; /* destination port */
	a_uint32_t if_index; /* egress interface index */
	a_bool_t ip_to_me_en; /* 0 for disable and 1 for enable*/
	a_uint8_t pub_ip_index; /*index to public ip address*/
	a_uint8_t stag_fmt; /* 0: untag 1:tagged*/
	a_uint16_t svid; /*svlan id*/
	a_int8_t ctag_fmt; /* 0: untag 1:tagged*/
	a_uint16_t cvid; /* cvlan id */
	fal_mac_addr_t mac_addr; /* mac address */
	fal_ip4_addr_t dnat_ip; /*dnat ip address*/
} fal_ip_nexthop_t;

typedef struct
{
	a_bool_t ipv4_sg_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t ipv4_sg_vio_action; /* check fail action for ipv4 source guard */
	a_bool_t ipv4_sg_port_en; /* source port based ipv4 source guard enable */
	a_bool_t ipv4_sg_svlan_en; /* source svlan based ipv4 source guard enable */
	a_bool_t ipv4_sg_cvlan_en; /* source cvlan based ipv4 source guard enable */
	fal_fwd_cmd_t ipv4_src_unk_action; /* unknown action for ipv4 source guard */
	a_bool_t ipv6_sg_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t ipv6_sg_vio_action; /* check fail action for ipv6 source guard */
	a_bool_t ipv6_sg_port_en; /* source port based ipv6 source guard enable */
	a_bool_t ipv6_sg_svlan_en; /* source svlan based ipv6 source guard enable */
	a_bool_t ipv6_sg_cvlan_en; /* source cvlan based ipv6 source guard enable */
	fal_fwd_cmd_t ipv6_src_unk_action; /* unknown action for ipv6 source guard */
} fal_sg_cfg_t;

typedef struct
{
	fal_ip4_addr_t pub_ip_addr; /*public ip address*/
} fal_ip_pub_addr_t;

typedef struct {
	a_bool_t valid; /* valid flag */
	fal_mac_addr_t mac_addr; /* mac address */
} fal_macaddr_entry_t;

typedef struct
{
	fal_fwd_cmd_t mru_fail_action; /*mru check fail action*/
	a_bool_t mru_deacclr_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t mtu_fail_action; /*mtu check fail action*/
	a_bool_t mtu_deacclr_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t mtu_nonfrag_fail_action; /*mtu check fail action for non-fragment */
	a_bool_t mtu_df_deacclr_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t prefix_bc_action; /*0 forward, 1 drop, 2 copy, 3 rdt_cpu*/
	a_bool_t prefix_deacclr_en; /*0 for disable and 1 for enable*/
	fal_fwd_cmd_t icmp_rdt_action; /*0 forward, 1 drop, 2 copy, 3 rdt_cpu*/
	a_bool_t icmp_rdt_deacclr_en; /*0 for disable and 1 for enable*/
	a_uint8_t hash_mode_0; /*0 crc10, 1 xor, 2 crc16*/
	a_uint8_t hash_mode_1; /*0 crc10, 1 xor, 2 crc16*/
} fal_ip_global_cfg_t;

enum {
	FUNC_IP_NETWORK_ROUTE_GET = 0,
	FUNC_IP_HOST_ADD,
	FUNC_IP_VSI_SG_CFG_GET,
	FUNC_IP_PUB_ADDR_SET,
	FUNC_IP_PORT_SG_CFG_SET,
	FUNC_IP_PORT_INTF_GET,
	FUNC_IP_VSI_ARP_SG_CFG_SET,
	FUNC_IP_PUB_ADDR_GET,
	FUNC_IP_PORT_INTF_SET,
	FUNC_IP_VSI_SG_CFG_SET,
	FUNC_IP_HOST_NEXT,
	FUNC_IP_PORT_MACADDR_SET,
	FUNC_IP_VSI_INTF_GET,
	FUNC_IP_NETWORK_ROUTE_ADD,
	FUNC_IP_PORT_SG_CFG_GET,
	FUNC_IP_INTF_GET,
	FUNC_IP_NETWORK_ROUTE_DEL,
	FUNC_IP_HOST_DEL,
	FUNC_IP_ROUTE_MISMATCH_GET,
	FUNC_IP_VSI_ARP_SG_CFG_GET,
	FUNC_IP_PORT_ARP_SG_CFG_SET,
	FUNC_IP_VSI_MC_MODE_SET,
	FUNC_IP_VSI_INTF_SET,
	FUNC_IP_NEXTHOP_GET,
	FUNC_IP_ROUTE_MISMATCH_SET,
	FUNC_IP_HOST_GET,
	FUNC_IP_INTF_SET,
	FUNC_IP_VSI_MC_MODE_GET,
	FUNC_IP_PORT_MACADDR_GET,
	FUNC_IP_PORT_ARP_SG_CFG_GET,
	FUNC_IP_NEXTHOP_SET,
	FUNC_IP_GLOBAL_CTRL_GET,
	FUNC_IP_GLOBAL_CTRL_SET,
};

#ifndef IN_IP_MINI
sw_error_t
fal_ip_host_add(a_uint32_t dev_id, fal_host_entry_t * host_entry);

sw_error_t
fal_ip_host_del(a_uint32_t dev_id, a_uint32_t del_mode,
                fal_host_entry_t * host_entry);

sw_error_t
fal_ip_host_get(a_uint32_t dev_id, a_uint32_t get_mode,
                fal_host_entry_t * host_entry);

sw_error_t
fal_ip_host_next(a_uint32_t dev_id, a_uint32_t next_mode,
                 fal_host_entry_t * host_entry);

sw_error_t
fal_ip_host_counter_bind(a_uint32_t dev_id, a_uint32_t entry_id,
                         a_uint32_t cnt_id, a_bool_t enable);

sw_error_t
fal_ip_host_pppoe_bind(a_uint32_t dev_id, a_uint32_t entry_id,
                       a_uint32_t pppoe_id, a_bool_t enable);

sw_error_t
fal_ip_pt_arp_learn_set(a_uint32_t dev_id, fal_port_t port_id,
                        a_uint32_t flags);

sw_error_t
fal_ip_pt_arp_learn_get(a_uint32_t dev_id, fal_port_t port_id,
                        a_uint32_t * flags);

sw_error_t
fal_ip_arp_learn_set(a_uint32_t dev_id, fal_arp_learn_mode_t mode);

sw_error_t
fal_ip_arp_learn_get(a_uint32_t dev_id, fal_arp_learn_mode_t * mode);

sw_error_t
fal_ip_source_guard_set(a_uint32_t dev_id, fal_port_t port_id,
                        fal_source_guard_mode_t mode);

sw_error_t
fal_ip_source_guard_get(a_uint32_t dev_id, fal_port_t port_id,
                        fal_source_guard_mode_t * mode);

sw_error_t
fal_ip_arp_guard_set(a_uint32_t dev_id, fal_port_t port_id,
                     fal_source_guard_mode_t mode);

sw_error_t
fal_ip_arp_guard_get(a_uint32_t dev_id, fal_port_t port_id,
                     fal_source_guard_mode_t * mode);

sw_error_t
fal_ip_route_status_set(a_uint32_t dev_id, a_bool_t enable);

sw_error_t
fal_ip_route_status_get(a_uint32_t dev_id, a_bool_t * enable);

sw_error_t
fal_ip_intf_entry_add(a_uint32_t dev_id, fal_intf_mac_entry_t * entry);

sw_error_t
fal_ip_intf_entry_del(a_uint32_t dev_id, a_uint32_t del_mode,
                      fal_intf_mac_entry_t * entry);

sw_error_t
fal_ip_intf_entry_next(a_uint32_t dev_id, a_uint32_t next_mode,
                       fal_intf_mac_entry_t * entry);

sw_error_t
fal_ip_unk_source_cmd_set(a_uint32_t dev_id, fal_fwd_cmd_t cmd);

sw_error_t
fal_ip_unk_source_cmd_get(a_uint32_t dev_id, fal_fwd_cmd_t * cmd);

sw_error_t
fal_arp_unk_source_cmd_set(a_uint32_t dev_id, fal_fwd_cmd_t cmd);

sw_error_t
fal_arp_unk_source_cmd_get(a_uint32_t dev_id, fal_fwd_cmd_t * cmd);

sw_error_t
fal_ip_age_time_set(a_uint32_t dev_id, a_uint32_t * time);

sw_error_t
fal_ip_age_time_get(a_uint32_t dev_id, a_uint32_t * time);

sw_error_t
fal_ip_wcmp_entry_set(a_uint32_t dev_id, a_uint32_t wcmp_id, fal_ip_wcmp_t * wcmp);

sw_error_t
fal_ip_wcmp_entry_get(a_uint32_t dev_id, a_uint32_t wcmp_id, fal_ip_wcmp_t * wcmp);

sw_error_t
fal_ip_wcmp_hash_mode_set(a_uint32_t dev_id, a_uint32_t hash_mode);

sw_error_t
fal_ip_rfs_ip4_rule_set(a_uint32_t dev_id, fal_ip4_rfs_t * rfs);

sw_error_t
fal_ip_rfs_ip6_rule_set(a_uint32_t dev_id, fal_ip6_rfs_t * rfs);

sw_error_t
fal_ip_rfs_ip4_rule_del(a_uint32_t dev_id, fal_ip4_rfs_t * rfs);

sw_error_t
fal_ip_rfs_ip6_rule_del(a_uint32_t dev_id, fal_ip6_rfs_t * rfs);

sw_error_t
fal_ip_wcmp_hash_mode_get(a_uint32_t dev_id, a_uint32_t * hash_mode);

sw_error_t
fal_ip_vrf_base_addr_set(a_uint32_t dev_id, a_uint32_t vrf_id, fal_ip4_addr_t addr);

sw_error_t
fal_ip_vrf_base_addr_get(a_uint32_t dev_id, a_uint32_t vrf_id, fal_ip4_addr_t * addr);

sw_error_t
fal_ip_vrf_base_mask_set(a_uint32_t dev_id, a_uint32_t vrf_id, fal_ip4_addr_t addr);

sw_error_t
fal_ip_vrf_base_mask_get(a_uint32_t dev_id, a_uint32_t vrf_id, fal_ip4_addr_t * addr);

sw_error_t
fal_ip_default_route_set(a_uint32_t dev_id, a_uint32_t droute_id,
		fal_default_route_t * entry);

sw_error_t
fal_ip_default_route_get(a_uint32_t dev_id, a_uint32_t droute_id,
		fal_default_route_t * entry);

sw_error_t
fal_ip_host_route_set(a_uint32_t dev_id, a_uint32_t hroute_id,
		fal_host_route_t * entry);

sw_error_t
fal_ip_host_route_get(a_uint32_t dev_id, a_uint32_t hroute_id,
		fal_host_route_t * entry);

sw_error_t
fal_ip_wcmp_entry_set(a_uint32_t dev_id, a_uint32_t wcmp_id,
		fal_ip_wcmp_t * wcmp);

sw_error_t
fal_ip_wcmp_entry_get(a_uint32_t dev_id, a_uint32_t wcmp_id,
		fal_ip_wcmp_t * wcmp);

sw_error_t
fal_default_flow_cmd_set(a_uint32_t dev_id, a_uint32_t vrf_id,
		fal_flow_type_t type, fal_default_flow_cmd_t cmd);

sw_error_t
fal_default_flow_cmd_get(a_uint32_t dev_id, a_uint32_t vrf_id,
		fal_flow_type_t type, fal_default_flow_cmd_t * cmd);

sw_error_t
fal_default_rt_flow_cmd_set(a_uint32_t dev_id, a_uint32_t vrf_id,
		fal_flow_type_t type, fal_default_flow_cmd_t cmd);

sw_error_t
fal_default_rt_flow_cmd_get(a_uint32_t dev_id, a_uint32_t vrf_id,
		fal_flow_type_t type, fal_default_flow_cmd_t * cmd);

sw_error_t
fal_ip_vsi_arp_sg_cfg_get(a_uint32_t dev_id, a_uint32_t vsi,
			fal_arp_sg_cfg_t *arp_sg_cfg);

sw_error_t
fal_ip_vsi_arp_sg_cfg_set(a_uint32_t dev_id, a_uint32_t vsi,
			fal_arp_sg_cfg_t *arp_sg_cfg);

sw_error_t
fal_ip_network_route_add(a_uint32_t dev_id, a_uint32_t index,
			fal_network_route_entry_t *entry);

sw_error_t
fal_ip_network_route_get(a_uint32_t dev_id,
			a_uint32_t index, a_uint8_t type,
			fal_network_route_entry_t *entry);

sw_error_t
fal_ip_network_route_del(a_uint32_t dev_id,
			a_uint32_t index, a_uint8_t type);

sw_error_t
fal_ip_intf_set(a_uint32_t dev_id,
		a_uint32_t index,
		fal_intf_entry_t *entry);

sw_error_t
fal_ip_intf_get(a_uint32_t dev_id,
    		a_uint32_t index,
    		fal_intf_entry_t *entry);

sw_error_t
fal_ip_vsi_intf_set(a_uint32_t dev_id, a_uint32_t vsi, fal_intf_id_t *id);

sw_error_t
fal_ip_vsi_intf_get(a_uint32_t dev_id, a_uint32_t vsi, fal_intf_id_t *id);

sw_error_t
fal_ip_port_intf_set(a_uint32_t dev_id, fal_port_t port_id, fal_intf_id_t *id);

sw_error_t
fal_ip_port_intf_get(a_uint32_t dev_id, fal_port_t port_id, fal_intf_id_t *id);

sw_error_t
fal_ip_nexthop_set(a_uint32_t dev_id, a_uint32_t index,
			fal_ip_nexthop_t *entry);

sw_error_t
fal_ip_nexthop_get(a_uint32_t dev_id, a_uint32_t index,
			fal_ip_nexthop_t *entry);

sw_error_t
fal_ip_vsi_sg_cfg_get(a_uint32_t dev_id, a_uint32_t vsi,
			fal_sg_cfg_t *sg_cfg);

sw_error_t
fal_ip_vsi_sg_cfg_set(a_uint32_t dev_id, a_uint32_t vsi,
			fal_sg_cfg_t *sg_cfg);

sw_error_t
fal_ip_port_sg_cfg_set(a_uint32_t dev_id, fal_port_t port_id,
			fal_sg_cfg_t *sg_cfg);

sw_error_t
fal_ip_port_sg_cfg_get(a_uint32_t dev_id, fal_port_t port_id,
			fal_sg_cfg_t *sg_cfg);

sw_error_t
fal_ip_pub_addr_set(a_uint32_t dev_id, a_uint32_t index,
			fal_ip_pub_addr_t *entry);

sw_error_t
fal_ip_pub_addr_get(a_uint32_t dev_id, a_uint32_t index,
			fal_ip_pub_addr_t *entry);

sw_error_t
fal_ip_port_macaddr_set(a_uint32_t dev_id, fal_port_t port_id,
			fal_macaddr_entry_t *macaddr);

sw_error_t
fal_ip_port_macaddr_get(a_uint32_t dev_id, fal_port_t port_id,
			fal_macaddr_entry_t *macaddr);

sw_error_t
fal_ip_route_mismatch_action_set(a_uint32_t dev_id, fal_fwd_cmd_t action);

sw_error_t
fal_ip_route_mismatch_action_get(a_uint32_t dev_id, fal_fwd_cmd_t *action);

sw_error_t
fal_ip_port_arp_sg_cfg_set(a_uint32_t dev_id, fal_port_t port_id,
			fal_arp_sg_cfg_t *arp_sg_cfg);

sw_error_t
fal_ip_port_arp_sg_cfg_get(a_uint32_t dev_id, fal_port_t port_id,
			fal_arp_sg_cfg_t *arp_sg_cfg);

sw_error_t
fal_ip_vsi_mc_mode_set(a_uint32_t dev_id, a_uint32_t vsi,
			fal_mc_mode_cfg_t *cfg);

sw_error_t
fal_ip_vsi_mc_mode_get(a_uint32_t dev_id, a_uint32_t vsi,
			fal_mc_mode_cfg_t *cfg);

sw_error_t
fal_ip_global_ctrl_get(a_uint32_t dev_id, fal_ip_global_cfg_t *cfg);

sw_error_t
fal_ip_global_ctrl_set(a_uint32_t dev_id, fal_ip_global_cfg_t *cfg);
#endif

#ifdef __cplusplus
}
#endif                          /* __cplusplus */
#endif                          /* _FAL_IP_H_ */
/**
 * @}
 */
