/*******************************************************************************
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 <linux/ctype.h>
#include "tpm_common.h"
#include "tpm_header.h"
#include "tpm_sysfs_utils.h"
#include "tpm_sysfs_help.h"
#include "tpm_sysfs_hwcall.h"

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
extern struct semaphore    tpm_sfs_2_ioctl_sem;
extern tpm_ioctl_mng_t     tpm_sfs_2_ioctl_command;
 #define PR_RULE_IDX(rule_idx)  {}
 #define PR_HIT_COUNT(hit_count){}
 #define PR_RESULT              {}
 #define PR_MAC_COUNT           {}
#else
 #define PR_RULE_IDX(rule_idx)  {printk(KERN_INFO "OK. rule_idx = %d\n", rule_idx);}
 #define PR_HIT_COUNT(hit_count){printk(KERN_INFO "OK. hit_count = %d\n", hit_count);}
 #define PR_RESULT              {printk(KERN_INFO "OK.\n");}
 #define PR_MAC_COUNT(count)    {printk(KERN_INFO "OK. mac_learn_entry_count = %d\n", count);}
#endif

static char *l2_key_empty_name   = "l2_key_empty";
static char *l3_key_empty_name   = "l3_key_empty";
static char *ipv4_key_empty_name = "ipv4_key_empty";
static char *ipv6_key_empty_name = "ipv6_key_empty";
static char *frwd_empty_name     = "frwd_empty";
static char *mod_empty_name      = "mod_empty";
char *ipv6_gen_key_empty_name = "ipv6_gen_key_empty";
char *ipv6_dip_key_empty_name = "ipv6_dip_key_empty";
char *ipv6_l4_key_empty_name = "ipv6_l4_key_empty";

extern int32_t module_tpmSetup(tpm_setup_t *tpm_initp);


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_l2_rule_bounce(uint32_t                owner_id,
                                        tpm_src_port_type_t     src_port,
                                        uint32_t                rule_num,
                                        uint32_t               *rule_idx,
                                        tpm_parse_fields_t      parse_rule_bm,
                                        tpm_parse_flags_t       parse_flags_bm,
                                        tpm_l2_acl_key_t       *l2_key,
                                        tpm_pkt_frwd_t         *pkt_frwd,
                                        tpm_pkt_mod_t          *pkt_mod,
                                        tpm_pkt_mod_bm_t        pkt_mod_bm,
                                        tpm_rule_action_t      *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                   = MV_TPM_IOCTL_ADD_L2_ACL_RULE;
    tpm_add_acl_rule->owner_id                      = owner_id;
    tpm_add_acl_rule->src_port                      = src_port;
    tpm_add_acl_rule->rule_num                      = rule_num;
    tpm_add_acl_rule->parse_rule_bm                 = parse_rule_bm;
    tpm_add_acl_rule->l2_acl_rule.parse_flags_bm    = parse_flags_bm;
    tpm_add_acl_rule->l2_acl_rule.pkt_mod_bm        = pkt_mod_bm;
    memcpy(&(tpm_add_acl_rule->l2_acl_rule.l2_key),         (void*)l2_key,      sizeof(tpm_l2_acl_key_t));
    memcpy(&(tpm_add_acl_rule->l2_acl_rule.pkt_frwd),       (void*)pkt_frwd,    sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->l2_acl_rule.pkt_mod),        (void*)pkt_mod,     sizeof(tpm_pkt_mod_t));
    memcpy(&(tpm_add_acl_rule->l2_acl_rule.rule_action),    (void*)rule_action, sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_l2_rule tpm_add_l2_rule_bounce
#else
 #define _tpm_add_l2_rule tpm_add_l2_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_l2_rule_add
*
* DESCRIPTION:
*           This function creates a L2 rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_l2_rule_add  (const char *buf, size_t len)
{
    typedef enum
    {
        l2ruleadd_owner=0, l2ruleadd_srcport, l2ruleadd_rulenum, l2ruleadd_parserulebm, l2ruleadd_parseflagbm, l2ruleadd_action,  l2ruleadd_nextphase,
        l2ruleadd_l2keyname, l2ruleadd_frwdname, l2ruleadd_modname, l2ruleadd_pktmodbm, l2ruleadd_max
    } l2ruleadd_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    char                     srcport_str[20];
    char                     uc_srcport_str[20];
    int                      indx;
    uint32_t                 src_port;
    uint32_t                 rulenum;
    uint32_t                 parserulebm;
    uint32_t                 parseflagbm;
    uint32_t                 pkt_mod_bm;
    uint32_t                 action;
    char                     nextphase_str[20];
    uint32_t                 nextphase;
    char                     l2keyname[20];
    char                     frwdname[20];
    char                     modname[20];
    int                      parsedargs;
    int                      numparms;
    // DB
    tpmcfg_frwd_entry_t      *pdbfrwdentry  = 0;
    tpmcfg_l2_key_entry_t    *pdbl2keyentry = 0;
    tpmcfg_mod_entry_t       *pdbmodentry = 0;
    //Used in API call
    tpm_rule_action_t        rule_action;
    tpm_pkt_frwd_t           pkt_frwd;
    tpm_l2_acl_key_t         l2_acl;
    tpm_pkt_mod_t            pkt_mod;
    uint32_t                 rule_idx;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != l2ruleadd_max)
    {
        parm_error_completion(numparms, l2ruleadd_max, buf, sfs_help_l2_rule_add);
//        if (numparms == 1 && buf[0] == '?')
//        {
//            char helpbuf[3000];
//            int  helpbuf_len;
//
//            helpbuf_len = sfs_help_l2_rule_add(helpbuf);
//            print_help_buffer(helpbuf, helpbuf_len);
//        }
//        else
//        {
//            printk(KERN_INFO "Parse problem: expected %d parameters, found %d\n", l2ruleadd_max, numparms);
//        }
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s %s %s %s 0x%x",  &ownerid, srcport_str, &rulenum, &parserulebm,
                                       &parseflagbm, &action, nextphase_str, l2keyname, frwdname, modname, &pkt_mod_bm);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], parserulebm[0x%x], action[0x%x], nextphase_str[%s], l2keyname[%s], frwdname[%s], modname[%s], pkt_mod_bm[0x%x]\n",
               len, parsedargs, ownerid, srcport_str, rulenum, parserulebm, action, nextphase_str, l2keyname, frwdname, modname, pkt_mod_bm);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
        }
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        }
        else if (((pdbl2keyentry = find_tpm_l2_key_entry_by_name(l2keyname)) == 0) && strcmp(l2keyname, l2_key_empty_name) != 0)
        {
            printk(KERN_INFO "L2 key entry [%s] not found\n", l2keyname);
        }
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name) != 0)
        {
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        }
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && strcmp(modname, mod_empty_name) != 0)
        {
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        }
        else
        {
            tpmcfg_l2_prim_key_entry_t *pentry;
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbl2keyentry != 0)  memcpy(&l2_acl, &pdbl2keyentry->l2_acl, sizeof(tpm_l2_acl_key_t));
            else                     memset(&l2_acl, 0,                      sizeof(tpm_l2_acl_key_t));

            if (pdbfrwdentry != 0)   memcpy(&pkt_frwd, &pdbfrwdentry->frwd,  sizeof(tpm_pkt_frwd_t));
            else                     memset(&pkt_frwd, 0,                    sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)    memcpy(&pkt_mod, &pdbmodentry->mod,     sizeof(tpm_pkt_mod_t));
            else                     memset(&pkt_mod, 0,                     sizeof(tpm_pkt_mod_t));

            if ((rc = _tpm_add_l2_rule(ownerid,
                                       src_port,
                                       rulenum,
                                       &rule_idx,
                                       parserulebm,
                                       parseflagbm,
                                       &l2_acl,
                                       &pkt_frwd,
                                       &pkt_mod,
                                       pkt_mod_bm,
                                       &rule_action)) == TPM_RC_OK)
            {
                if ((pentry = find_tpm_l2_prim_key_entry_by_owner_id_and_rule_num(ownerid, rulenum)) == 0)
                    pentry = find_free_tpm_l2_prim_key_entry();

                if (pentry == 0)
                {
                    printk(KERN_INFO "L2 rule DB full\n");
                }
                else
                {
                    pentry->action = action;
                    strcpy(pentry->frwd_name, frwdname);
                    strcpy(pentry->key_name, l2keyname);
                    strcpy(pentry->mod_name, modname);
                    strcpy(pentry->next_phase, nextphase_str);
                    pentry->owner_id = ownerid;
                    pentry->parse_rule_bm = parserulebm;
                    pentry->parse_flags_bm = parseflagbm;
                    pentry->pkt_mod_bm = pkt_mod_bm;
                    pentry->rule_num = rulenum;
                    pentry->rule_idx = rule_idx;
                    strcpy(pentry->src_port, srcport_str);
                    pentry->used = 1;
                }

                PR_RULE_IDX(rule_idx)
            }
            else
            {
                printk(KERN_INFO "%s: tpm_add_l2_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_l3_type_rule_bounce(uint32_t               owner_id,
                                             tpm_src_port_type_t     src_port,
                                             uint32_t                rule_num,
                                             uint32_t               *rule_idx,
                                             tpm_parse_fields_t      parse_rule_bm,
                                             tpm_parse_flags_t       parse_flags_bm,
                                             tpm_l3_type_key_t      *l3_key,
                                             tpm_pkt_frwd_t         *pkt_frwd,
                                             tpm_rule_action_t      *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                   = MV_TPM_IOCTL_ADD_L3_ACL_RULE;
    tpm_add_acl_rule->owner_id                      = owner_id;
    tpm_add_acl_rule->src_port                      = src_port;
    tpm_add_acl_rule->rule_num                      = rule_num;
    tpm_add_acl_rule->parse_rule_bm                 = parse_rule_bm;
    tpm_add_acl_rule->l3_acl_rule.parse_flags_bm    = parse_flags_bm;
    memcpy(&(tpm_add_acl_rule->l3_acl_rule.l3_key),         (void*)l3_key,      sizeof(tpm_l3_type_key_t));
    memcpy(&(tpm_add_acl_rule->l3_acl_rule.pkt_frwd),       (void*)pkt_frwd,    sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->l3_acl_rule.rule_action),    (void*)rule_action, sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_l3_type_rule tpm_add_l3_type_rule_bounce
#else
 #define _tpm_add_l3_type_rule tpm_add_l3_type_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_l3_rule_add
*
* DESCRIPTION:
*           This function creates a L3 rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_l3_rule_add  (const char *buf, size_t len)
{
    typedef enum
    {
        l3ruleadd_owner=0, l3ruleadd_srcport, l3ruleadd_rulenum, l3ruleadd_parserulebm, l3ruleadd_parseflagsbm, l3ruleadd_action, l3ruleadd_nextphase,
        l2ruleadd_frwdname, l3ruleadd_l3keyname, l3ruleadd_max
    } l3ruleadd_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    char                     srcport_str[20];
    char                     uc_srcport_str[20];
    int                      indx;
    uint32_t                 src_port;
    uint32_t                 rulenum;
    uint32_t                 parserulebm;
    uint32_t                 parseflagbm;
    uint32_t                 action;
    char                     nextphase_str[20];
    uint32_t                 nextphase;
    char                     frwdname[20];
    char                     l3keyname[20];
    int                      parsedargs;
    int                      numparms;
    // DB
    tpmcfg_l3_key_entry_t    *pdbl3keyentry = 0;
    tpmcfg_frwd_entry_t      *pdbfrwdentry  = 0;
    // Used in API call
    tpm_rule_action_t        rule_action;
    tpm_pkt_frwd_t           pkt_frwd;
    tpm_l3_type_key_t        l3_acl;
    uint32_t                 rule_idx;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != l3ruleadd_max)
    {
        parm_error_completion(numparms, l3ruleadd_max, buf, sfs_help_l3_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s %s %s",
                            &ownerid, srcport_str, &rulenum, &parserulebm, &parseflagbm, &action, nextphase_str, l3keyname, frwdname);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], parserulebm[0x%x], parseflagbm[0x%x], action[0x%x], nextphase_str[%s], l3keyname[%s], frwdname[%s]\n",
               len, parsedargs, ownerid, srcport_str, rulenum, parserulebm, parseflagbm, action, nextphase_str, l3keyname, frwdname);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port[%s]\n", uc_srcport_str);
        }
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        }
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name) != 0)
        {
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        }
        else if (((pdbl3keyentry = find_tpm_l3_key_entry_by_name(l3keyname)) == 0) && strcmp(l3keyname, l3_key_empty_name) != 0)
        {
            printk(KERN_INFO "L3 key entry [%s] not found\n", l3keyname);
        }
        else
        {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbl3keyentry != 0)  memcpy(&l3_acl, &pdbl3keyentry->l3_acl, sizeof(tpm_l3_type_key_t));
            else                     memset(&l3_acl, 0,                      sizeof(tpm_l3_type_key_t));

            if (pdbfrwdentry != 0)   memcpy(&pkt_frwd, &pdbfrwdentry->frwd,  sizeof(tpm_pkt_frwd_t));
            else                     memset(&pkt_frwd, 0,                    sizeof(tpm_pkt_frwd_t));

            if ((rc = _tpm_add_l3_type_rule(ownerid,
                                            src_port,
                                            rulenum,
                                            &rule_idx,
                                            parserulebm,
                                            parseflagbm,
                                            &l3_acl,
                                            &pkt_frwd,
                                            &rule_action)) == TPM_RC_OK)
                PR_RULE_IDX(rule_idx)
            else
            {
                printk(KERN_INFO "%s: tpm_add_l3_type_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv4_rule_bounce(uint32_t                owner_id,
                                          tpm_src_port_type_t     src_port,
                                          uint32_t                rule_num,
                                          uint32_t               *rule_idx,
                                          tpm_parse_fields_t      parse_rule_bm,
                                          tpm_parse_flags_t       parse_flags_bm,
                                          tpm_ipv4_acl_key_t     *ipv4_key,
                                          tpm_pkt_frwd_t         *pkt_frwd,
                                          tpm_pkt_mod_t          *pkt_mod,
                                          tpm_pkt_mod_bm_t        pkt_mod_bm,
                                          tpm_rule_action_t      *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                   = MV_TPM_IOCTL_ADD_IPv4_ACL_RULE;
    tpm_add_acl_rule->owner_id                      = owner_id;
    tpm_add_acl_rule->src_port                      = src_port;
    tpm_add_acl_rule->rule_num                      = rule_num;
    tpm_add_acl_rule->parse_rule_bm                 = parse_rule_bm;
    tpm_add_acl_rule->ipv4_acl_rule.parse_flags_bm  = parse_flags_bm;
    tpm_add_acl_rule->ipv4_acl_rule.pkt_mod_bm      = pkt_mod_bm;
    memcpy(&(tpm_add_acl_rule->ipv4_acl_rule.ipv4_key),     (void*)ipv4_key,    sizeof(tpm_ipv4_acl_key_t));
    memcpy(&(tpm_add_acl_rule->ipv4_acl_rule.pkt_frwd),     (void*)pkt_frwd,    sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->ipv4_acl_rule.pkt_mod),      (void*)pkt_mod,     sizeof(tpm_pkt_mod_t));
    memcpy(&(tpm_add_acl_rule->ipv4_acl_rule.rule_action),  (void*)rule_action, sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv4_rule tpm_add_ipv4_rule_bounce
#else
 #define _tpm_add_ipv4_rule tpm_add_ipv4_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_ipv4_rule_add
*
* DESCRIPTION:
*           This function creates a IPV4 rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv4_rule_add  (const char *buf, size_t len)
{
    typedef enum
    {
        ipv4ruleadd_owner=0, ipv4ruleadd_srcport,   ipv4ruleadd_rulenum,  ipv4ruleadd_parserulebm, ipv4ruleadd_parseflagsbm,
        ipv4ruleadd_action,  ipv4ruleadd_nextphase, ipv4ruleadd_frwdname, ipv4ruleadd_ipv4keyname,   ipv4ruleadd_modbm,
        ipv4ruleadd_modname, ipv4ruleadd_max
    } ipv4ruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    char                     srcport_str[20];
    char                     uc_srcport_str[20];
    int                      indx;
    uint32_t                 src_port;
    uint32_t                 rulenum;
    uint32_t                 parserulebm;
    uint32_t                 parseflagsbm;
    uint32_t                 action;
    uint32_t                 nextphase;
    char                     nextphase_str[20];
    uint32_t                 modbm;
    char                     ipv4keyname[20];
    char                     frwdname[20];
    char                     modname[20];
    int                      parsedargs;
    int                      numparms;
    // DB
    tpmcfg_ipv4_key_entry_t  *pdbipv4keyentry = 0;
    tpmcfg_frwd_entry_t      *pdbfrwdentry    = 0;
    tpmcfg_mod_entry_t       *pdbmodentry     = 0;
    // Used in API call
    tpm_rule_action_t        rule_action;
    tpm_pkt_frwd_t           pkt_frwd;
    tpm_pkt_mod_t            pkt_mod;
    tpm_ipv4_acl_key_t       ipv4_acl;
    uint32_t                 rule_idx;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ipv4ruleadd_max)
    {
        parm_error_completion(numparms, ipv4ruleadd_max, buf, sfs_help_ipv4_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s 0x%x %s %s %s", &ownerid, srcport_str, &rulenum, &parserulebm, &parseflagsbm,
                            &action, nextphase_str, &modbm, ipv4keyname, frwdname, modname);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], parserulebm[0x%x], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], modbm[0x%x], ipv4keyname[%s], frwdname[%s], modname[%s]\n",
//               len, parsedargs, ownerid, srcport_str, rulenum, parserulebm, parseflagsbm, action, nextphase_str, modbm, ipv4keyname, frwdname, modname);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
        }
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        }
        else if (((pdbipv4keyentry = find_tpm_ipv4_key_entry_by_name(ipv4keyname)) == 0) && strcmp(ipv4keyname, ipv4_key_empty_name) != 0)
        {
            printk(KERN_INFO "IPV4 key entry [%s] not found\n", ipv4keyname);
        }
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name) != 0)
        {
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        }
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && strcmp(modname, mod_empty_name) != 0)
        {
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        }
        else
        {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbipv4keyentry != 0)  memcpy(&ipv4_acl, &pdbipv4keyentry->ipv4_acl, sizeof(tpm_ipv4_acl_key_t));
            else                       memset(&ipv4_acl, 0,                          sizeof(tpm_ipv4_acl_key_t));

            if (pdbfrwdentry != 0)     memcpy(&pkt_frwd, &pdbfrwdentry->frwd,        sizeof(tpm_pkt_frwd_t));
            else                       memset(&pkt_frwd, 0,                          sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)      memcpy(&pkt_mod, &pdbmodentry->mod,           sizeof(tpm_pkt_mod_t));
            else                       memset(&pkt_mod, 0,                           sizeof(tpm_pkt_mod_t));

            if ((rc = _tpm_add_ipv4_rule(ownerid,
                                         src_port,
                                         rulenum,
                                         &rule_idx,
                                         parserulebm,
                                         parseflagsbm,
                                         &ipv4_acl,
                                         &pkt_frwd,
                                         &pkt_mod,
                                         modbm,
                                         &rule_action)) == TPM_RC_OK)
                PR_RULE_IDX(rule_idx)
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv4_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv4_mc_stream_bounce(uint32_t                 owner_id,
                                              uint32_t                  stream_num,
                                              tpm_mc_igmp_mode_t        igmp_mode,
                                              uint8_t                   mc_stream_pppoe,
                                              uint16_t                  vid,
                                              uint8_t                   ipv4_src_add[4],
                                              uint8_t                   ipv4_dst_add[4],
                                              uint8_t                   ignore_ipv4_src,
                                              tpm_trg_port_type_t       dest_port_bm)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd             = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd                     = MV_TPM_IOCTL_ADD_IPv4_MC_STREAM;
    tpm_mc_rule->stream_num                 = stream_num;
    tpm_mc_rule->igmp_mode                  = igmp_mode;
    tpm_mc_rule->mc_stream_pppoe            = mc_stream_pppoe;
    tpm_mc_rule->vid                        = vid;
    tpm_mc_rule->ipv4_mc.ignore_ipv4_src    = ignore_ipv4_src;
    tpm_mc_rule->dest_port_bm               = dest_port_bm;
    memcpy(&(tpm_mc_rule->ipv4_mc.ipv4_src_add[0]), ipv4_src_add, sizeof(uint8_t)*4);
    memcpy(&(tpm_mc_rule->ipv4_mc.ipv4_dst_add[0]), ipv4_dst_add, sizeof(uint8_t)*4);

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv4_mc_stream tpm_add_ipv4_mc_stream_bounce
#else
 #define _tpm_add_ipv4_mc_stream tpm_add_ipv4_mc_stream
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_mc_ipv4_stream_add
*
* DESCRIPTION:
*           This function creates a multicast IPV4 rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mc_ipv4_stream_add  (const char *buf, size_t len)
{
    typedef enum
    {
        mcipv4add_owner=0, mcipv4add_stream, mcipv4add_mode,   mcipv4add_pppoe,        mcipv4add_vid,
        mcipv4add_src_ip,  mcipv4add_dst_ip, mcipv4add_ignore, mcipv4add_target_ports, mcipv4add_max
    } mcipv4add_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 stream;
    uint32_t                 mode;
    char                     mc_pppoe_str[20];
    uint32_t                 mc_stream_pppoe;
    uint32_t                 vid;
    char                     srcip_str[30];
    char                     dstip_str[30];
    uint32_t                 temp_srcip[4];
    uint32_t                 temp_dstip[4];
    uint8_t                  srcip[4];
    uint8_t                  dstip[4];
    char                     ignore_str[20];
    uint32_t                 ignore;
    uint32_t                 target_ports;
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != mcipv4add_max)
    {
        parm_error_completion(numparms, mcipv4add_max, buf, sfs_help_mc_ipvx_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d %s %d %s %s %s 0x%x",
                            &ownerid, &stream, &mode, mc_pppoe_str, &vid, srcip_str, dstip_str, ignore_str, &target_ports);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream[%d], vid[%d], srcip_str[%s], dstip_str[%s], ignore_str[%s], target_ports[0x%x]\n",
//               len, parsedargs, ownerid, stream, vid, srcip_str, dstip_str, ignore_str, target_ports);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_bool_value(mc_pppoe_str, &mc_stream_pppoe) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid ignore[%s]\n", ignore_str);
        }
        else if (parse_ipv4_address(srcip_str, temp_srcip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_ip [%s]\n", srcip_str);
        }
        else if (parse_ipv4_address(dstip_str, temp_dstip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid dst_ip [%s]\n", dstip_str);
        }
        else if (get_bool_value(ignore_str, &ignore) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid ignore[%s]\n", ignore_str);
        }
        else
        {
            int indx;

            for (indx = 0; indx < sizeof(srcip); indx++)
            {
                srcip[indx] = (uint8_t)temp_srcip[indx];
                dstip[indx] = (uint8_t)temp_dstip[indx];
            }

            if ((rc = _tpm_add_ipv4_mc_stream(ownerid,
                                              stream,
                                              mode,
                                              (uint8_t)mc_stream_pppoe,
                                              vid,
                                              srcip,
                                              dstip,
                                              (uint8_t)ignore,
                                              target_ports)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv4_mc_stream failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv4_mc_stream_set_queue_bounce(
					      uint32_t                 owner_id,
                                              uint32_t                  stream_num,
                                              tpm_mc_igmp_mode_t        igmp_mode,
                                              uint8_t                   mc_stream_pppoe,
                                              uint16_t                  vid,
                                              uint8_t                   ipv4_src_add[4],
                                              uint8_t                   ipv4_dst_add[4],
                                              uint8_t                   ignore_ipv4_src,
                                              uint16_t                  dest_queue,
                                              tpm_trg_port_type_t       dest_port_bm)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd             = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd                     = MV_TPM_IOCTL_ADD_IPv4_MC_STREAM_SET_QUEUE;
    tpm_mc_rule->stream_num                 = stream_num;
    tpm_mc_rule->igmp_mode                  = igmp_mode;
    tpm_mc_rule->mc_stream_pppoe            = mc_stream_pppoe;
    tpm_mc_rule->vid                        = vid;
    tpm_mc_rule->ipv4_mc.ignore_ipv4_src    = ignore_ipv4_src;
    tpm_mc_rule->dest_queue                 = dest_queue;
    tpm_mc_rule->dest_port_bm               = dest_port_bm;
    memcpy(&(tpm_mc_rule->ipv4_mc.ipv4_src_add[0]), ipv4_src_add, sizeof(uint8_t)*4);
    memcpy(&(tpm_mc_rule->ipv4_mc.ipv4_dst_add[0]), ipv4_dst_add, sizeof(uint8_t)*4);

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv4_mc_stream_set_queue tpm_add_ipv4_mc_stream_set_queue_bounce
#else
 #define _tpm_add_ipv4_mc_stream_set_queue tpm_add_ipv4_mc_stream_set_queue
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_mc_ipv4_stream_set_queue_add
*
* DESCRIPTION:
*           This function creates a multicast IPV4 rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mc_ipv4_stream_set_queue_add  (const char *buf, size_t len)
{
    typedef enum
    {
        mcipv4add_owner=0, mcipv4add_stream, mcipv4add_mode,   mcipv4add_pppoe,        mcipv4add_vid,
        mcipv4add_src_ip,  mcipv4add_dst_ip, mcipv4add_ignore, mcipv4add_target_ports, mcipv4add_target_queue,
        mcipv4add_max
    } mcipv4add_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 stream;
    uint32_t                 mode;
    char                     mc_pppoe_str[20];
    uint32_t                 mc_stream_pppoe;
    uint32_t                 vid;
    char                     srcip_str[30];
    char                     dstip_str[30];
    uint32_t                 temp_srcip[4];
    uint32_t                 temp_dstip[4];
    uint8_t                  srcip[4];
    uint8_t                  dstip[4];
    char                     ignore_str[20];
    uint32_t                 ignore;
    uint32_t                 target_queue;
    uint32_t                 target_ports;
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != mcipv4add_max)
    {
        parm_error_completion(numparms, mcipv4add_max, buf, sfs_help_mc_ipvx_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d %s %d %s %s %s %d 0x%x",
                            &ownerid, &stream, &mode, mc_pppoe_str, &vid, srcip_str, dstip_str, ignore_str, &target_queue, &target_ports);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream[%d], vid[%d], srcip_str[%s], dstip_str[%s], ignore_str[%s], target_ports[0x%x]\n",
//               len, parsedargs, ownerid, stream, vid, srcip_str, dstip_str, ignore_str, target_ports);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_bool_value(mc_pppoe_str, &mc_stream_pppoe) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid ignore[%s]\n", ignore_str);
        }
        else if (parse_ipv4_address(srcip_str, temp_srcip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_ip [%s]\n", srcip_str);
        }
        else if (parse_ipv4_address(dstip_str, temp_dstip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid dst_ip [%s]\n", dstip_str);
        }
        else if (get_bool_value(ignore_str, &ignore) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid ignore[%s]\n", ignore_str);
        }
        else
        {
            int indx;

            for (indx = 0; indx < sizeof(srcip); indx++)
            {
                srcip[indx] = (uint8_t)temp_srcip[indx];
                dstip[indx] = (uint8_t)temp_dstip[indx];
            }

            if ((rc = _tpm_add_ipv4_mc_stream_set_queue(ownerid,
                                              stream,
                                              mode,
                                              (uint8_t)mc_stream_pppoe,
                                              vid,
                                              srcip,
                                              dstip,
                                              (uint8_t)ignore,
                                              target_queue,
                                              target_ports)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv4_mc_stream_set_queue failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_mc_stream_set_queue_bounce(uint32_t owner_id,
						uint32_t stream_num,
						tpm_mc_igmp_mode_t igmp_mode,
						uint8_t mc_stream_pppoe,
						uint16_t vid,
						uint8_t ipv6_src_add[16],
						uint8_t ipv6_dst_add[16],
						uint8_t ignore_ipv6_src,
						uint16_t dest_queue,
						tpm_trg_port_type_t dest_port_bm)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd             = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd                     = MV_TPM_IOCTL_ADD_IPv6_MC_STREAM_SET_QUEUE;
    tpm_mc_rule->stream_num                 = stream_num;
    tpm_mc_rule->igmp_mode                  = igmp_mode;
    tpm_mc_rule->mc_stream_pppoe            = mc_stream_pppoe;
    tpm_mc_rule->vid                        = vid;
    tpm_mc_rule->dest_port_bm               = dest_port_bm;
    tpm_mc_rule->dest_queue                 = dest_queue;
    memcpy(&(tpm_mc_rule->ipv6_mc.ipv6_dst_add[0]), ipv6_dst_add, sizeof(uint8_t) * 16);
    memcpy(&(tpm_mc_rule->ipv6_mc.ipv6_src_add[0]), ipv6_src_add, sizeof(uint8_t) * 16);
    tpm_mc_rule->ipv6_mc.ignore_ipv6_src = ignore_ipv6_src;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_mc_stream_set_queue tpm_add_ipv6_mc_stream_set_queue_bounce
#else
 #define _tpm_add_ipv6_mc_stream_set_queue tpm_add_ipv6_mc_stream_set_queue
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_mc_ipv6_stream_add_set_queue
*
* DESCRIPTION:
*           This function creates a multicast ipv6 rule with destination queue
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mc_ipv6_stream_set_queue_add  (const char *buf, size_t len)
{
    typedef enum
    {
        mcipv6add_owner=0, mcipv6add_stream, mcipv6add_mode,   mcipv6add_pppoe,        mcipv6add_vid,
        mcipv6add_src_ip, mcipv6add_dst_ip, mcipv6add_ignor_src_ip, mcipv6add_target_queue, mcipv6add_target_ports, mcipv6add_max
    } mcipv6add_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 stream;
    uint32_t                 mode;
    char                     mc_pppoe_str[20];
    uint32_t                 mc_stream_pppoe;
    uint32_t                 vid;
    char                     dstip_str[60];
    uint32_t                 temp_dstip[16];
    char                     srcip_str[60];
    uint32_t                 temp_srcip[16];
    uint8_t                  dstip[16];
    uint8_t                  srcip[16];
    uint32_t                 ignor_srcip;
    char                     ignore_str[20];
    uint32_t                 target_ports;
    uint32_t                 target_queue;
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != mcipv6add_max)
    {
        parm_error_completion(numparms, mcipv6add_max, buf, sfs_help_mc_ipvx_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d %s %d %s %s %s %d 0x%x",
                            &ownerid, &stream, &mode, mc_pppoe_str, &vid, srcip_str, dstip_str, ignore_str, &target_queue, &target_ports);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream[%d], vid[%d], srcip_str[%s],  "
		"dstip_str[%s],  ignor_srcip[%s], target_queue[%d], target_ports[0x%x]\n",
               len, parsedargs, ownerid, stream, vid, srcip_str, dstip_str, ignore_str, target_queue, target_ports);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_bool_value(mc_pppoe_str, &mc_stream_pppoe) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid mc_pppoe_str[%s]\n", mc_pppoe_str);
        }
        else if (parse_ipv6_address(dstip_str, temp_dstip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid dst_ip [%s]\n", dstip_str);
        }
        else if (parse_ipv6_address(srcip_str, temp_srcip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid srcip_str [%s]\n", srcip_str);
	}
	else if (get_bool_value(ignore_str, &ignor_srcip) == GT_FALSE)
	{
	    printk(KERN_INFO "Invalid ignore[%s]\n", ignore_str);
        }
        else
        {
            int indx;

            for (indx = 0; indx < sizeof(dstip); indx++)
            {
                dstip[indx] = (uint8_t)temp_dstip[indx];
                srcip[indx] = (uint8_t)temp_srcip[indx];
            }

            if ((rc = _tpm_add_ipv6_mc_stream_set_queue(ownerid,
                                              stream,
                                              mode,
                                              (uint8_t)mc_stream_pppoe,
                                              vid,
                                              srcip,
                                              dstip,
                                              ignor_srcip,
                                              target_queue,
                                              target_ports)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv6_mc_stream_set_queue failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_mc_stream_bounce(uint32_t owner_id,
						uint32_t stream_num,
						tpm_mc_igmp_mode_t igmp_mode,
						uint8_t mc_stream_pppoe,
						uint16_t vid,
						uint8_t ipv6_src_add[16],
						uint8_t ipv6_dst_add[16],
						uint8_t ignore_ipv6_src,
						tpm_trg_port_type_t dest_port_bm)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd             = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd                     = MV_TPM_IOCTL_ADD_IPv6_MC_STREAM;
    tpm_mc_rule->stream_num                 = stream_num;
    tpm_mc_rule->igmp_mode                  = igmp_mode;
    tpm_mc_rule->mc_stream_pppoe            = mc_stream_pppoe;
    tpm_mc_rule->vid                        = vid;
    tpm_mc_rule->dest_port_bm               = dest_port_bm;
    memcpy(&(tpm_mc_rule->ipv6_mc.ipv6_dst_add[0]), ipv6_dst_add, sizeof(uint8_t) * 16);
    memcpy(&(tpm_mc_rule->ipv6_mc.ipv6_src_add[0]), ipv6_src_add, sizeof(uint8_t) * 16);
    tpm_mc_rule->ipv6_mc.ignore_ipv6_src = ignore_ipv6_src;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_mc_stream tpm_add_ipv6_mc_stream_bounce
#else
 #define _tpm_add_ipv6_mc_stream tpm_add_ipv6_mc_stream
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_mc_ipv6_stream_add
*
* DESCRIPTION:
*           This function creates a multicast ipv6 rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mc_ipv6_stream_add  (const char *buf, size_t len)
{
    typedef enum
    {
        mcipv6add_owner=0, mcipv6add_stream, mcipv6add_mode,   mcipv6add_pppoe,        mcipv6add_vid,
        mcipv6add_src_ip, mcipv6add_dst_ip, mcipv6add_ignor_src_ip, mcipv6add_target_ports, mcipv6add_max
    } mcipv6add_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 stream;
    uint32_t                 mode;
    char                     mc_pppoe_str[20];
    uint32_t                 mc_stream_pppoe;
    uint32_t                 vid;
    char                     dstip_str[60];
    uint32_t                 temp_dstip[16];
    char                     srcip_str[60];
    uint32_t                 temp_srcip[16];
    uint8_t                  dstip[16];
    uint8_t                  srcip[16];
    uint32_t                 ignor_srcip;
    char                     ignore_str[20];
    uint32_t                 target_ports;
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != mcipv6add_max)
    {
        parm_error_completion(numparms, mcipv6add_max, buf, sfs_help_mc_ipvx_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d %s %d %s %s %s 0x%x",
                            &ownerid, &stream, &mode, mc_pppoe_str, &vid, srcip_str, dstip_str, ignore_str, &target_ports);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream[%d], vid[%d], srcip_str[%s],  "
		"dstip_str[%s],  ignor_srcip[%s], target_ports[0x%x]\n",
               len, parsedargs, ownerid, stream, vid, srcip_str, dstip_str, ignore_str, target_ports);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_bool_value(mc_pppoe_str, &mc_stream_pppoe) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid mc_pppoe_str[%s]\n", mc_pppoe_str);
        }
        else if (parse_ipv6_address(dstip_str, temp_dstip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid dst_ip [%s]\n", dstip_str);
        }
        else if (parse_ipv6_address(srcip_str, temp_srcip) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid srcip_str [%s]\n", srcip_str);
	}
	else if (get_bool_value(ignore_str, &ignor_srcip) == GT_FALSE)
	{
	    printk(KERN_INFO "Invalid ignore[%s]\n", ignore_str);
        }
        else
        {
            int indx;

            for (indx = 0; indx < sizeof(dstip); indx++)
            {
                dstip[indx] = (uint8_t)temp_dstip[indx];
                srcip[indx] = (uint8_t)temp_srcip[indx];
            }

            if ((rc = _tpm_add_ipv6_mc_stream(ownerid,
                                              stream,
                                              mode,
                                              (uint8_t)mc_stream_pppoe,
                                              vid,
                                              srcip,
                                              dstip,
                                              ignor_srcip,
                                              target_ports)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv6_mc_stream failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_set_port_igmp_frwd_mode_bounce(tpm_src_port_type_t  src_port,
                                                    tpm_igmp_frwd_mode_t mode)
{
    tpm_ioctl_igmp_t *tpm_igmp = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_igmp;

    tpm_sfs_2_ioctl_command.cmd   = MV_TPM_IOCTL_IGMP_SECTION;
    tpm_igmp->igmp_cmd          = MV_TPM_IOCTL_IGMP_SET_PORT_FRWD_MODE;
    tpm_igmp->src_port          = src_port;
    tpm_igmp->frwd_mode         = mode;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_set_port_igmp_frwd_mode tpm_set_port_igmp_frwd_mode_bounce
#else
 #define _tpm_set_port_igmp_frwd_mode tpm_set_port_igmp_frwd_mode
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_igmp_port_forward_mode_cfg
*
* DESCRIPTION:
*           This function creates a multicast IPV4 rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void  sfs_tpm_cfg_set_igmp_port_forward_mode_cfg (const char *buf, size_t len)
{
    typedef enum
    {
        igmpfrwd_owner=0, igmpfrwd_src_port, igmpfrwd_mode, igmpfrwd_max
    } igmpfrwd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;          // NOTE: not used in API!!
    char                     srcport_str[30];
    char                     uc_srcport_str[30];
    int                      indx;
    uint32_t                 src_port;
    char                     mode_str[30];
    uint32_t                 mode;
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != igmpfrwd_max)
    {
        parm_error_completion(numparms, igmpfrwd_max, buf, sfs_help_igmp_cfg);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %s", &ownerid, srcport_str, mode_str);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], mode_str[%s]\n",
//               len, parsedargs, ownerid, srcport_str, mode_str);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_igmp_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port [%s]\n", srcport_str);
        }
        else if (get_igmp_mode_value(mode_str, &mode) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid mode [%s]\n", mode_str);
        }
        else
        {
            if ((rc = _tpm_set_port_igmp_frwd_mode(src_port,
                                                   mode)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_set_port_igmp_frwd_mode failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_set_igmp_cpu_rx_queue_bounce(uint32_t  queue)
{
    tpm_ioctl_igmp_t *tpm_igmp = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_igmp;

    tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_IGMP_SECTION;
    tpm_igmp->igmp_cmd          = MV_TPM_IOCTL_IGMP_SET_CPU_RX_Q;
    tpm_igmp->cpu_queue         = queue;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_set_igmp_cpu_rx_queue tpm_set_igmp_cpu_rx_queue_bounce
#else
 #define _tpm_set_igmp_cpu_rx_queue tpm_set_igmp_cpu_rx_queue
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_igmp_cpu_queue_cfg
*
* DESCRIPTION:
*           This function configres the CPU queue for IGMP
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_igmp_cpu_queue_cfg (const char *buf, size_t len)
{
    typedef enum
    {
        igmpcpuq_owner=0, igmpcpuq_queue, igmpcpuq_max
    } igmpcpuq_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;             // NOTE: not used in API!!
    uint32_t                 que;
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != igmpcpuq_max)
    {
        parm_error_completion(numparms, igmpcpuq_max, buf, sfs_help_igmp_cfg);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &que);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], que[%d]\n",
//               len, parsedargs, ownerid, que);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (que >= TPM_MAX_NUM_RX_QUEUE)  // Hope this a good choice
        {
            printk(KERN_INFO "Invalid queue [%d]\n", que);
        }
        else
        {
            if ((rc = _tpm_set_igmp_cpu_rx_queue(que)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_set_igmp_cpu_rx_queue failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_set_igmp_proxy_sa_mac_bounce(uint8_t *sa_mac)
{
	tpm_ioctl_igmp_t *tpm_igmp_set_sa_mac = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_igmp;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_IGMP_SECTION;
	tpm_igmp_set_sa_mac->igmp_cmd = MV_TPM_IOCTL_SET_IGMP_PROXY_SA_MAC;
	memcpy(tpm_igmp_set_sa_mac->sa_mac, (void *)sa_mac, 6);

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_set_igmp_proxy_sa_mac tpm_set_igmp_proxy_sa_mac_bounce
#else
 #define _tpm_set_igmp_proxy_sa_mac tpm_set_igmp_proxy_sa_mac
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_igmp_proxy_sa_mac
*
* DESCRIPTION:
*           This function configures the sa_mac for IGMP proxy
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_igmp_proxy_sa_mac (const char *buf, size_t len)
{
    typedef enum
    {
        igmpproxysa_owner=0, igmpproxysa_mac, igmpproxysa_max
    } igmpproxysa_parm_indx_t;

    // shell line parsing
    unsigned int             ownerid, i;
    uint8_t                  mac[6];
    uint32_t                 temp_mac[6];
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;


    numparms = count_parameters(buf);
    if (numparms != igmpproxysa_max)
    {
        parm_error_completion(numparms, igmpproxysa_max, buf, sfs_help_igmp_cfg);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %02x:%02x:%02x:%02x:%02x:%02x",
                            &ownerid, &temp_mac[0], &temp_mac[1], &temp_mac[2], &temp_mac[3], &temp_mac[4], &temp_mac[5]);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], sa_mac[%02x:%02x:%02x:%02x:%02x:%02x]\n",
//               len, parsedargs, ownerid, temp_mac[0], temp_mac[1], temp_mac[2], temp_mac[3], temp_mac[4], temp_mac[5]);

        if (parsedargs != 7)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, 7);
        }
        else
        {
            for (i=0;i<6;i++)
            {
                mac[i] = temp_mac[i];
            }
            if ((rc = _tpm_set_igmp_proxy_sa_mac (mac)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_set_igmp_proxy_sa_mac failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_l2_rule_bounce(uint32_t        owner_id,
                                        uint32_t        rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_L2_ACL_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    tpm_del_acl_rule->rule_idx      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_l2_rule tpm_del_l2_rule_bounce
#else
 #define _tpm_del_l2_rule tpm_del_l2_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_l2
*
* DESCRIPTION:
*           This function deletes a L2 HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_l2  (const char *buf, size_t len)
{
    typedef enum
    {
        noruleaddl2_owner=0,  noruleaddl2_ruleidx,  noruleaddl2_max
    } noruleaddl2_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 rule_num;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noruleaddl2_max)
    {
        parm_error_completion(numparms, noruleaddl2_max, buf, sfs_help_no_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_num);
        //printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",
        //       len, parsedargs, ownerid, rule_idx);


        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            tpmcfg_l2_prim_key_entry_t *pentry;
            pentry = find_tpm_l2_prim_key_entry_by_owner_id_and_rule_num(ownerid, rule_num);
            if (pentry != 0) {
                if ((rc = _tpm_del_l2_rule(ownerid, pentry->rule_idx)) == TPM_RC_OK)
                {
                    printk(KERN_INFO "OK\n");
                }
                else
                {
                    printk(KERN_INFO "%s: tpm_del_l2_prim_rule failed, rc[%d] - %s\n",
                           __FUNCTION__, rc, get_tpm_err_str(rc));
                }
                pentry->used = 0;
            }
            else
            {
                printk("%s: Table l2_rule does not have entry owner_id[%d], rule_num[%d]\n",
                       __FUNCTION__, ownerid, rule_num);
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_l3_type_rule_bounce(uint32_t           owner_id,
                                             uint32_t           rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_L3_ACL_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    tpm_del_acl_rule->rule_idx      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_l3_type_rule tpm_del_l3_type_rule_bounce
#else
 #define _tpm_del_l3_type_rule tpm_del_l3_type_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_l3
*
* DESCRIPTION:
*           This function deletes a L3 HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_l3  (const char *buf, size_t len)
{
    typedef enum
    {
        noruleaddl3_owner=0,  noruleaddl3_ruleidx,  noruleaddl3_max
    } noruleaddl3_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noruleaddl3_max)
    {
        parm_error_completion(numparms, noruleaddl3_max, buf, sfs_help_no_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rule_idx[%d], parserulebm[0x%x], keyname[%s]\n",
//               len, parsedargs, ownerid, srcport_str, rule_idx, parserulebm, keyname);


        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_del_l3_type_rule(ownerid,
                                            rule_idx)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_del_l3_type_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv4_rule_bounce(uint32_t          owner_id,
                                          uint32_t          rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_IPv4_ACL_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    tpm_del_acl_rule->rule_idx      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv4_rule tpm_del_ipv4_rule_bounce
#else
 #define _tpm_del_ipv4_rule tpm_del_ipv4_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv4
*
* DESCRIPTION:
*           This function deletes a IPV4 HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv4  (const char *buf, size_t len)
{
    typedef enum
    {
        noruleaddipv4_owner=0,  noruleaddipv4_ruleidx, noruleaddipv4_max
    } noruleaddipv4_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noruleaddipv4_max)
    {
        parm_error_completion(numparms, noruleaddipv4_max, buf, sfs_help_no_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d",
                            &ownerid, &rule_idx);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rule_idx[%d], parserulebm[0x%x], keyname[%s]\n",
//               len, parsedargs, ownerid, srcport_str, rule_idx, parserulebm, keyname);


        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_del_ipv4_rule(ownerid,
                                         rule_idx)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_del_ipv4_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv4_mc_stream_bounce(uint32_t     owner_id,
                                              uint32_t      stream_num)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd         = MV_TPM_IOCTL_DEL_IPv4_MC_STREAM;
    tpm_mc_rule->owner_id       = owner_id;
    tpm_mc_rule->stream_num     = stream_num;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv4_mc_stream tpm_del_ipv4_mc_stream_bounce
#else
 #define _tpm_del_ipv4_mc_stream tpm_del_ipv4_mc_stream
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_mc_stream_add_ipv4
*
* DESCRIPTION:
*           This function deletes a DSCP IPV6 HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_mc_stream_add_ipv4  (const char *buf, size_t len)
{
    typedef enum
    {
        nostreamaddipv4_owner=0, nostreamaddipv4_ruleidx,  nostreamaddipv4_max
    } nostreamaddipv4_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 stream;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != nostreamaddipv4_max)
    {
        parm_error_completion(numparms, nostreamaddipv4_max, buf, sfs_help_no_mc_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &stream);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream[%d]\n", len, parsedargs, ownerid, stream);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if ((rc = _tpm_del_ipv4_mc_stream(ownerid,
                                               stream)) == TPM_RC_OK)
        {
            printk(KERN_INFO "OK\n");
        }
        else
        {
            printk(KERN_INFO "%s: tpm_del_ipv4_mc_stream failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_mc_stream_bounce(uint32_t     owner_id,
                                              uint32_t      stream_num)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd         = MV_TPM_IOCTL_DEL_IPv6_MC_STREAM;
    tpm_mc_rule->owner_id       = owner_id;
    tpm_mc_rule->stream_num     = stream_num;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_mc_stream tpm_del_ipv6_mc_stream_bounce
#else
 #define _tpm_del_ipv6_mc_stream tpm_del_ipv6_mc_stream
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_mc_stream_add_ipv6
*
* DESCRIPTION:
*           This function deletes a DSCP IPV6 HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_mc_stream_add_ipv6  (const char *buf, size_t len)
{
    typedef enum
    {
        nostreamaddipv6_owner=0, nostreamaddipv6_ruleidx,  nostreamaddipv6_max
    } nostreamaddipv6_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 stream;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != nostreamaddipv6_max)
    {
        parm_error_completion(numparms, nostreamaddipv6_max, buf, sfs_help_no_mc_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &stream);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream[%d]\n", len, parsedargs, ownerid, stream);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if ((rc = _tpm_del_ipv6_mc_stream(ownerid,
                                               stream)) == TPM_RC_OK)
        {
            printk(KERN_INFO "OK\n");
        }
        else
        {
            printk(KERN_INFO "%s: tpm_del_ipv6_mc_stream failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_proc_set_enable_mtu_bounce(tpm_init_mtu_setting_enable_t enable)
{
	tpm_ioctl_mtu_t *tpm_mtu_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_mtu_set;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MTU_SECTION;
	tpm_mtu_set->mtu_setting_cmd = MV_TPM_IOCTL_SET_MTU_ADMIN;
	tpm_mtu_set->enable = enable;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_proc_set_enable_mtu tpm_proc_set_enable_mtu_bounce
#else
 #define _tpm_proc_set_enable_mtu tpm_db_set_mtu_enable
#endif

void sfs_tpm_cfg_set_mtu_enable (const char *buf, size_t len)
{
	typedef enum
	{
		mtu_enable=0, mtu_enable_max
	} mtu_enable_indx_t;
	/*shell line parsing*/
	int enable;

	int parsedargs;
	int numparms;

	/*used in API call*/
	tpm_error_code_t rc;

	numparms = count_parameters(buf);
	if (numparms != mtu_enable_max)
		parm_error_completion(numparms, mtu_enable_max, buf, sfs_help_setup);
	else {
		/*get parameters*/
		parsedargs = sscanf(buf, "%d", &enable);
		if (parsedargs != numparms)
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		else if ((enable != 1) && (enable != 0))
			printk(KERN_INFO "Invalid enable[%d]\n", enable);
		else {
			if ((rc = _tpm_proc_set_enable_mtu(enable)) == TPM_RC_OK)
				printk(KERN_INFO "OK\n");
			else
				printk(KERN_INFO "%s: tpm_proc_set_enable_mtu failed, rc[%d] - %s\n",
				__FUNCTION__, rc, get_tpm_err_str(rc));
		}
	}
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_proc_set_mtu_bounce(uint32_t ipv4_or_ipv6,
					uint32_t direction,
					uint32_t mtu)
{
	tpm_ioctl_mtu_t *tpm_mtu_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_mtu_set;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MTU_SECTION;
	tpm_mtu_set->mtu_setting_cmd = MV_TPM_IOCTL_SET_MTU;
	tpm_mtu_set->ethertype = ipv4_or_ipv6;
	tpm_mtu_set->direction = direction;
	tpm_mtu_set->mtu = mtu;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_proc_set_mtu tpm_proc_set_mtu_bounce
#else
 #define _tpm_proc_set_mtu tpm_proc_set_mtu
#endif

void sfs_tpm_cfg_set_mtu (const char *buf, size_t len)
{
    typedef enum
    {
        mtu_ipv4_or_ipv6=0,  mtu_direction, mtu_value,  mtu_max
    } mtu_indx_t;
    // shell line parsing
    uint32_t                 ipv4_or_ipv6;
    uint32_t                 direction;
    uint32_t                 mtu;

    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;
    tpm_setup_t              setup;

    memset(&setup, 0, sizeof(tpm_setup_t));

    numparms = count_parameters(buf);
    if (numparms != mtu_max)
    {
        parm_error_completion(numparms, mtu_max, buf, sfs_help_setup);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d", &ipv4_or_ipv6, &direction, &mtu);
        printk(KERN_INFO "ipv4_or_ipv6=%d, direction=%d. mtu[%d],\n", ipv4_or_ipv6, direction, mtu);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (ipv4_or_ipv6 >= 2)
        {
            printk(KERN_INFO "Invalid ipv4_or_ipv6[%d]\n", ipv4_or_ipv6);
        }
        else if (direction >= 2)
        {
            printk(KERN_INFO "Invalid direction[%d]\n", direction);
        }
        else
        {
            if ((rc = _tpm_proc_set_mtu(ipv4_or_ipv6, direction, mtu)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_proc_set_mtu failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }

}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_proc_set_pppoe_mtu_bounce(uint32_t ipv4_or_ipv6,
					uint32_t direction,
					uint32_t pppoe_mtu)
{
	tpm_ioctl_mtu_t *tpm_mtu_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_mtu_set;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MTU_SECTION;
	tpm_mtu_set->mtu_setting_cmd = MV_TPM_IOCTL_SET_PPPOE_MTU;
	tpm_mtu_set->ethertype = ipv4_or_ipv6;
	tpm_mtu_set->direction = direction;
	tpm_mtu_set->pppoe_mtu= pppoe_mtu;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_proc_set_pppoe_mtu tpm_proc_set_pppoe_mtu_bounce
#else
 #define _tpm_proc_set_pppoe_mtu tpm_proc_set_pppoe_mtu
#endif


void sfs_tpm_cfg_set_pppoe_mtu (const char *buf, size_t len)
{
    typedef enum
    {
        pppoe_mtu_ipv4_or_ipv6=0,  pppoe_mtu_direction, pppoe_mtu_value,  pppoe_mtu_max
    } pppoe_mtu_indx_t;
    // shell line parsing
    uint32_t                 ipv4_or_ipv6;
    uint32_t                 direction;
    uint32_t                 pppoe_mtu;

    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;
    tpm_setup_t              setup;

    memset(&setup, 0, sizeof(tpm_setup_t));

    numparms = count_parameters(buf);
    if (numparms != pppoe_mtu_max)
    {
        parm_error_completion(numparms, pppoe_mtu_max, buf, sfs_help_setup);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d", &ipv4_or_ipv6, &direction, &pppoe_mtu);
        printk(KERN_INFO "ipv4_or_ipv6=%d, direction=%d. pppoe_mtu[%d],\n", ipv4_or_ipv6, direction, pppoe_mtu);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (ipv4_or_ipv6 >= 2)
        {
            printk(KERN_INFO "Invalid ipv4_or_ipv6[%d]\n", ipv4_or_ipv6);
        }
        else if (direction >= 2)
        {
            printk(KERN_INFO "Invalid direction[%d]\n", direction);
        }
        else
        {
            if ((rc = _tpm_proc_set_pppoe_mtu(ipv4_or_ipv6, direction, pppoe_mtu)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_proc_set_pppoe_mtu failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }

}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_gen_rule_bounce(uint32_t            owner_id,
                                                uint32_t            rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd                   = MV_TPM_IOCTL_DEL_IPV6_GEN_ACL_RULE;
    tpm_del_acl_rule->owner_id                      = owner_id;
    tpm_del_acl_rule->rule_idx                      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_gen_rule tpm_del_ipv6_gen_rule_bounce
#else
 #define _tpm_del_ipv6_gen_rule tpm_del_ipv6_gen_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv6_gen_acl
*
* DESCRIPTION:
*           This function deletes a IPV6 HW gen ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv6_gen_acl (const char *buf, size_t len)
{
    typedef enum
    {
        noipv6gen_owner=0, noipv6gen_ruleidx, noipv6gen_max
    } noipv6genruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noipv6gen_max)
    {
        parm_error_completion(numparms, noipv6gen_max, buf, sfs_help_no_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",
               len, parsedargs, ownerid, rule_idx);


        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_del_ipv6_gen_rule(ownerid,
                                               rule_idx)) == TPM_RC_OK)
                PR_RESULT
            else
            {
                printk(KERN_INFO "%s: tpm_del_ipv6_gen_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_gen_rule_bounce(uint32_t                    owner_id,
                                                tpm_src_port_type_t         src_port,
                                                uint32_t                    rule_num,
                                                uint32_t                   *rule_idx,
                                                tpm_parse_fields_t          parse_rule_bm,
                                                tpm_parse_flags_t           parse_flags_bm,
                                                tpm_ipv6_gen_acl_key_t   *ipv6_gen_key,
                                                tpm_pkt_frwd_t             *pkt_frwd,
                                                tpm_pkt_mod_t              *pkt_mod,
                                                tpm_pkt_mod_bm_t            pkt_mod_bm,
                                                tpm_rule_action_t          *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                             = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                           = MV_TPM_IOCTL_ADD_IPV6_GEN_ACL_RULE;
    tpm_add_acl_rule->owner_id                              = owner_id;
    tpm_add_acl_rule->src_port                              = src_port;
    tpm_add_acl_rule->rule_num                              = rule_num;
    tpm_add_acl_rule->parse_rule_bm                         = parse_rule_bm;
    tpm_add_acl_rule->ipv6_gen_acl_rule.parse_flags_bm    = parse_flags_bm;
    tpm_add_acl_rule->ipv6_gen_acl_rule.pkt_mod_bm        = pkt_mod_bm;

    memcpy(&(tpm_add_acl_rule->ipv6_gen_acl_rule.ipv6_gen_key), ipv6_gen_key, sizeof(tpm_ipv6_gen_acl_key_t));
    memcpy(&(tpm_add_acl_rule->ipv6_gen_acl_rule.pkt_frwd),       pkt_frwd,       sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->ipv6_gen_acl_rule.pkt_mod),        pkt_mod,        sizeof(tpm_pkt_mod_t));
    memcpy(&(tpm_add_acl_rule->ipv6_gen_acl_rule.rule_action),    rule_action,    sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_gen_rule tpm_add_ipv6_gen_rule_bounce
#else
 #define _tpm_add_ipv6_gen_rule tpm_add_ipv6_gen_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_ipv6_gen_rule_add
*
* DESCRIPTION:
*           This function create IPv6 general rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv6_gen_rule_add  (const char *buf, size_t len)
{
    typedef enum
    {
        ipv6ruleadd_owner=0, ipv6ruleadd_srcport,   ipv6ruleadd_rulenum,  ipv6ruleadd_parserulebm,      ipv6ruleadd_parseflagsbm,
        ipv6ruleadd_action,  ipv6ruleadd_nextphase, ipv6ruleadd_modbm,    ipv6ruleadd_ipv6genkeyname, ipv6ruleadd_frwdname,
        ipv6ruleadd_modname, ipv6ruleadd_max
    } ipv4ruleadd_parm_indx_t;

    uint32_t            owner_id;
    tpm_src_port_type_t src_port;
    uint32_t            rule_num;
    uint32_t            rule_idx;
    tpm_parse_fields_t  parse_rule_bm;
    tpm_parse_flags_t   parse_flags_bm;
    tpm_ipv6_gen_acl_key_t ipv6_gen_key;
    tpm_pkt_frwd_t      pkt_frwd;
    tpm_pkt_mod_t       pkt_mod;
    tpm_pkt_mod_bm_t    pkt_mod_bm;
    tpm_rule_action_t   rule_action;

    tpmcfg_ipv6_gen_key_entry_t *pdbipv6genkeyentry = 0;
    tpmcfg_frwd_entry_t           *pdbfrwdentry         = 0;
    tpmcfg_mod_entry_t            *pdbmodentry          = 0;

    tpm_error_code_t    rc;
    int                 indx;
    int                 parsedargs;
    int                 numparms;
    uint32_t            action;
    uint32_t            nextphase;
    char                srcport_str[20];
    char                uc_srcport_str[20];
    char                nextphase_str[20];
    char                ipv6genkeyname[30];
    char                frwdname[20];
    char                modname[20];


    numparms = count_parameters(buf);
    if (numparms != ipv6ruleadd_max)
    {
        parm_error_completion(numparms, ipv6ruleadd_max, buf, sfs_help_ipv6_gen_rule_add);
    }
    else
    {
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x  0x%x %s 0x%x %s %s %s",
                            &owner_id, srcport_str, &rule_num, &parse_rule_bm, &parse_flags_bm,
                            &action, nextphase_str, &pkt_mod_bm, ipv6genkeyname, frwdname, modname);
                printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], parserulebm[0x%x], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], modbm[0x%x], ipv6keyname[%s], frwdname[%s], modname[%s]\n",
                       len, parsedargs, owner_id, srcport_str, rule_num, parse_rule_bm, parse_flags_bm, action, nextphase_str, pkt_mod_bm, ipv6genkeyname, frwdname, modname);

        for (indx = 0; indx < strlen(srcport_str); indx++)
        {
            uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        }
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
        }
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        }
        else if (((pdbipv6genkeyentry = find_tpm_ipv6_gen_key_entry_by_name(ipv6genkeyname)) == 0) && \
                    strcmp(ipv6genkeyname, ipv6_gen_key_empty_name) != 0)
        {
            printk(KERN_INFO "IPV4 key entry [%s] not found\n", ipv6genkeyname);
        }
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && \
                    strcmp(frwdname, frwd_empty_name) != 0)
        {
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        }
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && \
                    strcmp(modname, mod_empty_name) != 0)
        {
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        }
        else
        {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbipv6genkeyentry != 0)
                memcpy(&ipv6_gen_key, &pdbipv6genkeyentry->ipv6gen_acl, sizeof(tpm_ipv6_gen_acl_key_t));
            else
                memset(&ipv6_gen_key, 0, sizeof(tpm_ipv6_gen_acl_key_t));

            if (pdbfrwdentry != 0)
                memcpy(&pkt_frwd, &pdbfrwdentry->frwd, sizeof(tpm_pkt_frwd_t));
            else
                memset(&pkt_frwd, 0, sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)
                memcpy(&pkt_mod, &pdbmodentry->mod, sizeof(tpm_pkt_mod_t));
            else
                memset(&pkt_mod, 0, sizeof(tpm_pkt_mod_t));

            if (TPM_RC_OK == (rc = _tpm_add_ipv6_gen_rule(owner_id,
                                                            src_port,
                                                            rule_num,
                                                            &rule_idx,
                                                            parse_rule_bm,
                                                            parse_flags_bm,
                                                            &ipv6_gen_key,
                                                            &pkt_frwd,
                                                            &pkt_mod,
                                                            pkt_mod_bm,
                                                            &rule_action)) )
                PR_RULE_IDX(rule_idx)
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv6_gen_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_oam_epon_add_channel_bounce(uint32_t owner_id,
						uint32_t cpu_rx_queue,
						tpm_trg_port_type_t llid_num)
{
	tpm_ioctl_mng_ch_t *tpm_oam_epon_chan = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mng_channel;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MNG_SECTION;
	tpm_oam_epon_chan->mng_cmd = MV_TPM_IOCTL_ADD_OAM_CHNL;
	tpm_oam_epon_chan->tpm_ioctl_oam_ch.owner_id = owner_id;
	tpm_oam_epon_chan->tpm_ioctl_oam_ch.cpu_rx_queue = cpu_rx_queue;
	tpm_oam_epon_chan->tpm_ioctl_oam_ch.llid_num = llid_num;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_oam_epon_add_channel tpm_oam_epon_add_channel_bounce
#else
 #define _tpm_oam_epon_add_channel tpm_oam_epon_add_channel
#endif
/*******************************************************************************
* sfs_tpm_cfg_set_oam_channel
*
* DESCRIPTION:
*           This function creates OAM channel HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_oam_channel  (const char *buf, size_t len)
{
    typedef enum
    {
        oam_owner=0, oam_rxq,  oam_llid,  oam_max
    } oam_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 rx_q;
    uint32_t                 llid;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != oam_max)
    {
        parm_error_completion(numparms, oam_max, buf, sfs_help_oam_omci_channel);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d 0x%x", &ownerid, &rx_q, &llid);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rxq[%d], llid[0x%x]\n", len, parsedargs, ownerid, rx_q, llid);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if ((rc = _tpm_oam_epon_add_channel (ownerid,
                                                 rx_q,
                                                 llid)) == TPM_RC_OK)
        {
            printk(KERN_INFO "OK\n");
        }
        else
        {
            printk(KERN_INFO "%s: tpm_oam_epon_add_channel failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_omci_add_channel_bounce(uint32_t owner_id,
						tpm_gem_port_key_t gem_port,
						uint32_t cpu_rx_queue,
						tpm_trg_port_type_t tcont_num,
						uint32_t cpu_tx_queue)
{
	tpm_ioctl_mng_ch_t *tpm_omci_gpon_chan = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mng_channel;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MNG_SECTION;
	tpm_omci_gpon_chan->mng_cmd = MV_TPM_IOCTL_ADD_OMCI_CHNL;
	tpm_omci_gpon_chan->tpm_ioctl_omci_ch.owner_id = owner_id;
	tpm_omci_gpon_chan->tpm_ioctl_omci_ch.gem_port = gem_port;
	tpm_omci_gpon_chan->tpm_ioctl_omci_ch.cpu_rx_queue = cpu_rx_queue;
	tpm_omci_gpon_chan->tpm_ioctl_omci_ch.tcont_num = tcont_num;
	tpm_omci_gpon_chan->tpm_ioctl_omci_ch.cpu_tx_queue = cpu_tx_queue;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_omci_add_channel tpm_omci_add_channel_bounce
#else
 #define _tpm_omci_add_channel tpm_omci_add_channel
#endif
/*******************************************************************************
* sfs_tpm_cfg_set_omci_channel
*
* DESCRIPTION:
*           This function creates creates an OMCI channel HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_omci_channel  (const char *buf, size_t len)
{
    typedef enum
    {
        omci_owner=0, omci_gemport,  omci_rxq,  omci_txq,  omci_tcont,  omci_max
    } omci_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 gemport;
    uint32_t                 rx_q;
    uint32_t                 tx_q;
    uint32_t                 tcont;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != omci_max)
    {
        parm_error_completion(numparms, omci_max, buf, sfs_help_oam_omci_channel);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d %d 0x%x", &ownerid, &gemport, &rx_q, &tx_q, &tcont);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], gemport[%d], rx_q[%d], tx_q[%d], tcont[0x%x]\n",
//               len, parsedargs, ownerid, gemport, rx_q, tx_q, tcont);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (gemport >= 255)
        {
            printk(KERN_INFO "invalid gemport[%d]\n", gemport);
        }
        else
        {
            if ((rc = _tpm_omci_add_channel (ownerid,
                                            (uint16_t)gemport,
                                            rx_q,
                                            tcont,
                                            tx_q)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_omci_add_channel failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_oam_epon_del_channel_bounce(uint32_t owner_id)
{
	tpm_ioctl_mng_ch_t *tpm_oam_epon_chan = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mng_channel;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MNG_SECTION;
	tpm_oam_epon_chan->mng_cmd = MV_TPM_IOCTL_DEL_OAM_CHNL;
	tpm_oam_epon_chan->tpm_ioctl_oam_ch.owner_id = owner_id;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_oam_epon_del_channel tpm_oam_epon_del_channel_bounce
#else
 #define _tpm_oam_epon_del_channel tpm_oam_epon_del_channel
#endif
/*******************************************************************************
* sfs_tpm_cfg_set_no_oam_channel
*
* DESCRIPTION:
*           This function deletes OAM channel HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_oam_channel  (const char *buf, size_t len)
{
    typedef enum
    {
        nooam_owner=0, nooam_max
    } oam_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);

    if (numparms == 1 && buf[0] == '?')
    {
#ifdef CONFIG_MV_TPM_SYSFS_HELP
        char helpbuf[1000];
        int  helpbuf_len;

        helpbuf_len = sfs_help_no_oam_omci_channel(helpbuf);
        print_help_buffer(helpbuf, helpbuf_len);
#else
        printk(KERN_INFO "Parse problem: parameters expected/found %d/%d\n", nooam_max, numparms);
#endif
    }
    else if (numparms != 1)
    {
        printk(KERN_INFO "Parse problem: parameters expected/found %d/%d\n", nooam_max, numparms);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d", &ownerid);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d]\n", len, parsedargs, ownerid);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if ((rc = _tpm_oam_epon_del_channel (ownerid)) == TPM_RC_OK)
        {
            printk(KERN_INFO "OK\n");
        }
        else
        {
            printk(KERN_INFO "%s: tpm_oam_epon_del_channel failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_omci_del_channel_bounce(uint32_t owner_id)
{
	tpm_ioctl_mng_ch_t *tpm_omci_gpon_chan = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mng_channel;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MNG_SECTION;
	tpm_omci_gpon_chan->mng_cmd = MV_TPM_IOCTL_DEL_OMCI_CHNL;
	tpm_omci_gpon_chan->tpm_ioctl_omci_ch.owner_id = owner_id;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}
 #define _tpm_omci_del_channel tpm_omci_del_channel_bounce
#else
 #define _tpm_omci_del_channel tpm_omci_del_channel
#endif
/*******************************************************************************
* sfs_tpm_cfg_set_no_omci_channel
*
* DESCRIPTION:
*           This function creates creates an OMCI channel HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_omci_channel  (const char *buf, size_t len)
{
    typedef enum
    {
        noomci_owner=0, noomci_max
    } noomci__parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);

    if (numparms == 1 && buf[0] == '?')
    {
#ifdef CONFIG_MV_TPM_SYSFS_HELP
        char helpbuf[1000];
        int  helpbuf_len;

        helpbuf_len = sfs_help_no_oam_omci_channel(helpbuf);
        print_help_buffer(helpbuf, helpbuf_len);
#else
        printk(KERN_INFO "Parse problem: parameters expected/found %d/%d\n", noomci_max, numparms);
#endif
    }
    else if (numparms != 1)
    {
        printk(KERN_INFO "Parse problem: parameters expected/found %d/%d\n", noomci_max, numparms);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d ", &ownerid);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d]\n", len, parsedargs, ownerid);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if ((rc = _tpm_omci_del_channel (ownerid)) == TPM_RC_OK)
        {
            printk(KERN_INFO "OK\n");
        }
        else
        {
            printk(KERN_INFO "%s: tpm_omci_del_channel failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

/*******************************************************************************
* sfs_tpm_cfg_setup
*
* DESCRIPTION:
*           This function initializes tpm module
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_setup  (const char *buf, size_t len)
{
    typedef enum
    {
        /*setup_ponype=0,  */setup_filename=0, setup_max
    } setup_parm_indx_t;
    // shell line parsing
    /*uint32_t                 pon_type;*/
    char                     filename[XML_FILE_PATH_LENGTH];
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;
    tpm_setup_t              setup;

    memset(&setup, 0, sizeof(tpm_setup_t));

    numparms = count_parameters(buf);
    if (numparms != setup_max)
    {
        parm_error_completion(numparms, setup_max, buf, sfs_help_setup);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%s", filename);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], level[%d]\n", len, parsedargs, ownerid, level);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        /*else if (pon_type >= TPM_NONE)
        {
            printk(KERN_INFO "Invalid pon_type[%d]\n", pon_type);
        }*/
        else
        {
            /*setup.pon_type = pon_type;*/
            if (strcmp(filename, "default"))
            {
                strcpy(setup.xml_file_path, filename);
            }
            if ((rc = module_tpmSetup(&setup)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: module_tpmSetup failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_mib_reset_bounce(uint32_t     owner_id,
                                      uint32_t     level)
{
    tpm_ioctl_mib_reset_t *tpm_mib_reset_param = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mib_reset_param;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_RESET_SECTION;
    tpm_mib_reset_param->owner_id       = owner_id;
    tpm_mib_reset_param->reset_level    = level;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_mib_reset tpm_mib_reset_bounce
#else
 #define _tpm_mib_reset tpm_mib_reset
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_mib_reset
*
* DESCRIPTION:
*           This function creates does a MIB reset
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mib_reset  (const char *buf, size_t len)
{
    typedef enum
    {
        mibreset_owner=0, mibreset_gemport,  mibreset_max
    } mibreset_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 level;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != mibreset_max)
    {
        parm_error_completion(numparms, mibreset_max, buf, sfs_help_mib_reset);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &level);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], level[%d]\n", len, parsedargs, ownerid, level);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (level > TPM_ENUM_MAX_RESET_LEVEL)
        {
            printk(KERN_INFO "Invalid level[%d]\n", level);
        }
        else
        {
            if ((rc = _tpm_mib_reset(ownerid,
                                     level)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_mib_reset failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_set_active_wan_bounce(uint32_t     owner_id,
                                           tpm_gmacs_enum_t active_wan)
{
    tpm_ioctl_set_active_wan_t *tpm_set_active_wan_param = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_set_active_wan_param;

    tpm_sfs_2_ioctl_command.cmd              = MV_TPM_IOCTL_SET_ACTIVE_WAN_SECTION;
    tpm_set_active_wan_param->owner_id       = owner_id;
    tpm_set_active_wan_param->active_wan     = active_wan;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_set_active_wan tpm_set_active_wan_bounce
#else
 #define _tpm_set_active_wan tpm_set_active_wan
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_set_active_wan
*
* DESCRIPTION:
*           This function sets active wan port
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_active_wan  (const char *buf, size_t len)
{
    typedef enum
    {
	activewan_owner=0, activewan_active_wan,  activewan_max
    } activewan_parm_indx_t;
    // shell line parsing
    uint32_t		     ownerid;
    int 		     parsedargs;
    int 		     numparms;
    //Used in API call
    tpm_error_code_t	     rc;
    tpm_gmacs_enum_t	     active_wan;

    numparms = count_parameters(buf);
    if (numparms != activewan_max)
    {
	parm_error_completion(numparms, activewan_max, buf, sfs_help_set_active_wan);
    }
    else
    {
	// Get parameters
	parsedargs = sscanf(buf, "%d %d", &ownerid, &active_wan);
//	  printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], active_wan_int[%d]\n",
//			len, parsedargs, ownerid, active_wan);

	if (parsedargs != numparms)
	{
	    printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
	}
	else if (active_wan >= TPM_MAX_NUM_GMACS)
	{
	    printk(KERN_INFO "Invalid active_wan[%d]\n", active_wan);
	}
	else
	{
	    if ((rc = _tpm_set_active_wan(ownerid,
					  active_wan)) == TPM_RC_OK)
	    {
		printk(KERN_INFO "OK\n");
	    }
	    else
	    {
		printk(KERN_INFO "%s: tpm_set_active_wan failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
	    }
	}
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_hot_swap_profile_bounce(uint32_t     owner_id,
                                           tpm_eth_complex_profile_t profile_id)
{
    tpm_ioctl_hot_swap_profile_t *tpm_hot_swap_profile_param = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_hot_swap_profile_param;

    tpm_sfs_2_ioctl_command.cmd              = MV_TPM_IOCTL_HOT_SWAP_PROFILE_SECTION;
    tpm_hot_swap_profile_param->owner_id       = owner_id;
    tpm_hot_swap_profile_param->profile_id     = profile_id;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_hot_swap_profile tpm_hot_swap_profile_bounce
#else
 #define _tpm_hot_swap_profile tpm_hot_swap_profile
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_hot_swap_profile
*
* DESCRIPTION:
*           This function swap profile in run time
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_hot_swap_profile  (const char *buf, size_t len)
{
    typedef enum
    {
	hotswap_owner=0, hotswap_profile_id,  hotswap_max
    } hotswap_parm_indx_t;
    // shell line parsing
    uint32_t		     ownerid;
    int 		     parsedargs;
    int 		     numparms;
    //Used in API call
    tpm_error_code_t	     rc;
    uint32_t	     profile_id;

    numparms = count_parameters(buf);
    if (numparms != hotswap_max)
    {
	parm_error_completion(numparms, hotswap_max, buf, sfs_help_hot_swap_profile);
    }
    else
    {
	// Get parameters
	parsedargs = sscanf(buf, "%d %d", &ownerid, &profile_id);
//	  printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], profile_id_int[%d]\n",
//			len, parsedargs, ownerid, profile_id);

	if (parsedargs != numparms)
	{
	    printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
	}
	else
	{
	    if ((rc = _tpm_hot_swap_profile(ownerid,
					  profile_id)) == TPM_RC_OK)
	    {
		printk(KERN_INFO "OK\n");
	    }
	    else
	    {
		printk(KERN_INFO "%s: tpm_hot_swap_profile failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
	    }
	}
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_set_port_hwf_admin_bounce(uint32_t	   owner_id,
							  tpm_gmacs_enum_t port,
							  uint8_t	   txp,
							  uint8_t	   enable)
{
    tpm_ioctl_set_port_hwf_admin_t *tpm_set_port_hwf_admin_param = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_set_port_hwf_admin_param;

    tpm_sfs_2_ioctl_command.cmd              = MV_TPM_IOCTL_SET_PORT_HWF_ADMIN_SECTION;
    tpm_set_port_hwf_admin_param->owner_id   = owner_id;
    tpm_set_port_hwf_admin_param->port       = port;
    tpm_set_port_hwf_admin_param->txp        = txp;
    tpm_set_port_hwf_admin_param->enable     = enable;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_set_port_hwf_admin tpm_set_port_hwf_admin_bounce
#else
 #define _tpm_set_port_hwf_admin tpm_proc_hwf_admin_set
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_set_port_hwf_admin
*
* DESCRIPTION:
*           This function set port hwf enable/disable
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_port_hwf_admin  (const char *buf, size_t len)
{
    typedef enum
    {
	setporthwfadmin_owner=0, setporthwfadmin_port, setporthwfadmin_txp,
	setporthwfadmin_enable, setporthwfadmin_max
    } setporthwfadmin_parm_indx_t;
    // shell line parsing
    int 		     parsedargs;
    int 		     numparms;
    //Used in API call
    tpm_error_code_t	   rc;
    uint32_t               ownerid;
    tpm_gmacs_enum_t       port;
    uint32_t               txp;
    uint32_t               enable;

    numparms = count_parameters(buf);
    if (numparms != setporthwfadmin_max)
    {
	parm_error_completion(numparms, setporthwfadmin_max, buf, sfs_help_set_port_hwf_admin);
    }
    else
    {
	// Get parameters
	parsedargs = sscanf(buf, "%d %d %d %d", &ownerid, &port, &txp, &enable);
//	  printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], port[%d], txp[%d], enable[%d]\n",
//			len, parsedargs, ownerid, port, txp, enable);

	if (parsedargs != numparms)
	{
	    printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
	}
	else
	{
	    if ((rc = _tpm_set_port_hwf_admin(port, txp, enable)) == TPM_RC_OK)
	    {
		printk(KERN_INFO "OK\n");
	    }
	    else
	    {
		printk(KERN_INFO "%s: tpm_set_port_hwf_admin failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
	    }
	}
    }
}

/*******************************************************************************
* sfs_tpm_cfg_set_erase_section
*
* DESCRIPTION:
*           This function erases a section per an application group.
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_erase_section(const char *buf, size_t len)
{
	typedef enum
	{
		section_owner_id=0, section_api_type, erase_section_max
	} erase_section_parm_indx_t;
	/*shell line parsing*/
	uint32_t                 ownerid;
	uint32_t                 api_type;
	int                      parsedargs;
	int                      numparms;
	tpm_error_code_t         rc;

	numparms = count_parameters(buf);
	if (numparms != erase_section_max)
		parm_error_completion(numparms, erase_section_max, buf, sfs_help_erase_section);
	else {
		/*get parameters*/
		parsedargs = sscanf(buf, "%d %d", &ownerid, &api_type);
		if(parsedargs != numparms)
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		else if (api_type > TPM_MAX_API_TYPES)
			printk(KERN_INFO "Invalid api type[%d]\n", api_type);
		else {
			if ((rc = tpm_erase_section(ownerid, api_type)) == TPM_RC_OK)
				printk(KERN_INFO "OK\n");
			else
				printk(KERN_INFO "%s: tpm_erase_section failed, rc[%d] - %s\n",
				__FUNCTION__, rc, get_tpm_err_str(rc));
		}
	}
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_cpu_wan_loopback_bounce(uint32_t         owner_id,
                                                 tpm_pkt_frwd_t  *pkt_frwd,
                                                 uint32_t        *mod_idx)
{
    tpm_ioctl_cpu_lpbk_t *tpm_ioctl_cpu_lpbk = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_cpu_lpbk;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_CPU_LPBK_SECTION;
    tpm_ioctl_cpu_lpbk->cpu_lpbk_cmd    = MV_TPM_IOCTL_ADD_CPU_WAN_LPBK;
    tpm_ioctl_cpu_lpbk->owner_id        = owner_id;
    memcpy(&(tpm_ioctl_cpu_lpbk->pkt_frwd), pkt_frwd, sizeof(tpm_pkt_frwd_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_cpu_wan_loopback tpm_add_cpu_wan_loopback_bounce
#else
 #define _tpm_add_cpu_wan_loopback tpm_add_cpu_wan_loopback
#endif


/*******************************************************************************
* sfs_tpm_cfg_add_cpu_lpbk
*
* DESCRIPTION:
*           This function adds CPU WAN loopback
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_add_cpu_lpbk  (const char *buf, size_t len)
{
    typedef enum
    {
        lpbk_owner=0, lpbk_port, lpbk_que, lpbk_gem, lpbk_max
    } lpbk_parm_indx_t;
    uint32_t            ownerid;
    uint32_t            temp_port;
    uint32_t            temp_que;
    uint32_t            temp_gem;
    int                 parsedargs;
    int                 numparms;
    tpm_error_code_t    rc;
    tpm_pkt_frwd_t      frwd_entry;
    uint32_t            mod_idx;

    numparms = count_parameters(buf);
    if (numparms != lpbk_max)
    {
        parm_error_completion(numparms, lpbk_max, buf, sfs_help_cfg_cpu_lpbk);
    }
    else
    {
        /* Get parameters */
        parsedargs = sscanf(buf, "%d 0x%x %d %d", &ownerid, &temp_port, &temp_que, &temp_gem);
/*
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%s] temp_port[0x%x],temp_que[%d],temp_gem[%d]\n",
               len, parsedargs, ownerid, temp_port, temp_que, temp_gem);
*/
        if (temp_que > 7)
        {
            printk(KERN_INFO "Invalid queue [%d]\n", temp_que);
        }
        else if (temp_gem > 4095)
        {
            printk(KERN_INFO "Invalid gem port [%d]\n", temp_gem);
        }
        else
        {
            frwd_entry.trg_port  = (tpm_trg_port_type_t)temp_port;
            frwd_entry.trg_queue = (uint8_t)temp_que;
            frwd_entry.gem_port  = (uint16_t)temp_gem;

            rc = _tpm_add_cpu_wan_loopback(TPM_MOD_OWNER_TPM, &frwd_entry, &mod_idx);
            if(TPM_RC_OK != rc)
            {
                printk(KERN_ERR "Failed to call tpm_add_cpu_wan_loopback, ret_code[%d]\n", rc);
            }
            else
            {
                printk(KERN_ERR "Call tpm_add_cpu_wan_loopback successfully, mod_idx[%d]\n", mod_idx);
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_cpu_wan_loopback_bounce(uint32_t         owner_id,
                                                 tpm_pkt_frwd_t  *pkt_frwd)
{
    tpm_ioctl_cpu_lpbk_t *tpm_ioctl_cpu_lpbk = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_cpu_lpbk;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_CPU_LPBK_SECTION;
    tpm_ioctl_cpu_lpbk->cpu_lpbk_cmd    = MV_TPM_IOCTL_DEL_CPU_WAN_LPBK;
    tpm_ioctl_cpu_lpbk->owner_id        = owner_id;
    memcpy(&(tpm_ioctl_cpu_lpbk->pkt_frwd), pkt_frwd, sizeof(tpm_pkt_frwd_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_cpu_wan_loopback tpm_del_cpu_wan_loopback_bounce
#else
 #define _tpm_del_cpu_wan_loopback tpm_del_cpu_wan_loopback
#endif


/*******************************************************************************
* sfs_tpm_cfg_del_cpu_lpbk
*
* DESCRIPTION:
*           This function delete CPU WAN loopback
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_del_cpu_lpbk  (const char *buf, size_t len)
{
    typedef enum
    {
        lpbk_owner=0, lpbk_port, lpbk_que, lpbk_gem, lpbk_max
    } lpbk_parm_indx_t;
    uint32_t            ownerid;
    uint32_t            temp_port;
    uint32_t            temp_que;
    uint32_t            temp_gem;
    int                 parsedargs;
    int                 numparms;
    tpm_error_code_t    rc;
    tpm_pkt_frwd_t      frwd_entry;

    numparms = count_parameters(buf);
    if (numparms != lpbk_max)
    {
        parm_error_completion(numparms, lpbk_max, buf, sfs_help_cfg_cpu_lpbk);
    }
    else
    {
        /* Get parameters */
        parsedargs = sscanf(buf, "%d 0x%x %d %d", &ownerid, &temp_port, &temp_que, &temp_gem);
/*
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%s] temp_port[0x%x],temp_que[%d],temp_gem[%d]\n",
               len, parsedargs, ownerid, temp_port, temp_que, temp_gem);
*/
        if (temp_que > 7)
        {
            printk(KERN_INFO "Invalid queue [%d]\n", temp_que);
        }
        else if (temp_gem > 4095)
        {
            printk(KERN_INFO "Invalid gem port [%d]\n", temp_gem);
        }
        else
        {
            frwd_entry.trg_port  = (tpm_trg_port_type_t)temp_port;
            frwd_entry.trg_queue = (uint8_t)temp_que;
            frwd_entry.gem_port  = (uint16_t)temp_gem;

            rc = _tpm_del_cpu_wan_loopback(TPM_MOD_OWNER_TPM, &frwd_entry);
            if(TPM_RC_OK != rc)
            {
                printk(KERN_ERR "Failed to call tpm_del_cpu_wan_loopback, ret_code[%d]\n", rc);
            }
            else
            {
                printk(KERN_ERR "Call tpm_del_cpu_wan_loopback successfully\n");
            }
        }
    }
}

/*******************************************************************************
* sfs_tpm_cfg_dump_cpu_lpbk
*
* DESCRIPTION:
*           This function dumps all valid CPU WAN loopback entries from DB
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_dump_cpu_lpbk  (const char *buf, size_t len)
{
    typedef enum
    {
        lpbk_owner=0, lpbk_max
    } lpbk_parm_indx_t;
    uint32_t            ownerid;
    int                 parsedargs;
    int                 numparms;

    numparms = count_parameters(buf);
    if (numparms != lpbk_max)
    {
        parm_error_completion(numparms, lpbk_max, buf, sfs_help_cfg_cpu_lpbk);
    }
    else
    {
        /* Get parameters */
        parsedargs = sscanf(buf, "%d", &ownerid);
        /*
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%s]\n",
               len, parsedargs, ownerid);
        */

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            tpm_print_cpu_lpbk_entry();
        }
    }
}

/*******************************************************************************
* sfs_tpm_cfg_get_lu_entry
*
* DESCRIPTION:
*           This function dumps least used PnC entries
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_get_lu_entry (const char *buf, size_t len)
{
    typedef enum
    {
        age_owner_id=0, age_api_group, age_lu_num, age_lu_reset, age_max
    } age_parm_indx_t;
    uint32_t            owner_id;
    uint32_t            api_group;
    uint32_t            lu_num;
    uint32_t            lu_reset;
    int                 parsed_args_num;
    int                 param_num;

    param_num = count_parameters(buf);
    if (param_num != age_max)
    {
        parm_error_completion(param_num, age_max, buf, sfs_help_cfg_age_count);
    }
    else
    {
        /* Get parameters */
        parsed_args_num = sscanf(buf, "%d %d %d %d", &owner_id, &api_group, &lu_num, &lu_reset);
        /*
        printk(KERN_INFO "len=%d, parsed_args_num[%d], ownerid[%d], api_group[%d], lu_num[%d], lu_reset[%d]\n",
               len, parsed_args_num, owner_id, api_group, lu_num, lu_reset);
        */

        if (parsed_args_num != param_num)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsed_args_num, param_num);
        }
        else
        {
            if((lu_num <= 0) || ( lu_num > TPM_MAX_LU_ENTRY_NUM))
            {
                printk(KERN_INFO "lu_num[%d] is illegal, allowed lu_num[1~%d]\n", lu_num, TPM_MAX_LU_ENTRY_NUM);
                return;
            }

            tpm_print_tcam_lu_entry(owner_id, api_group, lu_num, lu_reset);
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_get_pnc_all_hit_counters_bounce(uint32_t               owner_id,
                                                    tpm_api_type_t          api_type,
                                                    uint32_t                high_thresh_pkts,
                                                    uint8_t                 counters_reset,
                                                    uint16_t               *valid_counters,
                                                    tpm_api_entry_count_t  *count_array)
{
    tpm_ioctl_pnc_hit_cnt_t *tpm_ioctl_pnc_hit_cnt = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_pnc_hit_cnt;

    tpm_sfs_2_ioctl_command.cmd             = MV_TPM_IOCTL_AGE_COUNT_SECTION;
    tpm_ioctl_pnc_hit_cnt->age_count_cmd    = MV_TPM_IOCTL_GET_ALL_HIT_COUNTERS;
    tpm_ioctl_pnc_hit_cnt->owner_id         = owner_id;
    tpm_ioctl_pnc_hit_cnt->api_type         = api_type;
    tpm_ioctl_pnc_hit_cnt->high_thresh_pkts = high_thresh_pkts;
    tpm_ioctl_pnc_hit_cnt->counter_reset    = counters_reset;
    tpm_ioctl_pnc_hit_cnt->valid_counters   = *valid_counters;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_get_pnc_all_hit_counters tpm_get_pnc_all_hit_counters_bounce
 #define _tpm_print_pnc_all_hit_counters(a,b,c,d,e,f)
#else
 #define _tpm_get_pnc_all_hit_counters tpm_get_pnc_all_hit_counters
 #define _tpm_print_pnc_all_hit_counters(a,b,c,d,e,f) tpm_print_pnc_all_hit_counters(a,b,c,d,e,f)
#endif


/*******************************************************************************
* sfs_tpm_cfg_get_pnc_all_hit_counters
*
* DESCRIPTION:
*           This function prints all pnc hit counters per API type masking out
*           high counter values according to high_thresh_pkts
* INPUTS:
*       buf - Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_get_pnc_all_hit_counters (const char *buf, size_t len)
{
    typedef enum
    {
        age_owner_id=0, age_api_type, age_high_thresh_pkts, age_counters_reset, age_valid_counters, age_max
    } age_parm_indx_t;
    uint32_t                owner_id;
    uint32_t                api_type;
    uint32_t                high_thresh_pkts;
    uint32_t                counters_reset;
    uint32_t                valid_counters;
    int                     parsed_args_num;
    int                     param_num;
    tpm_error_code_t        ret_code;
	tpm_api_entry_count_t   count_array[CONFIG_MV_PNC_TCAM_LINES];

    param_num = count_parameters(buf);
    if (param_num != age_max)
    {
        parm_error_completion(param_num, age_max, buf, sfs_help_cfg_age_count);
    }
    else
    {
        /* Get parameters */
        parsed_args_num = sscanf(buf, "%d %d %d %d %d", &owner_id, &api_type, &high_thresh_pkts,
                                 &counters_reset, &valid_counters);

        if (parsed_args_num != param_num)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsed_args_num, param_num);
        }
        else
        {
            ret_code = _tpm_get_pnc_all_hit_counters(owner_id,
                                                     api_type,
                                                     high_thresh_pkts,
                                                     counters_reset,
                                                    (uint16_t*)&valid_counters,
                                                    &(count_array[0]));

            if (TPM_RC_OK == ret_code)
            {
                _tpm_print_pnc_all_hit_counters(owner_id,
                                                api_type, high_thresh_pkts,
                                                (uint8_t)counters_reset,
                                                valid_counters,
                                                &(count_array[0]));
            }
            else
            {
                printk(KERN_INFO "%s: _tpm_get_pnc_all_hit_counters failed, rc[%d] - %s\n",
                       __FUNCTION__, ret_code, get_tpm_err_str(ret_code));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_set_pnc_counter_mask_bounce(uint32_t           owner_id,
                                                 tpm_api_type_t     api_type,
                                                 uint32_t           rule_idx,
                                                 uint32_t           lu_rule_mask)
{
    tpm_ioctl_age_count_t *tpm_ioctl_age_count = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_age_count;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_AGE_COUNT_SECTION;
    tpm_ioctl_age_count->age_count_cmd  = MV_TPM_IOCTL_SET_LU_COUNT_MASK;
    tpm_ioctl_age_count->owner_id       = owner_id;
    tpm_ioctl_age_count->api_type       = api_type;
    tpm_ioctl_age_count->rule_idx       = rule_idx;
    tpm_ioctl_age_count->lu_rule_mask   = lu_rule_mask;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_set_pnc_counter_mask tpm_set_pnc_counter_mask_bounce
#else
 #define _tpm_set_pnc_counter_mask tpm_set_pnc_counter_mask
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_count_mask
*
* DESCRIPTION:
*           This function sets count mask
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_count_mask (const char *buf, size_t len)
{
    typedef enum
    {
        age_owner_id=0, age_api_group, age_rule_idx, age_lu_rule_mask, age_max
    } age_parm_indx_t;
    uint32_t            owner_id;
    uint32_t            api_group;
    uint32_t            rule_idx;
    uint32_t            lu_rule_mask;
    int                 parsed_args_num;
    int                 param_num;
    tpm_error_code_t    ret_code;

    param_num = count_parameters(buf);
    if (param_num != age_max)
    {
        parm_error_completion(param_num, age_max, buf, sfs_help_cfg_age_count);
    }
    else
    {
        /* Get parameters */
        parsed_args_num = sscanf(buf, "%d %d %d %d", &owner_id, &api_group, &rule_idx, &lu_rule_mask);
        /*
        printk(KERN_INFO "len=%d, parsed_args_num[%d], ownerid[%d], api_group[%d], rule_idx[%d], lu_rule_mask[%d]\n",
               len, parsed_args_num, owner_id, api_group, rule_idx, lu_rule_mask);
        */

        if (parsed_args_num != param_num)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsed_args_num, param_num);
        }
        else
        {
            if ((ret_code = _tpm_set_pnc_counter_mask(owner_id,
                                                      api_group,
                                                      rule_idx,
                                                      lu_rule_mask)) == TPM_RC_OK)
                PR_RESULT
            else
                printk(KERN_INFO "%s: tpm_set_pnc_counter_mask failed, rc[%d] - %s\n", __FUNCTION__,
                       ret_code, get_tpm_err_str(ret_code));
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_get_pnc_hit_count_bounce(uint32_t             owner_id,
                                              tpm_api_type_t       api_type,
                                              uint32_t             rule_idx,
                                              uint8_t              hit_reset,
                                              uint32_t            *hit_count)
{
    tpm_ioctl_age_count_t *tpm_ioctl_age_count = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_age_count;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_AGE_COUNT_SECTION;
    tpm_ioctl_age_count->age_count_cmd  = MV_TPM_IOCTL_GET_HIT_COUNT;
    tpm_ioctl_age_count->owner_id       = owner_id;
    tpm_ioctl_age_count->api_type       = api_type;
    tpm_ioctl_age_count->rule_idx       = rule_idx;
    tpm_ioctl_age_count->hit_reset      = hit_reset;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_get_pnc_hit_count tpm_get_pnc_hit_count_bounce
#else
 #define _tpm_get_pnc_hit_count tpm_get_pnc_hit_count
#endif


/*******************************************************************************
* sfs_tpm_cfg_get_hit_count
*
* DESCRIPTION:
*           This function sets count mask
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_get_hit_count (const char *buf, size_t len)
{
    typedef enum
    {
        age_owner_id=0, age_api_group, age_rule_idx, age_hit_reset, age_max
    } age_parm_indx_t;
    uint32_t            owner_id;
    uint32_t            api_group;
    uint32_t            rule_idx;
    int                 parsed_args_num;
    int                 param_num;
    uint32_t            hit_count = 0;
    uint32_t            hit_reset;
    tpm_error_code_t    ret_code;

    param_num = count_parameters(buf);
    if (param_num != age_max)
    {
        parm_error_completion(param_num, age_max, buf, sfs_help_cfg_age_count);
    }
    else
    {
        /* Get parameters */
        parsed_args_num = sscanf(buf, "%d %d %d %d", &owner_id, &api_group, &rule_idx, &hit_reset);
        /*
        printk(KERN_INFO "len=%d, parsed_args_num[%d], ownerid[%d], range_id[%d], rule_idx[%d]\n",
               len, parsed_args_num, owner_id, range_id, rule_idx);
        */
        if (parsed_args_num != param_num)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsed_args_num, param_num);
        }
        else
        {
            if ((ret_code = _tpm_get_pnc_hit_count(owner_id,
                                                   api_group,
                                                   rule_idx,
                                                   (uint8_t)hit_reset,
                                                   &hit_count)) == TPM_RC_OK)
                PR_HIT_COUNT(hit_count)
            else
                printk(KERN_INFO "%s: tpm_get_pnc_hit_count failed, rc[%d] - %s\n", __FUNCTION__,
                       ret_code, get_tpm_err_str(ret_code));
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_set_pnc_lu_threshold_bounce(uint32_t             owner_id,
                                                 tpm_api_type_t       api_type,
                                                 uint32_t             lu_thresh_pkts)
{
    tpm_ioctl_age_count_t *tpm_ioctl_age_count = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_age_count;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_AGE_COUNT_SECTION;
    tpm_ioctl_age_count->age_count_cmd  = MV_TPM_IOCTL_SET_LU_THESHOLD;
    tpm_ioctl_age_count->owner_id       = owner_id;
    tpm_ioctl_age_count->api_type       = api_type;
    tpm_ioctl_age_count->lu_thresh_pkts = lu_thresh_pkts;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_set_pnc_lu_threshold tpm_set_pnc_lu_threshold_bounce
#else
 #define _tpm_set_pnc_lu_threshold tpm_set_pnc_lu_threshold
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_lu_thresh
*
* DESCRIPTION:
*           This function sets count mask
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_lu_thresh (const char *buf, size_t len)
{
    typedef enum
    {
        age_owner_id=0, age_api_group, age_lu_thresh_pkts, age_max
    } age_parm_indx_t;
    uint32_t            owner_id;
    uint32_t            api_group;
    uint32_t            lu_thresh_pkts;
    int                 parsed_args_num;
    int                 param_num;
    tpm_error_code_t    ret_code;

    param_num = count_parameters(buf);
    if (param_num != age_max)
    {
        parm_error_completion(param_num, age_max, buf, sfs_help_cfg_age_count);
    }
    else
    {
        /* Get parameters */
        parsed_args_num = sscanf(buf, "%d %d %d", &owner_id, &api_group, &lu_thresh_pkts);
        /*
        printk(KERN_INFO "len=%d, parsed_args_num[%d], ownerid[%d], api_group[%d], rule_idx[%d]\n",
               len, parsed_args_num, owner_id, api_group, rule_idx);
        */

        if (parsed_args_num != param_num)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsed_args_num, param_num);
        }
        else
        {
            if ((ret_code = _tpm_set_pnc_lu_threshold(owner_id,
                                                     api_group,
                                                     lu_thresh_pkts)) == TPM_RC_OK)
                PR_RESULT
            else
                printk(KERN_INFO "%s: tpm_set_pnc_lu_threshold failed, rc[%d] - %s\n", __FUNCTION__,
                       ret_code, get_tpm_err_str(ret_code));
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_reset_pnc_age_group_bounce(uint32_t                owner_id,
                                                tpm_api_type_t          api_type)
{
    tpm_ioctl_age_count_t *tpm_ioctl_age_count = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_age_count;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_AGE_COUNT_SECTION;
    tpm_ioctl_age_count->age_count_cmd  = MV_TPM_IOCTL_RESET_COUNT_GROUP;
    tpm_ioctl_age_count->owner_id       = owner_id;
    tpm_ioctl_age_count->api_type       = api_type;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_reset_pnc_age_group tpm_reset_pnc_age_group_bounce
#else
 #define _tpm_reset_pnc_age_group tpm_reset_pnc_age_group
#endif


/*******************************************************************************
* sfs_tpm_cfg_reset_age_group
*
* DESCRIPTION:
*           This function sets count mask
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_reset_age_group (const char *buf, size_t len)
{
    typedef enum
    {
        age_owner_id=0, age_api_group,  age_max
    } age_parm_indx_t;
    uint32_t            owner_id;
    uint32_t            api_group;
    int                 parsed_args_num;
    int                 param_num;
    tpm_error_code_t    ret_code;

    param_num = count_parameters(buf);
    if (param_num != age_max)
    {
        parm_error_completion(param_num, age_max, buf, sfs_help_cfg_age_count);
    }
    else
    {
        /* Get parameters */
        parsed_args_num = sscanf(buf, "%d %d", &owner_id, &api_group);
        /*
        printk(KERN_INFO "len=%d, parsed_args_num[%d], ownerid[%d], api_group[%d]\n",
               len, parsed_args_num, owner_id, api_group);
        */

        if (parsed_args_num != param_num)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsed_args_num, param_num);
        }
        else
        {
            if ((ret_code = _tpm_reset_pnc_age_group(owner_id,
                                                     api_group)) == TPM_RC_OK)
                PR_RESULT
            else
                printk(KERN_INFO "%s: tpm_reset_pnc_age_group failed, rc[%d] - %s\n", __FUNCTION__,
                       ret_code, get_tpm_err_str(ret_code));
        }
    }
}


/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_tm_set_wan_q_ingr_rate_lim_bounce(uint32_t owner_id,
							uint32_t queue_id,
							uint32_t rate_limit_val,
							uint32_t bucket_size)
{
	tpm_ioctl_tm_tm_t *tpm_tm_tm_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_tm_tm;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_PP_TM_SECTION;
	tpm_tm_tm_set->pp_tm_cmd = MV_TPM_IOCTL_TM_SET_WAN_QUE_INGR_RATE_LIMIT;
	tpm_tm_tm_set->owner_id = owner_id;
	tpm_tm_tm_set->queue_id = queue_id;
	tpm_tm_tm_set->rate_limit_val = rate_limit_val;
	tpm_tm_tm_set->bucket_size = bucket_size;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}

 tpm_error_code_t tpm_tm_set_wan_queue_egr_rate_lim_bounce(uint32_t owner_id,
 							tpm_trg_port_type_t sched_ent,
							uint32_t queue_id,
							uint32_t rate_limit_val,
							uint32_t bucket_size)
 {
	 tpm_ioctl_tm_tm_t *tpm_tm_tm_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_tm_tm;

	 tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_PP_TM_SECTION;
	 tpm_tm_tm_set->pp_tm_cmd = MV_TPM_IOCTL_TM_SET_WAN_QUE_EGR_RATE_LIMIT;
	 tpm_tm_tm_set->owner_id = owner_id;
	 tpm_tm_tm_set->sched_ent = sched_ent;
	 tpm_tm_tm_set->queue_id = queue_id;
	 tpm_tm_tm_set->rate_limit_val = rate_limit_val;
	 tpm_tm_tm_set->bucket_size = bucket_size;

	 up(&tpm_sfs_2_ioctl_sem);

	 return TPM_RC_OK;
 }

 #define _tpm_tm_set_wan_q_ingr_rate_lim tpm_tm_set_wan_q_ingr_rate_lim_bounce
 #define _tpm_tm_set_wan_queue_egr_rate_lim tpm_tm_set_wan_queue_egr_rate_lim_bounce
#else
 #define _tpm_tm_set_wan_q_ingr_rate_lim tpm_tm_set_wan_q_ingr_rate_lim
 #define _tpm_tm_set_wan_queue_egr_rate_lim tpm_tm_set_wan_queue_egr_rate_lim
#endif
/*******************************************************************************
* sfs_tpm_cfg_set_rate_limit_queue_set
*
* DESCRIPTION:
*           This function sets rate limit on queue
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_rate_limit_queue_set       (const char *buf, size_t len)
{
    typedef enum
    {
        qratelim_owner=0, qratelim_direction, qratelim_if, qratelim_que, qratelim_rate_limit, qratelim_bucket_size, qratelim_max
    } qratelim_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    char                     direction_str[20];
    uint32_t                 direction;
    char                     entity_str[20];
    char                     uc_entity_str[20];
    int                      indx;
    uint32_t                 entity;
    uint32_t                 que;
    uint32_t                 rate_limit;
    uint32_t                 bucket_size;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != qratelim_max)
    {
        parm_error_completion(numparms, qratelim_max, buf, sfs_help_rate_limit);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %s %d %d %d", &ownerid, direction_str, entity_str, &que, &rate_limit, &bucket_size);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], direction_str[%s], entity_str[%s], que[%d], rate_limit[%d], bucket_size[%d]\n",
//               len, parsedargs, ownerid, direction_str, entity_str, que, rate_limit, bucket_size);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(entity_str); indx++) uc_entity_str[indx] = (char)toupper(entity_str[indx]);
        uc_entity_str[strlen(entity_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_direction_value(direction_str, &direction) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid direction[%s]\n", direction_str);
        }
        else if (get_sched_entity_value(uc_entity_str, &entity) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid sched_entity[%s] %s\n", entity_str, uc_entity_str);
        }
        else if ((direction == TPM_UPSTREAM   && que >= TPM_MAX_NUM_TX_QUEUE) ||
                 (direction == TPM_DOWNSTREAM && que >= TPM_MAX_NUM_RX_QUEUE))
        {
            printk(KERN_INFO "Invalid queue[%d]\n", que);
        }
        else
        {
            if (direction == TPM_DOWNSTREAM)
            {
                if ((rc = _tpm_tm_set_wan_q_ingr_rate_lim (ownerid,
                                                          // entity,
                                                          que,
                                                          rate_limit,
                                                          bucket_size)) == TPM_RC_OK)
                {
                    printk(KERN_INFO "OK\n");
                }
                else
                {
                    printk(KERN_INFO "%s: tpm_tm_set_wan_q_ingr_rate_lim failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
                }
            }
            else
            {
                if ((rc = _tpm_tm_set_wan_queue_egr_rate_lim (ownerid,
                                                             entity,
                                                             que,
                                                             rate_limit,
                                                             bucket_size)) == TPM_RC_OK)
                {
                    printk(KERN_INFO "OK\n");
                }
                else
                {
                    printk(KERN_INFO "%s: tpm_tm_set_wan_queue_egr_rate_lim failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
                }
            }
        }
    }
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_tm_set_wan_ingr_queue_sched_bounce(uint32_t owner_id,
							tpm_pp_sched_type_t sched_mode,
							uint8_t queue_id,
							uint16_t wrr_weight)
{
	tpm_ioctl_tm_tm_t *tpm_tm_tm_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_tm_tm;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_PP_TM_SECTION;
	tpm_tm_tm_set->pp_tm_cmd = MV_TPM_IOCTL_TM_SET_WAN_INGR_QUE_SCHED;
	tpm_tm_tm_set->owner_id = owner_id;
	tpm_tm_tm_set->pp_sched_mode = sched_mode;
	tpm_tm_tm_set->queue_id = queue_id;
	tpm_tm_tm_set->wrr_weight = wrr_weight;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}

 tpm_error_code_t tpm_tm_set_wan_egr_queue_sched_bounce(uint32_t owner_id,
							tpm_trg_port_type_t sched_ent,
							tpm_pp_sched_type_t sched_mode,
							uint8_t queue_id,
							uint16_t wrr_weight)
 {
	 tpm_ioctl_tm_tm_t *tpm_tm_tm_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_tm_tm;

	 tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_PP_TM_SECTION;
	 tpm_tm_tm_set->pp_tm_cmd = MV_TPM_IOCTL_TM_SET_WAN_EGR_QUE_SCHED;
	 tpm_tm_tm_set->owner_id = owner_id;
	 tpm_tm_tm_set->sched_ent = sched_ent;
	 tpm_tm_tm_set->pp_sched_mode = sched_mode;
	 tpm_tm_tm_set->queue_id = queue_id;
	 tpm_tm_tm_set->wrr_weight = wrr_weight;

	 up(&tpm_sfs_2_ioctl_sem);

	 return TPM_RC_OK;
 }

 #define _tpm_tm_set_wan_ingr_queue_sched tpm_tm_set_wan_ingr_queue_sched_bounce
 #define _tpm_tm_set_wan_egr_queue_sched tpm_tm_set_wan_egr_queue_sched_bounce
#else
 #define _tpm_tm_set_wan_ingr_queue_sched tpm_tm_set_wan_ingr_queue_sched
 #define _tpm_tm_set_wan_egr_queue_sched tpm_tm_set_wan_egr_queue_sched
#endif
/*******************************************************************************
* sfs_tpm_cfg_set_scheduling_mode_queue_set
*
* DESCRIPTION:
*           This function configures queue operation mode (per IF, per direction)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_scheduling_mode_queue_set       (const char *buf, size_t len)
{
    typedef enum
    {
        sched_owner=0, sched_direction, sched_if, sched_que, sched_rate_limit, sched_bucket_size, sched_max
    } sched_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    char                     direction_str[20];
    uint32_t                 direction;
    char                     entity_str[20];
    char                     uc_entity_str[20];
    int                      indx;
    uint32_t                 entity;
    char                     mode_str[20];
    uint32_t                 mode;
    uint32_t                 que;
    uint32_t                 wrr_weight;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != sched_max)
    {
        parm_error_completion(numparms, sched_max, buf, sfs_help_rate_limit);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %s %s %d %d", &ownerid, direction_str, entity_str, mode_str, &que, &wrr_weight);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], direction_str[%s], entity_str[%s], mode[%s], que[%d], wrr_weight[%d]\n",
//               len, parsedargs, ownerid, direction_str, entity_str, mode_str, que, wrr_weight);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(entity_str); indx++) uc_entity_str[indx] = (char)toupper(entity_str[indx]);
        uc_entity_str[strlen(entity_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_direction_value(direction_str, &direction) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid direction[%s]\n", direction_str);
        }
        else if (get_sched_entity_value(uc_entity_str, &entity) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid sched_entity[%s] %s\n", entity_str, uc_entity_str);
        }
        else if (get_scheduling_mode_value(mode_str, &mode) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid mode[%s]\n", mode_str);
        }
        else if ((direction == TPM_UPSTREAM   && que >= TPM_MAX_NUM_TX_QUEUE) ||
                 (direction == TPM_DOWNSTREAM && que >= TPM_MAX_NUM_RX_QUEUE))
        {
            printk(KERN_INFO "Invalid queue[%d]\n", que);
        }
        else
        {
            if (direction == TPM_DOWNSTREAM)
            {
                if ((rc = _tpm_tm_set_wan_ingr_queue_sched (ownerid,
                                                           mode,
                                                           que,
                                                           wrr_weight)) == TPM_RC_OK)
                {
                    printk(KERN_INFO "OK\n");
                }
                else
                {
                    printk(KERN_INFO "%s: tpm_tm_set_wan_ingr_queue_sched failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
                }
            }
            else
            {
                if ((rc = _tpm_tm_set_wan_egr_queue_sched (ownerid,
                                                          entity,
                                                          mode,
                                                          que,
                                                          wrr_weight)) == TPM_RC_OK)
                {
                    printk(KERN_INFO "OK\n");
                }
                else
                {
                    printk(KERN_INFO "%s: tpm_tm_set_wan_egr_queue_sched failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
                }
            }
        }
    }
}

/*Evan*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_tm_set_wan_ingr_rate_lim_bounce(uint32_t owner_id,
							uint32_t rate_limit_val,
							uint32_t bucket_size)
{
	tpm_ioctl_tm_tm_t *tpm_tm_tm_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_tm_tm;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_PP_TM_SECTION;
	tpm_tm_tm_set->pp_tm_cmd = MV_TPM_IOCTL_TM_SET_WAN_INGR_RATE_LIMIT;
	tpm_tm_tm_set->owner_id = owner_id;
	tpm_tm_tm_set->rate_limit_val = rate_limit_val;
	tpm_tm_tm_set->bucket_size = bucket_size;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}

 tpm_error_code_t tpm_tm_set_wan_sched_egr_rate_lim_bounce(uint32_t owner_id,
 							tpm_trg_port_type_t sched_ent,
							uint32_t rate_limit_val,
							uint32_t bucket_size)
 {
	 tpm_ioctl_tm_tm_t *tpm_tm_tm_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_tm_tm;

	 tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_PP_TM_SECTION;
	 tpm_tm_tm_set->pp_tm_cmd = MV_TPM_IOCTL_TM_SET_WAN_SCHED_EGR_RATE_LIMIT;
	 tpm_tm_tm_set->owner_id = owner_id;
	 tpm_tm_tm_set->sched_ent = sched_ent;
	 tpm_tm_tm_set->rate_limit_val = rate_limit_val;
	 tpm_tm_tm_set->bucket_size = bucket_size;

	 up(&tpm_sfs_2_ioctl_sem);

	 return TPM_RC_OK;
 }

 #define _tpm_tm_set_wan_ingr_rate_lim tpm_tm_set_wan_ingr_rate_lim_bounce
 #define _tpm_tm_set_wan_sched_egr_rate_lim tpm_tm_set_wan_sched_egr_rate_lim_bounce
#else
 #define _tpm_tm_set_wan_ingr_rate_lim tpm_tm_set_wan_ingr_rate_lim
 #define _tpm_tm_set_wan_sched_egr_rate_lim tpm_tm_set_wan_sched_egr_rate_lim
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_rate_limit_if_set
*
* DESCRIPTION:
*           This function sets rate limit on interface
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_rate_limit_if_set          (const char *buf, size_t len)
{
    typedef enum
    {
        entratelim_owner=0, entratelim_direction, entratelim_if, entratelim_rate_limit, entratelim_bucket_size, entratelim_max
    } entratelim_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    char                     direction_str[20];
    uint32_t                 direction;
    char                     entity_str[20];
    char                     uc_entity_str[20];
    int                      indx;
    uint32_t                 entity;
    uint32_t                 rate_limit;
    uint32_t                 bucket_size;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != entratelim_max)
    {
        parm_error_completion(numparms, entratelim_max, buf, sfs_help_rate_limit);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %s %d %d", &ownerid, direction_str, entity_str, &rate_limit, &bucket_size);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], direction_str[%s], entity_str[%s], rate_limit[%d], bucket_size[%d]\n",
//               len, parsedargs, ownerid, direction_str, entity_str, rate_limit, bucket_size);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(entity_str); indx++) uc_entity_str[indx] = (char)toupper(entity_str[indx]);
        uc_entity_str[strlen(entity_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_direction_value(direction_str, &direction) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid direction[%s]\n", direction_str);
        }
        else if (get_sched_entity_value(uc_entity_str, &entity) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid sched_entity[%s]\n", entity_str);
        }
        else
        {
            if (direction == TPM_DOWNSTREAM)
            {
                if ((rc = _tpm_tm_set_wan_ingr_rate_lim (ownerid,
                                                        rate_limit,
                                                        bucket_size)) == TPM_RC_OK)
                {
                    printk(KERN_INFO "OK\n");
                }
                else
                {
                    printk(KERN_INFO "%s: tpm_tm_set_wan_ingr_rate_lim failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
                }
            }
            else
            {
                if ((rc = _tpm_tm_set_wan_sched_egr_rate_lim (ownerid,
                                                             entity,
                                                             rate_limit,
                                                             bucket_size)) == TPM_RC_OK)
                {
                    printk(KERN_INFO "OK\n");
                }
                else
                {
                    printk(KERN_INFO "%s: tpm_tm_set_wan_sched_egr_rate_lim failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
                }
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_tm_set_gmac0_ingr_rate_lim_bounce(uint32_t owner_id,
						       uint32_t rate_limit_val,
						       uint32_t bucket_size)
{
	tpm_ioctl_tm_tm_t *tpm_tm_tm_set = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_tm_tm;

	tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_PP_TM_SECTION;
	tpm_tm_tm_set->pp_tm_cmd = MV_TPM_IOCTL_TM_SET_GMAC0_INGR_RATE_LIMIT;
	tpm_tm_tm_set->owner_id = owner_id;
	tpm_tm_tm_set->rate_limit_val = rate_limit_val;
	tpm_tm_tm_set->bucket_size = bucket_size;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;
}

 #define _tpm_tm_set_gmac0_ingr_rate_lim tpm_tm_set_gmac0_ingr_rate_lim_bounce
#else
 #define _tpm_tm_set_gmac0_ingr_rate_lim tpm_tm_set_gmac0_ingr_rate_lim
#endif
/*******************************************************************************
* sfs_tpm_cfg_set_gmac0_ingr_rate_limit
*
* DESCRIPTION:
*           This function sets rate limit on queue
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_gmac0_ingr_rate_limit(const char *buf, size_t len)
{
    typedef enum
    {
        qratelim_owner=0, qratelim_rate_limit, qratelim_bucket_size, qratelim_max
    } qratelim_parm_indx_t;
    /* shell line parsing */
    uint32_t                 ownerid;
    uint32_t                 rate_limit;
    uint32_t                 bucket_size;
    int                      parsedargs;
    int                      numparms;
    /* Used in API call */
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != qratelim_max) {
        parm_error_completion(numparms, qratelim_max, buf, sfs_help_rate_limit);
    } else {
        /* Get parameters */
        parsedargs = sscanf(buf, "%d %d %d", &ownerid, &rate_limit, &bucket_size);
        if (parsedargs != numparms) {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        } else {
            if ((rc = _tpm_tm_set_gmac0_ingr_rate_lim(ownerid,
                                                      rate_limit,
                                                      bucket_size)) == TPM_RC_OK)
                printk(KERN_INFO "OK\n");
            else
                printk(KERN_INFO "%s: tpm_tm_set_gmac0_ingr_rate_lim failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_dip_rule_bounce(uint32_t              owner_id,
                                              tpm_src_port_type_t   src_port,
                                              uint32_t              rule_num,
                                              uint32_t             *rule_idx,
                                              tpm_parse_fields_t    parse_rule_bm,
                                              tpm_parse_flags_t     parse_flags_bm,
                                              tpm_ipv6_addr_key_t  *ipv6_dip_key,
                                              tpm_pkt_frwd_t       *pkt_frwd,
                                              tpm_pkt_mod_t        *pkt_mod,
                                              tpm_pkt_mod_bm_t      pkt_mod_bm,
                                              tpm_rule_action_t    *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                             = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                           = MV_TPM_IOCTL_ADD_IPV6_DIP_ACL_RULE;
    tpm_add_acl_rule->owner_id                              = owner_id;
    tpm_add_acl_rule->src_port                              = src_port;
    tpm_add_acl_rule->rule_num                              = rule_num;
    tpm_add_acl_rule->parse_rule_bm                         = parse_rule_bm;
    tpm_add_acl_rule->ipv6_dip_acl_rule.parse_flags_bm      = parse_flags_bm;
    tpm_add_acl_rule->ipv6_dip_acl_rule.pkt_mod_bm          = pkt_mod_bm;

    memcpy(&(tpm_add_acl_rule->ipv6_dip_acl_rule.ipv6_dip_key), ipv6_dip_key,   sizeof(tpm_ipv6_addr_key_t));
    memcpy(&(tpm_add_acl_rule->ipv6_dip_acl_rule.pkt_frwd),     pkt_frwd,       sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->ipv6_dip_acl_rule.pkt_mod),      pkt_mod,        sizeof(tpm_pkt_mod_t));
    memcpy(&(tpm_add_acl_rule->ipv6_dip_acl_rule.rule_action),  rule_action,    sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_dip_rule tpm_add_ipv6_dip_rule_bounce
#else
 #define _tpm_add_ipv6_dip_rule tpm_add_ipv6_dip_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_ipv6_dip_acl_rule_add
*
* DESCRIPTION:
*           This function creates a IPV6 DIP rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv6_dip_acl_rule_add  (const char *buf, size_t len)
{
    typedef enum
    {
        ipv6ruleadd_owner=0, ipv6ruleadd_srcport,   ipv6ruleadd_rulenum,  ipv6ruleadd_parserulebm, ipv6ruleadd_parseflagsbm,
        ipv6ruleadd_action,  ipv6ruleadd_nextphase, ipv6ruleadd_modbm,    ipv6ruleadd_ipv6dipkeyname, ipv6ruleadd_frwdname,
        ipv6ruleadd_modname, ipv6dipruleadd_max
    } ipv6dipruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    char                     srcport_str[20];
    char                     uc_srcport_str[20];
    int                      indx;
    uint32_t                 src_port;
    unsigned int             rulenum;
    unsigned int             parserulebm;
    unsigned int             parseflagsbm;
    unsigned int             action;
    unsigned int             nextphase;
    char                     nextphase_str[20];
    unsigned int             modbm;
    char                     ipv6keyname[30];
    char                     frwdname[20];
    char                     modname[20];
    int                      parsedargs;
    int                      numparms;
    // DB
    tpmcfg_ipv6_dip_key_entry_t  *pdbipv6keyentry = 0;
    tpm_ipv6_addr_key_t    ipv6AddrKey;
    tpmcfg_frwd_entry_t      *pdbfrwdentry    = 0;
    tpmcfg_mod_entry_t       *pdbmodentry     = 0;
    // Used in API call
    tpm_rule_action_t        rule_action;
    tpm_pkt_frwd_t           pkt_frwd;
    tpm_pkt_mod_t            pkt_mod;
    //tpm_ipv6_acl_key_t       ipv6_acl;
    uint32_t                 rule_idx;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ipv6dipruleadd_max)
    {
        parm_error_completion(numparms, ipv6dipruleadd_max, buf, sys_help_ipv6_dip_acl_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s 0x%x %s %s %s",
                            &ownerid, srcport_str, &rulenum, &parserulebm, &parseflagsbm, &action,
                            nextphase_str, &modbm, ipv6keyname, frwdname, modname);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], parserulebm[0x%x], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], modbm[0x%x], ipv6keyname[%s], frwdname[%s], modname[%s]\n",
               len, parsedargs, ownerid, srcport_str, rulenum, parserulebm, parseflagsbm, action, nextphase_str, modbm, ipv6keyname, frwdname, modname);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
        }
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        }
        else if (((pdbipv6keyentry = find_tpm_ipv6_dip_key_entry_by_name(ipv6keyname)) == 0) && strcmp(ipv6keyname, ipv6_dip_key_empty_name) != 0)
        {
            printk(KERN_INFO "IPV6 key entry [%s] not found\n", ipv6keyname);
        }
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name) != 0)
        {
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        }
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && strcmp(modname, mod_empty_name) != 0)
        {
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        }
        else
        {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbipv6keyentry != 0)
            {
                memcpy(&(ipv6AddrKey.ipv6_ip_add), &(pdbipv6keyentry->ipv6_addr.ipv6_ip_add), sizeof(pdbipv6keyentry->ipv6_addr.ipv6_ip_add));
                memcpy(&(ipv6AddrKey.ipv6_ip_add_mask), &(pdbipv6keyentry->ipv6_addr.ipv6_ip_add_mask), sizeof(pdbipv6keyentry->ipv6_addr.ipv6_ip_add_mask));
            }
            else                       memset(&ipv6AddrKey, 0,                          sizeof(ipv6AddrKey));

            if (pdbfrwdentry != 0)     memcpy(&pkt_frwd, &pdbfrwdentry->frwd,    sizeof(tpm_pkt_frwd_t));
            else                       memset(&pkt_frwd, 0,                      sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)      memcpy(&pkt_mod, &pdbmodentry->mod,      sizeof(tpm_pkt_mod_t));
            else                       memset(&pkt_mod, 0,                      sizeof(tpm_pkt_mod_t));

            if ((rc = _tpm_add_ipv6_dip_rule(ownerid,
                                             src_port,
                                             rulenum,
                                             &rule_idx,
                                             parserulebm,
                                             parseflagsbm,
                                             &ipv6AddrKey,
                                             &pkt_frwd,
                                             &pkt_mod,
                                             modbm,
                                             &rule_action)) == TPM_RC_OK)
                PR_RULE_IDX(rule_idx)
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv6_dip_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_dip_rule_bounce(uint32_t              owner_id,
                                              uint32_t              rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd                   = MV_TPM_IOCTL_DEL_IPV6_DIP_ACL_RULE;
    tpm_del_acl_rule->owner_id                      = owner_id;
    tpm_del_acl_rule->rule_idx                      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_dip_rule tpm_del_ipv6_dip_rule_bounce
#else
 #define _tpm_del_ipv6_dip_rule tpm_del_ipv6_dip_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv6_dip
*
* DESCRIPTION:
*           This function deletes a IPV6 HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv6_dip  (const char *buf, size_t len)
{
    typedef enum
    {
        noruleaddipv6_owner=0,  noruleaddipv6_ruleidx, noruleaddipv6_max
    } noruleaddipv6_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 rule_idx;
//    uint32_t                 parserulebm;
//    char                     keyname[20];
    int                      parsedargs;
    int                      numparms;
    // DB
//    tpmcfg_ipv6_dip_key_entry_t  *pdbipv6keyentry = 0;
    //Used in API call
    //tpm_ipv6_acl_key_t       ipv6_acl;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noruleaddipv6_max)
    {
        parm_error_completion(numparms, noruleaddipv6_max, buf, sfs_help_no_rule_add);
    }
    else
    {
        // Get parameters
        // Zeev
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
//        parsedargs = sscanf(buf, "%d %s %d 0x%x %s",
//                            &ownerid, srcport_str, &rule_idx, &parserulebm, keyname);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rule_idx[%d], parserulebm[0x%x], keyname[%s]\n",
//               len, parsedargs, ownerid, srcport_str, rule_idx, parserulebm, keyname);


        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
//        else if ((pdbipv6keyentry = find_tpm_ipv6_dip_key_entry_by_name(keyname)) == 0)
//        {
//            printk(KERN_INFO "key entry [%s] not found\n", keyname);
//        }
        else
        {
            //memcpy(&ipv6_acl, &pdbipv6keyentry->ipv6_acl, sizeof(tpm_ipv6_acl_key_t));

            if ((rc = _tpm_del_ipv6_dip_rule(ownerid,
                                             rule_idx)) == TPM_RC_OK)
                PR_RESULT
            else
            {
                printk(KERN_INFO "%s: tpm_del_ipv6_dip_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_l4_ports_rule_bounce(uint32_t                owner_id,
                                                   tpm_src_port_type_t     src_port,
                                                   uint32_t                rule_num,
                                                   uint32_t               *rule_idx,
                                                   tpm_parse_fields_t      parse_rule_bm,
                                                   tpm_parse_flags_t       parse_flags_bm,
                                                   tpm_l4_ports_key_t     *l4_key,
                                                   tpm_pkt_frwd_t         *pkt_frwd,
                                                   tpm_pkt_mod_t          *pkt_mod,
                                                   tpm_pkt_mod_bm_t        pkt_mod_bm,
                                                   tpm_rule_action_t      *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                             = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                           = MV_TPM_IOCTL_ADD_IPV6_L4_PORTS_ACL_RULE;
    tpm_add_acl_rule->owner_id                              = owner_id;
    tpm_add_acl_rule->src_port                              = src_port;
    tpm_add_acl_rule->rule_num                              = rule_num;
    tpm_add_acl_rule->parse_rule_bm                         = parse_rule_bm;
    tpm_add_acl_rule->ipv6_l4_ports_acl_rule.parse_flags_bm = parse_flags_bm;
    tpm_add_acl_rule->ipv6_l4_ports_acl_rule.pkt_mod_bm     = pkt_mod_bm;

    memcpy(&(tpm_add_acl_rule->ipv6_l4_ports_acl_rule.l4_key),      l4_key,         sizeof(tpm_l4_ports_key_t));
    memcpy(&(tpm_add_acl_rule->ipv6_l4_ports_acl_rule.pkt_frwd),    pkt_frwd,       sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->ipv6_l4_ports_acl_rule.pkt_mod),     pkt_mod,        sizeof(tpm_pkt_mod_t));
    memcpy(&(tpm_add_acl_rule->ipv6_l4_ports_acl_rule.rule_action), rule_action,    sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_l4_ports_rule tpm_add_ipv6_l4_ports_rule_bounce
#else
 #define _tpm_add_ipv6_l4_ports_rule tpm_add_ipv6_l4_ports_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_ipv6_l4_ports_acl_rule_add
*
* DESCRIPTION:
*           This function adds a IPV6 HW L4 ports ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv6_l4_ports_acl_rule_add (const char *buf, size_t len)
{
    typedef enum
    {
        ipv6l4ports_owner=0, ipv6l4ports_srcport,   ipv6l4ports_rulenum,  ipv6l4ports_parserulebm, ipv6l4ports_parseflagsbm,
        ipv6l4ports_action,   ipv6l4ports_next_phase, ipv6l4ports_src_port, ipv6l4ports_dst_port,    ipv6l4ports_modbm,
        ipv6l4ports_frwdname, ipv6l4ports_modname,    ipv6l4ports_max
    } ipv6l4ports_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    char                     srcport_str[20];
    char                     uc_srcport_str[20];
    int                      indx;
    uint32_t                 src_port;
    unsigned int             rulenum;
    unsigned int             parserulebm;
    unsigned int             parseflagsbm;

    uint32_t                 temp_l4_src_port;
    uint32_t                 temp_l4_dst_port;

    char                     frwdname[20];

    char                     modname[20];
    unsigned int             modbm;

    unsigned int             action;
    unsigned int             nextphase;
    char                     nextphase_str[20];

    int                      parsedargs;
    int                      numparms;
    // DB
    tpmcfg_frwd_entry_t      *pdbfrwdentry    = 0;
    tpmcfg_mod_entry_t       *pdbmodentry     = 0;
    // Used in API call
    tpm_l4_ports_key_t       l4_key;
    tpm_rule_action_t        rule_action;
    tpm_pkt_frwd_t           pkt_frwd;
    tpm_pkt_mod_t            pkt_mod;
    uint32_t                 rule_idx;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ipv6l4ports_max)
    {
        parm_error_completion(numparms, ipv6l4ports_max, buf, sfs_help_ipv6_l4_ports_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x  0x%x %s %d %d  0x%x %s %s",
                            &ownerid, srcport_str, &rulenum, &parserulebm, &parseflagsbm, &action, nextphase_str,
                            &temp_l4_src_port, &temp_l4_dst_port, &modbm, frwdname, modname);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], parserulebm[0x%x], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], l4_src_port[%d], l4_dst_port[%d], modbm[0x%x], frwdname[%s], modname[%s]\n",
               len, parsedargs, ownerid, srcport_str, rulenum, parserulebm, parseflagsbm, action, nextphase_str, temp_l4_src_port, temp_l4_dst_port, modbm, frwdname, modname);

        // Minimal help for src_port upper/lower case support
        for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
        }
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name) != 0)
        {
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        }
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && strcmp(modname, mod_empty_name) != 0)
        {
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        }
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        }
        else
        {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            l4_key.l4_dst_port = (uint16_t)temp_l4_dst_port;
            l4_key.l4_src_port = (uint16_t)temp_l4_src_port;

            if (pdbfrwdentry != 0)     memcpy(&pkt_frwd, &pdbfrwdentry->frwd,    sizeof(tpm_pkt_frwd_t));
            else                       memset(&pkt_frwd, 0,                      sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)      memcpy(&pkt_mod, &pdbmodentry->mod,      sizeof(tpm_pkt_mod_t));
            else                       memset(&pkt_mod, 0,                      sizeof(tpm_pkt_mod_t));

            if ((rc = _tpm_add_ipv6_l4_ports_rule(ownerid,
                                                  src_port,
                                                  rulenum,
                                                  &rule_idx,
                                                  parserulebm,
                                                  parseflagsbm,
                                                  &l4_key,
                                                  &pkt_frwd,
                                                  &pkt_mod,
                                                  modbm,
                                                  &rule_action)) == TPM_RC_OK)
                PR_RULE_IDX(rule_idx)
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv6_l4_ports_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_l4_ports_rule_bounce(uint32_t              owner_id,
                                                   uint32_t              rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd                   = MV_TPM_IOCTL_DEL_IPV6_L4_PORTS_ACL_RULE;
    tpm_del_acl_rule->owner_id                      = owner_id;
    tpm_del_acl_rule->rule_idx                      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_l4_ports_rule tpm_del_ipv6_l4_ports_rule_bounce
#else
 #define _tpm_del_ipv6_l4_ports_rule tpm_del_ipv6_l4_ports_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv6_l4_ports_acl
*
* DESCRIPTION:
*           This function deletes a IPV6 HW L4 ports ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv6_l4_ports_acl (const char *buf, size_t len)
{
    typedef enum
    {
        noipv6l4ports_owner=0, noipv6l4ports_ruleidx, noipv6l4ports_max
    } noipv6l4portsruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noipv6l4ports_max)
    {
        parm_error_completion(numparms, noipv6l4ports_max, buf, sfs_help_no_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",
               len, parsedargs, ownerid, rule_idx);


        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_del_ipv6_l4_ports_rule(ownerid,
                                                  rule_idx)) == TPM_RC_OK)
                PR_RESULT
            else
            {
                printk(KERN_INFO "%s: tpm_del_ipv6_l4_ports_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_nh_rule_bounce(uint32_t           owner_id,
                                            uint32_t            rule_num,
                                            uint32_t           *rule_idx,
                                            tpm_parse_flags_t   parse_flags_bm,
                                            tpm_nh_iter_t       nh_iter,
                                            uint32_t            nh,
                                            tpm_pkt_frwd_t     *pkt_frwd,
                                            tpm_rule_action_t  *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                   = MV_TPM_IOCTL_ADD_IPV6_NH_ACL_RULE;
    tpm_add_acl_rule->owner_id                      = owner_id;
    tpm_add_acl_rule->rule_num                      = rule_num;
    tpm_add_acl_rule->parse_rule_bm                 = parse_flags_bm;
    tpm_add_acl_rule->ipv6_nh_acl_rule.nh_iter      = nh_iter;
    tpm_add_acl_rule->ipv6_nh_acl_rule.nh           = nh;
    memcpy(&(tpm_add_acl_rule->ipv6_nh_acl_rule.pkt_frwd),      pkt_frwd,       sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->ipv6_nh_acl_rule.rule_action),   rule_action,    sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_nh_rule tpm_add_ipv6_nh_rule_bounce
#else
 #define _tpm_add_ipv6_nh_rule tpm_add_ipv6_nh_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_ipv6_nh_acl_rule_add
*
* DESCRIPTION:
*           This function adds a IPV6 HW NH (Next Header) ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv6_nh_acl_rule_add    (const char *buf, size_t len)
{
    typedef enum
    {
        ipv6nh_owner=0,   ipv6nh_rulenum,   ipv6nh_parseflagsbm, ipv6nh_action, ipv6nh_nextphase, ipv6nh_nhiter,
         ipv6nh_nh,       ipv6nh_frwdname,  ipv6nh_max
    } ipv6nhruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    unsigned int             rulenum;
    unsigned int             parseflagsbm;
    unsigned int             nh_iter;
    unsigned int             nh;
    unsigned int             action;
    unsigned int             nextphase;
    char                     nextphase_str[20];
    int                      parsedargs;
    int                      numparms;
    // DB
    char                     frwdname[20];
    tpmcfg_frwd_entry_t      *pdbfrwdentry    = 0;
    // Used in API call
    tpm_rule_action_t        rule_action;
    tpm_pkt_frwd_t           pkt_frwd;
    uint32_t                 rule_idx;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ipv6nh_max)
    {
        parm_error_completion(numparms, ipv6nh_max, buf, sfs_help_ipv6_nh_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d 0x%x 0x%x %s %d 0x%x %s",
                            &ownerid, &rulenum, &parseflagsbm, &action, nextphase_str, &nh_iter, &nh, frwdname);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rulenum[%d], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], nh_iter[%d], nh[0x%x], frwdname[%s]\n",
               len, parsedargs, ownerid, rulenum, parseflagsbm, action, nextphase_str, nh_iter, nh, frwdname);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name) != 0)
        {
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        }
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        }
        else
        {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbfrwdentry != 0)     memcpy(&pkt_frwd, &pdbfrwdentry->frwd,    sizeof(tpm_pkt_frwd_t));
            else                       memset(&pkt_frwd, 0,                      sizeof(tpm_pkt_frwd_t));

            if ((rc = _tpm_add_ipv6_nh_rule(ownerid,
                                            rulenum,
                                            &rule_idx,
                                            parseflagsbm,
                                            nh_iter,
                                            nh,
                                            &pkt_frwd,
                                            &rule_action)) == TPM_RC_OK)
                PR_RULE_IDX(rule_idx)
            else
            {
                printk(KERN_INFO "%s: tpm_add_ipv6_nh_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_nh_rule_bounce(uint32_t           owner_id,
                                            uint32_t            rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd                   = MV_TPM_IOCTL_DEL_IPV6_NH_ACL_RULE;
    tpm_del_acl_rule->owner_id                      = owner_id;
    tpm_del_acl_rule->rule_idx                      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_nh_rule tpm_del_ipv6_nh_rule_bounce
#else
 #define _tpm_del_ipv6_nh_rule tpm_del_ipv6_nh_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv6_nh_acl
*
* DESCRIPTION:
*           This function deletes a IPV6 HW nh_acl rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv6_nh_acl    (const char *buf, size_t len)
{
    typedef enum
    {
        noipv6nh_owner=0, noipv6nh_ruleidx, noipv6nh_max
    } noipv6nhruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noipv6nh_max)
    {
        parm_error_completion(numparms, noipv6nh_max, buf, sfs_help_no_rule_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",len, parsedargs, ownerid, rule_idx);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_del_ipv6_nh_rule(ownerid,
                                            rule_idx)) == TPM_RC_OK)
                PR_RESULT
            else
            {
                printk(KERN_INFO "%s: tpm_del_ipv6_nh_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ctc_cm_acl_rule_bounce(uint32_t owner_id,
						tpm_src_port_type_t src_port,
						uint32_t precedence,
						tpm_parse_fields_t l2_parse_rule_bm,
						tpm_parse_fields_t ipv4_parse_rule_bm,
						tpm_l2_acl_key_t *l2_key,
						tpm_ipv4_acl_key_t *ipv4_key,
						tpm_pkt_frwd_t *pkt_frwd,
						tpm_pkt_action_t *pkt_act,
						uint32_t pbits)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                          = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                        = MV_TPM_IOCTL_ADD_CTC_CM_ACL_RULE;
    tpm_add_acl_rule->owner_id                           = owner_id;
    tpm_add_acl_rule->src_port                           = src_port;
    tpm_add_acl_rule->ctc_cm_acl_rule.precedence         = precedence;
    tpm_add_acl_rule->ctc_cm_acl_rule.l2_parse_rule_bm   = l2_parse_rule_bm;
    tpm_add_acl_rule->ctc_cm_acl_rule.ipv4_parse_rule_bm = ipv4_parse_rule_bm;
    tpm_add_acl_rule->ctc_cm_acl_rule.p_bits             = pbits;

    memcpy(&(tpm_add_acl_rule->ctc_cm_acl_rule.l2_key),        l2_key,       sizeof(tpm_l2_acl_key_t));
    memcpy(&(tpm_add_acl_rule->ctc_cm_acl_rule.ipv4_key),      ipv4_key,     sizeof(tpm_ipv4_acl_key_t));
    memcpy(&(tpm_add_acl_rule->ctc_cm_acl_rule.pkt_frwd),      pkt_frwd,     sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->ctc_cm_acl_rule.pkt_act),       pkt_act,      sizeof(tpm_pkt_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ctc_cm_acl_rule tpm_add_ctc_cm_acl_rule_bounce
#else
 #define _tpm_add_ctc_cm_acl_rule tpm_add_ctc_cm_acl_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_ctc_cm_rule_add
*
* DESCRIPTION:
*           This function adds a CnM ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ctc_cm_rule_add (const char *buf, size_t len)
{
	typedef enum
	{
	    cnmruleadd_owner=0, cnmruleadd_srcport, cnmruleadd_precedence, cnmruleadd_l2parserulebm,
	    cnmruleadd_ipv4parserulebm, cnmruleadd_action, cnmruleadd_l2keyname, cnmruleadd_ipv4keyname,
	    cnmruleadd_frwdname, cnmruleadd_pbits, cnmruleadd_max
	} cnmruleadd_parm_indx_t;
	/*shell line parsing*/
	uint32_t             	  owner_id;
	char                      srcport_str[20];
	char                      uc_srcport_str[20];
	int                       indx;
	tpm_src_port_type_t 	  src_port;
	uint32_t            	  precedence;
	tpm_parse_fields_t  	  l2_parse_rule_bm;
	tpm_parse_fields_t  	  ipv4_parse_rule_bm;
	char                      l2keyname[20];
	tpm_l2_acl_key_t   	  l2_key;
	char                      ipv4keyname[20];
	tpm_ipv4_acl_key_t 	  ipv4_key;
	char                      frwdname[20];
	tpm_pkt_frwd_t     	  pkt_frwd;
	tpm_pkt_action_t 	  action;
	uint32_t            	  pbits;
	int                       parsedargs;
	int                       numparms;
	/*DB*/
	tpmcfg_l2_key_entry_t    *pdbl2keyentry   = NULL;
	tpmcfg_ipv4_key_entry_t  *pdbipv4keyentry = NULL;
	tpmcfg_frwd_entry_t      *pdbfrwdentry    = NULL;

	tpm_error_code_t         rc;

	numparms = count_parameters(buf);
	if (numparms != cnmruleadd_max) {
	    parm_error_completion(numparms, cnmruleadd_max, buf, sfs_help_ctc_cm_rule_add);
	} else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s %s %s %d",  &owner_id, srcport_str, &precedence,
			&l2_parse_rule_bm, &ipv4_parse_rule_bm, &action, l2keyname, ipv4keyname, frwdname, &pbits);

		for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
		uc_srcport_str[strlen(srcport_str)] = 0;

		if (parsedargs != numparms) {
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		} else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE) {
			printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
		} else if (((pdbl2keyentry = find_tpm_l2_key_entry_by_name(l2keyname)) == 0) && strcmp(l2keyname, l2_key_empty_name) != 0) {
			printk(KERN_INFO "L2 key entry [%s] not found\n", l2keyname);
		} else if (((pdbipv4keyentry = find_tpm_ipv4_key_entry_by_name(ipv4keyname)) == 0) && strcmp(ipv4keyname, ipv4_key_empty_name) != 0) {
			printk(KERN_INFO "IPV4 key entry [%s] not found\n", ipv4keyname);
		} else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name)!= 0) {
			printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
		} else {
			if (pdbl2keyentry != NULL)
				memcpy(&l2_key, &(pdbl2keyentry->l2_acl), sizeof(tpm_l2_acl_key_t));
			else
				memset(&l2_key, 0, sizeof(tpm_l2_acl_key_t));

			if (pdbipv4keyentry != NULL)
				memcpy(&ipv4_key, &(pdbipv4keyentry->ipv4_acl), sizeof(tpm_ipv4_acl_key_t));
			else
				memset(&ipv4_key, 0, sizeof(tpm_ipv4_acl_key_t));

			if (pdbfrwdentry != NULL)
				memcpy(&pkt_frwd, &(pdbfrwdentry->frwd), sizeof(tpm_pkt_frwd_t));
			else
				memset(&pkt_frwd, 0, sizeof(tpm_pkt_frwd_t));

			if ((rc = _tpm_add_ctc_cm_acl_rule(owner_id,
						src_port,
						precedence,
						l2_parse_rule_bm,
						ipv4_parse_rule_bm,
						&l2_key,
						&ipv4_key,
						&pkt_frwd,
						action,
						pbits)) == TPM_RC_OK)
				printk(KERN_INFO "OK. precedence = %d\n", precedence);
			else
				printk(KERN_INFO "%s: tpm_add_ctc_cm_acl_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));

		}
	}

}
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ctc_cm_ipv6_acl_rule_bounce(uint32_t owner_id,
						     tpm_src_port_type_t src_port,
						     uint32_t precedence,
						     tpm_parse_fields_t ipv6_parse_rule_bm,
						     tpm_ipv4_acl_key_t *ipv6_key,
						     tpm_pkt_frwd_t *pkt_frwd,
						     tpm_pkt_action_t *pkt_act,
						     uint32_t pbits)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                          = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                        = MV_TPM_IOCTL_ADD_CTC_CM_ACL_RULE;
    tpm_add_acl_rule->owner_id                           = owner_id;
    tpm_add_acl_rule->src_port                           = src_port;
    tpm_add_acl_rule->ctc_cm_acl_rule.precedence         = precedence;
    tpm_add_acl_rule->ctc_cm_acl_rule.ipv6_parse_rule_bm = ipv6_parse_rule_bm;
    tpm_add_acl_rule->ctc_cm_acl_rule.p_bits             = pbits;

    memcpy(&(tpm_add_acl_rule->ctc_cm_acl_rule.ipv6_key),      ipv6_key,     sizeof(tpm_ipv6_acl_key_t));
    memcpy(&(tpm_add_acl_rule->ctc_cm_acl_rule.pkt_frwd),      pkt_frwd,     sizeof(tpm_pkt_frwd_t));
    memcpy(&(tpm_add_acl_rule->ctc_cm_acl_rule.pkt_act),       pkt_act,      sizeof(tpm_pkt_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ctc_cm_ipv6_acl_rule tpm_add_ctc_cm_ipv6_acl_rule_bounce
#else
 #define _tpm_add_ctc_cm_ipv6_acl_rule tpm_add_ctc_cm_ipv6_acl_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_ctc_cm_ipv6_rule_add
*
* DESCRIPTION:
*           This function adds a CnM IPv6 ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ctc_cm_ipv6_rule_add (const char *buf, size_t len)
{
	typedef enum
	{
	    cnmruleadd_owner=0, cnmruleadd_srcport, cnmruleadd_precedence,
	    cnmruleadd_ipv6parserulebm, cnmruleadd_action, cnmruleadd_ipv6keyname,
	    cnmruleadd_frwdname, cnmruleadd_pbits, cnmruleipv6add_max
	} cnmruleadd_parm_indx_t;
	/*shell line parsing*/
	uint32_t		  owner_id;
	char			  srcport_str[20];
	char			  uc_srcport_str[20];
	int			  indx;
	tpm_src_port_type_t	  src_port;
	uint32_t		  precedence;
	tpm_parse_fields_t	  ipv6_parse_rule_bm;
	char			  ipv6keyname[20];
	tpm_ipv6_acl_key_t	  ipv6_key;
	char			  frwdname[20];
	tpm_pkt_frwd_t		  pkt_frwd;
	tpm_pkt_action_t	  action;
	uint32_t		  pbits;
	int			  parsedargs;
	int			  numparms;
	/*DB*/
	tpmcfg_ipv6_key_entry_t  *pdbipv6keyentry = NULL;
	tpmcfg_frwd_entry_t	 *pdbfrwdentry	  = NULL;

	tpm_error_code_t	 rc;

	numparms = count_parameters(buf);
	if (numparms != cnmruleipv6add_max) {
	    parm_error_completion(numparms, cnmruleipv6add_max, buf, sfs_help_ctc_cm_rule_add);
	} else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x %s %s %d",  &owner_id, srcport_str, &precedence,
			&ipv6_parse_rule_bm, &action, ipv6keyname, frwdname, &pbits);

		for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
		uc_srcport_str[strlen(srcport_str)] = 0;

		if (parsedargs != numparms) {
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		} else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE) {
			printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
		} else if (((pdbipv6keyentry = find_tpm_ipv6_key_entry_by_name(ipv6keyname)) == 0) && strcmp(ipv6keyname, ipv6_key_empty_name) != 0) {
			printk(KERN_INFO "ipv6 key entry [%s] not found\n", ipv6keyname);
		} else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && strcmp(frwdname, frwd_empty_name)!= 0) {
			printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
		} else {
			if (pdbipv6keyentry != NULL)
				memcpy(&ipv6_key, &(pdbipv6keyentry->ipv6_acl), sizeof(tpm_ipv6_acl_key_t));
			else
				memset(&ipv6_key, 0, sizeof(tpm_ipv6_acl_key_t));

			if (pdbfrwdentry != NULL)
				memcpy(&pkt_frwd, &(pdbfrwdentry->frwd), sizeof(tpm_pkt_frwd_t));
			else
				memset(&pkt_frwd, 0, sizeof(tpm_pkt_frwd_t));

			if ((rc = _tpm_add_ctc_cm_ipv6_acl_rule(owner_id,
						src_port,
						precedence,
						ipv6_parse_rule_bm,
						&ipv6_key,
						&pkt_frwd,
						action,
						pbits)) == TPM_RC_OK)
				printk(KERN_INFO "OK. precedence = %d\n", precedence);
			else
				printk(KERN_INFO "%s: tpm_add_ctc_cm_acl_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));

		}
	}

}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ctc_cm_acl_rule_bounce(uint32_t owner_id,
						tpm_src_port_type_t src_port,
						uint32_t precedence)
{
	tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

	tpm_sfs_2_ioctl_command.cmd			= MV_TPM_IOCTL_DEL_ACL_SECTION;
	tpm_del_acl_rule->del_acl_cmd			= MV_TPM_IOCTL_DEL_CTC_CM_ACL_RULE;
	tpm_del_acl_rule->owner_id			= owner_id;
	tpm_del_acl_rule->src_port			= src_port;
	tpm_del_acl_rule->precedence			= precedence;

	up(&tpm_sfs_2_ioctl_sem);

	return TPM_RC_OK;

}
 #define _tpm_del_ctc_cm_acl_rule tpm_del_ctc_cm_acl_rule_bounce
#else
 #define _tpm_del_ctc_cm_acl_rule tpm_del_ctc_cm_acl_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ctc_cm_acl
*
* DESCRIPTION:
*           This function deletes a ctc CnM HW acl rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ctc_cm_acl(const char *buf, size_t len)
{
	typedef enum
	{
		noctccm_owner=0, noctccm_srcport, noctccm_precedence, noctccm_max
	} noctccmruleadd_parm_indx_t;
	/*shell line parsing*/
	uint32_t             	  owner_id;
	char                      srcport_str[20];
	char                      uc_srcport_str[20];
	tpm_src_port_type_t 	  src_port;
	uint32_t            	  precedence;
	int                       parsedargs;
	int                       numparms;
	int                       indx;

	tpm_error_code_t         rc;

	numparms = count_parameters(buf);
	if (numparms != noctccm_max) {
	    parm_error_completion(numparms, noctccm_max, buf, sfs_help_no_rule_add);
	} else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d %s %d",  &owner_id, srcport_str, &precedence);

		for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
		uc_srcport_str[strlen(srcport_str)] = 0;

		if (parsedargs != numparms) {
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		} else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE) {
			printk(KERN_INFO "Invalid src_port[%s]\n", srcport_str);
		} else {
			if ((rc = _tpm_del_ctc_cm_acl_rule(owner_id,
							src_port,
							precedence)) == TPM_RC_OK)
                		PR_RESULT
			else
		                printk(KERN_INFO "%s: tpm_del_ctc_cm_acl_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
		}
	}

}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_updt_ipv4_mc_stream_bounce(uint32_t            owner_id,
                                                uint32_t            stream_num,
                                                tpm_trg_port_type_t dest_port_bm)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd         = MV_TPM_IOCTL_MOD_IPv4_MC_STREAM;
    tpm_mc_rule->stream_num     = stream_num;
    tpm_mc_rule->dest_port_bm   = dest_port_bm;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_updt_ipv4_mc_stream tpm_updt_ipv4_mc_stream_bounce
#else
 #define _tpm_updt_ipv4_mc_stream tpm_updt_ipv4_mc_stream
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_mc_ipv4_stream_update
*
* DESCRIPTION:
*           This function updates a IPv4 multicast stream
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mc_ipv4_stream_update    (const char *buf, size_t len)
{
    typedef enum
    {
        ipv4strupdt_owner=0, ipv4strupdt_stream_num, ipv4strupdt_dest_port_bm, ipv4strupdt_max
    } noipv6nhruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 stream_num;
    uint32_t                 dest_port_bm;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ipv4strupdt_max)
    {
        parm_error_completion(numparms, ipv4strupdt_max, buf, sfs_help_mc_ipvx_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d 0x%x", &ownerid, &stream_num, &dest_port_bm);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream_num[%d], dest_port_bm[0x%x]\n",
               len, parsedargs, ownerid, stream_num, dest_port_bm);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_updt_ipv4_mc_stream(ownerid,
                                               stream_num,
                                               dest_port_bm)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK.\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_updt_ipv4_mc_stream failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_updt_ipv6_mc_stream_bounce(uint32_t            owner_id,
                                                uint32_t            stream_num,
                                                tpm_trg_port_type_t dest_port_bm)
{
    tpm_ioctl_mc_rule_t *tpm_mc_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_mc_rule;

    tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_MC_STREAM_SECTION;
    tpm_mc_rule->mc_cmd         = MV_TPM_IOCTL_MOD_IPv6_MC_STREAM;
    tpm_mc_rule->stream_num     = stream_num;
    tpm_mc_rule->dest_port_bm   = dest_port_bm;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_updt_ipv6_mc_stream tpm_updt_ipv6_mc_stream_bounce
#else
 #define _tpm_updt_ipv6_mc_stream tpm_updt_ipv6_mc_stream
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_mc_ipv6_stream_update
*
* DESCRIPTION:
*           This function updates a ipv6 multicast stream
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mc_ipv6_stream_update    (const char *buf, size_t len)
{
    typedef enum
    {
        ipv6strupdt_owner=0, ipv6strupdt_stream_num, ipv6strupdt_dest_port_bm, ipv6strupdt_max
    } noipv6nhruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 stream_num;
    uint32_t                 dest_port_bm;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ipv6strupdt_max)
    {
        parm_error_completion(numparms, ipv6strupdt_max, buf, sfs_help_mc_ipvx_stream_add);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d 0x%x", &ownerid, &stream_num, &dest_port_bm);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], stream_num[%d], dest_port_bm[0x%x]\n",
               len, parsedargs, ownerid, stream_num, dest_port_bm);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_updt_ipv6_mc_stream(ownerid,
                                               stream_num,
                                               dest_port_bm)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK.\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_updt_ipv6_mc_stream failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

void sfs_tpm_cfg_set_mc_vid_key_reset    (const char *buf, size_t len)
{
    typedef enum
    {
        mcvidkeyreset_owner=0,  mcvidkeyreset_max
    } mcvidkeyreset_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    int                      parsedargs;
    int                      numparms;

    numparms = count_parameters(buf);
    if (numparms != mcvidkeyreset_max)
    {
        parm_error_completion(numparms, mcvidkeyreset_max, buf, sfs_help_igmp_cfg);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d", &ownerid);
        printk(KERN_INFO "parsedargs=%d. ownerid[%d]\n", parsedargs, ownerid);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            tpm_reset_mc_vid_key ();
            printk(KERN_INFO "OK.\n");
        }
    }
}

void sfs_tpm_cfg_set_mc_vid_key_set    (const char *buf, size_t len)
{
    typedef enum
    {
        mcvidkeyset_src_port=0, mcvidkeyset_mc_uni_xlate_mode, mcvidkeyset_mc_uni_xlate_vid, mcvidkeyset_max
    } mcvidkeyset_parm_indx_t;
    // shell line parsing
    char                     srcport_str[30];
    char                     uc_srcport_str[30];
    uint32_t                 src_port;
    uint32_t                 mc_uni_xlate_mode;
    uint32_t                 mc_uni_xlate_vid;
    int                      parsedargs;
    int                      numparms;
    int                      indx;

    numparms = count_parameters(buf);
    if (numparms != mcvidkeyset_max)
    {
        parm_error_completion(numparms, mcvidkeyset_max, buf, sfs_help_igmp_cfg);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%s %d %d", srcport_str, &mc_uni_xlate_mode, &mc_uni_xlate_vid);
        printk(KERN_INFO "len=%d, parsedargs=%d. src_port[%s], mc_uni_xlate_mode[%d], mc_uni_xlate_vid[%d]\n",
               len, parsedargs, srcport_str, mc_uni_xlate_mode, mc_uni_xlate_vid);

         for (indx = 0; indx < strlen(srcport_str); indx++) uc_srcport_str[indx] = (char)toupper(srcport_str[indx]);
        uc_srcport_str[strlen(srcport_str)] = 0;

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (get_srcport_value(uc_srcport_str, &src_port) == GT_FALSE)
        {
            printk(KERN_INFO "Invalid src_port [%s]\n", srcport_str);
        }
        else
        {
            if ( GT_TRUE == tpm_set_mc_vid_key (src_port,
                                               mc_uni_xlate_mode,
                                               mc_uni_xlate_vid) )
            {
                printk(KERN_INFO "OK.\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_set_mc_vid_key failed\n", __FUNCTION__);
            }
        }
    }
}
void sfs_tpm_cfg_set_mc_vid_cfg_set    (const char *buf, size_t len)
{
    typedef enum
    {
        mcvidcfgset_owner=0, mcvidcfgset_mc_vid, mcvidcfgset_max
    } mcvidcfgset_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 mc_vid;
    int                      parsedargs;
    int                      numparms;

    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != mcvidcfgset_max)
    {
        parm_error_completion(numparms, mcvidcfgset_max, buf, sfs_help_igmp_cfg);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &mc_vid);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], mc_vid[%d]\n",
               len, parsedargs, ownerid, mc_vid);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = tpm_set_mc_vid_cfg (mc_vid)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK.\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_set_mc_vid_cfg failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

void sfs_tpm_cfg_send_genquery_to_uni  (const char *buf, size_t len)
{
    typedef enum
    {
        sendgenquerytouni_target_ports=0, sendgenquerytouni_packet_num, sendgenquerytouni_max
    } sendgenquerytouni_parm_indx_t;
    // shell line parsing
    uint32_t                 packet_num;
    uint32_t                 target_ports;
    int                      parsedargs;
    int                      numparms;
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != sendgenquerytouni_max)
    {
        parm_error_completion(numparms, sendgenquerytouni_max, buf, sfs_help_send_genquery_to_uni);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "0x%x %d ", &target_ports, &packet_num);
        printk(KERN_INFO "len=%d, parsedargs=%d. target_ports[0x%x]. packet_num[%d]\n",
               len, parsedargs, target_ports, packet_num);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
        	rc = tpm_proc_send_genquery_to_uni(target_ports, packet_num);
            if (TPM_RC_OK == rc)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_send_genquery_to_uni failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_gen_5t_rule_bounce(uint32_t owner_id,
										tpm_dir_t src_dir,
										uint32_t rule_num,
										uint32_t *rule_idx,
										tpm_parse_fields_t parse_rule_bm,
										tpm_parse_flags_t parse_flags_bm,
										tpm_l4_ports_key_t *l4_key,
										tpm_ipv6_gen_acl_key_t *ipv6_gen_key,
										tpm_pkt_frwd_t *pkt_frwd,
										tpm_pkt_mod_t *pkt_mod,
										tpm_pkt_mod_bm_t pkt_mod_bm,
										tpm_rule_action_t *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd      = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd    = MV_TPM_IOCTL_ADD_IPV6_GEN_5T_RULE;
    tpm_add_acl_rule->owner_id       = owner_id;
    tpm_add_acl_rule->src_dir        = src_dir;
    tpm_add_acl_rule->rule_num       = rule_num;
    tpm_add_acl_rule->parse_rule_bm  = parse_rule_bm;
    tpm_add_acl_rule->ipv6_gen_5t_rule.parse_flags_bm = parse_flags_bm;
    tpm_add_acl_rule->ipv6_gen_5t_rule.pkt_mod_bm     = pkt_mod_bm;

	memcpy(&tpm_add_acl_rule->ipv6_gen_5t_rule.l4_key, l4_key, sizeof(tpm_l4_ports_key_t));
	memcpy(&tpm_add_acl_rule->ipv6_gen_5t_rule.ipv6_gen_key, ipv6_gen_key, sizeof(tpm_ipv6_gen_acl_key_t));
	memcpy(&tpm_add_acl_rule->ipv6_gen_5t_rule.pkt_frwd, pkt_frwd, sizeof(tpm_pkt_frwd_t));
	memcpy(&tpm_add_acl_rule->ipv6_gen_5t_rule.pkt_mod, pkt_mod, sizeof(tpm_pkt_mod_t));
	memcpy(&tpm_add_acl_rule->ipv6_gen_5t_rule.rule_action, rule_action, sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_gen_5t_rule tpm_add_ipv6_gen_5t_rule_bounce
#else
 #define _tpm_add_ipv6_gen_5t_rule tpm_add_ipv6_gen_5t_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_ipv6_gen_rule_add
*
* DESCRIPTION:
*           This function create IPv6 general rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv6_gen_5t_rule_add(const char *buf, size_t len)
{
    typedef enum {
        ipv6ruleadd_owner=0, ipv6ruleadd_srcdir,    ipv6ruleadd_rulenum,  ipv6ruleadd_parserulebm,   ipv6ruleadd_parseflagsbm,
        ipv6ruleadd_action,  ipv6ruleadd_nextphase, ipv6ruleadd_modbm,    ipv6ruleadd_ipv6l4keyname, ipv6ruleadd_ipv6genkeyname,
        ipv6ruleadd_frwdname,ipv6ruleadd_modname,   ipv6ruleadd_max
    } ipv4ruleadd_parm_indx_t;

    uint32_t            owner_id;
    tpm_dir_t           src_dir;
    uint32_t            rule_num;
    uint32_t            rule_idx;
    tpm_parse_fields_t  parse_rule_bm;
    tpm_parse_flags_t   parse_flags_bm;
    tpm_l4_ports_key_t     l4_key;
    tpm_ipv6_gen_acl_key_t ipv6_gen_key;
    tpm_pkt_frwd_t      pkt_frwd;
    tpm_pkt_mod_t       pkt_mod;
    tpm_pkt_mod_bm_t    pkt_mod_bm;
    tpm_rule_action_t   rule_action;

    tpmcfg_ipv6_l4_ports_key_entry_t *pdbipv6l4keyentry  = 0;
    tpmcfg_ipv6_gen_key_entry_t      *pdbipv6genkeyentry = 0;
    tpmcfg_frwd_entry_t              *pdbfrwdentry       = 0;
    tpmcfg_mod_entry_t               *pdbmodentry        = 0;

    tpm_error_code_t    rc;
    int                 indx;
    int                 parsedargs;
    int                 numparms;
    uint32_t            action;
    uint32_t            nextphase;
    char                srcdir_str[20];
    char                uc_srcdir_str[20];
    char                nextphase_str[20];
    char                ipv6l4keyname[30];
    char                ipv6genkeyname[30];
    char                frwdname[20];
    char                modname[20];


    numparms = count_parameters(buf);
    if (numparms != ipv6ruleadd_max)
        parm_error_completion(numparms, ipv6ruleadd_max, buf, sfs_help_ipv6_gen_5t_rule_add);
    else {
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s 0x%x %s %s %s %s",
                            &owner_id, srcdir_str, &rule_num, &parse_rule_bm, &parse_flags_bm,
                            &action, nextphase_str, &pkt_mod_bm, ipv6l4keyname, ipv6genkeyname, frwdname, modname);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], parserulebm[0x%x], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], modbm[0x%x], ipv6l4keyname[%s], ipv6genkeyname[%s], frwdname[%s], modname[%s]\n",
               len, parsedargs, owner_id, srcdir_str, rule_num, parse_rule_bm, parse_flags_bm, action, nextphase_str, pkt_mod_bm, ipv6l4keyname, ipv6genkeyname, frwdname, modname);

        for (indx = 0; indx < strlen(srcdir_str); indx++)
			uc_srcdir_str[indx] = (char)toupper(srcdir_str[indx]);

        uc_srcdir_str[strlen(srcdir_str)] = 0;

        if (parsedargs != numparms)
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        else if (get_srcdir_value(uc_srcdir_str, &src_dir) == GT_FALSE)
            printk(KERN_INFO "Invalid src_port[%s]\n", srcdir_str);
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        else if (((pdbipv6l4keyentry = find_tpm_ipv6_l4_ports_key_entry_by_name(ipv6l4keyname)) == 0) && \
                    strcmp(ipv6l4keyname, ipv6_l4_key_empty_name) != 0)
            printk(KERN_INFO "L4 ports key entry [%s] not found\n", ipv6genkeyname);
        else if (((pdbipv6genkeyentry = find_tpm_ipv6_gen_key_entry_by_name(ipv6genkeyname)) == 0) && \
                    strcmp(ipv6genkeyname, ipv6_gen_key_empty_name) != 0)
            printk(KERN_INFO "IPV6 gen key entry [%s] not found\n", ipv6genkeyname);
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && \
                    strcmp(frwdname, frwd_empty_name) != 0)
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && \
                    strcmp(modname, mod_empty_name) != 0)
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        else {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbipv6l4keyentry != 0)
                memcpy(&l4_key, &pdbipv6l4keyentry->l4_ports, sizeof(tpm_l4_ports_key_t));
            else
                memset(&l4_key, 0, sizeof(tpm_l4_ports_key_t));

            if (pdbipv6genkeyentry != 0)
                memcpy(&ipv6_gen_key, &pdbipv6genkeyentry->ipv6gen_acl, sizeof(tpm_ipv6_gen_acl_key_t));
            else
                memset(&ipv6_gen_key, 0, sizeof(tpm_ipv6_gen_acl_key_t));

            if (pdbfrwdentry != 0)
                memcpy(&pkt_frwd, &pdbfrwdentry->frwd, sizeof(tpm_pkt_frwd_t));
            else
                memset(&pkt_frwd, 0, sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)
                memcpy(&pkt_mod, &pdbmodentry->mod, sizeof(tpm_pkt_mod_t));
            else
                memset(&pkt_mod, 0, sizeof(tpm_pkt_mod_t));

            if (TPM_RC_OK == (rc = _tpm_add_ipv6_gen_5t_rule(owner_id,
                                                            src_dir,
                                                            rule_num,
                                                            &rule_idx,
                                                            parse_rule_bm,
                                                            parse_flags_bm,
                                                            &l4_key,
                                                            &ipv6_gen_key,
                                                            &pkt_frwd,
                                                            &pkt_mod,
                                                            pkt_mod_bm,
                                                            &rule_action)) )
                PR_RULE_IDX(rule_idx)
            else
                printk(KERN_INFO "%s: tpm_add_ipv6_gen_5t_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_gen_5t_rule_bounce(uint32_t        owner_id,
                                        		 uint32_t        rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_IPV6_GEN_5T_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    tpm_del_acl_rule->rule_idx      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_gen_5t_rule tpm_del_ipv6_gen_5t_rule_bounce
#else
 #define _tpm_del_ipv6_gen_5t_rule tpm_del_ipv6_gen_5t_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv6_gen_5t
*
* DESCRIPTION:
*           This function deletes a IPV6 HW gen ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv6_gen_5t(const char *buf, size_t len)
{
    typedef enum {
        noipv6gen_owner=0, noipv6gen_ruleidx, noipv6gen_max
    } noipv6genruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noipv6gen_max)
        parm_error_completion(numparms, noipv6gen_max, buf, sfs_help_no_rule_add);
    else {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",
               len, parsedargs, ownerid, rule_idx);


        if (parsedargs != numparms)
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        else {
            if ((rc = _tpm_del_ipv6_gen_5t_rule(ownerid, rule_idx)) == TPM_RC_OK)
                PR_RESULT
            else
                printk(KERN_INFO "%s: tpm_del_ipv6_gen_5t_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_dip_5t_rule_bounce(uint32_t owner_id,
												tpm_dir_t src_dir,
												uint32_t rule_num,
												uint32_t *rule_idx,
												tpm_parse_fields_t parse_rule_bm,
												tpm_parse_flags_t parse_flags_bm,
												tpm_l4_ports_key_t *l4_key,
												tpm_ipv6_gen_acl_key_t *ipv6_gen_key,
												tpm_ipv6_addr_key_t *ipv6_dip_key,
												tpm_pkt_frwd_t *pkt_frwd,
												tpm_pkt_mod_t *pkt_mod,
												tpm_pkt_mod_bm_t pkt_mod_bm,
												tpm_rule_action_t *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd      = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd    = MV_TPM_IOCTL_ADD_IPV6_DIP_5T_RULE;
    tpm_add_acl_rule->owner_id       = owner_id;
    tpm_add_acl_rule->src_dir        = src_dir;
    tpm_add_acl_rule->rule_num       = rule_num;
    tpm_add_acl_rule->parse_rule_bm  = parse_rule_bm;
    tpm_add_acl_rule->ipv6_dip_5t_rule.parse_flags_bm = parse_flags_bm;
    tpm_add_acl_rule->ipv6_dip_5t_rule.pkt_mod_bm     = pkt_mod_bm;

	memcpy(&tpm_add_acl_rule->ipv6_dip_5t_rule.l4_key, l4_key, sizeof(tpm_l4_ports_key_t));
	memcpy(&tpm_add_acl_rule->ipv6_dip_5t_rule.ipv6_gen_key, ipv6_gen_key, sizeof(tpm_ipv6_gen_acl_key_t));
	memcpy(&tpm_add_acl_rule->ipv6_dip_5t_rule.ipv6_dip_key, ipv6_dip_key, sizeof(tpm_ipv6_addr_key_t));
	memcpy(&tpm_add_acl_rule->ipv6_dip_5t_rule.pkt_frwd, pkt_frwd, sizeof(tpm_pkt_frwd_t));
	memcpy(&tpm_add_acl_rule->ipv6_dip_5t_rule.pkt_mod, pkt_mod, sizeof(tpm_pkt_mod_t));
	memcpy(&tpm_add_acl_rule->ipv6_dip_5t_rule.rule_action, rule_action, sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_dip_5t_rule tpm_add_ipv6_dip_5t_rule_bounce
#else
 #define _tpm_add_ipv6_dip_5t_rule tpm_add_ipv6_dip_5t_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_ipv6_dip_5t_rule_add
*
* DESCRIPTION:
*           This function create IPv6 general rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv6_dip_5t_rule_add(const char *buf, size_t len)
{
    typedef enum {
        ipv6ruleadd_owner=0,        ipv6ruleadd_srcdir,    ipv6ruleadd_rulenum,  ipv6ruleadd_parserulebm,   ipv6ruleadd_parseflagsbm,
        ipv6ruleadd_action,         ipv6ruleadd_nextphase, ipv6ruleadd_modbm,    ipv6ruleadd_ipv6l4keyname, ipv6ruleadd_ipv6genkeyname,
        ipv6ruleadd_ipv6dipkeyname, ipv6ruleadd_frwdname,ipv6ruleadd_modname,   ipv6ruleadd_max
    } ipv4ruleadd_parm_indx_t;

    uint32_t            owner_id;
    tpm_dir_t           src_dir;
    uint32_t            rule_num;
    uint32_t            rule_idx;
    tpm_parse_fields_t  parse_rule_bm;
    tpm_parse_flags_t   parse_flags_bm;
    tpm_l4_ports_key_t     l4_key;
    tpm_ipv6_gen_acl_key_t ipv6_gen_key;
    tpm_ipv6_addr_key_t    ipv6_dip_key;
    tpm_pkt_frwd_t      pkt_frwd;
    tpm_pkt_mod_t       pkt_mod;
    tpm_pkt_mod_bm_t    pkt_mod_bm;
    tpm_rule_action_t   rule_action;

    tpmcfg_ipv6_l4_ports_key_entry_t *pdbipv6l4keyentry  = 0;
    tpmcfg_ipv6_gen_key_entry_t      *pdbipv6genkeyentry = 0;
    tpmcfg_ipv6_dip_key_entry_t      *pdbipv6dipkeyentry = 0;
    tpmcfg_frwd_entry_t              *pdbfrwdentry       = 0;
    tpmcfg_mod_entry_t               *pdbmodentry        = 0;

    tpm_error_code_t    rc;
    int                 indx;
    int                 parsedargs;
    int                 numparms;
    uint32_t            action;
    uint32_t            nextphase;
    char                srcdir_str[20];
    char                uc_srcdir_str[20];
    char                nextphase_str[20];
    char                ipv6l4keyname[30];
    char                ipv6genkeyname[30];
    char                ipv6dipkeyname[30];
    char                frwdname[20];
    char                modname[20];


    numparms = count_parameters(buf);
    if (numparms != ipv6ruleadd_max)
        parm_error_completion(numparms, ipv6ruleadd_max, buf, sfs_help_ipv6_dip_5t_rule_add);
    else {
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s 0x%x %s %s %s %s %s",
                            &owner_id, srcdir_str, &rule_num, &parse_rule_bm, &parse_flags_bm,
                            &action, nextphase_str, &pkt_mod_bm, ipv6l4keyname, ipv6genkeyname,
                            ipv6dipkeyname, frwdname, modname);
        printk("len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], "\
			"parserulebm[0x%x], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], modbm[0x%x], "\
			"ipv6l4keyname[%s], ipv6genkeyname[%s], ipv6dipkeyname[%s], frwdname[%s], modname[%s]\n",
            len, parsedargs, owner_id, srcdir_str, rule_num,
            parse_rule_bm, parse_flags_bm, action, nextphase_str, pkt_mod_bm,
            ipv6l4keyname, ipv6genkeyname, ipv6dipkeyname, frwdname, modname);

        for (indx = 0; indx < strlen(srcdir_str); indx++)
			uc_srcdir_str[indx] = (char)toupper(srcdir_str[indx]);

        uc_srcdir_str[strlen(srcdir_str)] = 0;

        if (parsedargs != numparms)
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        else if (get_srcdir_value(uc_srcdir_str, &src_dir) == GT_FALSE)
            printk(KERN_INFO "Invalid src_port[%s]\n", srcdir_str);
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        else if (((pdbipv6l4keyentry = find_tpm_ipv6_l4_ports_key_entry_by_name(ipv6l4keyname)) == 0) && \
                    strcmp(ipv6l4keyname, ipv6_l4_key_empty_name) != 0)
            printk(KERN_INFO "L4 ports key entry [%s] not found\n", ipv6l4keyname);
        else if (((pdbipv6genkeyentry = find_tpm_ipv6_gen_key_entry_by_name(ipv6genkeyname)) == 0) && \
                    strcmp(ipv6genkeyname, ipv6_gen_key_empty_name) != 0)
            printk(KERN_INFO "IPV6 gen key entry [%s] not found\n", ipv6genkeyname);
        else if (((pdbipv6dipkeyentry = find_tpm_ipv6_dip_key_entry_by_name(ipv6dipkeyname)) == 0) && \
                    strcmp(ipv6dipkeyname, ipv6_dip_key_empty_name) != 0)
            printk(KERN_INFO "IPV6 dip key entry [%s] not found\n", ipv6dipkeyname);
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && \
                    strcmp(frwdname, frwd_empty_name) != 0)
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && \
                    strcmp(modname, mod_empty_name) != 0)
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        else {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbipv6l4keyentry != 0)
                memcpy(&l4_key, &pdbipv6l4keyentry->l4_ports, sizeof(tpm_l4_ports_key_t));
            else
                memset(&l4_key, 0, sizeof(tpm_l4_ports_key_t));

            if (pdbipv6genkeyentry != 0)
                memcpy(&ipv6_gen_key, &pdbipv6genkeyentry->ipv6gen_acl, sizeof(tpm_ipv6_gen_acl_key_t));
            else
                memset(&ipv6_gen_key, 0, sizeof(tpm_ipv6_gen_acl_key_t));

            if (pdbipv6dipkeyentry != 0)
                memcpy(&ipv6_dip_key, &pdbipv6dipkeyentry->ipv6_addr, sizeof(tpm_ipv6_addr_key_t));
            else
                memset(&ipv6_dip_key, 0, sizeof(tpm_ipv6_addr_key_t));

            if (pdbfrwdentry != 0)
                memcpy(&pkt_frwd, &pdbfrwdentry->frwd, sizeof(tpm_pkt_frwd_t));
            else
                memset(&pkt_frwd, 0, sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)
                memcpy(&pkt_mod, &pdbmodentry->mod, sizeof(tpm_pkt_mod_t));
            else
                memset(&pkt_mod, 0, sizeof(tpm_pkt_mod_t));

            if (TPM_RC_OK == (rc = _tpm_add_ipv6_dip_5t_rule(owner_id,
                                                            src_dir,
                                                            rule_num,
                                                            &rule_idx,
                                                            parse_rule_bm,
                                                            parse_flags_bm,
                                                            &l4_key,
                                                            &ipv6_gen_key,
                                                            &ipv6_dip_key,
                                                            &pkt_frwd,
                                                            &pkt_mod,
                                                            pkt_mod_bm,
                                                            &rule_action)) )
                PR_RULE_IDX(rule_idx)
            else
                printk(KERN_INFO "%s: tpm_add_ipv6_dip_5t_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_dip_5t_rule_bounce(uint32_t        owner_id,
                                        		 uint32_t        rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_IPV6_DIP_5T_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    tpm_del_acl_rule->rule_idx      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_dip_5t_rule tpm_del_ipv6_dip_5t_rule_bounce
#else
 #define _tpm_del_ipv6_dip_5t_rule tpm_del_ipv6_dip_5t_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv6_dip_5t
*
* DESCRIPTION:
*           This function deletes a IPV6 HW gen ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv6_dip_5t(const char *buf, size_t len)
{
    typedef enum {
        noipv6dip_owner=0, noipv6dip_ruleidx, noipv6dip_max
    } noipv6dipruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noipv6dip_max)
        parm_error_completion(numparms, noipv6dip_max, buf, sfs_help_no_rule_add);
    else {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",
               len, parsedargs, ownerid, rule_idx);


        if (parsedargs != numparms)
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        else {
            if ((rc = _tpm_del_ipv6_dip_5t_rule(ownerid, rule_idx)) == TPM_RC_OK)
                PR_RESULT
            else
                printk(KERN_INFO "%s: tpm_del_ipv6_dip_5t_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ipv6_l4_ports_5t_rule_bounce(uint32_t owner_id,
													tpm_dir_t src_dir,
													uint32_t rule_num,
													uint32_t *rule_idx,
													tpm_parse_fields_t parse_rule_bm,
													tpm_parse_flags_t parse_flags_bm,
													tpm_l4_ports_key_t *l4_key,
													tpm_pkt_frwd_t *pkt_frwd,
													tpm_pkt_mod_t *pkt_mod,
													tpm_pkt_mod_bm_t pkt_mod_bm,
													tpm_rule_action_t *rule_action)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd      = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd    = MV_TPM_IOCTL_ADD_IPV6_L4_PORTS_5T_RULE;
    tpm_add_acl_rule->owner_id       = owner_id;
    tpm_add_acl_rule->src_dir        = src_dir;
    tpm_add_acl_rule->rule_num       = rule_num;
    tpm_add_acl_rule->parse_rule_bm  = parse_rule_bm;
    tpm_add_acl_rule->ipv6_l4_ports_5t_rule.parse_flags_bm = parse_flags_bm;
    tpm_add_acl_rule->ipv6_l4_ports_5t_rule.pkt_mod_bm     = pkt_mod_bm;

	memcpy(&tpm_add_acl_rule->ipv6_l4_ports_5t_rule.l4_key, l4_key, sizeof(tpm_l4_ports_key_t));
	memcpy(&tpm_add_acl_rule->ipv6_l4_ports_5t_rule.pkt_frwd, pkt_frwd, sizeof(tpm_pkt_frwd_t));
	memcpy(&tpm_add_acl_rule->ipv6_l4_ports_5t_rule.pkt_mod, pkt_mod, sizeof(tpm_pkt_mod_t));
	memcpy(&tpm_add_acl_rule->ipv6_l4_ports_5t_rule.rule_action, rule_action, sizeof(tpm_rule_action_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ipv6_l4_ports_5t_rule tpm_add_ipv6_l4_ports_5t_rule_bounce
#else
 #define _tpm_add_ipv6_l4_ports_5t_rule tpm_add_ipv6_l4_ports_5t_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_ipv6_l4_ports_5t_rule_add
*
* DESCRIPTION:
*           This function create IPv6 general rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ipv6_l4_ports_5t_rule_add(const char *buf, size_t len)
{
    typedef enum {
        ipv6ruleadd_owner=0, ipv6ruleadd_srcdir,    ipv6ruleadd_rulenum,  ipv6ruleadd_parserulebm,   ipv6ruleadd_parseflagsbm,
        ipv6ruleadd_action,  ipv6ruleadd_nextphase, ipv6ruleadd_modbm,    ipv6ruleadd_ipv6l4keyname, ipv6ruleadd_frwdname,
        ipv6ruleadd_modname, ipv6ruleadd_max
    } ipv4ruleadd_parm_indx_t;

    uint32_t            owner_id;
    tpm_dir_t           src_dir;
    uint32_t            rule_num;
    uint32_t            rule_idx;
    tpm_parse_fields_t  parse_rule_bm;
    tpm_parse_flags_t   parse_flags_bm;
    tpm_l4_ports_key_t  l4_key;
    tpm_pkt_frwd_t      pkt_frwd;
    tpm_pkt_mod_t       pkt_mod;
    tpm_pkt_mod_bm_t    pkt_mod_bm;
    tpm_rule_action_t   rule_action;

    tpmcfg_ipv6_l4_ports_key_entry_t *pdbipv6l4keyentry  = 0;
    tpmcfg_frwd_entry_t              *pdbfrwdentry       = 0;
    tpmcfg_mod_entry_t               *pdbmodentry        = 0;

    tpm_error_code_t    rc;
    int                 indx;
    int                 parsedargs;
    int                 numparms;
    uint32_t            action;
    uint32_t            nextphase;
    char                srcdir_str[20];
    char                uc_srcdir_str[20];
    char                nextphase_str[20];
    char                ipv6l4keyname[30];
    char                frwdname[20];
    char                modname[20];


    numparms = count_parameters(buf);
    if (numparms != ipv6ruleadd_max)
        parm_error_completion(numparms, ipv6ruleadd_max, buf, sfs_help_ipv6_l4_ports_5t_rule_add);
    else {
        parsedargs = sscanf(buf, "%d %s %d 0x%x 0x%x 0x%x %s 0x%x %s %s %s",
                            &owner_id, srcdir_str, &rule_num, &parse_rule_bm, &parse_flags_bm,
                            &action, nextphase_str, &pkt_mod_bm, ipv6l4keyname, frwdname, modname);
        printk("len=%d, parsedargs=%d. ownerid[%d], srcport_str[%s], rulenum[%d], "\
			"parserulebm[0x%x], parseflagsbm[0x%x], action[0x%x], nextphase_str[%s], "\
			"modbm[0x%x], ipv6l4keyname[%s], frwdname[%s], modname[%s]\n",
            len, parsedargs, owner_id, srcdir_str, rule_num,
            parse_rule_bm, parse_flags_bm, action, nextphase_str,
            pkt_mod_bm, ipv6l4keyname, frwdname, modname);

        for (indx = 0; indx < strlen(srcdir_str); indx++)
			uc_srcdir_str[indx] = (char)toupper(srcdir_str[indx]);

        uc_srcdir_str[strlen(srcdir_str)] = 0;

        if (parsedargs != numparms)
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        else if (get_srcdir_value(uc_srcdir_str, &src_dir) == GT_FALSE)
            printk(KERN_INFO "Invalid src_port[%s]\n", srcdir_str);
        else if (get_phase_value(nextphase_str, &nextphase) == GT_FALSE)
            printk(KERN_INFO "Invalid next_phase[%s]\n", nextphase_str);
        else if (((pdbipv6l4keyentry = find_tpm_ipv6_l4_ports_key_entry_by_name(ipv6l4keyname)) == 0) && \
                    strcmp(ipv6l4keyname, ipv6_l4_key_empty_name) != 0)
            printk(KERN_INFO "L4 ports key entry [%s] not found\n", ipv6l4keyname);
        else if (((pdbfrwdentry = find_tpm_pkt_frwd_entry_by_name(frwdname)) == 0) && \
                    strcmp(frwdname, frwd_empty_name) != 0)
            printk(KERN_INFO "frwd entry [%s] not found\n", frwdname);
        else if (((pdbmodentry = find_tpm_mod_entry_by_name(modname)) == 0) && \
                    strcmp(modname, mod_empty_name) != 0)
            printk(KERN_INFO "mod entry [%s] not found\n", modname);
        else {
            rule_action.next_phase = nextphase;
            rule_action.pkt_act    = action;

            if (pdbipv6l4keyentry != 0)
                memcpy(&l4_key, &pdbipv6l4keyentry->l4_ports, sizeof(tpm_l4_ports_key_t));
            else
                memset(&l4_key, 0, sizeof(tpm_l4_ports_key_t));

            if (pdbfrwdentry != 0)
                memcpy(&pkt_frwd, &pdbfrwdentry->frwd, sizeof(tpm_pkt_frwd_t));
            else
                memset(&pkt_frwd, 0, sizeof(tpm_pkt_frwd_t));

            if (pdbmodentry != 0)
                memcpy(&pkt_mod, &pdbmodentry->mod, sizeof(tpm_pkt_mod_t));
            else
                memset(&pkt_mod, 0, sizeof(tpm_pkt_mod_t));

            if (TPM_RC_OK == (rc = _tpm_add_ipv6_l4_ports_5t_rule(owner_id,
	                                                            src_dir,
	                                                            rule_num,
	                                                            &rule_idx,
	                                                            parse_rule_bm,
	                                                            parse_flags_bm,
	                                                            &l4_key,
	                                                            &pkt_frwd,
	                                                            &pkt_mod,
	                                                            pkt_mod_bm,
	                                                            &rule_action)) )
                PR_RULE_IDX(rule_idx)
            else
                printk(KERN_INFO "%s: tpm_add_ipv6_l4_ports_5t_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ipv6_l4_ports_5t_rule_bounce(uint32_t        owner_id,
                                        		      uint32_t        rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_IPV6_DIP_5T_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    tpm_del_acl_rule->rule_idx      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ipv6_l4_ports_5t_rule tpm_del_ipv6_l4_ports_5t_rule_bounce
#else
 #define _tpm_del_ipv6_l4_ports_5t_rule tpm_del_ipv6_l4_ports_5t_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ipv6_l4_ports_5t
*
* DESCRIPTION:
*           This function deletes a IPV6 HW gen ACL rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ipv6_l4_ports_5t(const char *buf, size_t len)
{
    typedef enum {
        noipv6l4_owner=0, noipv6l4_ruleidx, noipv6l4_max
    } noipv6l4ruleadd_parm_indx_t;
    // shell line parsing
    unsigned int             ownerid;
    uint32_t                 rule_idx;
    int                      parsedargs;
    int                      numparms;
    // DB
    // Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != noipv6l4_max)
        parm_error_completion(numparms, noipv6l4_max, buf, sfs_help_no_rule_add);
    else {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",
               len, parsedargs, ownerid, rule_idx);


        if (parsedargs != numparms)
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        else {
            if ((rc = _tpm_del_ipv6_l4_ports_5t_rule(ownerid, rule_idx)) == TPM_RC_OK)
                PR_RESULT
            else
                printk(KERN_INFO "%s: tpm_del_ipv6_l4_ports_5t_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
        }
    }
}

/*tpm self check*/
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_rule_self_check_bounce(uint32_t owner_id,uint32_t level)
{
    tpm_ioctl_tpm_check_t *tpm_check_param = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_check_param;

    tpm_sfs_2_ioctl_command.cmd = MV_TPM_IOCTL_TPM_CHECK_SECTION;
    tpm_check_param->owner_id = owner_id;
    tpm_check_param->check_level = level;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_rule_self_check tpm_rule_self_check_bounce
#else
 #define _tpm_rule_self_check tpm_rule_self_check
#endif


/*******************************************************************************
* sfs_tpm_rule_self_check
*
* DESCRIPTION:
*           This function creates does a tpm rule check
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_rule_self_check (const char *buf, size_t len)
{
	typedef enum
	{
		tpm_self_check_owner=0, tpm_self_check_level, tpm_self_check_max
	} tpm_check_parm_indx_t;
	// shell line parsing
	uint32_t                 ownerid;
	uint32_t                 level;
	int                      parsedargs;
	int                      numparms;
	//Used in API call
	tpm_error_code_t         rc;

	numparms = count_parameters(buf);
	if (numparms != tpm_self_check_max) {
		parm_error_completion(numparms, tpm_self_check_max, buf, sfs_help_mib_reset);
	} else {
		// Get parameters
		parsedargs = sscanf(buf, "%d %d", &ownerid, &level);

		if (parsedargs != numparms) {
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		} else if (level > TPM_ENUM_MAX_CHECK_LEVEL) {
			printk(KERN_INFO "Invalid level[%d]\n", level);
		} else {
			if ((rc = _tpm_rule_self_check(ownerid, level)) != TPM_RC_OK) {
				printk(KERN_INFO "%s: tpm_rule_self_check failed, rc[%d] - %s\n",
				       __FUNCTION__, rc, get_tpm_err_str(rc));
			}
		}
	}
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_flush_vtu_bounce(uint32_t     owner_id)
{
    tpm_ioctl_flush_vtu_t *tpm_flush_vtu = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_flush_vtu;

    tpm_sfs_2_ioctl_command.cmd   = MV_TPM_IOCTL_FLUSH_VTU_SECTION;
    tpm_flush_vtu->owner_id       = owner_id;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_flush_vtu tpm_flush_vtu_bounce
#else
 #define _tpm_flush_vtu tpm_flush_vtu
#endif


/*******************************************************************************
* sfs_tpm_cfg_flush_vtu
*
* DESCRIPTION:
*           This function flush vtu of the switch
* INPUTS:
*       buf - Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_flush_vtu  (const char *buf, size_t len)
{
    typedef enum
    {
        flush_vtu_owner=0,  flush_vtu_max
    } flush_vtu_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != flush_vtu_max)
    {
        parm_error_completion(numparms, flush_vtu_max, buf, sfs_help_flush_vtu);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d", &ownerid);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d]\n", len, parsedargs, ownerid);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else
        {
            if ((rc = _tpm_flush_vtu(ownerid)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_flush_vtu failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_flush_atu_bounce(uint32_t owner_id, tpm_flush_atu_type_t flush_type, uint16_t db_num)
{
    tpm_ioctl_flush_atu_t *tpm_flush_atu = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ioctl_flush_atu;

    tpm_sfs_2_ioctl_command.cmd         = MV_TPM_IOCTL_FLUSH_ATU_SECTION;
    tpm_flush_atu->owner_id       = owner_id;
    tpm_flush_atu->flush_type     = flush_type;
    tpm_flush_atu->db_num         = db_num;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_flush_atu tpm_flush_atu_bounce
#else
 #define _tpm_flush_atu tpm_flush_atu
#endif


/*******************************************************************************
* sfs_tpm_cfg_flush_atu
*
* DESCRIPTION:
*           This function flush atu of the switch
* INPUTS:
*       buf - Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_flush_atu  (const char *buf, size_t len)
{
    typedef enum
    {
        flush_atu_owner=0, flush_atu_type, flush_atu_dbnum, flush_atu_max
    } flush_atu_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 flush_type;
    uint32_t                 db_num;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != flush_atu_max)
    {
        parm_error_completion(numparms, flush_atu_max, buf, sfs_help_flush_atu);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d %d", &ownerid, &flush_type, &db_num);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], flush_type[%d], db_num[%d]\n",
//                          len, parsedargs, ownerid, flush_type, db_num);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (flush_type > TPM_FLUSH_ATU_DYNAMIC)
        {
            printk(KERN_INFO "Invalid flush_type[%d]\n", flush_type);
        }
        else
        {
            if ((rc = _tpm_flush_atu(ownerid, flush_type, db_num)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_flush_atu failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_ctc_cm_set_ipv6_parse_win_bounce(uint32_t owner_id, tpm_ctc_cm_ipv6_parse_win_t ipv6_parse_window)
{
    tpm_ioctl_ipv6_parse_window_t *ipv6_parse_window = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_ipv6_parse_window;

    tpm_sfs_2_ioctl_command.cmd           = MV_TPM_IOCTL_SET_IPV6_CM_PARSE_WIN_SECTION;
    ipv6_parse_window->owner_id           = owner_id;
    ipv6_parse_window->ipv6_parse_window  = ipv6_parse_window;
    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_ctc_cm_set_ipv6_parse_win tpm_ctc_cm_set_ipv6_parse_win_bounce
#else
 #define _tpm_ctc_cm_set_ipv6_parse_win tpm_ctc_cm_set_ipv6_parse_win
#endif
#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_mac_learn_rule_bounce(uint32_t owner_id, tpm_l2_acl_key_t *src_mac_addr)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                   = MV_TPM_IOCTL_ADD_MAC_LEARN_ACL_RULE;
    tpm_add_acl_rule->owner_id                      = owner_id;
    memcpy(&(tpm_add_acl_rule->l2_acl_rule.l2_key), (void*)src_mac_addr, sizeof(tpm_l2_acl_key_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_mac_learn_rule tpm_add_mac_learn_rule_bounce
#else
 #define _tpm_add_mac_learn_rule tpm_add_mac_learn_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_ctc_cm_set_ipv6_parse_win
*
* DESCRIPTION:
*           This function set_ipv6_parse_win
* INPUTS:
*       buf - Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_ctc_cm_set_ipv6_parse_win  (const char *buf, size_t len)
{
    typedef enum
    {
        ctc_cm_set_ipv6_parse_win_owner=0, ctc_cm_set_ipv6_parse_win, ctc_cm_set_ipv6_parse_win_max
    } ctc_cm_set_ipv6_parse_win_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 ipv6_parse_win;
    int                      parsedargs;
    int                      numparms;
    //Used in API call
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ctc_cm_set_ipv6_parse_win_max)
    {
        parm_error_completion(numparms, ctc_cm_set_ipv6_parse_win_max, buf, sfs_help_ctc_cm_set_ipv6_parse_win);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d", &ownerid, &ipv6_parse_win);
//        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], ipv6_parse_win[%d]\n",
//                          len, parsedargs, ownerid, db_num);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (ipv6_parse_win > TPM_CTC_CM_IPv6_SECOND_24B)
        {
            printk(KERN_INFO "Invalid ipv6_parse_win[%d]\n", ipv6_parse_win);
        }
        else
        {
            if ((rc = _tpm_ctc_cm_set_ipv6_parse_win(ownerid, (tpm_ctc_cm_ipv6_parse_win_t)ipv6_parse_win)) == TPM_RC_OK)
            {
                printk(KERN_INFO "OK\n");
            }
            else
            {
                printk(KERN_INFO "%s: tpm_ctc_cm_set_ipv6_parse_win failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}
/*******************************************************************************
* sfs_tpm_cfg_set_mac_learn_rule_add
*
* DESCRIPTION:
*           This function creates a L2 mac learn rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mac_learn_rule_add(const char *buf, size_t len)
{
	typedef enum
	{
		mac_learn_add_owner=0, mac_learn_add_l2keyname, mac_learn_add_max
	} mac_learn_add_parm_indx_t;
	/* shell line parsing */
	uint32_t ownerid;
	char l2keyname[20];
	int parsedargs;
	int numparms;
	/* DB */
	tpmcfg_l2_key_entry_t *pdbl2keyentry = 0;

	/* Used in API call */
	tpm_l2_acl_key_t l2_acl;
	tpm_error_code_t rc;

	numparms = count_parameters(buf);
	if (numparms != mac_learn_add_max) {
		parm_error_completion(numparms, mac_learn_add_max, buf, sfs_help_mac_learn_rule_add);
	} else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d %s", &ownerid, l2keyname);

		if (parsedargs != numparms) {
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		} else if (((pdbl2keyentry = find_tpm_l2_key_entry_by_name(l2keyname)) == 0)) {
			printk(KERN_INFO "L2 MAC addr key entry [%s] not found\n", l2keyname);
			return;
		} else {
			memcpy(&l2_acl, &pdbl2keyentry->l2_acl, sizeof(tpm_l2_acl_key_t));
			if ((rc = _tpm_add_mac_learn_rule(ownerid, &l2_acl)) == TPM_RC_OK)
				printk("OK\n");
			else
				printk(KERN_INFO "%s: tpm_add_mac_learn_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
		}
	}
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_mac_learn_rule_bounce(uint32_t owner_id, tpm_l2_acl_key_t *src_mac_addr)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_MAC_LEARN_ACL_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    memcpy(&(tpm_del_acl_rule->l2_key), (void*)src_mac_addr, sizeof(tpm_l2_acl_key_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
#define _tpm_del_mac_learn_rule tpm_del_mac_learn_rule_bounce
#else
#define _tpm_del_mac_learn_rule tpm_del_mac_learn_rule
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_mac_learn
*
* DESCRIPTION:
*           This function deletes a L2 mac learn rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_mac_learn(const char *buf, size_t len)
{
	typedef enum
	{
		noruleadd_maclearn_owner=0, noruleadd_maclearn_l2keyname, noruleadd_maclearn_max
	} noruleadd_maclearn_parm_indx_t;
	/* shell line parsing */
	uint32_t ownerid;
	int parsedargs;
	int numparms;
	char l2keyname[20];
	tpmcfg_l2_key_entry_t *pdbl2keyentry = 0;
	/* Used in API call */
	tpm_l2_acl_key_t l2_acl;
	tpm_error_code_t rc;

	numparms = count_parameters(buf);
	if (numparms != noruleadd_maclearn_max) {
		parm_error_completion(numparms, noruleadd_maclearn_max, buf, sfs_help_no_rule_add);
	} else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d %s", &ownerid, l2keyname);

		if (parsedargs != numparms) {
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		} else if (((pdbl2keyentry = find_tpm_l2_key_entry_by_name(l2keyname)) == 0)) {
			printk(KERN_INFO "L2 MAC addr key entry [%s] not found\n", l2keyname);
			return;
		} else {
			memcpy(&l2_acl, &pdbl2keyentry->l2_acl, sizeof(tpm_l2_acl_key_t));
			if ((rc = _tpm_del_mac_learn_rule(ownerid, &l2_acl)) == TPM_RC_OK)
				printk(KERN_INFO "OK\n");
			else
				printk(KERN_INFO "%s: tpm_del_mac_learn_rule failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
		}
	}
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_mac_learn_default_rule_act_set_bounce(uint32_t owner_id, tpm_unknown_mac_conf_t mac_conf)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd   = MV_TPM_IOCTL_SET_MAC_LEARN_DEFAULT_ACTION;
    tpm_add_acl_rule->owner_id      = owner_id;
    tpm_add_acl_rule->l2_acl_rule.mac_conf = mac_conf;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
#define _tpm_mac_learn_default_rule_act_set tpm_mac_learn_default_rule_act_set_bounce
#else
#define _tpm_mac_learn_default_rule_act_set tpm_mac_learn_default_rule_act_set
#endif

/*******************************************************************************
* sfs_tpm_cfg_set_mac_learn_default_rule_action
*
* DESCRIPTION:
*           This function set the action for mac learn default rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_mac_learn_default_rule_action(const char *buf, size_t len)
{
	typedef enum
	{
		default_rule_action_owner=0, default_rule_action_act, default_rule_action_max
	} default_rule_action_parm_indx_t;
	/* shell line parsing */
	uint32_t ownerid;
	int parsedargs;
	int numparms;
	tpm_unknown_mac_conf_t mac_conf;
	/* Used in API call */
	tpm_error_code_t rc;

	numparms = count_parameters(buf);
	if (numparms != default_rule_action_max) {
		parm_error_completion(numparms, default_rule_action_max, buf, sfs_help_mac_learn_def_act_set);
	} else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d %x", &ownerid, &mac_conf);

		if (parsedargs != numparms) {
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		} else {
			if ((rc = _tpm_mac_learn_default_rule_act_set(ownerid, mac_conf)) == TPM_RC_OK)
				printk(KERN_INFO "OK\n");
			else
				printk(KERN_INFO "%s: tpm_mac_learn_default_rule_act_set failed, rc[%d] - %s\n", __FUNCTION__, rc, get_tpm_err_str(rc));
		}
	}
}

/*******************************************************************************
* sfs_tpm_cfg_set_fc
*
* DESCRIPTION:
*           This function configures SW flow control
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_fc(const char *buf, size_t len)
{
	typedef enum {
		fc_thresh_high = 0,
		fc_thresh_low,
		fc_port,
		fc_tgt_port,
		fc_tx_port,
		fc_tx_queue,
		fc_max
	} fc_parm_indx_t;
	/* shell line parsing */
	tpm_fc_cfg_t cfg;
	int parsedargs;
	int numparms;

	numparms = count_parameters(buf);
	if (numparms != fc_max)
		parm_error_completion(numparms, fc_max, buf, sfs_help_rate_limit);
	else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d %d %d %d %d %d",
				    &cfg.thresh_high, &cfg.thresh_low,
				    &cfg.port, &cfg.tx_port, &cfg.tx_queue, &cfg.tgt_port);

		if (parsedargs != numparms)
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		else {
			tpm_fc_set_config(&cfg);
			printk(KERN_INFO "OK\n");

		}
	}
}

/*******************************************************************************
* sfs_tpm_cfg_set_fc_period
*
* DESCRIPTION:
*           This function configures SW flow control engine minitoring period
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_fc_period(const char *buf, size_t len)
{
	typedef enum {
		fc_period = 0,
		fc_max
	} fc_parm_indx_t;
	/* shell line parsing */
	uint32_t period;
	int parsedargs;
	int numparms;
	MV_STATUS ret_code;

	numparms = count_parameters(buf);
	if (numparms != fc_max)
		parm_error_completion(numparms, fc_max, buf, sfs_help_rate_limit);
	else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d", &period);

		if (parsedargs != numparms)
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		else {
			ret_code = tpm_fc_set_period(period);
			if (ret_code != MV_OK)
				printk(KERN_INFO "%s: tpm_fc_set_period() failed!\n", __func__);
			else
				printk(KERN_INFO "OK\n");
		}
	}
}

#ifdef TPM_FC_DEBUG
/*******************************************************************************
* sfs_tpm_cfg_set_fc_oneshot
*
* DESCRIPTION:
*   		This function configures SW flow control engine minitoring
*   		oneshot count for statistics
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_fc_oneshot(const char *buf, size_t len)
{
	typedef enum {
		fc_oneshot = 0,
		fc_max
	} fc_parm_indx_t;
	/* shell line parsing */
	uint32_t oneshot;
	int parsedargs;
	int numparms;
	MV_STATUS ret_code;

	numparms = count_parameters(buf);
	if (numparms != fc_max)
		parm_error_completion(numparms, fc_max, buf, sfs_help_rate_limit);
	else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d", &oneshot);

		if (parsedargs != numparms)
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		else {
			ret_code = tpm_fc_set_oneshot(oneshot);
			if (ret_code != MV_OK)
				printk(KERN_INFO "%s: tpm_fc_set_oneshot() failed!\n", __func__);
			else
				printk(KERN_INFO "OK\n");
		}
	}
}
#endif

/*******************************************************************************
* sfs_tpm_cfg_fc_enable
*
* DESCRIPTION:
*   		This function configures SW flow control engine minitoring
*   		oneshot count for statistics
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len     - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_fc_enable(const char *buf, size_t len)
{
	typedef enum {
		_fc_enable = 0,
		fc_max
	} fc_parm_indx_t;
	/* shell line parsing */
	uint32_t fc_enable;
	int parsedargs;
	int numparms;
	MV_STATUS ret_code;

	numparms = count_parameters(buf);
	if (numparms != fc_max)
		parm_error_completion(numparms, fc_max, buf, sfs_help_rate_limit);
	else {
		/* Get parameters */
		parsedargs = sscanf(buf, "%d", &fc_enable);

		if (parsedargs != numparms)
			printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
		else {
			ret_code = tpm_fc_enable((fc_enable == 0) ? MV_FALSE : MV_TRUE);
			if (ret_code != MV_OK)
				printk(KERN_INFO "%s: tpm_fc_enable() failed!\n", __func__);
			else
				printk(KERN_INFO "OK\n");
		}
	}
}


#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_add_ds_load_balance_rule_bounce(uint32_t                owner_id,
                                        uint32_t                rule_num,
                                        uint32_t               *rule_idx,
                                        tpm_parse_fields_t      parse_rule_bm,
					tpm_parse_flags_t	parse_flags_bm,
                                        tpm_l2_acl_key_t       *l2_key,
                                        tpm_ds_load_balance_tgrt_t tgrt_port)
{
    tpm_ioctl_add_acl_rule_t *tpm_add_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_add_acl_rule;

    tpm_sfs_2_ioctl_command.cmd                     = MV_TPM_IOCTL_ADD_ACL_SECTION;
    tpm_add_acl_rule->add_acl_cmd                   = MV_TPM_IOCTL_ADD_DS_LOAD_BALANCE_RULE;
    tpm_add_acl_rule->owner_id                      = owner_id;
    tpm_add_acl_rule->rule_num                      = rule_num;
    tpm_add_acl_rule->parse_rule_bm                 = parse_rule_bm;
    tpm_add_acl_rule->ds_load_balance_acl_rule.parse_flags_bm = parse_flags_bm;
    tpm_add_acl_rule->ds_load_balance_acl_rule.tgrt = tgrt_port;
    memcpy(&(tpm_add_acl_rule->ds_load_balance_acl_rule.l2_key),         (void*)l2_key,      sizeof(tpm_l2_acl_key_t));

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_add_ds_load_balance_rule tpm_add_ds_load_balance_rule_bounce
#else
 #define _tpm_add_ds_load_balance_rule tpm_add_ds_load_balance_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_ds_load_balance_rule_add
*
* DESCRIPTION:
*           This function creates a ds_load_balance rule
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_ds_load_balance_rule_add  (const char *buf, size_t len)
{
    typedef enum
    {
        ds_load_blnc_ruleadd_owner=0, ds_load_blnc_ruleadd_rulenum,
	ds_load_blnc_ruleadd_parserulebm, ds_load_blnc_ruleadd_parseflagsbm,
	ds_load_blnc_ruleadd_l2keyname,
        ds_load_blnc_ruleadd_trgt, ds_load_blnc_ruleadd_max
    } ds_load_blnc_ruleadd_parm_indx_t;
    // shell line parsing
    uint32_t                 ownerid;
    uint32_t                 rulenum;
    uint32_t                 parserulebm;
    uint32_t                 parseflagsbm;
    uint32_t                 trgt;
    char                     l2keyname[20];
    int                      parsedargs;
    int                      numparms;
    // DB
    tpmcfg_l2_key_entry_t    *pdbl2keyentry = 0;
    //Used in API call
    tpm_l2_acl_key_t         l2_acl;
    uint32_t                 rule_idx;
    tpm_error_code_t         rc;

    numparms = count_parameters(buf);
    if (numparms != ds_load_blnc_ruleadd_max)
    {
        parm_error_completion(numparms, ds_load_blnc_ruleadd_max, buf, sfs_help_ds_load_balance_rule);
    }
    else
    {
        // Get parameters
        parsedargs = sscanf(buf, "%d %d 0x%x 0x%x %s %d",  &ownerid, &rulenum, &parserulebm,
                                 &parseflagsbm, l2keyname, &trgt);
        printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rulenum[%d], parserulebm[0x%x], parseflagsbm[0x%x], "
			"l2keyname[%s], trgt[%d]\n",
               len, parsedargs, ownerid, rulenum, parserulebm, parseflagsbm, l2keyname, trgt);

        if (parsedargs != numparms)
        {
            printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
        }
        else if (((pdbl2keyentry = find_tpm_l2_key_entry_by_name(l2keyname)) == 0) && strcmp(l2keyname, l2_key_empty_name) != 0)
        {
            printk(KERN_INFO "L2 key entry [%s] not found\n", l2keyname);
        }
        else
        {

            if (pdbl2keyentry != 0)  memcpy(&l2_acl, &pdbl2keyentry->l2_acl, sizeof(tpm_l2_acl_key_t));
            else                     memset(&l2_acl, 0,                      sizeof(tpm_l2_acl_key_t));

            if ((rc = _tpm_add_ds_load_balance_rule(ownerid,
                                       rulenum,
                                       &rule_idx,
                                       parserulebm,
                                       parseflagsbm,
                                       &l2_acl,
                                       trgt)) == TPM_RC_OK)
                PR_RULE_IDX(rule_idx)
            else
            {
                printk(KERN_INFO "%s: tpm_add_ds_load_balance_rule failed, rc[%d] - %s\n",
			__FUNCTION__, rc, get_tpm_err_str(rc));
            }
        }
    }
}

#ifdef CONFIG_MV_TPM_SFS_2_IOCTL
tpm_error_code_t tpm_del_ds_load_balance_rule_bounce(uint32_t        owner_id,
                                        uint32_t        rule_idx)
{
    tpm_ioctl_del_acl_rule_t *tpm_del_acl_rule = &tpm_sfs_2_ioctl_command.tpm_cmd_data.tpm_del_acl_rule;

    tpm_sfs_2_ioctl_command.cmd     = MV_TPM_IOCTL_DEL_ACL_SECTION;
    tpm_del_acl_rule->del_acl_cmd   = MV_TPM_IOCTL_DEL_DS_LOAD_BALANCE_RULE;
    tpm_del_acl_rule->owner_id      = owner_id;
    tpm_del_acl_rule->rule_idx      = rule_idx;

    up(&tpm_sfs_2_ioctl_sem);

    return TPM_RC_OK;
}
 #define _tpm_del_ds_load_balance_rule tpm_del_ds_load_balance_rule_bounce
#else
 #define _tpm_del_ds_load_balance_rule tpm_del_ds_load_balance_rule
#endif


/*******************************************************************************
* sfs_tpm_cfg_set_no_rule_add_ds_load_balance
*
* DESCRIPTION:
*           This function deletes a ds_load_balance HW rule (PNC)
* INPUTS:
*       buf	- Shell parameters as char buffer
*       len - Number of characters in buffer
*
*******************************************************************************/
void sfs_tpm_cfg_set_no_rule_add_ds_load_balance  (const char *buf, size_t len)
{
    typedef enum
    {
	noruleadd_owner=0,  noruleadd_ruleidx,	noruleadd_max
    } noruleadd_parm_indx_t;
    // shell line parsing
    uint32_t		     ownerid;
    uint32_t		     rule_idx;
    int 		     parsedargs;
    int 		     numparms;
    //Used in API call
    tpm_error_code_t	     rc;

    numparms = count_parameters(buf);
    if (numparms != noruleadd_max)
    {
	parm_error_completion(numparms, noruleadd_max, buf, sfs_help_no_rule_add);
    }
    else
    {
	// Get parameters
	parsedargs = sscanf(buf, "%d %d", &ownerid, &rule_idx);
	//printk(KERN_INFO "len=%d, parsedargs=%d. ownerid[%d], rule_idx[%d]\n",
	//	 len, parsedargs, ownerid, rule_idx);


	if (parsedargs != numparms)
	{
	    printk(KERN_INFO "Parse failure - %d/%d parameters were parsed\n", parsedargs, numparms);
	}
	else
	{
	    if ((rc = _tpm_del_ds_load_balance_rule(ownerid, rule_idx)) == TPM_RC_OK)
	    {
		printk(KERN_INFO "OK\n");
	    }
	    else
	    {
		printk(KERN_INFO "%s: tpm_del_ds_load_balance_rule failed, rc[%d] - %s\n",
			__FUNCTION__, rc, get_tpm_err_str(rc));
	    }
	}
    }
}


