/*******************************************************************************
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;
        }
    }
}

static tpmcfg_l2_prim_key_entry_t tpm_sysfs_l2_rule_table[DB_TPMCFG_MAX_ENTRIES];

static tpm_generic_rule_db_t tpm_l2_rule_db =
{
    .max_num_entries    = DB_TPMCFG_MAX_ENTRIES,
    .num_entries        = 0,
    .size_entry         = sizeof(tpmcfg_l2_prim_key_entry_t),
    .entryAra           = tpm_sysfs_l2_rule_table
};


static void init_tpm_l2_rule_db(void)
{
    tpmcfg_l2_prim_key_entry_t *pentry = (tpmcfg_l2_prim_key_entry_t *)tpm_l2_rule_db.entryAra;
    int                   indx;

    printk(KERN_INFO "%s: Clearing DB\n", __FUNCTION__);
    for (indx = 0; indx < tpm_l2_rule_db.max_num_entries; indx++, pentry++)
    {
        pentry->used = 0;
    }
}

tpmcfg_l2_prim_key_entry_t *find_tpm_l2_prim_key_entry_by_owner_id_and_rule_num(uint32_t owner_id, uint32_t rule_num) {
    tpmcfg_l2_prim_key_entry_t *pentry = (tpmcfg_l2_prim_key_entry_t *)tpm_l2_rule_db.entryAra;
    int                   indx;

    for (indx = 0; indx < tpm_l2_rule_db.max_num_entries; indx++, pentry++)
    {
        if (pentry->owner_id == owner_id && pentry->rule_num == rule_num && pentry->used)
            return pentry;
    }
    return 0;
}

tpmcfg_l2_prim_key_entry_t *find_free_tpm_l2_prim_key_entry(void) {
    tpmcfg_l2_prim_key_entry_t *pentry = (tpmcfg_l2_prim_key_entry_t *)tpm_l2_rule_db.entryAra;
    int                   indx;

    for (indx = 0; indx < tpm_l2_rule_db.max_num_entries; indx++, pentry++)
    {
        if (!pentry->used) return pentry;
    }
    return 0;
}

GT_BOOL del_tpm_l2_prim_key_entry(uint32_t owner_id, uint32_t rule_num) {
    tpmcfg_l2_prim_key_entry_t *pentry = (tpmcfg_l2_prim_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->owner_id == owner_id && pentry->rule_num == rule_num && pentry->used)
        {
            pentry->used = 0;
            return GT_TRUE;
        };
    }
    return GT_FALSE;
}


/********************************************************************************/
/*                          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_l2_rule_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);
}

int sfs_show_frwd_rule (char *buf)
{
    tpmcfg_frwd_entry_t *pentry =
        (tpmcfg_frwd_entry_t *)tpm_frwd_rule_db.entryAra;
    int                 indx;
    int                 off = 0;

    for (indx = 0; indx < tpm_frwd_rule_db.max_num_entries; indx++, pentry++)
    {
        if (pentry->name[0] != 0)
        {
            off += sprintf(buf+off, "--- !FrwdRule\n");
            off += sprintf(buf+off, "gem_port: %d\n", pentry->frwd.gem_port);
            off += sprintf(buf+off, "port_bitmap: %-3d\n", pentry->frwd.trg_port);
            off += sprintf(buf+off, "queue: %d\n", pentry->frwd.trg_queue);
            off += sprintf(buf+off, "rule_name: %s\n", pentry->name);
        }
    }
    return off;
}

int sfs_show_l2_key_ethertype (char *buf)
{
    tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
    int                   indx;
    int                   off = 0;

    for (indx = 0; indx < tpm_l2_key_db.max_num_entries; indx++, pentry++)
    {
        if (pentry->name[0] != 0 && l2_key_type_ethertype == pentry->l2_key_type)
        {
            off += sprintf(buf+off, "--- !L2KeyEtherType\n");
            off += sprintf(buf+off, "rule_name: %s\n", pentry->name);
            off += sprintf(buf+off, "ethertype: 0x%x\n", pentry->l2_acl.ether_type);
        }
    }
    return off;
}

int sfs_show_l2_key_mac_addr (char *buf)
{
    tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
    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 && l2_key_type_macaddr == pentry->l2_key_type)
        {
            off += sprintf(buf+off, "--- !L2KeyMacAddr\n");
            format_mac_addr(pentry->l2_acl.mac.mac_da, d1);
            format_mac_addr(pentry->l2_acl.mac.mac_da_mask, d1_mask);
            format_mac_addr(pentry->l2_acl.mac.mac_sa, d2);
            format_mac_addr(pentry->l2_acl.mac.mac_sa_mask, d2_mask);
            off += sprintf(buf+off, "da: %s\n", d1);
            off += sprintf(buf+off, "da_mask: %s\n", d1_mask);
            off += sprintf(buf+off, "rule_name: %s\n", pentry->name);
            off += sprintf(buf+off, "sa: %s\n", d2);
            off += sprintf(buf+off, "sa_mask: %s\n", d2_mask);
        }
    }
    return off;
}

int sfs_show_l2_key_vlan (char *buf)
{
    tpmcfg_l2_key_entry_t *pentry = (tpmcfg_l2_key_entry_t *)tpm_l2_key_db.entryAra;
    int                   indx;
    int                   off = 0;

    for (indx = 0; indx < tpm_l2_key_db.max_num_entries; indx++, pentry++)
    {
        if (pentry->name[0] != 0 && l2_key_type_vlan == pentry->l2_key_type)
        {
            off += sprintf(buf+off, "--- !L2KeyVlan\n");
            off += sprintf(buf+off, "rule_name: %s\n", pentry->name);
            off += sprintf(buf+off, "vlan_rule1: %s\n", pentry->vlan_rule1);
            off += sprintf(buf+off, "vlan_rule2: %s\n", pentry->vlan_rule2);
        }
    }
    return off;
}

int sfs_show_vlan_rule (char *buf)
{
    tpmcfg_vlan_entry_t *pentry =
        (tpmcfg_vlan_entry_t *)tpm_vlan_rule_db.entryAra;
    int                 indx;
    int                 off = 0;

    for (indx = 0; indx < tpm_vlan_rule_db.max_num_entries; indx++, pentry++)
    {
        if (pentry->name[0] != 0)
        {
            off += sprintf(buf+off, "--- !VlanRule\n");
            off += sprintf(buf+off, "rule_name: %s\n", pentry->name);
            off += sprintf(buf+off, "tpid: 0x%x\n", pentry->vlan.tpid);
            off += sprintf(buf+off, "tpid_mask: 0x%x\n",
                           pentry->vlan.tpid_mask);
            off += sprintf(buf+off, "vid: %d\n", pentry->vlan.vid);
            off += sprintf(buf+off, "vid_mask: 0x%x\n", pentry->vlan.vid_mask);
            off += sprintf(buf+off, "cfi: %d\n", pentry->vlan.cfi);
            off += sprintf(buf+off, "cfi_mask: 0x%x\n", pentry->vlan.cfi_mask);
            off += sprintf(buf+off, "pbit: %d\n", pentry->vlan.pbit);
            off += sprintf(buf+off, "pbit_mask: 0x%x\n",
                           pentry->vlan.pbit_mask);
        }
    }
    return off;
}

int sfs_show_l2_rule (char *buf)
{
    tpmcfg_l2_prim_key_entry_t *pentry = (tpmcfg_l2_prim_key_entry_t *)tpm_l2_rule_db.entryAra;
    int                   indx;
    int                   off = 0;

    for (indx = 0; indx < tpm_l2_rule_db.max_num_entries; indx++, pentry++)
    {
        if (pentry->used)
        {
            off += sprintf(buf+off, "--- !L2Rule\n");
            off += sprintf(buf+off, "action: %d\n", pentry->action);
            off += sprintf(buf+off, "frwd_name: %s\n", pentry->frwd_name);
            off += sprintf(buf+off, "key_name: %s\n", pentry->key_name);
            off += sprintf(buf+off, "mod_name: %s\n", pentry->mod_name);
            off += sprintf(buf+off, "next_phase: %s\n", pentry->next_phase);
            off += sprintf(buf+off, "owner_id: %d\n", pentry->owner_id);
            off += sprintf(buf+off, "parse_flags_bm: 0x%x\n", pentry->parse_flags_bm);
            off += sprintf(buf+off, "parse_rule_bm: 0x%x\n", pentry->parse_rule_bm);
            off += sprintf(buf+off, "pkt_mod_bm: 0x%x\n", pentry->pkt_mod_bm);
            off += sprintf(buf+off, "rule_idx: %d\n", pentry->rule_idx);
            off += sprintf(buf+off, "rule_num: %d\n", pentry->rule_num);
            off += sprintf(buf+off, "src_port: %s\n", pentry->src_port);
        }
    }
    return off;
}

