blob: 6110628b3dc6af5952326242fe8c130e1da67590 [file] [log] [blame]
/*
* Copyright (c) 2012, 2015, 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_nat FAL_NAT
* @{
*/
#include "sw.h"
#include "fal_nat.h"
#include "hsl_api.h"
#include <linux/kernel.h>
#include <linux/module.h>
int nf_athrs17_hnat_sync_counter_en = 0;
static sw_error_t
_fal_nat_add(a_uint32_t dev_id, fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_add)
return SW_NOT_SUPPORTED;
rv = p_api->nat_add(dev_id, nat_entry);
return rv;
}
static sw_error_t
_fal_nat_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_del)
return SW_NOT_SUPPORTED;
rv = p_api->nat_del(dev_id, del_mode, nat_entry);
return rv;
}
static sw_error_t
_fal_nat_get(a_uint32_t dev_id, a_uint32_t get_mode,
fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_get)
return SW_NOT_SUPPORTED;
rv = p_api->nat_get(dev_id, get_mode, nat_entry);
return rv;
}
static sw_error_t
_fal_nat_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_next)
return SW_NOT_SUPPORTED;
rv = p_api->nat_next(dev_id, next_mode, nat_entry);
return rv;
}
static sw_error_t
_fal_nat_counter_bind(a_uint32_t dev_id, a_uint32_t entry_id, a_uint32_t cnt_id,
a_bool_t enable)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_counter_bind)
return SW_NOT_SUPPORTED;
rv = p_api->nat_counter_bind(dev_id, entry_id, cnt_id, enable);
return rv;
}
static sw_error_t
_fal_napt_add(a_uint32_t dev_id, fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_add)
return SW_NOT_SUPPORTED;
rv = p_api->napt_add(dev_id, napt_entry);
return rv;
}
static sw_error_t
_fal_napt_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_del)
return SW_NOT_SUPPORTED;
rv = p_api->napt_del(dev_id, del_mode, napt_entry);
return rv;
}
static sw_error_t
_fal_napt_get(a_uint32_t dev_id, a_uint32_t get_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_get)
return SW_NOT_SUPPORTED;
rv = p_api->napt_get(dev_id, get_mode, napt_entry);
return rv;
}
static sw_error_t
_fal_napt_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_next)
return SW_NOT_SUPPORTED;
rv = p_api->napt_next(dev_id, next_mode, napt_entry);
return rv;
}
static sw_error_t
_fal_napt_counter_bind(a_uint32_t dev_id, a_uint32_t entry_id,
a_uint32_t cnt_id, a_bool_t enable)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_counter_bind)
return SW_NOT_SUPPORTED;
rv = p_api->napt_counter_bind(dev_id, entry_id, cnt_id, enable);
return rv;
}
static sw_error_t
_fal_flow_add(a_uint32_t dev_id, fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->flow_add)
return SW_NOT_SUPPORTED;
rv = p_api->flow_add(dev_id, napt_entry);
return rv;
}
static sw_error_t
_fal_flow_cookie_set(a_uint32_t dev_id, fal_flow_cookie_t * flow_cookie)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->flow_cookie_set)
return SW_NOT_SUPPORTED;
rv = p_api->flow_cookie_set(dev_id, flow_cookie);
return rv;
}
static sw_error_t
_fal_flow_rfs_set(a_uint32_t dev_id, a_uint8_t action, fal_flow_rfs_t * rfs)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->flow_rfs_set)
return SW_NOT_SUPPORTED;
rv = p_api->flow_rfs_set(dev_id, action, rfs);
return rv;
}
static sw_error_t
_fal_flow_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->flow_del)
return SW_NOT_SUPPORTED;
rv = p_api->flow_del(dev_id, del_mode, napt_entry);
return rv;
}
static sw_error_t
_fal_flow_get(a_uint32_t dev_id, a_uint32_t get_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->flow_get)
return SW_NOT_SUPPORTED;
rv = p_api->flow_get(dev_id, get_mode, napt_entry);
return rv;
}
static sw_error_t
_fal_flow_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->flow_next)
return SW_NOT_SUPPORTED;
rv = p_api->flow_next(dev_id, next_mode, napt_entry);
return rv;
}
static sw_error_t
_fal_flow_counter_bind(a_uint32_t dev_id, a_uint32_t entry_id,
a_uint32_t cnt_id, a_bool_t enable)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->flow_counter_bind)
return SW_NOT_SUPPORTED;
rv = p_api->flow_counter_bind(dev_id, entry_id, cnt_id, enable);
return rv;
}
static sw_error_t
_fal_nat_status_set(a_uint32_t dev_id, a_bool_t enable)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_status_set)
return SW_NOT_SUPPORTED;
rv = p_api->nat_status_set(dev_id, enable);
return rv;
}
static sw_error_t
_fal_nat_status_get(a_uint32_t dev_id, a_bool_t * enable)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_status_get)
return SW_NOT_SUPPORTED;
rv = p_api->nat_status_get(dev_id, enable);
return rv;
}
static sw_error_t
_fal_nat_hash_mode_set(a_uint32_t dev_id, a_uint32_t mode)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_hash_mode_set)
return SW_NOT_SUPPORTED;
rv = p_api->nat_hash_mode_set(dev_id, mode);
return rv;
}
static sw_error_t
_fal_nat_hash_mode_get(a_uint32_t dev_id, a_uint32_t * mode)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_hash_mode_get)
return SW_NOT_SUPPORTED;
rv = p_api->nat_hash_mode_get(dev_id, mode);
return rv;
}
static sw_error_t
_fal_napt_status_set(a_uint32_t dev_id, a_bool_t enable)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_status_set)
return SW_NOT_SUPPORTED;
rv = p_api->napt_status_set(dev_id, enable);
return rv;
}
static sw_error_t
_fal_napt_status_get(a_uint32_t dev_id, a_bool_t * enable)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_status_get)
return SW_NOT_SUPPORTED;
rv = p_api->napt_status_get(dev_id, enable);
return rv;
}
static sw_error_t
_fal_napt_mode_set(a_uint32_t dev_id, fal_napt_mode_t mode)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_mode_set)
return SW_NOT_SUPPORTED;
rv = p_api->napt_mode_set(dev_id, mode);
return rv;
}
static sw_error_t
_fal_napt_mode_get(a_uint32_t dev_id, fal_napt_mode_t * mode)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->napt_mode_get)
return SW_NOT_SUPPORTED;
rv = p_api->napt_mode_get(dev_id, mode);
return rv;
}
static sw_error_t
_fal_nat_prv_base_addr_set(a_uint32_t dev_id, fal_ip4_addr_t addr)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_prv_base_addr_set)
return SW_NOT_SUPPORTED;
rv = p_api->nat_prv_base_addr_set(dev_id, addr);
return rv;
}
static sw_error_t
_fal_nat_prv_base_addr_get(a_uint32_t dev_id, fal_ip4_addr_t * addr)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_prv_base_addr_get)
return SW_NOT_SUPPORTED;
rv = p_api->nat_prv_base_addr_get(dev_id, addr);
return rv;
}
static sw_error_t
_fal_nat_prv_base_mask_set(a_uint32_t dev_id, fal_ip4_addr_t addr)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_prv_base_mask_set)
return SW_NOT_SUPPORTED;
rv = p_api->nat_prv_base_mask_set(dev_id, addr);
return rv;
}
static sw_error_t
_fal_nat_prv_base_mask_get(a_uint32_t dev_id, fal_ip4_addr_t * addr)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_prv_base_mask_get)
return SW_NOT_SUPPORTED;
rv = p_api->nat_prv_base_mask_get(dev_id, addr);
return rv;
}
static sw_error_t
_fal_nat_prv_addr_mode_set(a_uint32_t dev_id, a_bool_t map_en)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_prv_addr_mode_set)
return SW_NOT_SUPPORTED;
rv = p_api->nat_prv_addr_mode_set(dev_id, map_en);
return rv;
}
static sw_error_t
_fal_nat_prv_addr_mode_get(a_uint32_t dev_id, a_bool_t * map_en)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_prv_addr_mode_get)
return SW_NOT_SUPPORTED;
rv = p_api->nat_prv_addr_mode_get(dev_id, map_en);
return rv;
}
static sw_error_t
_fal_nat_pub_addr_add(a_uint32_t dev_id, fal_nat_pub_addr_t * entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_pub_addr_add)
return SW_NOT_SUPPORTED;
rv = p_api->nat_pub_addr_add(dev_id, entry);
return rv;
}
static sw_error_t
_fal_nat_pub_addr_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_nat_pub_addr_t * entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_pub_addr_del)
return SW_NOT_SUPPORTED;
rv = p_api->nat_pub_addr_del(dev_id, del_mode, entry);
return rv;
}
static sw_error_t
_fal_nat_pub_addr_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_nat_pub_addr_t * entry)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_pub_addr_next)
return SW_NOT_SUPPORTED;
rv = p_api->nat_pub_addr_next(dev_id, next_mode, entry);
return rv;
}
static sw_error_t
_fal_nat_unk_session_cmd_set(a_uint32_t dev_id, fal_fwd_cmd_t cmd)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_unk_session_cmd_set)
return SW_NOT_SUPPORTED;
rv = p_api->nat_unk_session_cmd_set(dev_id, cmd);
return rv;
}
static sw_error_t
_fal_nat_unk_session_cmd_get(a_uint32_t dev_id, fal_fwd_cmd_t * cmd)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_unk_session_cmd_get)
return SW_NOT_SUPPORTED;
rv = p_api->nat_unk_session_cmd_get(dev_id, cmd);
return rv;
}
static sw_error_t
_fal_nat_global_set(a_uint32_t dev_id, a_bool_t enable, a_uint32_t portbmp)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->nat_global_set)
return SW_NOT_SUPPORTED;
rv = p_api->nat_global_set(dev_id, enable, portbmp);
return rv;
}
/**
* @brief Add one NAT entry to one particular device.
* @details Comments:
Before NAT entry added ip4 private base address must be set
at first.
In parameter nat_entry entry flags must be set
Hardware entry id will be returned.
* @param[in] dev_id device id
* @param[in] nat_entry NAT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_nat_add(a_uint32_t dev_id, fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_add(dev_id, nat_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Del NAT entries from one particular device.
* @param[in] dev_id device id
* @param[in] del_mode NAT entry delete operation mode
* @param[in] nat_entry NAT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_nat_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_del(dev_id, del_mode, nat_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get one NAT entry from one particular device.
* @param[in] dev_id device id
* @param[in] get_mode NAT entry get operation mode
* @param[in] nat_entry NAT entry parameter
* @param[out] nat_entry NAT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_nat_get(a_uint32_t dev_id, a_uint32_t get_mode,
fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_get(dev_id, get_mode, nat_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Next NAT entries from one particular device.
* @param[in] dev_id device id
* @param[in] next_mode NAT entry next operation mode
* @param[in] nat_entry NAT entry parameter
* @param[out] nat_entry NAT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_nat_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_nat_entry_t * nat_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_next(dev_id, next_mode, nat_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Bind one counter entry to one NAT entry to one particular device.
* @param[in] dev_id device id
* @param[in] entry_id NAT entry id
* @param[in] cnt_id counter entry id
* @param[in] enable A_TRUE or A_FALSE
* @return SW_OK or error code
*/
sw_error_t
fal_nat_counter_bind(a_uint32_t dev_id, a_uint32_t entry_id, a_uint32_t cnt_id,
a_bool_t enable)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_counter_bind(dev_id, entry_id, cnt_id, enable);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Add one NAPT entry to one particular device.
* @details Comments:
Before NAPT entry added related ip4 private base address must be set
at first.
In parameter napt_entry related entry flags must be set
Hardware entry id will be returned.
* @param[in] dev_id device id
* @param[in] napt_entry NAPT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_napt_add(a_uint32_t dev_id, fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_add(dev_id, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Del NAPT entries from one particular device.
* @param[in] dev_id device id
* @param[in] del_mode NAPT entry delete operation mode
* @param[in] napt_entry NAPT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_napt_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_del(dev_id, del_mode, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get one NAPT entry from one particular device.
* @param[in] dev_id device id
* @param[in] get_mode NAPT entry get operation mode
* @param[in] nat_entry NAPT entry parameter
* @param[out] nat_entry NAPT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_napt_get(a_uint32_t dev_id, a_uint32_t get_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_get(dev_id, get_mode, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Next NAPT entries from one particular device.
* @param[in] dev_id device id
* @param[in] next_mode NAPT entry next operation mode
* @param[in] napt_entry NAPT entry parameter
* @param[out] napt_entry NAPT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_napt_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_next(dev_id, next_mode, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Bind one counter entry to one NAPT entry to one particular device.
* @param[in] dev_id device id
* @param[in] entry_id NAPT entry id
* @param[in] cnt_id counter entry id
* @param[in] enable A_TRUE or A_FALSE
* @return SW_OK or error code
*/
sw_error_t
fal_napt_counter_bind(a_uint32_t dev_id, a_uint32_t entry_id,
a_uint32_t cnt_id, a_bool_t enable)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_counter_bind(dev_id, entry_id, cnt_id, enable);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Add one FLOW entry to one particular device.
* @details Comments:
Before FLOW entry added related ip4 private base address must be set
at first.
In parameter napt_entry related entry flags must be set
Hardware entry id will be returned.
* @param[in] dev_id device id
* @param[in] napt_entry FLOW entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_flow_add(a_uint32_t dev_id, fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_flow_add(dev_id, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Del FLOW entries from one particular device.
* @param[in] dev_id device id
* @param[in] del_mode NAPT entry delete operation mode
* @param[in] napt_entry NAPT entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_flow_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_flow_del(dev_id, del_mode, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get one FLOW entry from one particular device.
* @param[in] dev_id device id
* @param[in] get_mode FLOW entry get operation mode
* @param[in] nat_entry FLOW entry parameter
* @param[out] nat_entry FLOW entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_flow_get(a_uint32_t dev_id, a_uint32_t get_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_flow_get(dev_id, get_mode, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Next FLOW entries from one particular device.
* @param[in] dev_id device id
* @param[in] next_mode FLOW entry next operation mode
* @param[in] napt_entry FLOW entry parameter
* @param[out] napt_entry FLOW entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_flow_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_napt_entry_t * napt_entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_flow_next(dev_id, next_mode, napt_entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Bind one counter entry to one FLOW entry to one particular device.
* @param[in] dev_id device id
* @param[in] entry_id FLOW entry id
* @param[in] cnt_id counter entry id
* @param[in] enable A_TRUE or A_FALSE
* @return SW_OK or error code
*/
sw_error_t
fal_flow_counter_bind(a_uint32_t dev_id, a_uint32_t entry_id,
a_uint32_t cnt_id, a_bool_t enable)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_flow_counter_bind(dev_id, entry_id, cnt_id, enable);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set working status of NAT engine on a particular device
* @param[in] dev_id device id
* @param[in] enable A_TRUE or A_FALSE
* @return SW_OK or error code
*/
sw_error_t
fal_nat_status_set(a_uint32_t dev_id, a_bool_t enable)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_status_set(dev_id, enable);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get working status of NAT engine on a particular device
* @param[in] dev_id device id
* @param[out] enable A_TRUE or A_FALSE
* @return SW_OK or error code
*/
sw_error_t
fal_nat_status_get(a_uint32_t dev_id, a_bool_t * enable)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_status_get(dev_id, enable);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set NAT hash mode on a particular device
* @param[in] dev_id device id
* @param[in] mode NAT hash mode
* @return SW_OK or error code
*/
sw_error_t
fal_nat_hash_mode_set(a_uint32_t dev_id, a_uint32_t mode)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_hash_mode_set(dev_id, mode);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get NAT hash mode on a particular device
* @param[in] dev_id device id
* @param[out] mode NAT hash mode
* @return SW_OK or error code
*/
sw_error_t
fal_nat_hash_mode_get(a_uint32_t dev_id, a_uint32_t * mode)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_hash_mode_get(dev_id, mode);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set working status of NAPT engine on a particular device
* @param[in] dev_id device id
* @param[in] enable A_TRUE or A_FALSE
* @return SW_OK or error code
*/
sw_error_t
fal_napt_status_set(a_uint32_t dev_id, a_bool_t enable)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_status_set(dev_id, enable);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get working status of NAPT engine on a particular device
* @param[in] dev_id device id
* @param[out] enable A_TRUE or A_FALSE
* @return SW_OK or error code
*/
sw_error_t
fal_napt_status_get(a_uint32_t dev_id, a_bool_t * enable)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_status_get(dev_id, enable);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set working mode of NAPT engine on a particular device
* @param[in] dev_id device id
* @param[in] mode NAPT mode
* @return SW_OK or error code
*/
sw_error_t
fal_napt_mode_set(a_uint32_t dev_id, fal_napt_mode_t mode)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_mode_set(dev_id, mode);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get working mode of NAPT engine on a particular device
* @param[in] dev_id device id
* @param[out] mode NAPT mode
* @return SW_OK or error code
*/
sw_error_t
fal_napt_mode_get(a_uint32_t dev_id, fal_napt_mode_t * mode)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_napt_mode_get(dev_id, mode);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set IP4 private base address on a particular device
* @details Comments:
Only 20bits is meaning which 20bits is determined by private address mode.
* @param[in] dev_id device id
* @param[in] addr private base address
* @return SW_OK or error code
*/
sw_error_t
fal_nat_prv_base_addr_set(a_uint32_t dev_id, fal_ip4_addr_t addr)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_prv_base_addr_set(dev_id, addr);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get IP4 private base address on a particular device
* @param[in] dev_id device id
* @param[out] addr private base address
* @return SW_OK or error code
*/
sw_error_t
fal_nat_prv_base_addr_get(a_uint32_t dev_id, fal_ip4_addr_t * addr)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_prv_base_addr_get(dev_id, addr);
FAL_API_UNLOCK;
return rv;
}
sw_error_t
fal_nat_prv_base_mask_set(a_uint32_t dev_id, fal_ip4_addr_t addr)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_prv_base_mask_set(dev_id, addr);
FAL_API_UNLOCK;
return rv;
}
sw_error_t
fal_nat_prv_base_mask_get(a_uint32_t dev_id, fal_ip4_addr_t * addr)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_prv_base_mask_get(dev_id, addr);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set IP4 private base address mode on a particular device
* @details Comments:
If map_en equal true means bits31-20 bits15-8 are base address
else bits31-12 are base address.
* @param[in] dev_id device id
* @param[in] map_en private base mapping mode
* @return SW_OK or error code
*/
sw_error_t
fal_nat_prv_addr_mode_set(a_uint32_t dev_id, a_bool_t map_en)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_prv_addr_mode_set(dev_id, map_en);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get IP4 private base address mode on a particular device
* @param[in] dev_id device id
* @param[out] map_en private base mapping mode
* @return SW_OK or error code
*/
sw_error_t
fal_nat_prv_addr_mode_get(a_uint32_t dev_id, a_bool_t * map_en)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_prv_addr_mode_get(dev_id, map_en);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Add one public address entry to one particular device.
* @details Comments:
Hardware entry id will be returned.
* @param[in] dev_id device id
* @param[in] entry public address entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_nat_pub_addr_add(a_uint32_t dev_id, fal_nat_pub_addr_t * entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_pub_addr_add(dev_id, entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Delete one public address entry from one particular device.
* @param[in] dev_id device id
* @param[in] del_mode delete operaton mode
* @param[in] entry public address entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_nat_pub_addr_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_nat_pub_addr_t * entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_pub_addr_del(dev_id, del_mode, entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Next public address entries from one particular device.
* @param[in] dev_id device id
* @param[in] next_mode next operaton mode
* @param[out] entry public address entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_nat_pub_addr_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_nat_pub_addr_t * entry)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_pub_addr_next(dev_id, next_mode, entry);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set forwarding command for those packets miss NAT entries on a particular device.
* @param[in] dev_id device id
* @param[in] cmd forwarding command
* @return SW_OK or error code
*/
sw_error_t
fal_nat_unk_session_cmd_set(a_uint32_t dev_id, fal_fwd_cmd_t cmd)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_unk_session_cmd_set(dev_id, cmd);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Get forwarding command for those packets miss NAT entries on a particular device.
* @param[in] dev_id device id
* @param[out] cmd forwarding command
* @return SW_OK or error code
*/
sw_error_t
fal_nat_unk_session_cmd_get(a_uint32_t dev_id, fal_fwd_cmd_t * cmd)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_nat_unk_session_cmd_get(dev_id, cmd);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Set working status of NAPT engine on a particular device
* @param[in] dev_id device id
* @param[in] enable A_TRUE or A_FALSE
* @param[in] sync_cnt_enable A_TRUE or A_FALSE
* @param[in] portbmp port bitmap
* @return SW_OK or error code
*/
sw_error_t
fal_nat_global_set(a_uint32_t dev_id, a_bool_t enable,
a_bool_t sync_cnt_enable, a_uint32_t portbmp)
{
sw_error_t rv;
FAL_API_LOCK;
nf_athrs17_hnat_sync_counter_en = (int)sync_cnt_enable;
rv = _fal_nat_global_set(dev_id, enable, portbmp);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Add/del one FLOW cookie entry to one particular device.
* @details Comments:
Before FLOW entry added related ip4 private base address must be set
at first.
In parameter napt_entry related entry flags must be set
Hardware entry id will be returned.
* @param[in] dev_id device id
* @param[in] napt_entry FLOW entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_flow_cookie_set(a_uint32_t dev_id, fal_flow_cookie_t * flow_cookie)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_flow_cookie_set(dev_id, flow_cookie);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief Add/del one FLOW rfs entry to one particular device.
* @details Comments:
Before FLOW entry added related ip4 private base address must be set
at first.
In parameter napt_entry related entry flags must be set
Hardware entry id will be returned.
* @param[in] dev_id device id
* @param[in] napt_entry FLOW entry parameter
* @return SW_OK or error code
*/
sw_error_t
fal_flow_rfs_set(a_uint32_t dev_id, a_uint8_t action, fal_flow_rfs_t * rfs)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_flow_rfs_set(dev_id, action, rfs);
FAL_API_UNLOCK;
return rv;
}
int ssdk_flow_cookie_set(
u32 protocol, __be32 src_ip,
__be16 src_port, __be32 dst_ip,
__be16 dst_port, u16 flowcookie)
{
fal_flow_cookie_t flow_cookie;
if(protocol == 17) {
flow_cookie.proto = 0x2;
} else {
flow_cookie.proto = 0x1;
}
flow_cookie.src_addr = ntohl(src_ip);
flow_cookie.dst_addr = ntohl(dst_ip);
flow_cookie.src_port = ntohs(src_port);
flow_cookie.dst_port = ntohs(dst_port);
flow_cookie.flow_cookie = flowcookie;
return fal_flow_cookie_set(0, &flow_cookie);
}
int ssdk_rfs_ipct_rule_set(
__be32 ip_src, __be32 ip_dst,
__be16 sport, __be16 dport, uint8_t proto,
u16 loadbalance, bool action)
{
fal_flow_rfs_t rfs;
if(proto == 17) {
rfs.proto = 0x2;
} else {
rfs.proto = 0x1;
}
rfs.src_addr = ntohl(ip_src);
rfs.dst_addr = ntohl(ip_dst);
rfs.src_port = ntohs(sport);
rfs.dst_port = ntohs(dport);
rfs.load_balance = loadbalance;
if(fal_flow_rfs_set(0, action, &rfs))
return -1;
return 0;
}
#if 0
EXPORT_SYMBOL(ssdk_flow_cookie_set);
EXPORT_SYMBOL(ssdk_rfs_ipct_rule_set);
#endif
/**
* @}
*/