blob: f4a40dd50e5ff8b209481f8bf1cb72c880677b9d [file] [log] [blame]
/*
* Copyright (c) 2016-2017, 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
* @{
*/
#include "sw.h"
#include "fal_ip.h"
#include "hppe_ip_reg.h"
#include "hppe_ip.h"
#include "adpt.h"
#ifndef IN_IP_MINI
sw_error_t
adpt_hppe_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 rv = SW_OK;
union network_route_ip_u network_route_ip;
union network_route_ip_ext_u network_route_ip_ext;
union network_route_action_u network_route_action;
fal_ip6_addr_t ipv6, ipv6_mask;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
memset(&network_route_ip, 0, sizeof(network_route_ip));
memset(&network_route_ip_ext, 0, sizeof(network_route_ip_ext));
memset(&network_route_action, 0, sizeof(network_route_action));
if (type > 1 || (type == 0 && index > 31) || (type == 1 && index > 7))
return SW_BAD_VALUE;
if (type == 0) {
rv = hppe_network_route_ip_get(dev_id, index,
&network_route_ip);
if( rv != SW_OK )
return rv;
rv = hppe_network_route_ip_ext_get(dev_id, index,
&network_route_ip_ext);
if( rv != SW_OK )
return rv;
rv = hppe_network_route_action_get(dev_id, index,
&network_route_action);
if( rv != SW_OK )
return rv;
} else {
rv = hppe_network_route_ip_get(dev_id, index * 4, &network_route_ip);
if( rv != SW_OK )
return rv;
ipv6.ul[3] = network_route_ip.val[0];
ipv6.ul[2] = network_route_ip.val[1];
rv = hppe_network_route_ip_get(dev_id, index * 4 + 1, &network_route_ip);
if( rv != SW_OK )
return rv;
ipv6.ul[1] = network_route_ip.val[0];
ipv6.ul[0] = network_route_ip.val[1];
rv = hppe_network_route_ip_get(dev_id, index * 4 + 2, &network_route_ip);
if( rv != SW_OK )
return rv;
ipv6_mask.ul[3] = network_route_ip.val[0];
ipv6_mask.ul[2] = network_route_ip.val[1];
rv = hppe_network_route_ip_get(dev_id, index * 4 + 3, &network_route_ip);
if( rv != SW_OK )
return rv;
ipv6_mask.ul[1] = network_route_ip.val[0];
ipv6_mask.ul[0] = network_route_ip.val[1];
rv = hppe_network_route_ip_ext_get(dev_id, index * 4,
&network_route_ip_ext);
if( rv != SW_OK )
return rv;
rv = hppe_network_route_action_get(dev_id, index * 4,
&network_route_action);
if( rv != SW_OK )
return rv;
}
if (!network_route_ip_ext.bf.valid)
return SW_FAIL;
entry->action = (fal_fwd_cmd_t)network_route_action.bf.fwd_cmd;
entry->lan_wan = network_route_action.bf.lan_wan;
entry->dst_info = network_route_action.bf.dst_info;
entry->type = network_route_ip_ext.bf.entry_type;
if (type == 0) {
entry->route_addr.ip4_addr = network_route_ip.bf.ip_addr;
entry->route_addr_mask.ip4_addr_mask = network_route_ip.bf.ip_addr_mask;
} else {
memcpy(&entry->route_addr.ip6_addr , &ipv6, sizeof(ipv6));
memcpy(&entry->route_addr_mask.ip6_addr_mask,
&ipv6_mask, sizeof(ipv6_mask));
}
return SW_OK;
}
sw_error_t
adpt_hppe_ip_host_add(a_uint32_t dev_id, fal_host_entry_t * host_entry)
{
a_uint8_t mode = 0, type = 0;
sw_error_t rv = SW_OK;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(host_entry);
mode = host_entry->flags >> 24;
type = host_entry->flags & 0xff;
if ((type & FAL_IP_IP4_ADDR) == FAL_IP_IP4_ADDR) {
union host_tbl_u entry;
entry.bf.valid= host_entry->status;
entry.bf.key_type = 0;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.ip_addr = host_entry->ip4_addr;
rv = hppe_host_ipv4_add(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
} else if ((type & FAL_IP_IP6_ADDR) == FAL_IP_IP6_ADDR) {
union host_ipv6_tbl_u entry;
entry.bf.valid= host_entry->status;
entry.bf.key_type = 2;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.ipv6_addr_0 = host_entry->ip6_addr.ul[3];
entry.bf.ipv6_addr_1 = host_entry->ip6_addr.ul[3] >> 10 | \
host_entry->ip6_addr.ul[2] << 22;
entry.bf.ipv6_addr_2 = host_entry->ip6_addr.ul[2] >> 10 | \
host_entry->ip6_addr.ul[1] << 22;
entry.bf.ipv6_addr_3 = host_entry->ip6_addr.ul[1] >> 10 | \
host_entry->ip6_addr.ul[0] << 22;
entry.bf.ipv6_addr_4 = host_entry->ip6_addr.ul[0] >> 10;
rv = hppe_host_ipv6_add(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
} else if ((type & FAL_IP_IP4_ADDR_MCAST) == FAL_IP_IP4_ADDR_MCAST) {
union host_ipv4_mcast_tbl_u entry;
entry.bf.valid= host_entry->status;
entry.bf.key_type = 1;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.gip_addr_0 = host_entry->ip4_addr;
entry.bf.gip_addr_1 = host_entry->ip4_addr >> 11;
entry.bf.vsi = host_entry->mcast_info.vsi;
entry.bf.sip_addr_0 = host_entry->mcast_info.sip4_addr;
entry.bf.sip_addr_1 = host_entry->mcast_info.sip4_addr >> 11;
rv = hppe_host_ipv4_mcast_add(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
} else if ((type & FAL_IP_IP6_ADDR_MCAST) == FAL_IP_IP6_ADDR_MCAST) {
union host_ipv6_mcast_tbl_u entry;
entry.bf.valid= host_entry->status;
entry.bf.key_type = 3;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.gipv6_addr_0 = host_entry->ip6_addr.ul[3];
entry.bf.gipv6_addr_1 = host_entry->ip6_addr.ul[3] >> 20 | \
host_entry->ip6_addr.ul[2] << 12;
entry.bf.gipv6_addr_2 = host_entry->ip6_addr.ul[2] >> 20 | \
host_entry->ip6_addr.ul[1] << 12;
entry.bf.gipv6_addr_3 = host_entry->ip6_addr.ul[1] >> 20 | \
host_entry->ip6_addr.ul[0] << 12;
entry.bf.gipv6_addr_4 = host_entry->ip6_addr.ul[0] >> 20;
entry.bf.vsi = host_entry->mcast_info.vsi;
entry.bf.sipv6_addr_0 = host_entry->mcast_info.sip6_addr.ul[3];
entry.bf.sipv6_addr_1 = host_entry->mcast_info.sip6_addr.ul[3] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[2] << 12;
entry.bf.sipv6_addr_2 = host_entry->mcast_info.sip6_addr.ul[2] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[1] << 12;
entry.bf.sipv6_addr_3 = host_entry->mcast_info.sip6_addr.ul[1] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[0] << 12;
entry.bf.sipv6_addr_4 = host_entry->mcast_info.sip6_addr.ul[0] >> 20;
rv = hppe_host_ipv6_mcast_add(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
}
return rv;
}
sw_error_t
adpt_hppe_ip_vsi_sg_cfg_get(a_uint32_t dev_id, a_uint32_t vsi,
fal_sg_cfg_t *sg_cfg)
{
sw_error_t rv = SW_OK;
union l3_vsi_ext_u l3_vsi_ext;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(sg_cfg);
memset(&l3_vsi_ext, 0, sizeof(l3_vsi_ext));
rv = hppe_l3_vsi_ext_get(dev_id, vsi, &l3_vsi_ext);
if( rv != SW_OK )
return rv;
sg_cfg->ipv4_sg_en = l3_vsi_ext.bf.ipv4_sg_en;
sg_cfg->ipv4_sg_vio_action = l3_vsi_ext.bf.ipv4_sg_vio_cmd;
sg_cfg->ipv4_sg_port_en = l3_vsi_ext.bf.ipv4_sg_port_en;
sg_cfg->ipv4_sg_svlan_en = l3_vsi_ext.bf.ipv4_sg_svlan_en;
sg_cfg->ipv4_sg_cvlan_en = l3_vsi_ext.bf.ipv4_sg_cvlan_en;
sg_cfg->ipv4_src_unk_action = l3_vsi_ext.bf.ipv4_src_unk_cmd;
sg_cfg->ipv6_sg_en = l3_vsi_ext.bf.ipv6_sg_en;
sg_cfg->ipv6_sg_vio_action = l3_vsi_ext.bf.ipv6_sg_vio_cmd;
sg_cfg->ipv6_sg_port_en = l3_vsi_ext.bf.ipv6_sg_port_en;
sg_cfg->ipv6_sg_svlan_en = l3_vsi_ext.bf.ipv6_sg_svlan_en;
sg_cfg->ipv6_sg_cvlan_en = l3_vsi_ext.bf.ipv6_sg_cvlan_en;
sg_cfg->ipv6_src_unk_action = l3_vsi_ext.bf.ipv6_src_unk_cmd;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_port_sg_cfg_set(a_uint32_t dev_id, fal_port_t port_id,
fal_sg_cfg_t *sg_cfg)
{
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
l3_vp_port_tbl.bf.ipv4_sg_en = sg_cfg->ipv4_sg_en;
l3_vp_port_tbl.bf.ipv4_sg_vio_cmd = sg_cfg->ipv4_sg_vio_action;
l3_vp_port_tbl.bf.ipv4_sg_port_en = sg_cfg->ipv4_sg_port_en;
l3_vp_port_tbl.bf.ipv4_sg_svlan_en = sg_cfg->ipv4_sg_svlan_en;
l3_vp_port_tbl.bf.ipv4_sg_cvlan_en = sg_cfg->ipv4_sg_cvlan_en;
l3_vp_port_tbl.bf.ipv4_src_unk_cmd = sg_cfg->ipv4_src_unk_action;
l3_vp_port_tbl.bf.ipv6_sg_en = sg_cfg->ipv6_sg_en;
l3_vp_port_tbl.bf.ipv6_sg_vio_cmd = sg_cfg->ipv6_sg_vio_action;
l3_vp_port_tbl.bf.ipv6_sg_port_en = sg_cfg->ipv6_sg_port_en;
l3_vp_port_tbl.bf.ipv6_sg_svlan_en = sg_cfg->ipv6_sg_svlan_en;
l3_vp_port_tbl.bf.ipv6_sg_cvlan_en = sg_cfg->ipv6_sg_cvlan_en;
l3_vp_port_tbl.bf.ipv6_src_unk_cmd = sg_cfg->ipv6_src_unk_action;
return hppe_l3_vp_port_tbl_set(dev_id, port_id, &l3_vp_port_tbl);
}
sw_error_t
adpt_hppe_ip_port_intf_get(a_uint32_t dev_id, fal_port_t port_id, fal_intf_id_t *id)
{
sw_error_t rv = SW_OK;
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(id);
rv = hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
if( rv != SW_OK )
return rv;
id->l3_if_valid = l3_vp_port_tbl.bf.l3_if_valid;
id->l3_if_index = l3_vp_port_tbl.bf.l3_if_index;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_vsi_arp_sg_cfg_set(a_uint32_t dev_id, a_uint32_t vsi,
fal_arp_sg_cfg_t *arp_sg_cfg)
{
union l3_vsi_ext_u l3_vsi_ext;
memset(&l3_vsi_ext, 0, sizeof(l3_vsi_ext));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vsi_ext_get(dev_id, vsi, &l3_vsi_ext);
l3_vsi_ext.bf.ip_arp_sg_en = arp_sg_cfg->ipv4_arp_sg_en;
l3_vsi_ext.bf.ip_arp_sg_vio_cmd = arp_sg_cfg->ipv4_arp_sg_vio_action;
l3_vsi_ext.bf.ip_arp_sg_port_en = arp_sg_cfg->ipv4_arp_sg_port_en;
l3_vsi_ext.bf.ip_arp_sg_svlan_en = arp_sg_cfg->ipv4_arp_sg_svlan_en;
l3_vsi_ext.bf.ip_arp_sg_cvlan_en = arp_sg_cfg->ipv4_arp_sg_cvlan_en;
l3_vsi_ext.bf.ip_arp_src_unk_cmd = arp_sg_cfg->ipv4_arp_src_unk_action;
l3_vsi_ext.bf.ip_nd_sg_en = arp_sg_cfg->ip_nd_sg_en;
l3_vsi_ext.bf.ip_nd_sg_vio_cmd = arp_sg_cfg->ip_nd_sg_vio_action;
l3_vsi_ext.bf.ip_nd_sg_port_en = arp_sg_cfg->ip_nd_sg_port_en;
l3_vsi_ext.bf.ip_nd_sg_svlan_en = arp_sg_cfg->ip_nd_sg_svlan_en;
l3_vsi_ext.bf.ip_nd_sg_cvlan_en = arp_sg_cfg->ip_nd_sg_cvlan_en;
l3_vsi_ext.bf.ip_nd_src_unk_cmd = arp_sg_cfg->ip_nd_src_unk_action;
return hppe_l3_vsi_ext_set(dev_id, vsi, &l3_vsi_ext);
}
sw_error_t
adpt_hppe_ip_pub_addr_get(a_uint32_t dev_id,
a_uint32_t index, fal_ip_pub_addr_t *entry)
{
sw_error_t rv = SW_OK;
union in_pub_ip_addr_tbl_u in_pub_ip_addr_tbl;
memset(&in_pub_ip_addr_tbl, 0, sizeof(in_pub_ip_addr_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
rv = hppe_in_pub_ip_addr_tbl_get(dev_id, index, &in_pub_ip_addr_tbl);
if( rv != SW_OK )
return rv;
entry->pub_ip_addr = in_pub_ip_addr_tbl.bf.ip_addr;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_port_intf_set(a_uint32_t dev_id, fal_port_t port_id, fal_intf_id_t *id)
{
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
l3_vp_port_tbl.bf.l3_if_valid = id->l3_if_valid;
l3_vp_port_tbl.bf.l3_if_index = id->l3_if_index;
return hppe_l3_vp_port_tbl_set(dev_id, port_id, &l3_vp_port_tbl);
}
sw_error_t
adpt_hppe_ip_vsi_sg_cfg_set(a_uint32_t dev_id, a_uint32_t vsi,
fal_sg_cfg_t *sg_cfg)
{
union l3_vsi_ext_u l3_vsi_ext;
memset(&l3_vsi_ext, 0, sizeof(l3_vsi_ext));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vsi_ext_get(dev_id, vsi, &l3_vsi_ext);
l3_vsi_ext.bf.ipv4_sg_en = sg_cfg->ipv4_sg_en;
l3_vsi_ext.bf.ipv4_sg_vio_cmd = sg_cfg->ipv4_sg_vio_action;
l3_vsi_ext.bf.ipv4_sg_port_en = sg_cfg->ipv4_sg_port_en;
l3_vsi_ext.bf.ipv4_sg_svlan_en = sg_cfg->ipv4_sg_svlan_en;
l3_vsi_ext.bf.ipv4_sg_cvlan_en = sg_cfg->ipv4_sg_cvlan_en;
l3_vsi_ext.bf.ipv4_src_unk_cmd = sg_cfg->ipv4_src_unk_action;
l3_vsi_ext.bf.ipv6_sg_en = sg_cfg->ipv6_sg_en;
l3_vsi_ext.bf.ipv6_sg_vio_cmd = sg_cfg->ipv6_sg_vio_action;
l3_vsi_ext.bf.ipv6_sg_port_en = sg_cfg->ipv6_sg_port_en;
l3_vsi_ext.bf.ipv6_sg_svlan_en = sg_cfg->ipv6_sg_svlan_en;
l3_vsi_ext.bf.ipv6_sg_cvlan_en = sg_cfg->ipv6_sg_cvlan_en;
l3_vsi_ext.bf.ipv6_src_unk_cmd = sg_cfg->ipv6_src_unk_action;
return hppe_l3_vsi_ext_set(dev_id, vsi, &l3_vsi_ext);
}
sw_error_t
adpt_hppe_ip_port_macaddr_set(a_uint32_t dev_id, fal_port_t port_id,
fal_macaddr_entry_t *macaddr)
{
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
l3_vp_port_tbl.bf.mac_valid = macaddr->valid;
l3_vp_port_tbl.bf.mac_da_0 = macaddr->mac_addr.uc[4] << 8 | \
macaddr->mac_addr.uc[5];
l3_vp_port_tbl.bf.mac_da_1 = macaddr->mac_addr.uc[0] << 24 | \
macaddr->mac_addr.uc[1] << 16 | \
macaddr->mac_addr.uc[2] << 8 | \
macaddr->mac_addr.uc[3];
return hppe_l3_vp_port_tbl_set(dev_id, port_id, &l3_vp_port_tbl);
}
sw_error_t
adpt_hppe_ip_vsi_intf_get(a_uint32_t dev_id, a_uint32_t vsi, fal_intf_id_t *id)
{
sw_error_t rv = SW_OK;
union l3_vsi_u l3_vsi;
memset(&l3_vsi, 0, sizeof(l3_vsi));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(id);
rv = hppe_l3_vsi_get(dev_id, vsi, &l3_vsi);
if( rv != SW_OK )
return rv;
id->l3_if_valid = l3_vsi.bf.l3_if_valid;
id->l3_if_index = l3_vsi.bf.l3_if_index;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_network_route_add(a_uint32_t dev_id,
a_uint32_t index,
fal_network_route_entry_t *entry)
{
union network_route_ip_u network_route_ip;
union network_route_ip_ext_u network_route_ip_ext;
union network_route_action_u network_route_action;
memset(&network_route_ip, 0, sizeof(network_route_ip));
memset(&network_route_ip_ext, 0, sizeof(network_route_ip_ext));
memset(&network_route_action, 0, sizeof(network_route_action));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
if (entry->type > 1 || (entry->type == 0 && index > 31) || (entry->type == 1 && index > 7))
return SW_BAD_VALUE;
if (entry->type == 0) {
network_route_ip.bf.ip_addr = entry->route_addr.ip4_addr;
network_route_ip.bf.ip_addr_mask = entry->route_addr_mask.ip4_addr_mask;
network_route_ip_ext.bf.valid = 1;
network_route_ip_ext.bf.entry_type = entry->type;
network_route_action.bf.dst_info = entry->dst_info;
network_route_action.bf.fwd_cmd = entry->action;
network_route_action.bf.lan_wan = entry->lan_wan;
hppe_network_route_ip_set(dev_id, index, &network_route_ip);
hppe_network_route_ip_ext_set(dev_id, index, &network_route_ip_ext);
hppe_network_route_action_set(dev_id, index, &network_route_action);
} else {
network_route_ip_ext.bf.valid = 1;
network_route_ip_ext.bf.entry_type = entry->type;
network_route_action.bf.dst_info = entry->dst_info;
network_route_action.bf.fwd_cmd = entry->action;
network_route_action.bf.lan_wan = entry->lan_wan;
hppe_network_route_ip_ext_set(dev_id, index * 4, &network_route_ip_ext);
hppe_network_route_action_set(dev_id, index * 4, &network_route_action);
network_route_ip.bf.ip_addr = entry->route_addr.ip6_addr.ul[3];
network_route_ip.bf.ip_addr_mask = entry->route_addr.ip6_addr.ul[2];
hppe_network_route_ip_set(dev_id, index * 4, &network_route_ip);
network_route_ip.bf.ip_addr = entry->route_addr.ip6_addr.ul[1];
network_route_ip.bf.ip_addr_mask = entry->route_addr.ip6_addr.ul[0];
hppe_network_route_ip_set(dev_id, index * 4 + 1, &network_route_ip);
network_route_ip.bf.ip_addr = entry->route_addr_mask.ip6_addr_mask.ul[3];
network_route_ip.bf.ip_addr_mask = entry->route_addr_mask.ip6_addr_mask.ul[2];
hppe_network_route_ip_set(dev_id, index * 4 + 2, &network_route_ip);
network_route_ip.bf.ip_addr = entry->route_addr_mask.ip6_addr_mask.ul[1];
network_route_ip.bf.ip_addr_mask = entry->route_addr_mask.ip6_addr_mask.ul[0];
hppe_network_route_ip_set(dev_id, index * 4 + 3, &network_route_ip);
}
return SW_OK;
}
sw_error_t
adpt_hppe_ip_network_route_del(a_uint32_t dev_id,
a_uint32_t index, a_uint8_t type)
{
union network_route_ip_u network_route_ip;
union network_route_ip_ext_u network_route_ip_ext;
union network_route_action_u network_route_action;
memset(&network_route_ip, 0, sizeof(network_route_ip));
memset(&network_route_ip_ext, 0, sizeof(network_route_ip_ext));
memset(&network_route_action, 0, sizeof(network_route_action));
ADPT_DEV_ID_CHECK(dev_id);
if (type > 1 || (type == 0 && index > 31) || (type == 1 && index > 7))
return SW_BAD_VALUE;
network_route_ip_ext.bf.valid = 0;
if (type == 0) {
hppe_network_route_ip_ext_set(dev_id, index, &network_route_ip_ext);
} else {
hppe_network_route_ip_ext_set(dev_id, index * 4, &network_route_ip_ext);
}
return SW_OK;
}
sw_error_t
adpt_hppe_ip_port_sg_cfg_get(a_uint32_t dev_id, fal_port_t port_id,
fal_sg_cfg_t *sg_cfg)
{
sw_error_t rv = SW_OK;
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(sg_cfg);
rv = hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
if( rv != SW_OK )
return rv;
sg_cfg->ipv4_sg_en = l3_vp_port_tbl.bf.ipv4_sg_en;
sg_cfg->ipv4_sg_vio_action= l3_vp_port_tbl.bf.ipv4_sg_vio_cmd;
sg_cfg->ipv4_sg_port_en = l3_vp_port_tbl.bf.ipv4_sg_port_en;
sg_cfg->ipv4_sg_svlan_en = l3_vp_port_tbl.bf.ipv4_sg_svlan_en;
sg_cfg->ipv4_sg_cvlan_en = l3_vp_port_tbl.bf.ipv4_sg_cvlan_en;
sg_cfg->ipv4_src_unk_action = l3_vp_port_tbl.bf.ipv4_src_unk_cmd;
sg_cfg->ipv6_sg_en = l3_vp_port_tbl.bf.ipv6_sg_en;
sg_cfg->ipv6_sg_vio_action = l3_vp_port_tbl.bf.ipv6_sg_vio_cmd;
sg_cfg->ipv6_sg_port_en = l3_vp_port_tbl.bf.ipv6_sg_port_en;
sg_cfg->ipv6_sg_svlan_en = l3_vp_port_tbl.bf.ipv6_sg_svlan_en;
sg_cfg->ipv6_sg_cvlan_en = l3_vp_port_tbl.bf.ipv6_sg_cvlan_en;
sg_cfg->ipv6_src_unk_action = l3_vp_port_tbl.bf.ipv6_src_unk_cmd;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_intf_get(
a_uint32_t dev_id,
a_uint32_t index,
fal_intf_entry_t *entry)
{
sw_error_t rv = SW_OK;
union in_l3_if_tbl_u in_l3_if_tbl;
union eg_l3_if_tbl_u eg_l3_if_tbl;
memset(&in_l3_if_tbl, 0, sizeof(in_l3_if_tbl));
memset(&eg_l3_if_tbl, 0, sizeof(eg_l3_if_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
rv = hppe_in_l3_if_tbl_get(dev_id, index, &in_l3_if_tbl);
if( rv != SW_OK )
return rv;
rv = hppe_eg_l3_if_tbl_get(dev_id, index, &eg_l3_if_tbl);
if( rv != SW_OK )
return rv;
entry->mru = in_l3_if_tbl.bf.mru;
entry->mtu = in_l3_if_tbl.bf.mtu;
entry->ttl_dec_bypass_en = in_l3_if_tbl.bf.ttl_dec_bypass;
entry->ipv4_uc_route_en = in_l3_if_tbl.bf.ipv4_uc_route_en;
entry->ipv6_uc_route_en = in_l3_if_tbl.bf.ipv6_uc_route_en;
entry->icmp_trigger_en = in_l3_if_tbl.bf.icmp_trigger_en;
entry->ttl_exceed_action = in_l3_if_tbl.bf.ttl_exceed_cmd;
entry->ttl_exceed_deacclr_en = in_l3_if_tbl.bf.ttl_exceed_de_acce;
entry->mac_addr_bitmap = in_l3_if_tbl.bf.mac_bitmap;
entry->mac_addr.uc[5] = eg_l3_if_tbl.bf.mac_addr_0;
entry->mac_addr.uc[4] = eg_l3_if_tbl.bf.mac_addr_0 >> 8;
entry->mac_addr.uc[3] = eg_l3_if_tbl.bf.mac_addr_0 >> 16;
entry->mac_addr.uc[2] = eg_l3_if_tbl.bf.mac_addr_0 >> 24;
entry->mac_addr.uc[1] = eg_l3_if_tbl.bf.mac_addr_1;
entry->mac_addr.uc[0] = eg_l3_if_tbl.bf.mac_addr_1 >> 8;
if (rv == SW_OK) {
union rt_interface_cnt_tbl_u cnt_ingress, cnt_egress;
hppe_rt_interface_cnt_tbl_get(dev_id, index, &cnt_ingress);
hppe_rt_interface_cnt_tbl_get(dev_id, index + 256, &cnt_egress);
entry->counter.rx_pkt_counter = cnt_ingress.bf.pkt_cnt;
entry->counter.rx_byte_counter = cnt_ingress.bf.byte_cnt_0 | ((a_uint64_t)cnt_ingress.bf.byte_cnt_1 << 32);
entry->counter.rx_drop_pkt_counter = cnt_ingress.bf.drop_pkt_cnt_0 | (cnt_ingress.bf.drop_pkt_cnt_1 << 24);
entry->counter.rx_drop_byte_counter = cnt_ingress.bf.drop_byte_cnt_0 | \
((a_uint64_t)cnt_ingress.bf.drop_byte_cnt_1 << 24);
entry->counter.tx_pkt_counter = cnt_egress.bf.pkt_cnt;
entry->counter.tx_byte_counter = cnt_egress.bf.byte_cnt_0 | ((a_uint64_t)cnt_egress.bf.byte_cnt_1 << 32);
entry->counter.tx_drop_pkt_counter = cnt_egress.bf.drop_pkt_cnt_0 | (cnt_egress.bf.drop_pkt_cnt_1 << 24);
entry->counter.tx_drop_byte_counter = cnt_egress.bf.drop_byte_cnt_0 | \
((a_uint64_t)cnt_egress.bf.drop_byte_cnt_1 << 24);
}
return SW_OK;
}
sw_error_t
adpt_hppe_ip_pub_addr_set(a_uint32_t dev_id,
a_uint32_t index, fal_ip_pub_addr_t *entry)
{
union in_pub_ip_addr_tbl_u in_pub_ip_addr_tbl;
memset(&in_pub_ip_addr_tbl, 0, sizeof(in_pub_ip_addr_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
in_pub_ip_addr_tbl.bf.ip_addr = entry->pub_ip_addr;
return hppe_in_pub_ip_addr_tbl_set(dev_id, index, &in_pub_ip_addr_tbl);
}
sw_error_t
adpt_hppe_ip_host_del(a_uint32_t dev_id, a_uint32_t del_mode,
fal_host_entry_t * host_entry)
{
a_uint8_t mode = 0, type = 0;
sw_error_t rv = SW_OK;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(host_entry);
mode = host_entry->flags >> 24;
type = host_entry->flags & 0xff;
if (del_mode & FAL_IP_ENTRY_ID_EN)
mode = 1;
else if (del_mode & FAL_IP_ENTRY_IPADDR_EN)
mode = 0;
else if (del_mode & FAL_IP_ENTRY_ALL_EN) {
return hppe_host_flush_common(dev_id);
}
if ((type & FAL_IP_IP4_ADDR) == FAL_IP_IP4_ADDR) {
union host_tbl_u entry;
entry.bf.valid= 1;
entry.bf.key_type = 0;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.ip_addr = host_entry->ip4_addr;
rv = hppe_host_ipv4_del(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
} else if ((type & FAL_IP_IP6_ADDR) == FAL_IP_IP6_ADDR) {
union host_ipv6_tbl_u entry;
entry.bf.valid= 1;
entry.bf.key_type = 2;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.ipv6_addr_0 = host_entry->ip6_addr.ul[3];
entry.bf.ipv6_addr_1 = host_entry->ip6_addr.ul[3] >> 10 | \
host_entry->ip6_addr.ul[2] << 22;
entry.bf.ipv6_addr_2 = host_entry->ip6_addr.ul[2] >> 10 | \
host_entry->ip6_addr.ul[1] << 22;
entry.bf.ipv6_addr_3 = host_entry->ip6_addr.ul[1] >> 10 | \
host_entry->ip6_addr.ul[0] << 22;
entry.bf.ipv6_addr_4 = host_entry->ip6_addr.ul[0] >> 10;
rv = hppe_host_ipv6_del(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
} else if ((type & FAL_IP_IP4_ADDR_MCAST) == FAL_IP_IP4_ADDR_MCAST) {
union host_ipv4_mcast_tbl_u entry;
entry.bf.valid= 1;
entry.bf.key_type = 1;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.gip_addr_0 = host_entry->ip4_addr;
entry.bf.gip_addr_1 = host_entry->ip4_addr >> 11;
entry.bf.vsi = host_entry->mcast_info.vsi;
entry.bf.sip_addr_0 = host_entry->mcast_info.sip4_addr;
entry.bf.sip_addr_1 = host_entry->mcast_info.sip4_addr >> 11;
rv = hppe_host_ipv4_mcast_del(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
} else if ((type & FAL_IP_IP6_ADDR_MCAST) == FAL_IP_IP6_ADDR_MCAST) {
union host_ipv6_mcast_tbl_u entry;
entry.bf.valid= 1;
entry.bf.key_type = 3;
entry.bf.fwd_cmd = host_entry->action;
entry.bf.syn_toggle = host_entry->syn_toggle;
entry.bf.dst_info = host_entry->dst_info;
entry.bf.lan_wan = host_entry->lan_wan;
entry.bf.gipv6_addr_0 = host_entry->ip6_addr.ul[3];
entry.bf.gipv6_addr_1 = host_entry->ip6_addr.ul[3] >> 20 | \
host_entry->ip6_addr.ul[2] << 12;
entry.bf.gipv6_addr_2 = host_entry->ip6_addr.ul[2] >> 20 | \
host_entry->ip6_addr.ul[1] << 12;
entry.bf.gipv6_addr_3 = host_entry->ip6_addr.ul[1] >> 20 | \
host_entry->ip6_addr.ul[0] << 12;
entry.bf.gipv6_addr_4 = host_entry->ip6_addr.ul[0] >> 20;
entry.bf.vsi = host_entry->mcast_info.vsi;
entry.bf.sipv6_addr_0 = host_entry->mcast_info.sip6_addr.ul[3];
entry.bf.sipv6_addr_1 = host_entry->mcast_info.sip6_addr.ul[3] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[2] << 12;
entry.bf.sipv6_addr_2 = host_entry->mcast_info.sip6_addr.ul[2] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[1] << 12;
entry.bf.sipv6_addr_3 = host_entry->mcast_info.sip6_addr.ul[1] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[0] << 12;
entry.bf.sipv6_addr_4 = host_entry->mcast_info.sip6_addr.ul[0] >> 20;
rv = hppe_host_ipv6_mcast_del(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
}
return rv;
}
sw_error_t
adpt_hppe_ip_route_mismatch_get(a_uint32_t dev_id, fal_fwd_cmd_t *cmd)
{
sw_error_t rv = SW_OK;
union l3_route_ctrl_ext_u l3_route_ctrl_ext;
memset(&l3_route_ctrl_ext, 0, sizeof(l3_route_ctrl_ext));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cmd);
rv = hppe_l3_route_ctrl_ext_get(dev_id, &l3_route_ctrl_ext);
if( rv != SW_OK )
return rv;
*cmd = (fal_fwd_cmd_t)l3_route_ctrl_ext.bf.ip_route_mismatch;
return rv;
}
sw_error_t
adpt_hppe_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 rv = SW_OK;
union l3_vsi_ext_u l3_vsi_ext;
memset(&l3_vsi_ext, 0, sizeof(l3_vsi_ext));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(arp_sg_cfg);
rv = hppe_l3_vsi_ext_get(dev_id, vsi, &l3_vsi_ext);
if( rv != SW_OK )
return rv;
arp_sg_cfg->ipv4_arp_sg_en = l3_vsi_ext.bf.ip_arp_sg_en;
arp_sg_cfg->ipv4_arp_sg_vio_action = l3_vsi_ext.bf.ip_arp_sg_vio_cmd;
arp_sg_cfg->ipv4_arp_sg_port_en = l3_vsi_ext.bf.ip_arp_sg_port_en;
arp_sg_cfg->ipv4_arp_sg_svlan_en = l3_vsi_ext.bf.ip_arp_sg_svlan_en;
arp_sg_cfg->ipv4_arp_sg_cvlan_en = l3_vsi_ext.bf.ip_arp_sg_cvlan_en;
arp_sg_cfg->ipv4_arp_src_unk_action = l3_vsi_ext.bf.ip_arp_src_unk_cmd;
arp_sg_cfg->ip_nd_sg_en = l3_vsi_ext.bf.ip_nd_sg_en;
arp_sg_cfg->ip_nd_sg_vio_action = l3_vsi_ext.bf.ip_nd_sg_vio_cmd;
arp_sg_cfg->ip_nd_sg_port_en = l3_vsi_ext.bf.ip_nd_sg_port_en;
arp_sg_cfg->ip_nd_sg_svlan_en = l3_vsi_ext.bf.ip_nd_sg_svlan_en;
arp_sg_cfg->ip_nd_sg_cvlan_en = l3_vsi_ext.bf.ip_nd_sg_cvlan_en;
arp_sg_cfg->ip_nd_src_unk_action = l3_vsi_ext.bf.ip_nd_src_unk_cmd;
return rv;
}
sw_error_t
adpt_hppe_ip_port_arp_sg_cfg_set(a_uint32_t dev_id, fal_port_t port_id,
fal_arp_sg_cfg_t *arp_sg_cfg)
{
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
l3_vp_port_tbl.bf.ip_arp_sg_en = arp_sg_cfg->ipv4_arp_sg_en;
l3_vp_port_tbl.bf.ip_arp_sg_vio_cmd = arp_sg_cfg->ipv4_arp_sg_vio_action;
l3_vp_port_tbl.bf.ip_arp_sg_port_en = arp_sg_cfg->ipv4_arp_sg_port_en;
l3_vp_port_tbl.bf.ip_arp_sg_svlan_en = arp_sg_cfg->ipv4_arp_sg_svlan_en;
l3_vp_port_tbl.bf.ip_arp_sg_cvlan_en = arp_sg_cfg->ipv4_arp_sg_cvlan_en;
l3_vp_port_tbl.bf.ip_arp_src_unk_cmd = arp_sg_cfg->ipv4_arp_src_unk_action;
l3_vp_port_tbl.bf.ip_nd_sg_en = arp_sg_cfg->ip_nd_sg_en;
l3_vp_port_tbl.bf.ip_nd_sg_vio_cmd = arp_sg_cfg->ip_nd_sg_vio_action;
l3_vp_port_tbl.bf.ip_nd_sg_port_en = arp_sg_cfg->ip_nd_sg_port_en;
l3_vp_port_tbl.bf.ip_nd_sg_svlan_en = arp_sg_cfg->ip_nd_sg_svlan_en;
l3_vp_port_tbl.bf.ip_nd_sg_cvlan_en = arp_sg_cfg->ip_nd_sg_cvlan_en;
l3_vp_port_tbl.bf.ip_nd_src_unk_cmd = arp_sg_cfg->ip_nd_src_unk_action;
return hppe_l3_vp_port_tbl_set(dev_id, port_id, &l3_vp_port_tbl);
}
sw_error_t
adpt_hppe_ip_vsi_mc_mode_set(a_uint32_t dev_id, a_uint32_t vsi,
fal_mc_mode_cfg_t *cfg)
{
union l3_vsi_u l3_vsi;
memset(&l3_vsi, 0, sizeof(l3_vsi));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vsi_get(dev_id, vsi, &l3_vsi);
l3_vsi.bf.l2_ipv4_mc_en = cfg->l2_ipv4_mc_en;
l3_vsi.bf.l2_ipv4_mc_mode = cfg->l2_ipv4_mc_mode;
l3_vsi.bf.l2_ipv6_mc_en = cfg->l2_ipv6_mc_en;
l3_vsi.bf.l2_ipv6_mc_mode = cfg->l2_ipv6_mc_mode;
return hppe_l3_vsi_set(dev_id, vsi, &l3_vsi);
}
sw_error_t
adpt_hppe_ip_vsi_intf_set(a_uint32_t dev_id, a_uint32_t vsi, fal_intf_id_t *id)
{
union l3_vsi_u l3_vsi;
memset(&l3_vsi, 0, sizeof(l3_vsi));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_vsi_get(dev_id, vsi, &l3_vsi);
l3_vsi.bf.l3_if_valid = id->l3_if_valid;
l3_vsi.bf.l3_if_index = id->l3_if_index;
return hppe_l3_vsi_set(dev_id, vsi, &l3_vsi);
}
sw_error_t
adpt_hppe_ip_nexthop_get(a_uint32_t dev_id,
a_uint32_t index, fal_ip_nexthop_t *entry)
{
sw_error_t rv = SW_OK;
union in_nexthop_tbl_u in_nexthop_tbl;
memset(&in_nexthop_tbl, 0, sizeof(in_nexthop_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
rv = hppe_in_nexthop_tbl_get(dev_id, index, &in_nexthop_tbl);
if( rv != SW_OK )
return rv;
entry->type = in_nexthop_tbl.bf0.type;
entry->vsi = in_nexthop_tbl.bf1.vsi;
entry->port = in_nexthop_tbl.bf0.port;
entry->if_index = in_nexthop_tbl.bf0.post_l3_if;
entry->ip_to_me_en = in_nexthop_tbl.bf0.ip_to_me;
entry->pub_ip_index = in_nexthop_tbl.bf1.ip_pub_addr_index;
entry->stag_fmt = in_nexthop_tbl.bf0.stag_fmt;
entry->svid = in_nexthop_tbl.bf0.svid;
entry->ctag_fmt = in_nexthop_tbl.bf0.ctag_fmt;
entry->cvid = in_nexthop_tbl.bf0.cvid;
entry->mac_addr.uc[5] = in_nexthop_tbl.bf1.mac_addr_0;
entry->mac_addr.uc[4] = in_nexthop_tbl.bf1.mac_addr_0 >> 8;
entry->mac_addr.uc[3] = in_nexthop_tbl.bf1.mac_addr_1;
entry->mac_addr.uc[2] = in_nexthop_tbl.bf1.mac_addr_1 >> 8;
entry->mac_addr.uc[1] = in_nexthop_tbl.bf1.mac_addr_1 >> 16;
entry->mac_addr.uc[0] = in_nexthop_tbl.bf1.mac_addr_1 >> 24;
entry->dnat_ip = in_nexthop_tbl.bf0.ip_addr_dnat;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_route_mismatch_set(a_uint32_t dev_id, fal_fwd_cmd_t cmd)
{
union l3_route_ctrl_ext_u l3_route_ctrl_ext;
memset(&l3_route_ctrl_ext, 0, sizeof(l3_route_ctrl_ext));
ADPT_DEV_ID_CHECK(dev_id);
hppe_l3_route_ctrl_ext_get(dev_id, &l3_route_ctrl_ext);
l3_route_ctrl_ext.bf.ip_route_mismatch = cmd;
return hppe_l3_route_ctrl_ext_set(dev_id, &l3_route_ctrl_ext);
}
sw_error_t
adpt_hppe_ip_host_get(a_uint32_t dev_id, a_uint32_t get_mode,
fal_host_entry_t *host_entry)
{
a_uint8_t mode = 0, type = 0;
sw_error_t rv = SW_OK;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(host_entry);
mode = host_entry->flags >> 24;
type = host_entry->flags & 0xff;
if (get_mode & FAL_IP_ENTRY_ID_EN)
mode = 1;
else if (get_mode & FAL_IP_ENTRY_IPADDR_EN)
mode = 0;
if ((type & FAL_IP_IP4_ADDR) == FAL_IP_IP4_ADDR) {
union host_tbl_u entry;
entry.bf.key_type = 0;
entry.bf.ip_addr = host_entry->ip4_addr;
rv = hppe_host_ipv4_get(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
if (!rv && (entry.bf.key_type != 0))
rv = SW_FAIL;
host_entry->ip4_addr = entry.bf.ip_addr;
host_entry->lan_wan = entry.bf.lan_wan;
host_entry->dst_info = entry.bf.dst_info;
host_entry->syn_toggle = entry.bf.syn_toggle;
host_entry->action = entry.bf.fwd_cmd;
host_entry->status = entry.bf.valid;
} else if ((type & FAL_IP_IP6_ADDR) == FAL_IP_IP6_ADDR) {
union host_ipv6_tbl_u entry;
entry.bf.key_type = 2;
entry.bf.ipv6_addr_0 = host_entry->ip6_addr.ul[3];
entry.bf.ipv6_addr_1 = host_entry->ip6_addr.ul[3] >> 10 | \
host_entry->ip6_addr.ul[2] << 22;
entry.bf.ipv6_addr_2 = host_entry->ip6_addr.ul[2] >> 10 | \
host_entry->ip6_addr.ul[1] << 22;
entry.bf.ipv6_addr_3 = host_entry->ip6_addr.ul[1] >> 10 | \
host_entry->ip6_addr.ul[0] << 22;
entry.bf.ipv6_addr_4 = host_entry->ip6_addr.ul[0] >> 10;
rv = hppe_host_ipv6_get(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
if (!rv && (entry.bf.key_type != 2))
rv = SW_FAIL;
host_entry->ip6_addr.ul[3] = entry.bf.ipv6_addr_0 | entry.bf.ipv6_addr_1 << 10;
host_entry->ip6_addr.ul[2] = entry.bf.ipv6_addr_1 >> 22 | entry.bf.ipv6_addr_2 << 10;
host_entry->ip6_addr.ul[1] = entry.bf.ipv6_addr_2 >> 22 | entry.bf.ipv6_addr_3 << 10;
host_entry->ip6_addr.ul[0] = entry.bf.ipv6_addr_3 >> 22 | entry.bf.ipv6_addr_4 << 10;
host_entry->lan_wan = entry.bf.lan_wan;
host_entry->dst_info = entry.bf.dst_info;
host_entry->syn_toggle = entry.bf.syn_toggle;
host_entry->action = entry.bf.fwd_cmd;
host_entry->status = entry.bf.valid;
} else if ((type & FAL_IP_IP4_ADDR_MCAST) == FAL_IP_IP4_ADDR_MCAST) {
union host_ipv4_mcast_tbl_u entry;
entry.bf.key_type = 1;
entry.bf.gip_addr_0 = host_entry->ip4_addr;
entry.bf.gip_addr_1 = host_entry->ip4_addr >> 11;
entry.bf.vsi = host_entry->mcast_info.vsi;
entry.bf.sip_addr_0 = host_entry->mcast_info.sip4_addr;
entry.bf.sip_addr_1 = host_entry->mcast_info.sip4_addr >> 11;
rv = hppe_host_ipv4_mcast_get(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
if (!rv && (entry.bf.key_type != 1))
rv = SW_FAIL;
host_entry->lan_wan = entry.bf.lan_wan;
host_entry->dst_info = entry.bf.dst_info;
host_entry->syn_toggle = entry.bf.syn_toggle;
host_entry->action = entry.bf.fwd_cmd;
host_entry->status = entry.bf.valid;
host_entry->ip4_addr = entry.bf.gip_addr_0 | entry.bf.gip_addr_1 << 11;
host_entry->mcast_info.vsi = entry.bf.vsi;
host_entry->mcast_info.sip4_addr = entry.bf.sip_addr_0 | entry.bf.sip_addr_1 << 11;
} else if ((type & FAL_IP_IP6_ADDR_MCAST) == FAL_IP_IP6_ADDR_MCAST) {
union host_ipv6_mcast_tbl_u entry;
entry.bf.key_type = 3;
entry.bf.vsi = host_entry->mcast_info.vsi;
entry.bf.gipv6_addr_0 = host_entry->ip6_addr.ul[3];
entry.bf.gipv6_addr_1 = host_entry->ip6_addr.ul[3] >> 20 | \
host_entry->ip6_addr.ul[2] << 12;
entry.bf.gipv6_addr_2 = host_entry->ip6_addr.ul[2] >> 20 | \
host_entry->ip6_addr.ul[1] << 12;
entry.bf.gipv6_addr_3 = host_entry->ip6_addr.ul[1] >> 20 | \
host_entry->ip6_addr.ul[0] << 12;
entry.bf.gipv6_addr_4 = host_entry->ip6_addr.ul[0] >> 20;
entry.bf.sipv6_addr_0 = host_entry->mcast_info.sip6_addr.ul[3];
entry.bf.sipv6_addr_1 = host_entry->mcast_info.sip6_addr.ul[3] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[2] << 12;
entry.bf.sipv6_addr_2 = host_entry->mcast_info.sip6_addr.ul[2] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[1] << 12;
entry.bf.sipv6_addr_3 = host_entry->mcast_info.sip6_addr.ul[1] >> 20 | \
host_entry->mcast_info.sip6_addr.ul[0] << 12;
entry.bf.sipv6_addr_4 = host_entry->mcast_info.sip6_addr.ul[0] >> 20;
rv = hppe_host_ipv6_mcast_get(dev_id, (a_uint32_t)mode, &host_entry->entry_id, &entry);
if (!rv && (entry.bf.key_type != 3))
rv = SW_FAIL;
host_entry->lan_wan = entry.bf.lan_wan;
host_entry->dst_info = entry.bf.dst_info;
host_entry->syn_toggle = entry.bf.syn_toggle;
host_entry->action = entry.bf.fwd_cmd;
host_entry->status = entry.bf.valid;
host_entry->ip6_addr.ul[3] = entry.bf.gipv6_addr_0 | entry.bf.gipv6_addr_1 << 20;
host_entry->ip6_addr.ul[2] = entry.bf.gipv6_addr_1 >> 12 | entry.bf.gipv6_addr_2 << 20;
host_entry->ip6_addr.ul[1] = entry.bf.gipv6_addr_2 >> 12 | entry.bf.gipv6_addr_3 << 20;
host_entry->ip6_addr.ul[0] = entry.bf.gipv6_addr_3 >> 12 | entry.bf.gipv6_addr_4 << 20;
host_entry->mcast_info.vsi = entry.bf.vsi;
host_entry->mcast_info.sip6_addr.ul[3] = entry.bf.sipv6_addr_0 | entry.bf.sipv6_addr_1 << 20;
host_entry->mcast_info.sip6_addr.ul[2] = entry.bf.sipv6_addr_1 >> 12 | entry.bf.sipv6_addr_2 << 20;
host_entry->mcast_info.sip6_addr.ul[1] = entry.bf.sipv6_addr_2 >> 12 | entry.bf.sipv6_addr_3 << 20;
host_entry->mcast_info.sip6_addr.ul[0] = entry.bf.sipv6_addr_3 >> 12 | entry.bf.sipv6_addr_4 << 20;
}
return rv;
}
sw_error_t
adpt_hppe_ip_host_next(a_uint32_t dev_id, a_uint32_t next_mode,
fal_host_entry_t * host_entry)
{
a_uint32_t i = 0, step = 0;
sw_error_t rv = SW_OK;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(host_entry);
if (FAL_NEXT_ENTRY_FIRST_ID == host_entry->entry_id)
i = 0;
if (next_mode == FAL_IP_IP6_ADDR_MCAST) {
if (FAL_NEXT_ENTRY_FIRST_ID != host_entry->entry_id)
i = (host_entry->entry_id & ~3) + 4;
step = 4;
} else if (next_mode == FAL_IP_IP4_ADDR_MCAST) {
if (FAL_NEXT_ENTRY_FIRST_ID != host_entry->entry_id)
i = (host_entry->entry_id & ~1) + 2;
step = 2;
} else if (next_mode == FAL_IP_IP4_ADDR) {
if (FAL_NEXT_ENTRY_FIRST_ID != host_entry->entry_id)
i = host_entry->entry_id + 1;
step = 1;
} else if (next_mode == FAL_IP_IP6_ADDR) {
if (FAL_NEXT_ENTRY_FIRST_ID != host_entry->entry_id)
i = (host_entry->entry_id & ~1) + 2;
step = 2;
}
for (; i < HOST_TBL_MAX_ENTRY;) {
host_entry->flags = next_mode;
host_entry->entry_id = i;
rv = adpt_hppe_ip_host_get(dev_id, FAL_IP_ENTRY_ID_EN, host_entry);
if (!rv) {
return rv;
}
i += step;
}
return SW_FAIL;
}
sw_error_t
adpt_hppe_ip_intf_set(
a_uint32_t dev_id,
a_uint32_t index,
fal_intf_entry_t *entry)
{
union in_l3_if_tbl_u in_l3_if_tbl;
union eg_l3_if_tbl_u eg_l3_if_tbl;
a_uint8_t i = 0;
memset(&in_l3_if_tbl, 0, sizeof(in_l3_if_tbl));
memset(&eg_l3_if_tbl, 0, sizeof(eg_l3_if_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
in_l3_if_tbl.bf.mru = entry->mru;
in_l3_if_tbl.bf.mtu = entry->mtu;
in_l3_if_tbl.bf.ttl_dec_bypass = entry->ttl_dec_bypass_en;
in_l3_if_tbl.bf.ipv4_uc_route_en = entry->ipv4_uc_route_en;
in_l3_if_tbl.bf.ipv6_uc_route_en = entry->ipv6_uc_route_en;
in_l3_if_tbl.bf.icmp_trigger_en = entry->icmp_trigger_en;
in_l3_if_tbl.bf.ttl_exceed_cmd = entry->ttl_exceed_action;
in_l3_if_tbl.bf.ttl_exceed_de_acce = entry->ttl_exceed_deacclr_en;
in_l3_if_tbl.bf.mac_bitmap = entry->mac_addr_bitmap;
eg_l3_if_tbl.bf.mac_addr_0 = entry->mac_addr.uc[5] | \
entry->mac_addr.uc[4] << 8 | \
entry->mac_addr.uc[3] << 16 | \
entry->mac_addr.uc[2] << 24;
eg_l3_if_tbl.bf.mac_addr_1 = entry->mac_addr.uc[1] | \
entry->mac_addr.uc[0] << 8;
for (i = 0; i < 8; i++) {
if ((entry->mac_addr_bitmap >> i) & 0x1) {
union my_mac_tbl_u mymac;
mymac.bf.valid = 1;
mymac.bf.mac_da_0 = eg_l3_if_tbl.bf.mac_addr_0;
mymac.bf.mac_da_1 = eg_l3_if_tbl.bf.mac_addr_1;
hppe_my_mac_tbl_set(dev_id, i, &mymac);
break;
}
}
hppe_in_l3_if_tbl_set(dev_id, index, &in_l3_if_tbl);
hppe_eg_l3_if_tbl_set(dev_id, index, &eg_l3_if_tbl);
return SW_OK;
}
sw_error_t
adpt_hppe_ip_vsi_mc_mode_get(a_uint32_t dev_id, a_uint32_t vsi,
fal_mc_mode_cfg_t *cfg)
{
sw_error_t rv = SW_OK;
union l3_vsi_u l3_vsi;
memset(&l3_vsi, 0, sizeof(l3_vsi));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cfg);
rv = hppe_l3_vsi_get(dev_id, vsi, &l3_vsi);
if( rv != SW_OK )
return rv;
cfg->l2_ipv4_mc_en = l3_vsi.bf.l2_ipv4_mc_en;
cfg->l2_ipv4_mc_mode = l3_vsi.bf.l2_ipv4_mc_mode;
cfg->l2_ipv6_mc_en = l3_vsi.bf.l2_ipv6_mc_en;
cfg->l2_ipv6_mc_mode = l3_vsi.bf.l2_ipv6_mc_mode;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_port_macaddr_get(a_uint32_t dev_id, fal_port_t port_id,
fal_macaddr_entry_t *macaddr)
{
sw_error_t rv = SW_OK;
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(macaddr);
rv = hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
if( rv != SW_OK )
return rv;
macaddr->valid = l3_vp_port_tbl.bf.mac_valid;
macaddr->mac_addr.uc[5] = l3_vp_port_tbl.bf.mac_da_0;
macaddr->mac_addr.uc[4] = l3_vp_port_tbl.bf.mac_da_0 >> 8;
macaddr->mac_addr.uc[3] = l3_vp_port_tbl.bf.mac_da_1;
macaddr->mac_addr.uc[2] = l3_vp_port_tbl.bf.mac_da_1 >> 8;
macaddr->mac_addr.uc[1] = l3_vp_port_tbl.bf.mac_da_1 >> 16;
macaddr->mac_addr.uc[0] = l3_vp_port_tbl.bf.mac_da_1 >> 24;
return SW_OK;
}
sw_error_t
adpt_hppe_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 rv = SW_OK;
union l3_vp_port_tbl_u l3_vp_port_tbl;
memset(&l3_vp_port_tbl, 0, sizeof(l3_vp_port_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(arp_sg_cfg);
rv = hppe_l3_vp_port_tbl_get(dev_id, port_id, &l3_vp_port_tbl);
if( rv != SW_OK )
return rv;
arp_sg_cfg->ipv4_arp_sg_en = l3_vp_port_tbl.bf.ip_arp_sg_en;
arp_sg_cfg->ipv4_arp_sg_vio_action = l3_vp_port_tbl.bf.ip_arp_sg_vio_cmd;
arp_sg_cfg->ipv4_arp_sg_port_en = l3_vp_port_tbl.bf.ip_arp_sg_port_en;
arp_sg_cfg->ipv4_arp_sg_svlan_en = l3_vp_port_tbl.bf.ip_arp_sg_svlan_en;
arp_sg_cfg->ipv4_arp_sg_cvlan_en = l3_vp_port_tbl.bf.ip_arp_sg_cvlan_en;
arp_sg_cfg->ipv4_arp_src_unk_action = l3_vp_port_tbl.bf.ip_arp_src_unk_cmd;
arp_sg_cfg->ip_nd_sg_en = l3_vp_port_tbl.bf.ip_nd_sg_en;
arp_sg_cfg->ip_nd_sg_vio_action = l3_vp_port_tbl.bf.ip_nd_sg_vio_cmd;
arp_sg_cfg->ip_nd_sg_port_en = l3_vp_port_tbl.bf.ip_nd_sg_port_en;
arp_sg_cfg->ip_nd_sg_svlan_en = l3_vp_port_tbl.bf.ip_nd_sg_svlan_en;
arp_sg_cfg->ip_nd_sg_cvlan_en = l3_vp_port_tbl.bf.ip_nd_sg_cvlan_en;
arp_sg_cfg->ip_nd_src_unk_action = l3_vp_port_tbl.bf.ip_nd_src_unk_cmd;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_global_ctrl_get(a_uint32_t dev_id, fal_ip_global_cfg_t *cfg)
{
sw_error_t rv = SW_OK;
union l3_route_ctrl_u l3_route_ctrl;
union l3_route_ctrl_ext_u l3_route_ctrl_ext;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cfg);
memset(&l3_route_ctrl, 0, sizeof(l3_route_ctrl));
memset(&l3_route_ctrl, 0, sizeof(l3_route_ctrl_ext));
rv = hppe_l3_route_ctrl_get(dev_id, &l3_route_ctrl);
if( rv != SW_OK )
return rv;
rv = hppe_l3_route_ctrl_ext_get(dev_id, &l3_route_ctrl_ext);
if( rv != SW_OK )
return rv;
cfg->mru_fail_action = l3_route_ctrl.bf.ip_mru_check_fail;
cfg->mru_deacclr_en = l3_route_ctrl.bf.ip_mru_check_fail_de_acce;
cfg->mtu_fail_action = l3_route_ctrl.bf.ip_mtu_fail;
cfg->mtu_deacclr_en = l3_route_ctrl.bf.ip_mtu_fail_de_acce;
cfg->mtu_nonfrag_fail_action = l3_route_ctrl.bf.ip_mtu_df_fail;
cfg->mtu_df_deacclr_en = l3_route_ctrl.bf.ip_mtu_df_fail_de_acce;
cfg->prefix_bc_action = l3_route_ctrl.bf.ip_prefix_bc_cmd;
cfg->prefix_deacclr_en = l3_route_ctrl.bf.ip_prefix_bc_de_acce;
cfg->icmp_rdt_action = l3_route_ctrl.bf.icmp_rdt_cmd;
cfg->icmp_rdt_deacclr_en = l3_route_ctrl.bf.icmp_rdt_de_acce;
cfg->hash_mode_0 = l3_route_ctrl_ext.bf.host_hash_mode_0;
cfg->hash_mode_1 = l3_route_ctrl_ext.bf.host_hash_mode_1;
return SW_OK;
}
sw_error_t
adpt_hppe_ip_global_ctrl_set(a_uint32_t dev_id, fal_ip_global_cfg_t *cfg)
{
sw_error_t rv = SW_OK;
union l3_route_ctrl_u l3_route_ctrl;
union l3_route_ctrl_ext_u l3_route_ctrl_ext;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cfg);
memset(&l3_route_ctrl, 0, sizeof(l3_route_ctrl));
memset(&l3_route_ctrl, 0, sizeof(l3_route_ctrl_ext));
rv = hppe_l3_route_ctrl_get(dev_id, &l3_route_ctrl);
if( rv != SW_OK )
return rv;
rv = hppe_l3_route_ctrl_ext_get(dev_id, &l3_route_ctrl_ext);
if( rv != SW_OK )
return rv;
l3_route_ctrl.bf.ip_mru_check_fail = cfg->mru_fail_action;
l3_route_ctrl.bf.ip_mru_check_fail_de_acce = cfg->mru_deacclr_en;
l3_route_ctrl.bf.ip_mtu_fail = cfg->mtu_fail_action;
l3_route_ctrl.bf.ip_mtu_fail_de_acce = cfg->mtu_deacclr_en;
l3_route_ctrl.bf.ip_mtu_df_fail = cfg->mtu_nonfrag_fail_action;
l3_route_ctrl.bf.ip_mtu_df_fail_de_acce = cfg->mtu_df_deacclr_en;
l3_route_ctrl.bf.ip_prefix_bc_cmd =cfg->prefix_bc_action;
l3_route_ctrl.bf.ip_prefix_bc_de_acce = cfg->prefix_deacclr_en;
l3_route_ctrl.bf.icmp_rdt_cmd = cfg->icmp_rdt_action;
l3_route_ctrl.bf.icmp_rdt_de_acce = cfg->icmp_rdt_deacclr_en;
l3_route_ctrl_ext.bf.host_hash_mode_0 = cfg->hash_mode_0;
l3_route_ctrl_ext.bf.host_hash_mode_1 = cfg->hash_mode_1;
hppe_l3_route_ctrl_set(dev_id, &l3_route_ctrl);
hppe_l3_route_ctrl_ext_set(dev_id, &l3_route_ctrl_ext);
return SW_OK;
}
sw_error_t
adpt_hppe_ip_nexthop_set(a_uint32_t dev_id,
a_uint32_t index, fal_ip_nexthop_t *entry)
{
union in_nexthop_tbl_u in_nexthop_tbl;
memset(&in_nexthop_tbl, 0, sizeof(in_nexthop_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(entry);
in_nexthop_tbl.bf0.type = entry->type;
if (entry->type == 0)
in_nexthop_tbl.bf1.vsi = entry->vsi;
else
in_nexthop_tbl.bf0.port = entry->port;
in_nexthop_tbl.bf0.post_l3_if = entry->if_index;
in_nexthop_tbl.bf0.ip_to_me = entry->ip_to_me_en;
in_nexthop_tbl.bf0.ip_pub_addr_index = entry->pub_ip_index;
in_nexthop_tbl.bf0.stag_fmt = entry->stag_fmt;
in_nexthop_tbl.bf0.svid = entry->svid;
in_nexthop_tbl.bf0.ctag_fmt = entry->ctag_fmt;
in_nexthop_tbl.bf0.cvid = entry->cvid;
in_nexthop_tbl.bf0.mac_addr_0 = entry->mac_addr.uc[5] |
entry->mac_addr.uc[4] << 8;
in_nexthop_tbl.bf0.mac_addr_1 = entry->mac_addr.uc[3] |
entry->mac_addr.uc[2] << 8 |
entry->mac_addr.uc[1] << 16 |
entry->mac_addr.uc[0] << 24;
in_nexthop_tbl.bf0.ip_addr_dnat = entry->dnat_ip;
return hppe_in_nexthop_tbl_set(dev_id, index, &in_nexthop_tbl);
}
#endif
void adpt_hppe_ip_func_bitmap_init(a_uint32_t dev_id)
{
adpt_api_t *p_adpt_api = NULL;
p_adpt_api = adpt_api_ptr_get(dev_id);
if(p_adpt_api == NULL)
return;
p_adpt_api->adpt_ip_func_bitmap[0] = 0;
p_adpt_api->adpt_ip_func_bitmap[1] = 0;
return;
}
static void adpt_hppe_ip_func_unregister(a_uint32_t dev_id, adpt_api_t *p_adpt_api)
{
if(p_adpt_api == NULL)
return;
p_adpt_api->adpt_ip_network_route_get = NULL;
p_adpt_api->adpt_ip_host_add = NULL;
p_adpt_api->adpt_ip_vsi_sg_cfg_get = NULL;
p_adpt_api->adpt_ip_pub_addr_set = NULL;
p_adpt_api->adpt_ip_port_sg_cfg_set = NULL;
p_adpt_api->adpt_ip_port_intf_get = NULL;
p_adpt_api->adpt_ip_vsi_arp_sg_cfg_set = NULL;
p_adpt_api->adpt_ip_pub_addr_get = NULL;
p_adpt_api->adpt_ip_port_intf_set = NULL;
p_adpt_api->adpt_ip_vsi_sg_cfg_set = NULL;
p_adpt_api->adpt_ip_host_next = NULL;
p_adpt_api->adpt_ip_port_macaddr_set = NULL;
p_adpt_api->adpt_ip_vsi_intf_get = NULL;
p_adpt_api->adpt_ip_network_route_add = NULL;
p_adpt_api->adpt_ip_port_sg_cfg_get = NULL;
p_adpt_api->adpt_ip_intf_get = NULL;
p_adpt_api->adpt_ip_network_route_del = NULL;
p_adpt_api->adpt_ip_host_del = NULL;
p_adpt_api->adpt_ip_route_mismatch_get = NULL;
p_adpt_api->adpt_ip_vsi_arp_sg_cfg_get = NULL;
p_adpt_api->adpt_ip_port_arp_sg_cfg_set = NULL;
p_adpt_api->adpt_ip_vsi_mc_mode_set = NULL;
p_adpt_api->adpt_ip_vsi_intf_set = NULL;
p_adpt_api->adpt_ip_nexthop_get = NULL;
p_adpt_api->adpt_ip_route_mismatch_set = NULL;
p_adpt_api->adpt_ip_host_get = NULL;
p_adpt_api->adpt_ip_intf_set = NULL;
p_adpt_api->adpt_ip_vsi_mc_mode_get = NULL;
p_adpt_api->adpt_ip_port_macaddr_get = NULL;
p_adpt_api->adpt_ip_port_arp_sg_cfg_get = NULL;
p_adpt_api->adpt_ip_nexthop_set = NULL;
p_adpt_api->adpt_ip_global_ctrl_get = NULL;
p_adpt_api->adpt_ip_global_ctrl_set = NULL;
return;
}
sw_error_t adpt_hppe_ip_init(a_uint32_t dev_id)
{
adpt_api_t *p_adpt_api = NULL;
p_adpt_api = adpt_api_ptr_get(dev_id);
if(p_adpt_api == NULL)
return SW_FAIL;
adpt_hppe_ip_func_unregister(dev_id, p_adpt_api);
#ifndef IN_IP_MINI
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_NETWORK_ROUTE_GET))
p_adpt_api->adpt_ip_network_route_get = adpt_hppe_ip_network_route_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_HOST_ADD))
p_adpt_api->adpt_ip_host_add = adpt_hppe_ip_host_add;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_SG_CFG_GET))
p_adpt_api->adpt_ip_vsi_sg_cfg_get = adpt_hppe_ip_vsi_sg_cfg_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PUB_ADDR_SET))
p_adpt_api->adpt_ip_pub_addr_set = adpt_hppe_ip_pub_addr_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_SG_CFG_SET))
p_adpt_api->adpt_ip_port_sg_cfg_set = adpt_hppe_ip_port_sg_cfg_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_INTF_GET))
p_adpt_api->adpt_ip_port_intf_get = adpt_hppe_ip_port_intf_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_ARP_SG_CFG_SET))
p_adpt_api->adpt_ip_vsi_arp_sg_cfg_set = adpt_hppe_ip_vsi_arp_sg_cfg_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PUB_ADDR_GET))
p_adpt_api->adpt_ip_pub_addr_get = adpt_hppe_ip_pub_addr_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_INTF_SET))
p_adpt_api->adpt_ip_port_intf_set = adpt_hppe_ip_port_intf_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_SG_CFG_SET))
p_adpt_api->adpt_ip_vsi_sg_cfg_set = adpt_hppe_ip_vsi_sg_cfg_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_HOST_NEXT))
p_adpt_api->adpt_ip_host_next = adpt_hppe_ip_host_next;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_MACADDR_SET))
p_adpt_api->adpt_ip_port_macaddr_set = adpt_hppe_ip_port_macaddr_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_INTF_GET))
p_adpt_api->adpt_ip_vsi_intf_get = adpt_hppe_ip_vsi_intf_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_NETWORK_ROUTE_ADD))
p_adpt_api->adpt_ip_network_route_add = adpt_hppe_ip_network_route_add;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_SG_CFG_GET))
p_adpt_api->adpt_ip_port_sg_cfg_get = adpt_hppe_ip_port_sg_cfg_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_INTF_GET))
p_adpt_api->adpt_ip_intf_get = adpt_hppe_ip_intf_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_NETWORK_ROUTE_DEL))
p_adpt_api->adpt_ip_network_route_del = adpt_hppe_ip_network_route_del;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_HOST_DEL))
p_adpt_api->adpt_ip_host_del = adpt_hppe_ip_host_del;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_ROUTE_MISMATCH_GET))
p_adpt_api->adpt_ip_route_mismatch_get = adpt_hppe_ip_route_mismatch_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_ARP_SG_CFG_GET))
p_adpt_api->adpt_ip_vsi_arp_sg_cfg_get = adpt_hppe_ip_vsi_arp_sg_cfg_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_ARP_SG_CFG_SET))
p_adpt_api->adpt_ip_port_arp_sg_cfg_set = adpt_hppe_ip_port_arp_sg_cfg_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_MC_MODE_SET))
p_adpt_api->adpt_ip_vsi_mc_mode_set = adpt_hppe_ip_vsi_mc_mode_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_INTF_SET))
p_adpt_api->adpt_ip_vsi_intf_set = adpt_hppe_ip_vsi_intf_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_NEXTHOP_GET))
p_adpt_api->adpt_ip_nexthop_get = adpt_hppe_ip_nexthop_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_ROUTE_MISMATCH_SET))
p_adpt_api->adpt_ip_route_mismatch_set = adpt_hppe_ip_route_mismatch_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_HOST_GET))
p_adpt_api->adpt_ip_host_get = adpt_hppe_ip_host_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_INTF_SET))
p_adpt_api->adpt_ip_intf_set = adpt_hppe_ip_intf_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_VSI_MC_MODE_GET))
p_adpt_api->adpt_ip_vsi_mc_mode_get = adpt_hppe_ip_vsi_mc_mode_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_MACADDR_GET))
p_adpt_api->adpt_ip_port_macaddr_get = adpt_hppe_ip_port_macaddr_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_PORT_ARP_SG_CFG_GET))
p_adpt_api->adpt_ip_port_arp_sg_cfg_get = adpt_hppe_ip_port_arp_sg_cfg_get;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_NEXTHOP_SET))
p_adpt_api->adpt_ip_nexthop_set = adpt_hppe_ip_nexthop_set;
if (p_adpt_api->adpt_ip_func_bitmap[0] & (1 << FUNC_IP_GLOBAL_CTRL_GET))
p_adpt_api->adpt_ip_global_ctrl_get = adpt_hppe_ip_global_ctrl_get;
if (p_adpt_api->adpt_ip_func_bitmap[1] & (1 << (FUNC_IP_GLOBAL_CTRL_SET % 32)))
p_adpt_api->adpt_ip_global_ctrl_set = adpt_hppe_ip_global_ctrl_set;
#endif
return SW_OK;
}
/**
* @}
*/