blob: 00099a5db68d1c6475613d3cdbf1eb57ccf25bbd [file] [log] [blame]
/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms. Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.
********************************************************************************
Marvell Commercial License Option
If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.
********************************************************************************
Marvell GPL License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED. The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of Marvell nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
#include "tpm_common.h"
#include "tpm_header.h"
#include "tpm_sysfs_utils.h"
tpm_mc_vid_port_vid_set_t mc_vid_key;
uint8_t g_gen_query_pkt[] =
{
0x01, 0x00, 0x5E, 0x00, 0x00, 0x01,
0x54, 0xE6, 0xFC, 0x63, 0x36, 0x74,
0xda, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* reserve for Ethertype DSA tag */
0x81, 0x00, 0x00, 0x11,
0x08, 0x00, 0x46, 0xEE, 0x00, 0x20,
0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
0x82, 0x3F, 0xC0, 0xA8, 0x01, 0x01,
0xE0, 0x00, 0x00, 0x01, 0x94, 0x04,
0x00, 0x00, 0x11, 0x64, 0xEE, 0x9B,
0x00, 0x00, 0x00, 0x00, 0x9E, 0xA0,
0x01, 0x00, 0x5E, 0x00, 0x00, 0x01,
0x00, 0x00, 0x54, 0xE6, 0xFC, 0x63,
0x70, 0xF7, 0xDC, 0x59
};
/********************************************************************************/
/* Miscellaneous */
/********************************************************************************/
/*******************************************************************************
* print_help_buffer
*
* DESCRIPTION:
* This function prints help buffer
* INPUTS:
* buf - Shell parameters as char buffer
* len - Number of characters in buffer
*
*******************************************************************************/
void print_help_buffer(char *helpbuf, int len)
{
#if 1
int indx;
char savech;
for (indx = 0; indx < len; indx += 1000)
{
if (indx + 1000 < len)
{
savech = helpbuf[indx + 1000];
helpbuf[indx + 1000] = 0;
printk(KERN_INFO "%s", &helpbuf[indx]);
helpbuf[indx + 1000] = savech;
}
else
{
printk(KERN_INFO "%s", &helpbuf[indx]);
}
}
#else
printk(KERN_INFO "%s", helpbuf);
#endif
}
/*******************************************************************************
* parm_error_completion
*
* DESCRIPTION:
* This function prints out help message if buffer holds 1 parameter that
* starts '?'; else it prints out incorrect number of parameters message
* INPUTS:
* buf - Shell parameters as char buffer
* len - Number of characters in buffer
*
*******************************************************************************/
void parm_error_completion(int numparms, int reqdparms, const char *buf, int (*help_text_routine)(char *))
{
if (numparms == 1 && buf[0] == '?' && help_text_routine != NULL)
{
char helpbuf[4000];
int helpbuf_len;
helpbuf_len = help_text_routine(helpbuf);
print_help_buffer(helpbuf, helpbuf_len);
}
else
{
printk(KERN_INFO "Parse problem: parameters expected/found %d/%d\n", reqdparms, numparms);
}
}
/*******************************************************************************
* count_parameters
*
* DESCRIPTION:
* This function counts the number of parameters provided
* INPUTS:
* buf - buffer with parameter string
*
* OUTPUTS:
NONE.
*
* RETURNS:
* int
*
* COMMENTS:
* None.
*
*******************************************************************************/
int count_parameters (const char *buf)
{
char bufcopy[513];
char **ap, *argv[20];
char *inputstring = bufcopy;
int numparms = 0;
strcpy(bufcopy, buf);
for (ap = argv; ap < &argv[15] && (*ap = strsep(&inputstring, " \t")) != NULL;)
{
if (**ap != '\0')
{
ap++;
numparms++;
}
}
return numparms;
}
/*******************************************************************************
* print_horizontal_line
*
* DESCRIPTION:
* This function prints a horizontal line using the "=" sign and places CRLF
* INPUTS:
* char_count - the horizontal line length
*
* OUTPUTS:
NONE.
*
* RETURNS:
* int
*
* COMMENTS:
* None.
*
*******************************************************************************/
void print_horizontal_line(unsigned int char_count)
{
unsigned int cnt;
for (cnt = 0; cnt < char_count; cnt++)
printk("=");
printk("\n");
}
/********************************************************************************/
/* String-int map lookups */
/********************************************************************************/
/*******************************************************************************
* map_string_to_value
*
* DESCRIPTION:
* This function maps a string in a given map table to its value
* INPUTS:
* buf - buffer with parameter string
*
* OUTPUTS:
NONE.
*
* RETURNS:
* int
*
* COMMENTS:
* None.
*
*******************************************************************************/
static GT_BOOL map_string_to_value (string_enum_pair_db_t *db, char *str, unsigned int *value)
{
int indx;
string_enum_pair_t *pentry;
for (indx = 0; indx < db->num_entries; indx++)
{
pentry = &db->string_enum_pair[indx];
if (strcmp(str, pentry->str) == 0)
{
*value = pentry->value;
return GT_TRUE;
}
}
return GT_FALSE;
}
/*******************************************************************************
* map_value_to_string
*
* DESCRIPTION:
* This function maps a value to string in a given map table
* INPUTS:
* value - int enumaeration
*
* OUTPUTS:
NONE.
*
* RETURNS:
* char *. The matching string or "<unknown>"
*
* COMMENTS:
* None.
*
*******************************************************************************/
static char *map_value_to_string (string_enum_pair_db_t *db, int value)
{
int indx;
string_enum_pair_t *pentry;
static char *unknown_str = "<unknown>";
for (indx = 0; indx < db->num_entries; indx++)
{
pentry = &db->string_enum_pair[indx];
if (value == pentry->value)
{
return pentry->str;
}
}
return unknown_str;
}
//--------------------------------------------------------------------------
static string_enum_pair_t phase_string_enum_pair_ara[] =
{
{STAGE_L2_PRIM, "l2" },
{STAGE_L3_TYPE, "l3" },
{STAGE_IPv4, "ipv4" },
{STAGE_IPv6_GEN, "ipv6_gen" },
{STAGE_IPv6_DIP, "ipv6_dip" },
{STAGE_IPv6_NH, "ipv6_nh" },
{STAGE_IPV6_L4, "ipv6_l4" },
{STAGE_CTC_CM, "ctc_cm" },
{STAGE_DONE, "done" },
};
static string_enum_pair_db_t phase_string_enum_pair_db =
{
phase_string_enum_pair_ara,
sizeof(phase_string_enum_pair_ara)/sizeof(phase_string_enum_pair_ara[0])
};
GT_BOOL get_phase_value(char *str, unsigned int *value)
{
return map_string_to_value(&phase_string_enum_pair_db, str, value);
}
//---------------------------------------------------------------------------
static string_enum_pair_t srcport_string_enum_pair_ara[] =
{
{TPM_SRC_PORT_UNI_0, "UNI_0" },
{TPM_SRC_PORT_UNI_1, "UNI_1" },
{TPM_SRC_PORT_UNI_2, "UNI_2" },
{TPM_SRC_PORT_UNI_3, "UNI_3" },
{TPM_SRC_PORT_UNI_4, "UNI_4" },
{TPM_SRC_PORT_UNI_5, "UNI_5" },
{TPM_SRC_PORT_UNI_6, "UNI_6" },
{TPM_SRC_PORT_UNI_7, "UNI_7" },
{TPM_SRC_PORT_UNI_VIRT, "UNI_VIRT" },
{TPM_SRC_PORT_WAN, "WAN" },
{TPM_SRC_PORT_UNI_ANY, "UNI_ANY" },
};
static string_enum_pair_db_t srcport_string_enum_pair_db =
{
srcport_string_enum_pair_ara,
sizeof(srcport_string_enum_pair_ara)/sizeof(srcport_string_enum_pair_ara[0])
};
GT_BOOL get_srcport_value(char *str, unsigned int *value)
{
return map_string_to_value(&srcport_string_enum_pair_db, str, value);
}
//---------------------------------------------------------------------------
static string_enum_pair_t srcdir_string_enum_pair_ara[] =
{
{TPM_DIR_DS, "DS" },
{TPM_DIR_US, "US" },
};
static string_enum_pair_db_t srcdir_string_enum_pair_db =
{
srcdir_string_enum_pair_ara,
sizeof(srcdir_string_enum_pair_ara)/sizeof(srcdir_string_enum_pair_ara[0])
};
GT_BOOL get_srcdir_value(char *str, unsigned int *value)
{
return map_string_to_value(&srcdir_string_enum_pair_db, str, value);
}
//-----------------------------------------------------------------------------
static string_enum_pair_t bool_string_enum_pair_ara[] =
{
{GT_FALSE, "false"},
{GT_TRUE, "true" },
};
static string_enum_pair_db_t bool_string_enum_pair_db =
{
bool_string_enum_pair_ara,
sizeof(bool_string_enum_pair_ara)/sizeof(bool_string_enum_pair_ara[0])
};
GT_BOOL get_bool_value(char *str, unsigned int *value)
{
return map_string_to_value(&bool_string_enum_pair_db, str, value);
}
//---------------------------------------------------------------------------
static string_enum_pair_t igmp_mode_string_enum_pair_ara[] =
{
{TPM_IGMP_FRWD_MODE_DROP, "drop" },
{TPM_IGMP_FRWD_MODE_FORWARD, "frwd" },
{TPM_IGMP_FRWD_MODE_SNOOPING, "snoop"},
};
static string_enum_pair_db_t igmp_mode_string_enum_pair_db =
{
igmp_mode_string_enum_pair_ara,
sizeof(igmp_mode_string_enum_pair_ara)/sizeof(igmp_mode_string_enum_pair_ara[0])
};
GT_BOOL get_igmp_mode_value(char *str, unsigned int *value)
{
return map_string_to_value(&igmp_mode_string_enum_pair_db, str, value);
}
//---------------------------------------------------------------------------
static string_enum_pair_t igmp_srcport_string_enum_pair_ara[] =
{
{TPM_SRC_PORT_WAN, "WAN" },
{TPM_SRC_PORT_UNI_0, "UNI_0" },
{TPM_SRC_PORT_UNI_1, "UNI_1" },
{TPM_SRC_PORT_UNI_2, "UNI_2" },
{TPM_SRC_PORT_UNI_3, "UNI_3" },
};
static string_enum_pair_db_t igmp_srcport_string_enum_pair_db =
{
igmp_srcport_string_enum_pair_ara,
sizeof(igmp_srcport_string_enum_pair_ara)/sizeof(igmp_srcport_string_enum_pair_ara[0])
};
GT_BOOL get_igmp_srcport_value(char *str, unsigned int *value)
{
return map_string_to_value(&igmp_srcport_string_enum_pair_db, str, value);
}
//---------------------------------------------------------------------------
static string_enum_pair_t lx_ipvy_string_enum_pair_ara[] =
{
{TPM_SRC_PORT_WAN, "l2" },
{TPM_SRC_PORT_UNI_0, "l3" },
{TPM_SRC_PORT_UNI_1, "ipv4" },
{TPM_SRC_PORT_UNI_2, "ipv6" },
};
static string_enum_pair_db_t lx_ipvy_string_enum_pair_db =
{
lx_ipvy_string_enum_pair_ara,
sizeof(lx_ipvy_string_enum_pair_ara)/sizeof(lx_ipvy_string_enum_pair_ara[0])
};
GT_BOOL get_lx_ipvy_value(char *str, unsigned int *value)
{
return map_string_to_value(&lx_ipvy_string_enum_pair_db, str, value);
}
//---------------------------------------------------------------------------
static string_enum_pair_t direction_string_enum_pair_ara[] =
{
{TPM_DOWNSTREAM, "ds" },
{TPM_UPSTREAM, "us" },
};
static string_enum_pair_db_t direction_string_enum_pair_db =
{
direction_string_enum_pair_ara,
sizeof(direction_string_enum_pair_ara)/sizeof(direction_string_enum_pair_ara[0])
};
GT_BOOL get_direction_value(char *str, unsigned int *value)
{
return map_string_to_value(&direction_string_enum_pair_db, str, value);
}
//-----------------------------------------------------------------------------
static string_enum_pair_t scheduling_mode_string_enum_pair_ara[] =
{
{TPM_PP_SCHED_STRICT, "strict" },
{TPM_PP_SCHED_WRR, "wrr" },
};
static string_enum_pair_db_t scheduling_mode_string_enum_pair_db =
{
scheduling_mode_string_enum_pair_ara,
sizeof(scheduling_mode_string_enum_pair_ara)/sizeof(scheduling_mode_string_enum_pair_ara[0])
};
GT_BOOL get_scheduling_mode_value(char *str, unsigned int *value)
{
return map_string_to_value(&scheduling_mode_string_enum_pair_db, str, value);
}
//-----------------------------------------------------------------------------
static string_enum_pair_t sched_entity_string_enum_pair_ara[] =
{
{TPM_TRG_PORT_WAN, "WAN" },
{TPM_TRG_TCONT_0, "TCONT_0" },
{TPM_TRG_TCONT_1, "TCONT_1" },
{TPM_TRG_TCONT_2, "TCONT_2" },
{TPM_TRG_TCONT_3, "TCONT_3" },
{TPM_TRG_TCONT_4, "TCONT_4" },
{TPM_TRG_TCONT_5, "TCONT_5" },
{TPM_TRG_TCONT_6, "TCONT_6" },
{TPM_TRG_TCONT_7, "TCONT_7" },
{TPM_TRG_PORT_UNI_ANY, "UNI_ANY" },
};
static string_enum_pair_db_t sched_entity_string_enum_pair_db =
{
sched_entity_string_enum_pair_ara,
sizeof(sched_entity_string_enum_pair_ara)/sizeof(sched_entity_string_enum_pair_ara[0])
};
GT_BOOL get_sched_entity_value(char *str, unsigned int *value)
{
return map_string_to_value(&sched_entity_string_enum_pair_db, str, value);
}
//-----------------------------------------------------------------------------
static string_enum_pair_t vlan_op_string_enum_pair_ara[] =
{
{0, "none" },
{1, "ext_tag_mod" },
{2, "ext_tag_del" },
{3, "ext_tag_ins" },
{4, "ext_tag_mod_ins" },
{5, "ins_2tag" },
{6, "mod_2tag" },
{7, "swap_tags" },
{8, "del_2tags" },
{9, "int_tag_mod" },
{10, "ext_tag_del_int_mod" },
{11, "split_mod_pbit" },
};
static string_enum_pair_db_t vlan_op_string_enum_pair_db =
{
vlan_op_string_enum_pair_ara,
sizeof(vlan_op_string_enum_pair_ara)/sizeof(vlan_op_string_enum_pair_ara[0])
};
GT_BOOL get_vlan_op_value(char *str, unsigned int *value)
{
return map_string_to_value(&vlan_op_string_enum_pair_db, str, value);
}
char *get_vlan_op_str(int value)
{
return map_value_to_string(&vlan_op_string_enum_pair_db, value);
}
//-----------------------------------------------------------------------------
static string_enum_pair_t tpm_err_string_enum_pair_ara[] =
{
{TPM_RC_OK, "TPM_RC_OK"},
{ERR_GENERAL, "ERR_GENERAL"},
{ERR_OWNER_INVALID, "ERR_OWNER_INVALID"},
{ERR_SRC_PORT_INVALID, "ERR_SRC_PORT_INVALID"},
{ERR_RULE_NUM_INVALID, "ERR_RULE_NUM_INVALID"},
{ERR_RULE_IDX_INVALID, "ERR_RULE_IDX_INVALID"},
{ERR_PARSE_MAP_INVALID, "ERR_PARSE_MAP_INVALID"},
{ERR_VLAN_OP_INVALID, "ERR_VLAN_OP_INVALID"},
{ERR_L2_KEY_INVALID, "ERR_L2_KEY_INVALID"},
{ERR_FRWD_INVALID, "ERR_FRWD_INVALID"},
{ERR_MOD_INVALID, "ERR_MOD_INVALID"},
{ERR_ACTION_INVALID, "ERR_ACTION_INVALID"},
{ERR_NEXT_PHASE_INVALID, "ERR_NEXT_PHASE_INVALID"},
{ERR_RULE_KEY_MISMATCH, "ERR_RULE_KEY_MISMATCH"},
{ERR_IPV4_NO_CONT_L4, "ERR_IPV4_NO_CONT_L4"},
{ERR_IPV6_ADD_FAIL, "ERR_IPV6_ADD_FAIL"},
{ERR_MC_STREAM_INVALID, "ERR_MC_STREAM_INVALID"},
{ERR_MC_STREAM_EXISTS , "ERR_MC_STREAM_EXISTS "},
{ERR_MC_DST_PORT_INVALID, "ERR_MC_DST_PORT_INVALID"},
{ERR_MC_DST_QUEUE_INVALID, "ERR_MC_DST_QUEUE_INVALID"},
{ERR_IPV4_MC_DST_IP_INVALID, "ERR_IPV4_MC_DST_IP_INVALID"},
{ERR_IPV6_MC_DST_IP_INVALID, "ERR_IPV6_MC_DST_IP_INVALID"},
{ERR_OMCI_TCONT_INVALID, "ERR_OMCI_TCONT_INVALID"},
{ERR_MNGT_TX_Q_INVALID, "ERR_MNGT_TX_Q_INVALID"},
{ERR_MNGT_CREATE_DUPLICATE_CHANNEL, "ERR_MNGT_CREATE_DUPLICATE_CHANNEL"},
{ERR_MNGT_DEL_CHANNEL_INVALID, "ERR_MNGT_DEL_CHANNEL_INVALID"},
{ERR_OAM_LLID_INVALID, "ERR_OAM_LLID_INVALID"},
{ERR_CFG_GETNEXT_INDEX_INVALID, "ERR_CFG_GETNEXT_INDEX_INVALID"},
{ERR_CFG_GETNEXT_DIRECTION_INVALID, "ERR_CFG_GETNEXT_DIRECTION_INVALID"},
{ERR_CFG_GET_CHANNEL_INVALID, "ERR_CFG_GET_CHANNEL_INVALID"},
{ERR_SW_MAC_INVALID, "ERR_SW_MAC_INVALID"},
{ERR_SW_MAC_STATIC_NOT_FOUND, "ERR_SW_MAC_STATIC_NOT_FOUND"},
{ERR_SW_MAC_PER_PORT_INVALID, "ERR_SW_MAC_PER_PORT_INVALID"},
{ERR_SW_NUM_OF_MAC_PER_PORT_INVALID,"ERR_SW_NUM_OF_MAC_PER_PORT_INVALID"},
{ERR_SW_VID_INVALID, "ERR_SW_VID_INVALID"},
{ERR_SW_TM_QUEUE_INVALID, "ERR_SW_TM_QUEUE_INVALID"},
{ERR_SW_TM_WEIGHT_INVALID, "ERR_SW_TM_WEIGHT_INVALID"},
{ERR_SW_TM_WRR_MODE_INVALID, "ERR_SW_TM_WRR_MODE_INVALID"},
{ERR_API_TYPE_INVALID, "ERR_API_TYPE_INVALID"},
{ERR_DIR_INVALID, "ERR_DIR_INVALID"},
{ERR_NULL_POINTER, "ERR_NULL_POINTER"},
{ERR_IGMP_NOT_ENABLED, "ERR_IGMP_NOT_ENABLED"},
{ERR_OUT_OF_RESOURCES, "ERR_OUT_OF_RESOURCES"},
{ERR_AI_SESS_EXISTS, "ERR_AI_SESS_EXISTS"},
{ERR_AI_SESS_DELETING, "ERR_AI_SESS_DELETING"},
{ERR_SW_TM_BUCKET_SIZE_INVALID, "ERR_SW_TM_BUCKET_SIZE_INVALID"},
{ERR_SW_TM_RATE_LIMIT_INVALID, "ERR_SW_TM_RATE_LIMIT_INVALID"},
{ERR_DELETE_KEY_INVALID, "ERR_DELETE_KEY_INVALID"},
{ERR_L3_KEY_INVALID, "ERR_L3_KEY_INVALID"},
{ERR_IPV4_KEY_INVALID, "ERR_IPV4_KEY_INVALID"},
{ERR_IPV6_KEY_INVALID, "ERR_IPV6_KEY_INVALID"},
{ERR_PORT_IGMP_FRWD_MODE_INVALID, "ERR_PORT_IGMP_FRWD_MODE_INVALID"},
{ERR_IPV6_API_ILLEGAL_CALL, "ERR_IPV6_API_ILLEGAL_CALL"},
{ERR_IPV6_5T_RULE_EXISTS, "ERR_IPV6_5T_RULE_EXISTS"},
{ERR_IPV6_5T_FLOW_PARTIAL_MATCHED, "ERR_IPV6_5T_FLOW_PARTIAL_MATCHED"},
{ERR_IPV6_5T_RULE_IN_USE, "ERR_IPV6_5T_RULE_IN_USE"},
{ERR_IPV6_5T_FLOW_AI_BITS_EXHAUSED, "ERR_IPV6_5T_FLOW_AI_BITS_EXHAUSED"},
{ERR_SW_NOT_INIT, "ERR_SW_NOT_INIT"},
};
static string_enum_pair_db_t tpm_err_string_enum_pair_db =
{
tpm_err_string_enum_pair_ara,
sizeof(tpm_err_string_enum_pair_ara)/sizeof(tpm_err_string_enum_pair_ara[0])
};
char *get_tpm_err_str(int value)
{
return map_value_to_string(&tpm_err_string_enum_pair_db, value);
}
/*******************************************************************************
* parse_ipv4_address
*
* DESCRIPTION:
* This function parses IPV4 address
* INPUTS:
* buf - buffer with parameter string
*
* OUTPUTS:
NONE.
*
* RETURNS:
* GT_BOOL
*
* COMMENTS:
* None.
*
*******************************************************************************/
GT_BOOL parse_ipv4_address (char *buf, uint32_t *ipv4addr_parts)
{
if (4 == sscanf(buf, "%d.%d.%d.%d", &ipv4addr_parts[0], &ipv4addr_parts[1], &ipv4addr_parts[2], &ipv4addr_parts[3]))
{
if (ipv4addr_parts[0] <= 255 && ipv4addr_parts[1] <= 255 && ipv4addr_parts[2] <= 255 && ipv4addr_parts[3] <= 255)
{
return GT_TRUE;
}
}
return GT_FALSE;
}
/*******************************************************************************
* parse_ipv6_address
*
* DESCRIPTION:
* This function parses IPV4 address
* INPUTS:
* buf - buffer with parameter string
*
* OUTPUTS:
NONE.
*
* RETURNS:
* GT_BOOL
*
* COMMENTS:
* None.
*
*******************************************************************************/
GT_BOOL parse_ipv6_address (char *buf, uint32_t *ipv6addr_parts)
{
if (8 == sscanf(buf, "%x:%x:%x:%x:%x:%x:%x:%x",
&ipv6addr_parts[0], &ipv6addr_parts[2], &ipv6addr_parts[4], &ipv6addr_parts[6],
&ipv6addr_parts[8], &ipv6addr_parts[10], &ipv6addr_parts[12], &ipv6addr_parts[14]));
{
if (ipv6addr_parts[0] <= 0xFFFF && ipv6addr_parts[2] <= 0xFFFF && ipv6addr_parts[4] <= 0xFFFF && ipv6addr_parts[6] <= 0xFFFF &&
ipv6addr_parts[8] <= 0xFFFF && ipv6addr_parts[10] <= 0xFFFF && ipv6addr_parts[12] <= 0xFFFF && ipv6addr_parts[14] <= 0xFFFF)
{
// Note the order
ipv6addr_parts[1] = ipv6addr_parts[0] & 0xFF; ipv6addr_parts[0] = ipv6addr_parts[0] >> 8;
ipv6addr_parts[3] = ipv6addr_parts[2] & 0xFF; ipv6addr_parts[2] = ipv6addr_parts[2] >> 8;
ipv6addr_parts[5] = ipv6addr_parts[4] & 0xFF; ipv6addr_parts[4] = ipv6addr_parts[4] >> 8;
ipv6addr_parts[7] = ipv6addr_parts[6] & 0xFF; ipv6addr_parts[6] = ipv6addr_parts[6] >> 8;
ipv6addr_parts[9] = ipv6addr_parts[8] & 0xFF; ipv6addr_parts[8] = ipv6addr_parts[8] >> 8;
ipv6addr_parts[11] = ipv6addr_parts[10] & 0xFF; ipv6addr_parts[10] = ipv6addr_parts[10] >> 8;
ipv6addr_parts[13] = ipv6addr_parts[12] & 0xFF; ipv6addr_parts[12] = ipv6addr_parts[12] >> 8;
ipv6addr_parts[15] = ipv6addr_parts[14] & 0xFF; ipv6addr_parts[14] = ipv6addr_parts[14] >> 8;
return GT_TRUE;
}
}
return GT_FALSE;
}
/*******************************************************************************
* parse_mac_address
*
* DESCRIPTION:
* This function parses MAC address
* INPUTS:
* buf - buffer with parameter string
*
* OUTPUTS:
NONE.
*
* RETURNS:
* GT_BOOL
*
* COMMENTS:
* None.
*
*******************************************************************************/
GT_BOOL parse_mac_address (char *buf, uint32_t *macaddr_parts)
{
if (6 == sscanf(buf, "%x:%x:%x:%x:%x:%x", &macaddr_parts[0], &macaddr_parts[1], &macaddr_parts[2], &macaddr_parts[3],
&macaddr_parts[4], &macaddr_parts[5]))
{
if (macaddr_parts[0] <= 255 && macaddr_parts[1] <= 255 && macaddr_parts[2] <= 255 && macaddr_parts[3] <= 255 &&
macaddr_parts[4] <= 255 && macaddr_parts[5] <= 255)
{
return GT_TRUE;
}
}
return GT_FALSE;
}
/********************************************************************************/
/* Packet Forward rule table and API */
/********************************************************************************/
static tpmcfg_frwd_entry_t tpm_sysfs_frwd_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_frwd_rule_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_frwd_entry_t),
.entryAra = tpm_sysfs_frwd_table
};
static void init_tpm_pkt_frwd_db(void)
{
tpmcfg_frwd_entry_t *pentry = (tpmcfg_frwd_entry_t *)tpm_frwd_rule_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_frwd_rule_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
static void format_ipv4_addr(uint8_t *ipaddr, char *str)
{
sprintf(str, "%d.%d.%d.%d", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
}
static void format_ipv6_addr(uint8_t *ipaddr, char *str)
{
uint16_t p1 = (ipaddr[0] << 8) | ipaddr[1];
uint16_t p2 = (ipaddr[2] << 8) | ipaddr[3];
uint16_t p3 = (ipaddr[4] << 8) | ipaddr[5];
uint16_t p4 = (ipaddr[6] << 8) | ipaddr[7];
uint16_t p5 = (ipaddr[8] << 8) | ipaddr[9];
uint16_t p6 = (ipaddr[10] << 8) | ipaddr[11];
uint16_t p7 = (ipaddr[12] << 8) | ipaddr[13];
uint16_t p8 = (ipaddr[14] << 8) | ipaddr[15];
sprintf(str, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", p1, p2, p3, p4, p5, p6, p7, p8);
}
static void format_mac_addr(uint8_t *macaddr, char *str)
{
sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]);
}
tpmcfg_frwd_entry_t *find_tpm_pkt_frwd_entry_by_name(char *name)
{
tpmcfg_frwd_entry_t *pentry = (tpmcfg_frwd_entry_t *)tpm_frwd_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_frwd_rule_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_frwd_entry_t *find_free_tpm_pkt_frwd_entry (void)
{
tpmcfg_frwd_entry_t *pentry = (tpmcfg_frwd_entry_t *)tpm_frwd_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_frwd_rule_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_pkt_frwd_entry_by_name (char *name)
{
tpmcfg_frwd_entry_t *pentry = (tpmcfg_frwd_entry_t *)tpm_frwd_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_frwd_rule_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
memset(&pentry->frwd, 0, sizeof(pentry->frwd));
pentry->name[0] = 0;
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_pkt_frwd_db (void)
{
tpmcfg_frwd_entry_t *pentry = (tpmcfg_frwd_entry_t *)tpm_frwd_rule_db.entryAra;
int indx;
printk(KERN_INFO "%16s target-port queue gem-port\n", "name");
for (indx = 0; indx < tpm_frwd_rule_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
printk(KERN_INFO "%16s 0x%04x %-3d %d\n", pentry->name, pentry->frwd.trg_port, pentry->frwd.trg_queue, pentry->frwd.gem_port);
}
}
}
/********************************************************************************/
/* VLAN rule table and API */
/********************************************************************************/
static tpmcfg_vlan_entry_t tpm_sysfs_vlan_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_vlan_rule_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_vlan_entry_t),
.entryAra = tpm_sysfs_vlan_table
};
static void init_tpm_vlan_db(void)
{
tpmcfg_vlan_entry_t *pentry = (tpmcfg_vlan_entry_t *)tpm_vlan_rule_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_vlan_rule_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
tpmcfg_vlan_entry_t *find_tpm_vlan_entry_by_name(char *name)
{
tpmcfg_vlan_entry_t *pentry = (tpmcfg_vlan_entry_t *)tpm_vlan_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_vlan_rule_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_vlan_entry_t *find_free_tpm_vlan_entry (void)
{
tpmcfg_vlan_entry_t *pentry = (tpmcfg_vlan_entry_t *)tpm_vlan_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_vlan_rule_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_vlan_entry_by_name (char *name)
{
tpmcfg_vlan_entry_t *pentry = (tpmcfg_vlan_entry_t *)tpm_vlan_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_vlan_rule_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->vlan, 0, sizeof(pentry->vlan));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_vlan_db (void)
{
tpmcfg_vlan_entry_t *pentry = (tpmcfg_vlan_entry_t *)tpm_vlan_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_vlan_rule_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
printk(KERN_INFO "%s: tpid 0x%x, tpid_mask 0x%x, VID %d/0x%x, CFI %d/0x%x, pbit %d/0x%x\n", pentry->name,
pentry->vlan.tpid, pentry->vlan.tpid_mask, pentry->vlan.vid, pentry->vlan.vid_mask,
pentry->vlan.cfi, pentry->vlan.cfi_mask, pentry->vlan.pbit, pentry->vlan.pbit_mask);
}
}
}
/********************************************************************************/
/* Mod (packet modification) rule table and API */
/********************************************************************************/
/*
* Wilson:
* DB_TPMCFG_MAX_ENTRIES are for ACL rules while one entry,
* which is named as 'dbg_entry', is reserved for mod_eng debug only.
* The 'dbg_entry' is the last entry in 'tpm_sysfs_mod_table'.
*/
static tpmcfg_mod_entry_t tpm_sysfs_mod_table[DB_TPMCFG_MAX_ENTRIES+1];
static tpm_generic_rule_db_t tpm_mod_rule_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_mod_entry_t),
.entryAra = tpm_sysfs_mod_table
};
static void init_tpm_mod_db(void)
{
tpmcfg_mod_entry_t *pentry = (tpmcfg_mod_entry_t *)tpm_mod_rule_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_mod_rule_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
pentry->flags = 0;
}
strcpy(pentry->name, "dbg_entry");
pentry->flags = 0;
}
tpmcfg_mod_entry_t *find_tpm_mod_entry_by_name(char *name)
{
tpmcfg_mod_entry_t *pentry = (tpmcfg_mod_entry_t *)tpm_mod_rule_db.entryAra;
int indx;
if (strcmp(name, "dbg_entry") == 0)
return &(tpm_sysfs_mod_table[DB_TPMCFG_MAX_ENTRIES]);
for (indx = 0; indx < tpm_mod_rule_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_mod_entry_t *find_free_tpm_mod_entry (void)
{
tpmcfg_mod_entry_t *pentry = (tpmcfg_mod_entry_t *)tpm_mod_rule_db.entryAra;
int indx;
for (indx = 0; indx < tpm_mod_rule_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_mod_entry_by_name (char *name)
{
tpmcfg_mod_entry_t *pentry = (tpmcfg_mod_entry_t *)tpm_mod_rule_db.entryAra;
int indx;
if (strcmp(name, "dbg_entry") == 0)
{
memset(&pentry->mod, 0, sizeof(pentry->mod));
pentry->flags = 0;
return GT_TRUE;
}
for (indx = 0; indx < tpm_mod_rule_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->mod, 0, sizeof(pentry->mod));
pentry->flags = 0;
return GT_TRUE;
}
}
return GT_FALSE;
}
void show_tpm_mod_db (void)
{
tpmcfg_mod_entry_t *pentry = (tpmcfg_mod_entry_t *)tpm_mod_rule_db.entryAra;
int indx;
int off = 0;
char buf[800];
char d1[60];
char d2[60];
char d1_mask[60];
char d2_mask[60];
for (indx = 0; indx < tpm_mod_rule_db.max_num_entries+1; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
off += sprintf(buf+off, "%s: flags 0x%x\n",
pentry->name, pentry->flags);
if (pentry->flags & MOD_ENTRY_FLAG_MH)
{
off += sprintf(buf+off, "\tMH 0x%x\n", pentry->mod.mh_mod);
}
if (pentry->flags & MOD_ENTRY_FLAG_MAC)
{
format_mac_addr(pentry->mod.mac_mod.mac_sa, d1);
format_mac_addr(pentry->mod.mac_mod.mac_sa_mask, d1_mask);
format_mac_addr(pentry->mod.mac_mod.mac_da, d2);
format_mac_addr(pentry->mod.mac_mod.mac_da_mask, d2_mask);
off += sprintf(buf+off, "\tMAC SA %s/%s, DA %s/%s\n", d1, d1_mask, d2, d2_mask);
}
if (pentry->flags & MOD_ENTRY_FLAG_VLAN)
{
off += sprintf(buf+off, "\t%-19s VLAN_1 - tpid 0x%x, VID %d/0x%x, CFI %d/0x%x, pbit %d/0x%x\n",
get_vlan_op_str(pentry->mod.vlan_mod.vlan_op), pentry->mod.vlan_mod.vlan1_out.tpid,
pentry->mod.vlan_mod.vlan1_out.vid, pentry->mod.vlan_mod.vlan1_out.vid_mask,
pentry->mod.vlan_mod.vlan1_out.cfi, pentry->mod.vlan_mod.vlan1_out.cfi_mask,
pentry->mod.vlan_mod.vlan1_out.pbit, pentry->mod.vlan_mod.vlan1_out.pbit_mask);
off += sprintf(buf+off, "\t VLAN_2 - tpid 0x%x, VID %d/0x%x, CFI %d/0x%x, pbit %d/0x%x\n",
pentry->mod.vlan_mod.vlan2_out.tpid,
pentry->mod.vlan_mod.vlan2_out.vid, pentry->mod.vlan_mod.vlan2_out.vid_mask,
pentry->mod.vlan_mod.vlan2_out.cfi, pentry->mod.vlan_mod.vlan2_out.cfi_mask,
pentry->mod.vlan_mod.vlan2_out.pbit, pentry->mod.vlan_mod.vlan2_out.pbit_mask);
}
if (pentry->flags & MOD_ENTRY_FLAG_IPV4)
{
format_ipv4_addr(pentry->mod.l3.ipv4_mod.ipv4_src_ip_add, d1);
format_ipv4_addr(pentry->mod.l3.ipv4_mod.ipv4_src_ip_add_mask, d1_mask);
format_ipv4_addr(pentry->mod.l3.ipv4_mod.ipv4_dst_ip_add, d2);
format_ipv4_addr(pentry->mod.l3.ipv4_mod.ipv4_dst_ip_add_mask, d2_mask);
off += sprintf(buf+off, "\tIPV4: src_ip_add %s/%s, dst_ip_add %s/%s\n", d1, d1_mask, d2, d2_mask);
off += sprintf(buf+off, "\tl3.l4_src_port %d, l3.l4_dst_port %d\n",
pentry->mod.l3.ipv4_mod.l4_src_port, pentry->mod.l3.ipv4_mod.l4_dst_port);
}
else if (pentry->flags & MOD_ENTRY_FLAG_IPV6)
{
format_ipv6_addr(pentry->mod.l3.ipv6_mod.ipv6_src_ip_add, d1);
format_ipv6_addr(pentry->mod.l3.ipv6_mod.ipv6_src_ip_add_mask, d1_mask);
format_ipv6_addr(pentry->mod.l3.ipv6_mod.ipv6_dst_ip_add, d2);
format_ipv6_addr(pentry->mod.l3.ipv6_mod.ipv6_dst_ip_add_mask, d2_mask);
off += sprintf(buf+off, "\tIPV6: src_ip_add %s/%s\n\t dst_ip_add %s/%s\n", d1, d1_mask, d2, d2_mask);
off += sprintf(buf+off, "\tl4_src_port %d, l4_dst_port %d\n",
pentry->mod.l3.ipv6_mod.l4_src_port, pentry->mod.l3.ipv6_mod.l4_dst_port);
}
if (pentry->flags & MOD_ENTRY_FLAG_PPPOE)
{
off += sprintf(buf+off, "\tPPPoE session %d, protocol type 0x%x\n",
pentry->mod.pppoe_mod.ppp_session, pentry->mod.pppoe_mod.ppp_proto);
}
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
/********************************************************************************/
/* L2 ACL table and API */
/********************************************************************************/
static tpmcfg_l2_key_entry_t tpm_sysfs_l2_key_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_l2_key_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_l2_key_entry_t),
.entryAra = tpm_sysfs_l2_key_table
};
static void init_tpm_l2_key_db(void)
{
tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_l2_key_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
tpmcfg_l2_key_entry_t *find_tpm_l2_key_entry_by_name(char *name)
{
tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_l2_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_l2_key_entry_t *find_free_tpm_l2_key_entry (void)
{
tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_l2_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_l2_key_entry_by_name (char *name)
{
tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_l2_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->l2_acl, 0, sizeof(pentry->l2_acl));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_l2_key_db (void)
{
tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
char buf[800];
int indx;
int off = 0;
char d1[60];
char d2[60];
char d1_mask[60];
char d2_mask[60];
for (indx = 0; indx < tpm_l2_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
off += sprintf(buf+off, "%s: \n", pentry->name);
off += sprintf(buf+off, "\tVLAN_1 - tpid 0x%x/0x%x, VID %d/0x%x, CFI %d/0x%x, pbit %d/0x%x\n",
pentry->l2_acl.vlan1.tpid, pentry->l2_acl.vlan1.tpid_mask,
pentry->l2_acl.vlan1.vid, pentry->l2_acl.vlan1.vid_mask,
pentry->l2_acl.vlan1.cfi, pentry->l2_acl.vlan1.cfi_mask,
pentry->l2_acl.vlan1.pbit, pentry->l2_acl.vlan1.pbit_mask);
off += sprintf(buf+off, "\tVLAN_2 - tpid 0x%x/0x%x, VID %d/0x%x, CFI %d/0x%x, pbit %d/0x%x\n",
pentry->l2_acl.vlan2.tpid, pentry->l2_acl.vlan2.tpid_mask,
pentry->l2_acl.vlan2.vid, pentry->l2_acl.vlan2.vid_mask,
pentry->l2_acl.vlan2.cfi, pentry->l2_acl.vlan2.cfi_mask,
pentry->l2_acl.vlan2.pbit, pentry->l2_acl.vlan2.pbit_mask);
off += sprintf(buf+off, "\tethertype 0x%x, gemport %d, PPPoE: session %d, protocol type 0x%x\n",
pentry->l2_acl.ether_type, pentry->l2_acl.gem_port,
pentry->l2_acl.pppoe_hdr.ppp_session, pentry->l2_acl.pppoe_hdr.ppp_proto);
format_mac_addr(pentry->l2_acl.mac.mac_sa, d1);
format_mac_addr(pentry->l2_acl.mac.mac_sa_mask, d1_mask);
format_mac_addr(pentry->l2_acl.mac.mac_da, d2);
format_mac_addr(pentry->l2_acl.mac.mac_da_mask, d2_mask);
off += sprintf(buf+off, "\tMAC SA %s/%s, DA %s/%s\n", d1, d1_mask, d2, d2_mask);
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
/********************************************************************************/
/* L3 ACL table and API */
/********************************************************************************/
static tpmcfg_l3_key_entry_t tpm_sysfs_l3_key_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_l3_key_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_l3_key_entry_t),
.entryAra = tpm_sysfs_l3_key_table
};
static void init_tpm_l3_key_db(void)
{
tpmcfg_l3_key_entry_t *pentry = (tpmcfg_l3_key_entry_t *)tpm_l3_key_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_l3_key_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
tpmcfg_l3_key_entry_t *find_tpm_l3_key_entry_by_name(char *name)
{
tpmcfg_l3_key_entry_t *pentry = (tpmcfg_l3_key_entry_t *)tpm_l3_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_l3_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_l3_key_entry_t *find_free_tpm_l3_key_entry (void)
{
tpmcfg_l3_key_entry_t *pentry = (tpmcfg_l3_key_entry_t *)tpm_l3_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_l3_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_l3_key_entry_by_name (char *name)
{
tpmcfg_l3_key_entry_t *pentry = (tpmcfg_l3_key_entry_t *)tpm_l3_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_l3_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->l3_acl, 0, sizeof(pentry->l3_acl));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_l3_key_db (void)
{
tpmcfg_l3_key_entry_t *pentry = (tpmcfg_l3_key_entry_t *)tpm_l3_key_db.entryAra;
char buf[800];
int indx;
int off = 0;
for (indx = 0; indx < tpm_l3_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
off += sprintf(buf+off, "%s: \n", pentry->name);
off += sprintf(buf+off, "\tethertype 0x%x, PPPoE: session %d, protocol type 0x%x\n",
pentry->l3_acl.ether_type_key, pentry->l3_acl.pppoe_key.ppp_session, pentry->l3_acl.pppoe_key.ppp_proto);
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
/********************************************************************************/
/* IPV4 ACL table and API */
/********************************************************************************/
static tpmcfg_ipv4_key_entry_t tpm_sysfs_ipv4_key_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_ipv4_key_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_ipv4_key_entry_t),
.entryAra = tpm_sysfs_ipv4_key_table
};
static void init_tpm_ipv4_key_db(void)
{
tpmcfg_ipv4_key_entry_t *pentry = (tpmcfg_ipv4_key_entry_t *)tpm_ipv4_key_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_ipv4_key_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
tpmcfg_ipv4_key_entry_t *find_tpm_ipv4_key_entry_by_name(char *name)
{
tpmcfg_ipv4_key_entry_t *pentry = (tpmcfg_ipv4_key_entry_t *)tpm_ipv4_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv4_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_ipv4_key_entry_t *find_free_tpm_ipv4_key_entry (void)
{
tpmcfg_ipv4_key_entry_t *pentry = (tpmcfg_ipv4_key_entry_t *)tpm_ipv4_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv4_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_ipv4_key_entry_by_name (char *name)
{
tpmcfg_ipv4_key_entry_t *pentry = (tpmcfg_ipv4_key_entry_t *)tpm_ipv4_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv4_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->ipv4_acl, 0, sizeof(pentry->ipv4_acl));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_ipv4_key_db (void)
{
tpmcfg_ipv4_key_entry_t *pentry = (tpmcfg_ipv4_key_entry_t *)tpm_ipv4_key_db.entryAra;
char buf[800];
int indx;
int off = 0;
char d1[60];
char d2[60];
char d1_mask[60];
char d2_mask[60];
for (indx = 0; indx < tpm_ipv4_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
off += sprintf(buf+off, "%s: \n",
pentry->name);
off += sprintf(buf+off, "\tdscp %d/0x%x, protocol %d, src_port %d, dst_port %d\n",
pentry->ipv4_acl.ipv4_dscp, pentry->ipv4_acl.ipv4_dscp_mask,
pentry->ipv4_acl.ipv4_proto, pentry->ipv4_acl.l4_src_port, pentry->ipv4_acl.l4_dst_port);
format_ipv4_addr(pentry->ipv4_acl.ipv4_src_ip_add, d1);
format_ipv4_addr(pentry->ipv4_acl.ipv4_src_ip_add_mask, d1_mask);
format_ipv4_addr(pentry->ipv4_acl.ipv4_dst_ip_add, d2);
format_ipv4_addr(pentry->ipv4_acl.ipv4_dst_ip_add_mask, d2_mask);
off += sprintf(buf+off, "\tsrc_ip_add %s/%s, dst_ip_add %s/%s\n", d1, d1_mask, d2, d2_mask);
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
/********************************************************************************/
/* IPV6 ACL table and API */
/********************************************************************************/
static tpmcfg_ipv6_key_entry_t tpm_sysfs_ipv6_key_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_ipv6_key_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_ipv6_key_entry_t),
.entryAra = tpm_sysfs_ipv6_key_table
};
static void init_tpm_ipv6_key_db(void)
{
tpmcfg_ipv6_key_entry_t *pentry = (tpmcfg_ipv6_key_entry_t *)tpm_ipv6_key_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_ipv6_key_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
tpmcfg_ipv6_key_entry_t *find_tpm_ipv6_key_entry_by_name(char *name)
{
tpmcfg_ipv6_key_entry_t *pentry = (tpmcfg_ipv6_key_entry_t *)tpm_ipv6_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_ipv6_key_entry_t *find_free_tpm_ipv6_key_entry (void)
{
tpmcfg_ipv6_key_entry_t *pentry = (tpmcfg_ipv6_key_entry_t *)tpm_ipv6_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_ipv6_key_entry_by_name (char *name)
{
tpmcfg_ipv6_key_entry_t *pentry = (tpmcfg_ipv6_key_entry_t *)tpm_ipv6_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->ipv6_acl, 0, sizeof(pentry->ipv6_acl));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_ipv6_key_db (void)
{
tpmcfg_ipv6_key_entry_t *pentry = (tpmcfg_ipv6_key_entry_t *)tpm_ipv6_key_db.entryAra;
char buf[800];
int indx;
int off = 0;
char d1[60];
char d2[60];
char d1_mask[60];
char d2_mask[60];
for (indx = 0; indx < tpm_ipv6_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
off += sprintf(buf+off, "%s: \n", pentry->name);
off += sprintf(buf+off, "\tdscp %d/0x%x, next_header %d, src_port %d, dst_port %d\n",
pentry->ipv6_acl.ipv6_dscp, pentry->ipv6_acl.ipv6_dscp_mask,
pentry->ipv6_acl.ipv6_next_header, pentry->ipv6_acl.l4_src_port, pentry->ipv6_acl.l4_dst_port);
format_ipv6_addr(pentry->ipv6_acl.ipv6_src_ip_add, d1);
format_ipv6_addr(pentry->ipv6_acl.ipv6_src_ip_add_mask, d1_mask);
format_ipv6_addr(pentry->ipv6_acl.ipv6_dst_ip_add, d2);
format_ipv6_addr(pentry->ipv6_acl.ipv6_dst_ip_add_mask, d2_mask);
off += sprintf(buf+off, "\tsrc_ip_add %s/%s, dst_ip_add %s/%s\n", d1, d1_mask, d2, d2_mask);
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
/********************************************************************************/
/* IPV6 gen ACL table and API */
/********************************************************************************/
static tpmcfg_ipv6_key_entry_t tpm_sysfs_ipv6_gen_key_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_ipv6_gen_key_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_ipv6_key_entry_t),
.entryAra = tpm_sysfs_ipv6_gen_key_table
};
static void init_tpm_ipv6_gen_key_db(void)
{
tpmcfg_ipv6_gen_key_entry_t *pentry = (tpmcfg_ipv6_gen_key_entry_t *)tpm_ipv6_gen_key_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_ipv6_gen_key_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
tpmcfg_ipv6_gen_key_entry_t *find_tpm_ipv6_gen_key_entry_by_name(char *name)
{
tpmcfg_ipv6_gen_key_entry_t *pentry = (tpmcfg_ipv6_gen_key_entry_t *)tpm_ipv6_gen_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_gen_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_ipv6_gen_key_entry_t *find_free_tpm_ipv6_gen_key_entry(void)
{
tpmcfg_ipv6_gen_key_entry_t *pentry = (tpmcfg_ipv6_gen_key_entry_t *)tpm_ipv6_gen_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_gen_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_ipv6_gen_key_entry_by_name(char *name)
{
tpmcfg_ipv6_gen_key_entry_t *pentry = (tpmcfg_ipv6_gen_key_entry_t *)tpm_ipv6_gen_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_gen_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->ipv6gen_acl, 0, sizeof(pentry->ipv6gen_acl));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_ipv6_gen_key_db(void)
{
tpmcfg_ipv6_gen_key_entry_t *pentry = (tpmcfg_ipv6_gen_key_entry_t *)tpm_ipv6_gen_key_db.entryAra;
char buf[800];
int indx;
int off = 0;
char d1[60];
char d1_mask[60];
for (indx = 0; indx < tpm_ipv6_gen_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
off += sprintf(buf+off, "%s: \n", pentry->name);
off += sprintf(buf+off, "\tdscp %d/0x%x, hop_limit %d\n",
pentry->ipv6gen_acl.ipv6_dscp, pentry->ipv6gen_acl.ipv6_dscp_mask,
pentry->ipv6gen_acl.hop_limit);
format_ipv6_addr(pentry->ipv6gen_acl.ipv6_src_ip_add, d1);
format_ipv6_addr(pentry->ipv6gen_acl.ipv6_src_ip_add_mask, d1_mask);
off += sprintf(buf+off, "\tsrc_ip_add %s/%s\n", d1, d1_mask);
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
static tpmcfg_ipv6_dip_key_entry_t tpm_sysfs_ipv6_dip_key_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_ipv6_dip_key_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_ipv6_dip_key_entry_t),
.entryAra = tpm_sysfs_ipv6_dip_key_table
};
static void init_tpm_ipv6_dip_key_db(void)
{
tpmcfg_ipv6_dip_key_entry_t *pentry = (tpmcfg_ipv6_dip_key_entry_t *)tpm_ipv6_dip_key_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_ipv6_dip_key_db.max_num_entries; indx++, pentry++)
{
pentry->name[0] = 0;
}
}
tpmcfg_ipv6_dip_key_entry_t *find_tpm_ipv6_dip_key_entry_by_name(char *name)
{
tpmcfg_ipv6_dip_key_entry_t *pentry = (tpmcfg_ipv6_dip_key_entry_t *)tpm_ipv6_dip_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_dip_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0) return pentry;
}
return 0;
}
tpmcfg_ipv6_dip_key_entry_t *find_free_tpm_ipv6_dip_key_entry(void)
{
tpmcfg_ipv6_dip_key_entry_t *pentry = (tpmcfg_ipv6_dip_key_entry_t *)tpm_ipv6_dip_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_dip_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] == 0) return pentry;
}
return 0;
}
GT_BOOL del_tpm_ipv6_dip_key_entry_by_name(char *name)
{
tpmcfg_ipv6_dip_key_entry_t *pentry = (tpmcfg_ipv6_dip_key_entry_t *)tpm_ipv6_dip_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_dip_key_db.max_num_entries; indx++, pentry++)
{
if (strcmp(pentry->name, name) == 0)
{
pentry->name[0] = 0;
memset(&pentry->ipv6_addr, 0, sizeof(pentry->ipv6_addr));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_ipv6_dip_key_db(void)
{
tpmcfg_ipv6_dip_key_entry_t *pentry = (tpmcfg_ipv6_dip_key_entry_t *)tpm_ipv6_dip_key_db.entryAra;
char buf[800];
int indx;
int off = 0;
char d1[60];
// char d2[60];
char d1_mask[60];
// char d2_mask[60];
for (indx = 0; indx < tpm_ipv6_dip_key_db.max_num_entries; indx++, pentry++)
{
if (pentry->name[0] != 0)
{
off += sprintf(buf+off, "%s: \n", pentry->name);
format_ipv6_addr(pentry->ipv6_addr.ipv6_ip_add, d1);
format_ipv6_addr(pentry->ipv6_addr.ipv6_ip_add_mask, d1_mask);
off += sprintf(buf+off, "\tdst_ip_add %s/%s\n", d1, d1_mask);
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
static tpmcfg_ipv6_l4_ports_key_entry_t tpm_sysfs_ipv6_l4_ports_key_table[DB_TPMCFG_MAX_ENTRIES];
static tpm_generic_rule_db_t tpm_ipv6_l4_ports_key_db =
{
.max_num_entries = DB_TPMCFG_MAX_ENTRIES,
.num_entries = 0,
.size_entry = sizeof(tpmcfg_ipv6_l4_ports_key_entry_t),
.entryAra = tpm_sysfs_ipv6_l4_ports_key_table
};
static void init_tpm_ipv6_l4_ports_key_db(void)
{
tpmcfg_ipv6_l4_ports_key_entry_t *pentry = (tpmcfg_ipv6_l4_ports_key_entry_t *)tpm_ipv6_l4_ports_key_db.entryAra;
int indx;
printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
for (indx = 0; indx < tpm_ipv6_l4_ports_key_db.max_num_entries; indx++, pentry++)
pentry->name[0] = 0;
}
tpmcfg_ipv6_l4_ports_key_entry_t *find_tpm_ipv6_l4_ports_key_entry_by_name(char *name)
{
tpmcfg_ipv6_l4_ports_key_entry_t *pentry = (tpmcfg_ipv6_l4_ports_key_entry_t *)tpm_ipv6_l4_ports_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_l4_ports_key_db.max_num_entries; indx++, pentry++) {
if (strcmp(pentry->name, name) == 0)
return pentry;
}
return 0;
}
tpmcfg_ipv6_l4_ports_key_entry_t *find_free_tpm_ipv6_l4_ports_key_entry(void)
{
tpmcfg_ipv6_l4_ports_key_entry_t *pentry = (tpmcfg_ipv6_l4_ports_key_entry_t *)tpm_ipv6_l4_ports_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_l4_ports_key_db.max_num_entries; indx++, pentry++) {
if (pentry->name[0] == 0)
return pentry;
}
return 0;
}
GT_BOOL del_tpm_ipv6_l4_ports_key_entry_by_name(char *name)
{
tpmcfg_ipv6_l4_ports_key_entry_t *pentry = (tpmcfg_ipv6_l4_ports_key_entry_t *)tpm_ipv6_l4_ports_key_db.entryAra;
int indx;
for (indx = 0; indx < tpm_ipv6_l4_ports_key_db.max_num_entries; indx++, pentry++) {
if (strcmp(pentry->name, name) == 0) {
pentry->name[0] = 0;
memset(&pentry->l4_ports, 0, sizeof(pentry->l4_ports));
return GT_TRUE;
};
}
return GT_FALSE;
}
void show_tpm_ipv6_l4_ports_key_db(void)
{
tpmcfg_ipv6_l4_ports_key_entry_t *pentry = (tpmcfg_ipv6_l4_ports_key_entry_t *)tpm_ipv6_l4_ports_key_db.entryAra;
char buf[800];
int indx;
int off = 0;
for (indx = 0; indx < tpm_ipv6_l4_ports_key_db.max_num_entries; indx++, pentry++) {
if (pentry->name[0] != 0) {
off += sprintf(buf+off, "%s: \n", pentry->name);
off += sprintf(buf+off, "\tsrc_port %d, dst_port %d\n",
pentry->l4_ports.l4_src_port, pentry->l4_ports.l4_dst_port);
printk(KERN_INFO "%s\n", buf);
off = 0;
}
}
}
void tpm_reset_mc_vid_key(void)
{
tpm_src_port_type_t src_port;
memset(&mc_vid_key, 0, sizeof(mc_vid_key));
for ( src_port = TPM_SRC_PORT_UNI_0; src_port <= TPM_SRC_PORT_UNI_VIRT; src_port++)
{
mc_vid_key.mc_vid_port_vids[src_port - TPM_SRC_PORT_UNI_0].tpm_src_port = src_port;
}
return;
}
GT_BOOL tpm_set_mc_vid_key(
uint32_t src_port,
uint32_t mc_uni_xlate_mode,
uint32_t mc_uni_xlate_vid
)
{
if (src_port < TPM_SRC_PORT_UNI_0 || src_port > TPM_SRC_PORT_UNI_VIRT)
{
printk(KERN_INFO "illegal input src port(%d)\n", src_port);
return GT_FALSE;
}
mc_vid_key.mc_vid_port_vids[src_port - TPM_SRC_PORT_UNI_0].mc_uni_port_mode = mc_uni_xlate_mode;
mc_vid_key.mc_vid_port_vids[src_port - TPM_SRC_PORT_UNI_0].tpm_src_port = src_port;
mc_vid_key.mc_vid_port_vids[src_port - TPM_SRC_PORT_UNI_0].uni_port_vid = mc_uni_xlate_vid;
return GT_TRUE;
}
tpm_error_code_t tpm_set_mc_vid_cfg(
uint32_t mc_vid
)
{
tpm_error_code_t ret;
ret = tpm_proc_set_mc_vid_port_vids (0, mc_vid, &mc_vid_key);
return ret;
}
// Intialization of database
void tpm_sysfs_rule_db_init(void)
{
init_tpm_pkt_frwd_db();
init_tpm_vlan_db();
init_tpm_mod_db();
init_tpm_l2_key_db();
init_tpm_l3_key_db();
init_tpm_ipv4_key_db();
init_tpm_ipv6_key_db();
init_tpm_ipv6_dip_key_db();
init_tpm_ipv6_gen_key_db();
init_tpm_ipv6_l4_ports_key_db();
}
tpm_error_code_t tpm_proc_send_genquery_to_uni(tpm_trg_port_type_t dest_port_bm, uint32_t packet_num)
{
int32_t switch_dev_num;
uint8_t loop;
uint8_t loop_in;
uint32_t trg_port;
uint32_t switch_port_bm;
tpm_error_code_t ret_code;
tpm_db_ety_dsa_enable_t ety_dsa_enable;
tpm_db_get_ety_dsa_enable(&ety_dsa_enable);
if (TPM_ETY_DSA_DISABLE == ety_dsa_enable) {
TPM_OS_ERROR(TPM_TPM_LOG_MOD, "ety_dsa is not enabled!\n");
return TPM_OK;
}
/* fill in the switch dev_num */
tpm_db_get_switch_dev_num(&switch_dev_num);
switch_dev_num &= 0x1f;
g_gen_query_pkt[16] = (0x40 | switch_dev_num);
switch_port_bm = tpm_db_trg_port_switch_port_get(dest_port_bm);
for (loop = 0, trg_port = 1; loop <= 7; loop++, trg_port = trg_port << 1) {
if (0 == (trg_port & switch_port_bm))
continue;
g_gen_query_pkt[17] = (loop << 3);
for (loop_in = 0; loop_in < packet_num; loop_in++) {
g_gen_query_pkt[23] = (loop_in + 1);
ret_code = tpm_tx_igmp_frame(0, TPM_TRG_PORT_UNI_ANY, 7, 0, g_gen_query_pkt, sizeof(g_gen_query_pkt));
if (ret_code != TPM_OK) {\
TPM_OS_ERROR(TPM_CLI_MOD, " recvd ret_code(%d)\n", ret_code);\
return(ret_code);\
}
}
}
return(TPM_RC_OK);
}