include <stdio.h>

include "tulip.h"

include "TSCMI.h"

define _CHECK_BUFLEN_DEMAND_RETFALSE(done, total, demand) \

do { \

if ((done+demand) > total) \{ \    if (dbg_TSCPrt) \    { \        printf("[%s:%d]EPMS TotalLen not enough. total:%u, demand:%u\n", __FUNCTION__, __LINE__, (WORD32)total, (WORD32)demand); \    } \    return FALSE; \} \

} while (0)

ifdef LITTLE_ENDIAN

define _GET_NTOH16(ptrbyte) (WORD16)(((((WORD16 )(ptrbyte))>>8) & 0xff) | (((WORD16 )(ptrbyte))<<8))

define _GET_NTOH32(ptrbyte) (WORD32)(((((WORD32 )(ptrbyte))>>24) & 0xff) | ((((WORD32 )(ptrbyte))>>8) & 0xff00) | ((((WORD32 )(ptrbyte))<<8) & 0xff0000) | (((WORD32 )(ptrbyte))<<24))

define _GET_NTOH64(ptrbyte) (WORD64)(((((WORD64 )(ptrbyte)) & 0xff00000000000000) >> 56) | \

                                             (((*(WORD64 *)(ptrbyte)) & 0x00ff000000000000) >> 40) | \                                             (((*(WORD64 *)(ptrbyte)) & 0x0000ff0000000000) >> 24) | \                                             (((*(WORD64 *)(ptrbyte)) & 0x000000ff00000000) >> 8) | \                                             (((*(WORD64 *)(ptrbyte)) & 0x00000000ff000000) << 8) | \                                             (((*(WORD64 *)(ptrbyte)) & 0x0000000000ff0000) << 24) | \                                             (((*(WORD64 *)(ptrbyte)) & 0x000000000000ff00) << 40) | \                                             (((*(WORD64 *)(ptrbyte)) & 0x00000000000000ff) << 56))

define _SET_HTON16(ptrbyte, val) do {((WORD16 )(ptrbyte)) = ((((val)>>8) & 0xff) | ((val)<<8));} while (0)

define _SET_HTON32(ptrbyte, val) do {((WORD32 )(ptrbyte)) = ((((val)>>24) & 0xff) | (((val)>>8) & 0xff00) | (((val)<<8) & 0xff0000) | ((val)<<24));} while (0)

define _SET_HTON64(ptrbyte, val) do {((WORD64 )(ptrbyte)) = ((((val) & 0xff00000000000000) >> 56) | \

                                                                 (((val) & 0x00ff000000000000) >> 40) | \                                                                 (((val) & 0x0000ff0000000000) >> 24) | \                                                                 (((val) & 0x000000ff00000000) >> 8) | \                                                                 (((val) & 0x00000000ff000000) << 8) | \                                                                 (((val) & 0x0000000000ff0000) << 24) | \                                                                 (((val) & 0x000000000000ff00) << 40) | \                                                                 (((val) & 0x00000000000000ff) << 56));} while (0)

else

define _GET_NTOH16(ptrbyte) (WORD16)((WORD16 )(ptrbyte))

define _GET_NTOH32(ptrbyte) (WORD32)((WORD32 )(ptrbyte))

define _GET_NTOH64(ptrbyte) (WORD64)((WORD64 )(ptrbyte))

define _SET_HTON16(ptrbyte, val) do {((WORD16 )(ptrbyte)) = (val);} while (0)

define _SET_HTON32(ptrbyte, val) do {((WORD32 )(ptrbyte)) = (val);} while (0)

define _SET_HTON64(ptrbyte, val) do {((WORD64 )(ptrbyte)) = (val);} while (0)

endif

ifndef MAX

define MAX(x, y) (((x)>(y))?(x):(y))

endif

ifndef MIN

define MIN(x, y) (((x)<(y))?(x):(y))

endif

BOOLEAN dbg_TSCPrt = FALSE;

static void printMsgBuf(const BYTE *Buf, WORD32 BufLen)
{

_CHECK_TRUE_RETURN_VOID(!dbg_TSCPrt);_CHECK_TRUE_RETURN_VOID(NULL == Buf);printf("\n********** printMsgBuf BufLen:%u *********\n", BufLen);WORD32      i;for (i = 0; i < BufLen; i ++){    printf("%.2X  ", Buf[i]);    if (((i+1)%8) == 0)    {        printf("\n");    }}if (((i+1)%8) != 0){    printf("\n");}printf("********** printMsgBuf End *********\n\n");

}

/ EPMS /
static BOOLEAN decode_EPMS_EthernetPortParameter(const BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 4);WORD16      name = _GET_NTOH16(&Buf[done]);done        += 2;WORD16      length = _GET_NTOH16(&Buf[done]);done        += 2;_TSC_TRACE("Parameter Name:0x%X, Length:%u\n", name, length);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, length);done        += length;return TRUE;

}

static BOOLEAN decode_EPMS_EthernetPortParameter(const BYTE *Buf, WORD32 BufLen, WORD32 &done, EPMS_EthernetPortParameterTL &TL, EPMS_EthernetPortParameterV &V)
{

_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 4);TL.Name     = _GET_NTOH16(&Buf[done]);done        += 2;TL.Length   = _GET_NTOH16(&Buf[done]);done        += 2;_TSC_TRACE("Parameter Name:0x%X, Length:%u\n", TL.Name, TL.Length);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, TL.Length);switch (TL.Name){    case EPMS_ETHERNET_PORT_PARAMETER_txPropagationDelay:    {        _CHECK_TRUE_RETURN_VAL(TL.Length != 8, FALSE);        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 8);        V.txPropagationDelay.Value  = _GET_NTOH64(&Buf[done]);        _TSC_TRACE("txPropagationDelay value:%llu\n", V.txPropagationDelay.Value);        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_TraffiClassTable:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 2);        V.TrafficClassTable.IEI     = Buf[done];        V.TrafficClassTable.Length  = Buf[done+1];        _TSC_TRACE("TrafficClassTable Length:%u\n", V.TrafficClassTable.Length);        _CHECK_BUFLEN_DEMAND_RETFALSE(2, TL.Length, V.TrafficClassTable.Length);        if (V.TrafficClassTable.Length > sizeof(EPMS_TCContents))        {            _TSC_TRACE("EthernetPortParameter TraffiClassTable Length error. parameter.Length:%u, parameter.TrafficClassTable.Length:%u, EPMS_TCContents:%lu\n",                         TL.Length, V.TrafficClassTable.Length, sizeof(EPMS_TCContents));            return FALSE;        }                memcpy(&V.TrafficClassTable.TCContents, &Buf[done+2], V.TrafficClassTable.Length);        _TSC_TRACE("TrafficClassTable TCContents NumberOfTrafficClasses:%u\n", V.TrafficClassTable.TCContents.NumberOfTrafficClasses);        WORD32      i;        for (i = 0; i < MIN(V.TrafficClassTable.TCContents.NumberOfTrafficClasses, EPMS_TCINFORMATION_MAXNUM); i ++)        {            _TSC_TRACE("TrafficClassTable TCInformation[%u]:TrafficClassValue:%u, bPriorityValue:0x%X\n",                         i, V.TrafficClassTable.TCContents.TCInformation[i].TrafficClassValue,                        V.TrafficClassTable.TCContents.TCInformation[i].bPriorityValue);        }        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_GateEnabled:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 1);        V.GateEnabled   = Buf[done];        _TSC_TRACE("GateEnabled:%u\n", V.GateEnabled);        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminBaseTime:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 10);        V.AdminBaseTime.Seconds_Hi  = _GET_NTOH16(&Buf[done]);        V.AdminBaseTime.Seconds     = _GET_NTOH32(&Buf[done+2]);        V.AdminBaseTime.Nanoseconds = _GET_NTOH32(&Buf[done+6]);        _TSC_TRACE("AdminBaseTime Seconds_Hi:%u, Seconds:%u, Nanoseconds:%u\n",                     V.AdminBaseTime.Seconds_Hi, V.AdminBaseTime.Seconds, V.AdminBaseTime.Nanoseconds);        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminControlListLength:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 2);        V.AdminControlListLength    = _GET_NTOH16(&Buf[done]);        _TSC_TRACE("AdminControlListLength:%u\n", V.AdminControlListLength);        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminControlList:    {        WORD32      i;        WORD32      offset = done;        V.AdminControlLists.AdminControlListNum = MIN(TL.Length/sizeof(EPMS_AdminControlList), EPMS_ADMINCONTROLLIST_MAXNUM);        for (i = 0; i < V.AdminControlLists.AdminControlListNum; i ++)        {            _CHECK_BUFLEN_DEMAND_RETFALSE(i*sizeof(EPMS_AdminControlList), TL.Length, sizeof(EPMS_AdminControlList));            V.AdminControlLists.AdminControlList[i].GateOperationName   = Buf[offset];            V.AdminControlLists.AdminControlList[i].Length              = Buf[offset+1];            V.AdminControlLists.AdminControlList[i].bGateState          = Buf[offset+2];            V.AdminControlLists.AdminControlList[i].TimeInterval        = _GET_NTOH32(&Buf[offset+3]);            offset  += sizeof(EPMS_AdminControlList);            _TSC_TRACE("AdminControlList[%u]: GateOperationName:%u, Length:%u, bGateState:0x%X, TimeInterval:%u\n",                         i, V.AdminControlLists.AdminControlList[i].GateOperationName, V.AdminControlLists.AdminControlList[i].Length,                        V.AdminControlLists.AdminControlList[i].bGateState, V.AdminControlLists.AdminControlList[i].TimeInterval);        }        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminCycleTime:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 8);        V.AdminCycleTime.AdminCycleTimeNumerator    = _GET_NTOH32(&Buf[done]);        V.AdminCycleTime.AdminCycleTimeDenominator  = _GET_NTOH32(&Buf[done+4]);        _TSC_TRACE("AdminCycleTime AdminCycleTimeNumerator:%u, AdminCycleTimeDenominator:%u\n",                     V.AdminCycleTime.AdminCycleTimeNumerator, V.AdminCycleTime.AdminCycleTimeDenominator);        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_TickGranularity:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 4);        V.TickGranularity.Value     = _GET_NTOH32(&Buf[done]);        _TSC_TRACE("TickGranularity value:%u\n", V.TickGranularity.Value);        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_PSFPMaxStreamFilterInstances:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 4);        V.PSFPMaxStreamFilterInstances.Value    = _GET_NTOH32(&Buf[done]);        _TSC_TRACE("PSFPMaxStreamFilterInstances value:%u\n", V.PSFPMaxStreamFilterInstances.Value);        break;    }    default:    {        _TSC_TRACE("EthernetPortParameter not support! Name:0x%X\n", TL.Name);        break;    }}done        += TL.Length;return TRUE;

}

static WORD16 calc_msglen_EPMS_EthernetPortParameter(EPMS_EthernetPortParameterTL &TL, EPMS_EthernetPortParameterV &V)
{

WORD16      msglen = 0;/* Ethernet port parameter name *//* Length of Ethernet port parameter value */msglen  += 4;switch (TL.Name){    case EPMS_ETHERNET_PORT_PARAMETER_txPropagationDelay:    {        TL.Length   = 8;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_TraffiClassTable:    {            V.TrafficClassTable.IEI                                 = 0;        V.TrafficClassTable.TCContents.NumberOfTrafficClasses   = MIN(V.TrafficClassTable.TCContents.NumberOfTrafficClasses, EPMS_TCINFORMATION_MAXNUM);        V.TrafficClassTable.Length                              = 1 + V.TrafficClassTable.TCContents.NumberOfTrafficClasses * sizeof(EPMS_TCInformation);        TL.Length                                               = 2 + V.TrafficClassTable.Length;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_GateEnabled:    {        TL.Length   = 1;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminBaseTime:    {        TL.Length   = 10;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminControlListLength:    {        TL.Length   = 2;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminControlList:    {        V.AdminControlLists.AdminControlListNum = MIN(V.AdminControlLists.AdminControlListNum, EPMS_ADMINCONTROLLIST_MAXNUM);        TL.Length                               = V.AdminControlLists.AdminControlListNum * sizeof(EPMS_AdminControlList);        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminCycleTime:    {        TL.Length   = 8;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_TickGranularity:    {        TL.Length   = 4;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_PSFPMaxStreamFilterInstances:    {        TL.Length   = 4;        break;    }        default:    {        _TSC_TRACE("calc_msglen_EPMS_EthernetPortParameter not support! Name:0x%X\n", TL.Name);        TL.Length   = 0;        break;    }}msglen  += TL.Length;return msglen;

}

static WORD16 calc_msglen_EPMS_EthernetPortParameter(EPMS_EthernetPortParameterTL TL[], EPMS_EthernetPortParameterV &V, WORD32 num)
{

WORD16      msglen = 0;WORD32      i;for (i = 0; i < num; i ++){    msglen  += calc_msglen_EPMS_EthernetPortParameter(TL[i], V);}return msglen;

}

static void encode_EPMS_EthernetPortParameter(EPMS_EthernetPortParameterTL &TL, EPMS_EthernetPortParameterV &V, BYTE *Buf, WORD32 &done)
{

/* Ethernet port parameter name and length */_SET_HTON16(&Buf[done], TL.Name);done        += 2;_SET_HTON16(&Buf[done], TL.Length);done        += 2;   switch (TL.Name){    case EPMS_ETHERNET_PORT_PARAMETER_txPropagationDelay:    {        _SET_HTON64(&Buf[done], V.txPropagationDelay.Value);        done        += 8;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_TraffiClassTable:    {            /* Traffic class table IEI */        Buf[done]   = V.TrafficClassTable.IEI;        done        ++;                /* Length of traffic class table contents */        Buf[done]   = V.TrafficClassTable.Length;        done        ++;        /* Traffic class table contents */        memcpy(&Buf[done], &V.TrafficClassTable.TCContents, V.TrafficClassTable.Length);        done        += V.TrafficClassTable.Length;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_GateEnabled:    {        Buf[done]   = V.GateEnabled;        done        ++;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminBaseTime:    {        _SET_HTON16(&Buf[done], V.AdminBaseTime.Seconds_Hi);        done        += 2;        _SET_HTON32(&Buf[done], V.AdminBaseTime.Seconds);        done        += 4;        _SET_HTON32(&Buf[done], V.AdminBaseTime.Nanoseconds);        done        += 4;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminControlListLength:    {        _SET_HTON16(&Buf[done], V.AdminControlListLength);        done        += 2;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminControlList:    {        WORD32      i;                for (i = 0; i < MIN(V.AdminControlLists.AdminControlListNum, EPMS_ADMINCONTROLLIST_MAXNUM); i ++)        {            Buf[done++]     = V.AdminControlLists.AdminControlList[i].GateOperationName;            Buf[done++]     = 5;             Buf[done++]     = V.AdminControlLists.AdminControlList[i].bGateState;            _SET_HTON32(&Buf[done], V.AdminControlLists.AdminControlList[i].TimeInterval);            done        += 4;        }        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_AdminCycleTime:    {        _SET_HTON32(&Buf[done], V.AdminCycleTime.AdminCycleTimeNumerator);        done        += 4;                _SET_HTON32(&Buf[done], V.AdminCycleTime.AdminCycleTimeDenominator);        done        += 4;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_TickGranularity:    {        _SET_HTON32(&Buf[done], V.TickGranularity.Value);        done        += 4;        break;    }    case EPMS_ETHERNET_PORT_PARAMETER_PSFPMaxStreamFilterInstances:    {        _SET_HTON32(&Buf[done], V.PSFPMaxStreamFilterInstances.Value);        done        += 4;        break;    }    default:    {        _TSC_TRACE("EthernetPortParameter not support! Name:0x%X\n", TL.Name);        break;    }}

}

static void encode_EPMS_EthernetPortParameter(EPMS_EthernetPortParameterTL TL[], EPMS_EthernetPortParameterV &V, WORD32 num, BYTE *Buf, WORD32 &done)
{

WORD32      i;for (i = 0; i < num; i ++){    encode_EPMS_EthernetPortParameter(TL[i], V, Buf, done);}

}

static BOOLEAN decode_EPMS_EthernetPortManagementCapability(const BYTE *Buf, WORD32 BufLen, WORD32 &done, EPMS_EthernetPortManagementCapability &Data)
{

WORD32      i;      /* Length of Ethernet port management capability contents */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);WORD16      contentlen = _GET_NTOH16(&Buf[done]);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, contentlen);Data.SupportedParameterNum  = MIN(contentlen/sizeof(WORD16), EPMS_ETHERNETPORTMANAGEMENTCAPABILITY_MAXNUM);/* Ethernet port management capability contents */for (i = 0; i < Data.SupportedParameterNum; i ++){    Data.SupportedParameter[i]  = _GET_NTOH16(&Buf[done]);    done    += 2;}/* align content len */done    += contentlen - Data.SupportedParameterNum*sizeof(WORD16);return TRUE;

}

static BOOLEAN encode_EPMS_EthernetPortManagementCapability(EPMS_EthernetPortManagementCapability &Data, BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

WORD32      i;/* Ethernet port management capability IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_ETHERNETPORTMANAGEMENTCAPABILITY_IEI;done        ++;/* Length of Ethernet port management capability contents */Data.SupportedParameterNum  = MIN(Data.SupportedParameterNum, EPMS_ETHERNETPORTMANAGEMENTCAPABILITY_MAXNUM);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2+Data.SupportedParameterNum*2);_SET_HTON16(&Buf[done], Data.SupportedParameterNum*2);done        += 2;/* Ethernet port management capability contents */for (i = 0; i < Data.SupportedParameterNum; i ++){    _SET_HTON16(&Buf[done], Data.SupportedParameter[i]);    done        += 2;}return TRUE;

}

static BOOLEAN decode_EPMS_EthernetPortStatus(const BYTE *Buf, WORD32 BufLen, WORD32 &done, EPMS_EthernetPortStatus &Data)
{

WORD32      i;      /* Length of Ethernet port status and error contents */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);WORD16      contentlen = _GET_NTOH16(&Buf[done]);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, contentlen);/* Number of Ethernet port parameters successfully read */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        succRead = Buf[done];done        ++;Data.SuccParameterNum   = MIN(succRead, EPMS_ETHERNETPORTSTATUS_SUCC_MAXNUM);for (i = 0; i < succRead; i ++){    if (i < Data.SuccParameterNum)    {        if (!decode_EPMS_EthernetPortParameter(Buf, BufLen, done, Data.SuccParameterTL[i], Data.SuccParameterV))        {          _TSC_TRACE("decode_EPMS_EthernetPortParameter fail!\n");          return FALSE;        }    }    else    {        if (!decode_EPMS_EthernetPortParameter(Buf, BufLen, done))        {          _TSC_TRACE("decode_EPMS_EthernetPortParameter fail!\n");          return FALSE;        }    }}/* Number of Ethernet port parameters not successfully read */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        NotSuccRead = Buf[done];done        ++;Data.ErrorParameterNum  = MIN(NotSuccRead, EPMS_ETHERNETPORTSTATUS_ERROR_MAXNUM);for (i = 0; i < NotSuccRead; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        WORD16      NotSuccParaName = _GET_NTOH16(&Buf[done]);    done        += 2;    BYTE        NotSuccCause = Buf[done];    done        ++;        if (i < Data.ErrorParameterNum)    {        Data.ErrorParameter[i]  = NotSuccParaName;        Data.ErrorCause[i]      = NotSuccCause;    }}return TRUE;

}

static BOOLEAN encode_EPMS_EthernetPortStatus(EPMS_EthernetPortStatus &Data, BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

WORD32      i;/* Ethernet port status IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_ETHERNETPORTSTATUS_IEI;done        ++;/* Length of Ethernet port status and error contents */Data.SuccParameterNum      = MIN(Data.SuccParameterNum, EPMS_ETHERNETPORTSTATUS_SUCC_MAXNUM);Data.ErrorParameterNum     = MIN(Data.ErrorParameterNum, EPMS_ETHERNETPORTSTATUS_ERROR_MAXNUM);WORD16  statuslen = calc_msglen_EPMS_EthernetPortParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum);statuslen   += 2+Data.ErrorParameterNum*3;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);_SET_HTON16(&Buf[done], statuslen);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, statuslen);/* Number of Ethernet port parameters successfully read */Buf[done]   = Data.SuccParameterNum;done        ++;/* Ethernet port parameter status */encode_EPMS_EthernetPortParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum, Buf, done);/* Number of Ethernet port parameters not successfully read */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = Data.ErrorParameterNum;done        ++;/* Ethernet port parameter error */for (i = 0; i < Data.ErrorParameterNum; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        _SET_HTON16(&Buf[done], Data.ErrorParameter[i]);    done        += 2;    Buf[done]   = Data.ErrorCause[i];    done        ++;}return TRUE;

}

static BOOLEAN decode_EPMS_EthernetPortUpdateResult(const BYTE *Buf, WORD32 BufLen, WORD32 &done, EPMS_EthernetPortUpdateResult &Data)
{

WORD32      i;      /* Length of Ethernet port update and update error contents */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);WORD16      contentlen = _GET_NTOH16(&Buf[done]);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, contentlen);/* Number of Ethernet port parameters successfully updated */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        succUpdate = Buf[done];done        ++;Data.SuccParameterNum   = MIN(succUpdate, EPMS_ETHERNETPORTSTATUS_SUCC_MAXNUM);for (i = 0; i < succUpdate; i ++){    if (i < Data.SuccParameterNum)    {        if (!decode_EPMS_EthernetPortParameter(Buf, BufLen, done, Data.SuccParameterTL[i], Data.SuccParameterV))        {          _TSC_TRACE("decode_EPMS_EthernetPortParameter fail!\n");          return FALSE;        }    }    else    {        if (!decode_EPMS_EthernetPortParameter(Buf, BufLen, done))        {          _TSC_TRACE("decode_EPMS_EthernetPortParameter fail!\n");          return FALSE;        }    }}/* Number of Ethernet port parameters not updated successfully */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        NotSuccUpdate = Buf[done];done        ++;Data.ErrorParameterNum  = MIN(NotSuccUpdate, EPMS_ETHERNETPORTSTATUS_ERROR_MAXNUM);for (i = 0; i < NotSuccUpdate; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        WORD16      NotSuccParaName = _GET_NTOH16(&Buf[done]);    done        += 2;    BYTE        NotSuccCause = Buf[done];    done        ++;        if (i < Data.ErrorParameterNum)    {        Data.ErrorParameter[i]  = NotSuccParaName;        Data.ErrorCause[i]      = NotSuccCause;    }}return TRUE;

}

static BOOLEAN encode_EPMS_EthernetPortUpdateResult(EPMS_EthernetPortUpdateResult &Data, BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

WORD32      i;/* Ethernet port update result IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_ETHERNETPORTUPDATERESULT_IEI;done        ++;/* Length of Ethernet port update and update error contents */Data.SuccParameterNum   = MIN(Data.SuccParameterNum, EPMS_ETHERNETPORTUPDATERESULT_SUCC_MAXNUM);Data.ErrorParameterNum  = MIN(Data.ErrorParameterNum, EPMS_ETHERNETPORTUPDATERESULT_ERROR_MAXNUM);WORD16  updreslen = calc_msglen_EPMS_EthernetPortParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum);updreslen   += 2+Data.ErrorParameterNum*3;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);_SET_HTON16(&Buf[done], updreslen);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, updreslen);/* Number of Ethernet port parameters successfully updated */Buf[done]   = Data.SuccParameterNum;done        ++;/* Ethernet port parameter update */encode_EPMS_EthernetPortParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum, Buf, done);/* Number of Ethernet port parameters not updated successfully */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = Data.ErrorParameterNum;done        ++;/* Ethernet port parameter error */for (i = 0; i < Data.ErrorParameterNum; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        _SET_HTON16(&Buf[done], Data.ErrorParameter[i]);    done        += 2;    Buf[done]   = Data.ErrorCause[i];    done        ++;}return TRUE;

}

static BOOLEAN decode_MANAGE_ETHERNET_PORT_COMMAND(const BYTE *Buf, WORD32 BufLen, EPMS_RECV &Data)
{

WORD32      done = 1;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);/* Ethernet port management list IEI */done    ++;/* Length of Ethernet port management list contents */WORD16  listLen = _GET_NTOH16(&Buf[done]);done    += 2;_TSC_TRACE("Length of Ethernet port management list contents:%u\n", listLen);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, listLen);BufLen = done + listLen;/* Operations */EPMS_EthernetPortManagementList &listData = Data.MANAGE_ETHERNET_PORT_COMMAND.EthernetPortManagementList;for (listData.OperationNum = 0; listData.OperationNum < EPMS_ETHERNETPORTMANAGEMENTLISTOPERATION_MAXNUM; listData.OperationNum ++){    if (done == BufLen)    {        _TSC_TRACE("deal succ.\n");        return TRUE;    }        /* Operation code */    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);    BYTE    optCode = Buf[done];    listData.Operation[listData.OperationNum].OperationCode = optCode;    done    ++;    _TSC_TRACE("OperationCode:%u\n", optCode);        if (EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_GET_CAPABILITIES == optCode)    {        continue;    }    if (EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_READ_PARAMETER == optCode            || EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_SUBSCRIBE_NOTIFY_FOR_PARAMETER == optCode            || EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_UNSUBSCRIBE_FOR_PARAMETER == optCode)    {        _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);        listData.Operation[listData.OperationNum].ParameterTL.Name  = _GET_NTOH16(&Buf[done]);        done    += 2;        _TSC_TRACE("Read/Subscribe/UnSubscribe Parameter Name:0x%X\n", listData.Operation[listData.OperationNum].ParameterTL.Name);        continue;    }    if (EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_SET_PARAMETER == optCode)    {        if (!decode_EPMS_EthernetPortParameter(Buf, BufLen, done, listData.Operation[listData.OperationNum].ParameterTL, listData.OpSetParameterV))        {            _TSC_TRACE("decode_EPMS_EthernetPortParameter fail!\n");            return FALSE;        }        continue;    }        _TSC_TRACE("OperationCode not support!\n");    return FALSE;}_TSC_TRACE("list max!\n");return TRUE;

}

static BOOLEAN decode_MANAGE_ETHERNET_PORT_COMPLETE(const BYTE *Buf, WORD32 BufLen, EPMS_RECV &Data)
{

WORD32      done = 1;BYTE        IEI;while (done < BufLen){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);    IEI         = Buf[done];    done        ++;    if (EPMS_ETHERNETPORTMANAGEMENTCAPABILITY_IEI == IEI)    {        if (!decode_EPMS_EthernetPortManagementCapability(Buf, BufLen, done, Data.MANAGE_ETHERNET_PORT_COMPLETE.Capability))        {            _TSC_TRACE("decode_EPMS_EthernetPortManagementCapability fail!\n");            return FALSE;        }                Data.MANAGE_ETHERNET_PORT_COMPLETE.hasCapability    = TRUE;    }    else if (EPMS_ETHERNETPORTSTATUS_IEI == IEI)    {        if (!decode_EPMS_EthernetPortStatus(Buf, BufLen, done, Data.MANAGE_ETHERNET_PORT_COMPLETE.Status))        {            _TSC_TRACE("decode_EPMS_EthernetPortStatus fail!\n");            return FALSE;        }                Data.MANAGE_ETHERNET_PORT_COMPLETE.hasStatus        = TRUE;    }    else if (EPMS_ETHERNETPORTUPDATERESULT_IEI == IEI)    {        if (!decode_EPMS_EthernetPortUpdateResult(Buf, BufLen, done, Data.MANAGE_ETHERNET_PORT_COMPLETE.UpdateResult))        {            _TSC_TRACE("decode_EPMS_EthernetPortUpdateResult fail!\n");            return FALSE;        }                Data.MANAGE_ETHERNET_PORT_COMPLETE.hasUpdateResult  = TRUE;    }    else    {        _TSC_TRACE("IEI not support!IEI:%u\n", IEI);        return FALSE;    }};_TSC_TRACE("deal succ. done:%u,BufLen:%u\n", done, BufLen);return TRUE;

}

static BOOLEAN decode_ETHERNET_PORT_MANAGEMENT_NOTIFY(const BYTE *Buf, WORD32 BufLen, EPMS_RECV &Data)
{

WORD32      done = 1;/* Ethernet port status IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);done        ++;if (!decode_EPMS_EthernetPortStatus(Buf, BufLen, done, Data.ETHERNET_PORT_MANAGEMENT_NOTIFY.Status)){    _TSC_TRACE("decode_EPMS_EthernetPortStatus fail!\n");    return FALSE;}_TSC_TRACE("deal succ.\n");return TRUE;

}

static BOOLEAN decode_ETHERNET_PORT_MANAGEMENT_CAPABILITY(const BYTE *Buf, WORD32 BufLen, EPMS_RECV &Data)
{

WORD32      done = 1;/* Ethernet port management capability IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);done        ++;if (!decode_EPMS_EthernetPortManagementCapability(Buf, BufLen, done, Data.ETHERNET_PORT_MANAGEMENT_CAPABILITY.Capability)){    _TSC_TRACE("decode_EPMS_EthernetPortManagementCapability fail!\n");    return FALSE;}_TSC_TRACE("deal succ.\n");return TRUE;

}

/ EPMS /

/ BMS /
static BOOLEAN decode_BMS_BridgeParameter(const BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 4);WORD16      name = _GET_NTOH16(&Buf[done]);done        += 2;WORD16      length = _GET_NTOH16(&Buf[done]);done        += 2;_TSC_TRACE("Parameter Name:0x%X, Length:%u\n", name, length);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, length);done        += length;return TRUE;

}

static BOOLEAN decode_BMS_BridgeParameter(const BYTE *Buf, WORD32 BufLen, WORD32 &done, BMS_BridgeParameterTL &TL, BMS_BridgeParameterV &V)
{

_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 4);TL.Name     = _GET_NTOH16(&Buf[done]);done        += 2;TL.Length   = _GET_NTOH16(&Buf[done]);done        += 2;_TSC_TRACE("Parameter Name:0x%X, Length:%u\n", TL.Name, TL.Length);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, TL.Length);switch (TL.Name){    case BMS_BRIDGE_PARAMETER_BridgeAddress:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 6);        memcpy(V.BridgeAddress.MacAddress ,&Buf[done], 6);        _TSC_TRACE("BridgeAddress:%X %X %X %X %X %X \n",                     V.BridgeAddress.MacAddress[0], V.BridgeAddress.MacAddress[1],                    V.BridgeAddress.MacAddress[2], V.BridgeAddress.MacAddress[3],                    V.BridgeAddress.MacAddress[4], V.BridgeAddress.MacAddress[5]);        break;    }    case BMS_BRIDGE_PARAMETER_BridgeID:    {        _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 8);

ifdef LITTLE_ENDIAN

        V.BridgeID.IDDetail.Priority    = (Buf[done] >> 4) & 0x0F;        V.BridgeID.IDDetail.SystemID    = ((WORD16)(Buf[done] & 0x0F) << 8) | (WORD16)(Buf[done+1]);        memcpy(V.BridgeID.IDDetail.MacAddress, &Buf[done+2], 6);

else

        memcpy(&V.BridgeID.ID, &Buf[done], 8);

endif

        _TSC_TRACE("BridgeID Priority:%u, SystemID:%u, MacAddress:%X %X %X %X %X %X \n",                    V.BridgeID.IDDetail.Priority, V.BridgeID.IDDetail.SystemID,                    V.BridgeID.IDDetail.MacAddress[0], V.BridgeID.IDDetail.MacAddress[1],                    V.BridgeID.IDDetail.MacAddress[2], V.BridgeID.IDDetail.MacAddress[3],                    V.BridgeID.IDDetail.MacAddress[4], V.BridgeID.IDDetail.MacAddress[5]);        break;    }    case BMS_BRIDGE_PARAMETER_NWTTPortNumbers:    {        WORD32      offset = done;                _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 3);        V.NWTTPortNumbers.IEI       = Buf[offset];        offset      ++;        V.NWTTPortNumbers.Length    = _GET_NTOH16(&Buf[offset]);        V.NWTTPortNumbers.Num       = MIN(V.NWTTPortNumbers.Length/sizeof(WORD16), BMS_NWTTPORTNUMBERS_MAXNUM);        offset      += 2;        _TSC_TRACE("NWTTPortNumbers Length:%u, Num:%u\n", V.NWTTPortNumbers.Length, V.NWTTPortNumbers.Num);        WORD32      i;        for (i = 0; i < V.NWTTPortNumbers.Num; i ++)        {            _CHECK_BUFLEN_DEMAND_RETFALSE(3+i*sizeof(WORD16), TL.Length, sizeof(WORD16));            V.NWTTPortNumbers.PortNumber[i] = _GET_NTOH16(&Buf[offset]);            offset      += 2;            _TSC_TRACE("NWTTPortNumbers PortNumber[%u]:%u\n", i, V.NWTTPortNumbers.PortNumber[i]);        }        break;    }    case BMS_BRIDGE_PARAMETER_StaticFilteringEntries:    {        WORD32      offset = done;                _CHECK_BUFLEN_DEMAND_RETFALSE(0, TL.Length, 3);        V.StaticFilteringEntries.IEI    = Buf[offset];        offset      ++;        V.StaticFilteringEntries.Length = _GET_NTOH16(&Buf[offset]);        V.StaticFilteringEntries.Num    = MIN(V.StaticFilteringEntries.Length/sizeof(BMS_StaticFilteringEntry), BMS_STATICFILTERINGENTRY_MAXNUM);        offset      += 2;        _TSC_TRACE("StaticFilteringEntries Length:%u, Num:%u\n", V.StaticFilteringEntries.Length, V.StaticFilteringEntries.Num);        WORD32      i;        for (i = 0; i < V.StaticFilteringEntries.Num; i ++)        {            _CHECK_BUFLEN_DEMAND_RETFALSE(3+i*sizeof(BMS_StaticFilteringEntry), TL.Length, sizeof(BMS_StaticFilteringEntry));            memcpy(V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress, &Buf[offset], 6);            offset      += 6;            V.StaticFilteringEntries.StaticFilteringEntry[i].VID    = _GET_NTOH16(&Buf[offset]);            offset      += 2;            V.StaticFilteringEntries.StaticFilteringEntry[i].Port   = _GET_NTOH16(&Buf[offset]);            offset      += 2;            _TSC_TRACE("StaticFilteringEntry[%u] MacAddress:%X %X %X %X %X %X , VID:%u, Port:%u\n",                         i, V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress[0],                        V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress[1],                        V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress[2],                        V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress[3],                        V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress[4],                        V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress[5],                        V.StaticFilteringEntries.StaticFilteringEntry[i].VID,                        V.StaticFilteringEntries.StaticFilteringEntry[i].Port);        }        break;    }    default:    {        _TSC_TRACE("BridgeParameter not support! Name:0x%X\n", TL.Name);        break;    }}done        += TL.Length;return TRUE;

}

static WORD16 calc_msglen_BMS_BridgeParameter(BMS_BridgeParameterTL &TL, BMS_BridgeParameterV &V)
{

WORD16      msglen = 0;/* Bridge parameter name *//* Length of Bridge parameter value */msglen  += 4;switch (TL.Name){    case BMS_BRIDGE_PARAMETER_BridgeAddress:    {        TL.Length   = 6;        break;    }    case BMS_BRIDGE_PARAMETER_BridgeID:    {        TL.Length   = 8;        break;    }    case BMS_BRIDGE_PARAMETER_NWTTPortNumbers:    {            V.NWTTPortNumbers.IEI       = 0;        V.NWTTPortNumbers.Num       = MIN(V.NWTTPortNumbers.Num, BMS_NWTTPORTNUMBERS_MAXNUM);        V.NWTTPortNumbers.Length    = V.NWTTPortNumbers.Num * sizeof(WORD16);        TL.Length                   = 3 + V.NWTTPortNumbers.Length;        break;    }    case BMS_BRIDGE_PARAMETER_StaticFilteringEntries:    {        V.StaticFilteringEntries.IEI    = 0;        V.StaticFilteringEntries.Num    = MIN(V.StaticFilteringEntries.Num, BMS_STATICFILTERINGENTRY_MAXNUM);        V.StaticFilteringEntries.Length = V.StaticFilteringEntries.Num * sizeof(BMS_StaticFilteringEntry);        TL.Length                       = 3 + V.StaticFilteringEntries.Length;        break;    }    default:    {        _TSC_TRACE("calc_msglen_BMS_BridgeParameter not support! Name:0x%X\n", TL.Name);        TL.Length   = 0;        break;    }}msglen  += TL.Length;return msglen;

}

static WORD16 calc_msglen_BMS_BridgeParameter(BMS_BridgeParameterTL TL[], BMS_BridgeParameterV &V, WORD32 num)
{

WORD16      msglen = 0;WORD32      i;for (i = 0; i < num; i ++){    msglen  += calc_msglen_BMS_BridgeParameter(TL[i], V);}return msglen;

}

static void encode_BMS_BridgeParameter(BMS_BridgeParameterTL &TL, BMS_BridgeParameterV &V, BYTE *Buf, WORD32 &done)
{

/* Bridge parameter name and length */_SET_HTON16(&Buf[done], TL.Name);done        += 2;_SET_HTON16(&Buf[done], TL.Length);done        += 2;switch (TL.Name){    case BMS_BRIDGE_PARAMETER_BridgeAddress:    {        memcpy(&Buf[done], V.BridgeAddress.MacAddress, 6);        done        += 6;        break;    }    case BMS_BRIDGE_PARAMETER_BridgeID:    {

ifdef LITTLE_ENDIAN

        Buf[done]       = ((V.BridgeID.IDDetail.Priority << 4) & 0xF0) | ((V.BridgeID.IDDetail.SystemID >> 8) & 0x0F);        Buf[done+1]     = V.BridgeID.IDDetail.SystemID & 0xFF;        memcpy(&Buf[done+2], V.BridgeID.IDDetail.MacAddress, 6);

else

        memcpy(&Buf[done], &V.BridgeID.ID, 8);

endif

        done        += 8;        break;    }    case BMS_BRIDGE_PARAMETER_NWTTPortNumbers:    {        Buf[done]   = V.NWTTPortNumbers.IEI;        done        ++;        _SET_HTON16(&Buf[done], V.NWTTPortNumbers.Length);        done        += 2;        WORD32      i;        for (i = 0; i < MIN(V.NWTTPortNumbers.Num, BMS_NWTTPORTNUMBERS_MAXNUM); i ++)        {            _SET_HTON16(&Buf[done], V.NWTTPortNumbers.PortNumber[i]);            done        += 2;        }           break;    }    case BMS_BRIDGE_PARAMETER_StaticFilteringEntries:    {        Buf[done]   = V.StaticFilteringEntries.IEI;        done        ++;        _SET_HTON16(&Buf[done], V.StaticFilteringEntries.Length);        done        += 2;        WORD32      i;        for (i = 0; i < MIN(V.StaticFilteringEntries.Num, BMS_STATICFILTERINGENTRY_MAXNUM); i ++)        {            memcpy(&Buf[done], V.StaticFilteringEntries.StaticFilteringEntry[i].MacAddress, 6);            done        += 6;            _SET_HTON16(&Buf[done],  V.StaticFilteringEntries.StaticFilteringEntry[i].VID);            done        += 2;            _SET_HTON16(&Buf[done],  V.StaticFilteringEntries.StaticFilteringEntry[i].Port);            done        += 2;        }        break;    }    default:    {        _TSC_TRACE("encode_BMS_BridgeParameter not support! Name:0x%X\n", TL.Name);        break;    }}

}

static void encode_BMS_BridgeParameter(BMS_BridgeParameterTL TL[], BMS_BridgeParameterV &V, WORD32 num, BYTE *Buf, WORD32 &done)
{

WORD32      i;for (i = 0; i < num; i ++){    encode_BMS_BridgeParameter(TL[i], V, Buf, done);}

}

static BOOLEAN decode_BMS_BridgeManagementCapability(const BYTE *Buf, WORD32 BufLen, WORD32 &done, BMS_BridgeManagementCapability &Data)
{

WORD32      i;      /* Length of Bridge management capability contents */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);WORD16      contentlen = _GET_NTOH16(&Buf[done]);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, contentlen);Data.SupportedParameterNum  = MIN(contentlen/sizeof(WORD16), BMS_BRIDGEMANAGEMENTCAPABILITY_MAXNUM);/* Bridge management capability contents */for (i = 0; i < Data.SupportedParameterNum; i ++){    Data.SupportedParameter[i]  = _GET_NTOH16(&Buf[done]);    done    += 2;}/* align content len */done    += contentlen - Data.SupportedParameterNum*sizeof(WORD16);return TRUE;

}

static BOOLEAN encode_BMS_BridgeManagementCapability(BMS_BridgeManagementCapability &Data, BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

WORD32      i;/* Bridge management capability IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = BMS_BRIDGEMANAGEMENTCAPABILITY_IEI;done        ++;/* Length of Bridge management capability contents */Data.SupportedParameterNum  = MIN(Data.SupportedParameterNum, BMS_BRIDGEMANAGEMENTCAPABILITY_MAXNUM);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2+Data.SupportedParameterNum*2);_SET_HTON16(&Buf[done], Data.SupportedParameterNum*2);done        += 2;/* Bridge management capability contents */for (i = 0; i < Data.SupportedParameterNum; i ++){    _SET_HTON16(&Buf[done], Data.SupportedParameter[i]);    done        += 2;}return TRUE;

}

static BOOLEAN decode_BMS_BridgeStatus(const BYTE *Buf, WORD32 BufLen, WORD32 &done, BMS_BridgeStatus &Data)
{

WORD32      i;      /* Length of Bridge status and error contents */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);WORD16      contentlen = _GET_NTOH16(&Buf[done]);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, contentlen);/* Number of Bridge parameters successfully read */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        succRead = Buf[done];done        ++;Data.SuccParameterNum   = MIN(succRead, BMS_BRIDGESTATUS_SUCC_MAXNUM);for (i = 0; i < succRead; i ++){    if (i < Data.SuccParameterNum)    {        if (!decode_BMS_BridgeParameter(Buf, BufLen, done, Data.SuccParameterTL[i], Data.SuccParameterV))        {          _TSC_TRACE("decode_BMS_BridgeParameter fail!\n");          return FALSE;        }    }    else    {        if (!decode_BMS_BridgeParameter(Buf, BufLen, done))        {          _TSC_TRACE("decode_BMS_BridgeParameter fail!\n");          return FALSE;        }    }}/* Number of Bridge parameters not successfully read */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        NotSuccRead = Buf[done];done        ++;Data.ErrorParameterNum  = MIN(NotSuccRead, BMS_BRIDGESTATUS_ERROR_MAXNUM);for (i = 0; i < NotSuccRead; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        WORD16      NotSuccParaName = _GET_NTOH16(&Buf[done]);    done        += 2;    BYTE        NotSuccCause = Buf[done];    done        ++;        if (i < Data.ErrorParameterNum)    {        Data.ErrorParameter[i]  = NotSuccParaName;        Data.ErrorCause[i]      = NotSuccCause;    }}return TRUE;

}

static BOOLEAN encode_BMS_BridgeStatus(BMS_BridgeStatus &Data, BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

WORD32      i;/* Bridge status IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = BMS_BRIDGESTATUS_IEI;done        ++;/* Length of Bridge status and error contents */Data.SuccParameterNum      = MIN(Data.SuccParameterNum, BMS_BRIDGESTATUS_SUCC_MAXNUM);Data.ErrorParameterNum     = MIN(Data.ErrorParameterNum, BMS_BRIDGESTATUS_ERROR_MAXNUM);WORD16  statuslen = calc_msglen_BMS_BridgeParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum);statuslen   += 2+Data.ErrorParameterNum*3;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);_SET_HTON16(&Buf[done], statuslen);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, statuslen);/* Number of Bridge parameters successfully read */Buf[done]   = Data.SuccParameterNum;done        ++;/* Bridge parameter status */encode_BMS_BridgeParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum, Buf, done);/* Number of Bridge parameters not successfully read */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = Data.ErrorParameterNum;done        ++;/* Bridge parameter error */for (i = 0; i < Data.ErrorParameterNum; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        _SET_HTON16(&Buf[done], Data.ErrorParameter[i]);    done        += 2;    Buf[done]   = Data.ErrorCause[i];    done        ++;}return TRUE;

}

static BOOLEAN decode_BMS_BridgeUpdateResult(const BYTE *Buf, WORD32 BufLen, WORD32 &done, BMS_BridgeUpdateResult &Data)
{

WORD32      i;      /* Length of Bridge update and update error contents */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);WORD16      contentlen = _GET_NTOH16(&Buf[done]);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, contentlen);/* Number of Bridge parameters successfully updated */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        succUpdate = Buf[done];done        ++;Data.SuccParameterNum   = MIN(succUpdate, BMS_BRIDGESTATUS_SUCC_MAXNUM);for (i = 0; i < succUpdate; i ++){    if (i < Data.SuccParameterNum)    {        if (!decode_BMS_BridgeParameter(Buf, BufLen, done, Data.SuccParameterTL[i], Data.SuccParameterV))        {          _TSC_TRACE("decode_BMS_BridgeParameter fail!\n");          return FALSE;        }    }    else    {        if (!decode_BMS_BridgeParameter(Buf, BufLen, done))        {          _TSC_TRACE("decode_BMS_BridgeParameter fail!\n");          return FALSE;        }    }    }/* Number of Bridge parameters not updated successfully */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);BYTE        NotSuccUpdate = Buf[done];done        ++;Data.ErrorParameterNum  = MIN(NotSuccUpdate, BMS_BRIDGESTATUS_ERROR_MAXNUM);for (i = 0; i < NotSuccUpdate; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        WORD16      NotSuccParaName = _GET_NTOH16(&Buf[done]);    done        += 2;    BYTE        NotSuccCause = Buf[done];    done        ++;        if (i < Data.ErrorParameterNum)    {        Data.ErrorParameter[i]  = NotSuccParaName;        Data.ErrorCause[i]      = NotSuccCause;    }}return TRUE;

}

static BOOLEAN encode_BMS_BridgeUpdateResult(BMS_BridgeUpdateResult &Data, BYTE *Buf, WORD32 BufLen, WORD32 &done)
{

WORD32      i;/* Bridge update result IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = BMS_BRIDGEUPDATERESULT_IEI;done        ++;/* Length of Bridge update and update error contents */Data.SuccParameterNum   = MIN(Data.SuccParameterNum, BMS_BRIDGEUPDATERESULT_SUCC_MAXNUM);Data.ErrorParameterNum  = MIN(Data.ErrorParameterNum, BMS_BRIDGEUPDATERESULT_ERROR_MAXNUM);WORD16  updreslen = calc_msglen_BMS_BridgeParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum);updreslen   += 2 + Data.ErrorParameterNum * 3;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);_SET_HTON16(&Buf[done], updreslen);done        += 2;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, updreslen);/* Number of Bridge parameters successfully updated */Buf[done]   = Data.SuccParameterNum;done        ++;/* Bridge parameter update */encode_BMS_BridgeParameter(Data.SuccParameterTL, Data.SuccParameterV, Data.SuccParameterNum, Buf, done);/* Number of Bridge parameters not updated successfully */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = Data.ErrorParameterNum;done        ++;/* Bridge parameter error */for (i = 0; i < Data.ErrorParameterNum; i ++){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);        _SET_HTON16(&Buf[done], Data.ErrorParameter[i]);    done        += 2;    Buf[done]   = Data.ErrorCause[i];    done        ++;}return TRUE;

}

static BOOLEAN decode_MANAGE_BRIDGE_COMMAND(const BYTE *Buf, WORD32 BufLen, BMS_RECV &Data)
{

WORD32      done = 1;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);_CHECK_TRUE_RETURN_VAL(BufLen > 65530, FALSE);/* Bridge management list IEI */done    ++;/* Length of Bridge management list contents */WORD16  listLen = _GET_NTOH16(&Buf[done]);done    += 2;_TSC_TRACE("Length of Bridge management list contents:%u\n", listLen);_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, listLen);BufLen  = done + listLen;/* Operations */BMS_BridgeManagementList    &listData = Data.MANAGE_BRIDGE_COMMAND.BridgeManagementList;for (listData.OperationNum = 0; listData.OperationNum < BMS_BRIDGEMANAGEMENTLISTOPERATION_MAXNUM; listData.OperationNum ++){    if (done == BufLen)    {        _TSC_TRACE("deal succ.\n");        return TRUE;    }        /* Operation code */    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);    BYTE    optCode = Buf[done];    listData.Operation[listData.OperationNum].OperationCode = optCode;    done    ++;    _TSC_TRACE("OperationCode:%u\n", optCode);        if (BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_GET_CAPABILITIES == optCode)    {        continue;    }    if (BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_READ_PARAMETER == optCode            || BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_SUBSCRIBE_NOTIFY_FOR_PARAMETER == optCode            || BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_UNSUBSCRIBE_FOR_PARAMETER == optCode)    {        _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);        listData.Operation[listData.OperationNum].ParameterTL.Name  = _GET_NTOH16(&Buf[done]);        done    += 2;        _TSC_TRACE("Read/Subscribe/UnSubscribe Parameter Name:0x%X\n", listData.Operation[listData.OperationNum].ParameterTL.Name);        continue;    }    if (BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_SET_PARAMETER == optCode)    {        if (!decode_BMS_BridgeParameter(Buf, BufLen, done, listData.Operation[listData.OperationNum].ParameterTL, listData.OpSetParameterV))        {            _TSC_TRACE("decode_BMS_BridgeParameter fail!\n");            return FALSE;        }        continue;    }        _TSC_TRACE("OperationCode not support!\n");    return FALSE;}_TSC_TRACE("list max!\n");return TRUE;

}

static BOOLEAN decode_MANAGE_BRIDGE_COMPLETE(const BYTE *Buf, WORD32 BufLen, BMS_RECV &Data)
{

WORD32      done = 1;BYTE        IEI;while (done < BufLen){    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);    IEI         = Buf[done];    done        ++;    if (BMS_BRIDGEMANAGEMENTCAPABILITY_IEI == IEI)    {        if (!decode_BMS_BridgeManagementCapability(Buf, BufLen, done, Data.MANAGE_BRIDGE_COMPLETE.Capability))        {            _TSC_TRACE("decode_BMS_BridgeManagementCapability fail!\n");            return FALSE;        }                Data.MANAGE_BRIDGE_COMPLETE.hasCapability   = TRUE;    }    else if (BMS_BRIDGESTATUS_IEI == IEI)    {        if (!decode_BMS_BridgeStatus(Buf, BufLen, done, Data.MANAGE_BRIDGE_COMPLETE.Status))        {            _TSC_TRACE("decode_BMS_BridgeStatus fail!\n");            return FALSE;        }                Data.MANAGE_BRIDGE_COMPLETE.hasStatus       = TRUE;    }    else if (BMS_BRIDGEUPDATERESULT_IEI == IEI)    {        if (!decode_BMS_BridgeUpdateResult(Buf, BufLen, done, Data.MANAGE_BRIDGE_COMPLETE.UpdateResult))        {            _TSC_TRACE("decode_BMS_BridgeUpdateResult fail!\n");            return FALSE;        }                Data.MANAGE_BRIDGE_COMPLETE.hasUpdateResult = TRUE;    }    else    {        _TSC_TRACE("IEI not support!IEI:%u\n", IEI);        return FALSE;    }};_TSC_TRACE("deal succ. done:%u,BufLen:%u\n", done, BufLen);return TRUE;

}

static BOOLEAN decode_BRIDGE_MANAGEMENT_NOTIFY(const BYTE *Buf, WORD32 BufLen, BMS_RECV &Data)
{

WORD32      done = 1;/* Bridge status IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);done        ++;if (!decode_BMS_BridgeStatus(Buf, BufLen, done, Data.BRIDGE_MANAGEMENT_NOTIFY.Status)){    _TSC_TRACE("decode_BMS_BridgeStatus fail!\n");    return FALSE;}_TSC_TRACE("deal succ.\n");return TRUE;

}

/ BMS /

extern "C" {

BOOLEAN Encode_EPMS_MANAGE_ETHERNET_PORT_COMMAND(EPMS_MANAGE_ETHERNET_PORT_COMMAND Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;WORD32      i;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_MESSAGE_TYPE_MANAGE_ETHERNET_PORT_COMMAND;done        ++;/* Ethernet port management list IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);Buf[done]   = 0;done        ++;/* Length of Ethernet port management list contents */WORD32      listLenOffset = done;_SET_HTON16(&Buf[done], 0); /* set after process */done        += 2;/* Ethernet port management list contents */EPMS_EthernetPortManagementList &listData = Data->EthernetPortManagementList;listData.OperationNum   = MIN(listData.OperationNum, EPMS_ETHERNETPORTMANAGEMENTLISTOPERATION_MAXNUM);for (i = 0; i < listData.OperationNum; i ++){    /* Operation code */    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);    BYTE    optCode = listData.Operation[i].OperationCode;    Buf[done]   = optCode;    done        ++;    if (EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_GET_CAPABILITIES == optCode)    {        continue;    }        if (EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_READ_PARAMETER == optCode            || EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_SUBSCRIBE_NOTIFY_FOR_PARAMETER == optCode            || EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_UNSUBSCRIBE_FOR_PARAMETER == optCode)    {        _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);        _SET_HTON16(&Buf[done], listData.Operation[i].ParameterTL.Name);        done    += 2;        continue;    }        if (EPMS_ETHERNET_PORT_MANAGEMENT_LIST_OPTCODE_SET_PARAMETER == optCode)    {        WORD16  statuslen = calc_msglen_EPMS_EthernetPortParameter(listData.Operation[i].ParameterTL, listData.OpSetParameterV);        _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, statuslen);        encode_EPMS_EthernetPortParameter(listData.Operation[i].ParameterTL, listData.OpSetParameterV, Buf, done);        continue;    }}/* set real list contents */_SET_HTON16(&Buf[listLenOffset], done-listLenOffset-2); *MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_EPMS_MANAGE_ETHERNET_PORT_COMPLETE(EPMS_MANAGE_ETHERNET_PORT_COMPLETE Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_MESSAGE_TYPE_MANAGE_ETHERNET_PORT_COMPLETE;done        ++;if (Data->hasCapability){    if (!encode_EPMS_EthernetPortManagementCapability(Data->Capability, Buf, BufLen, done))    {        _TSC_TRACE("encode_EPMS_EthernetPortManagementCapability fail!\n");        return FALSE;    }  }if (Data->hasStatus){    if (!encode_EPMS_EthernetPortStatus(Data->Status, Buf, BufLen, done))    {        _TSC_TRACE("encode_EPMS_EthernetPortStatus fail!\n");        return FALSE;    }}if (Data->hasUpdateResult){    if (!encode_EPMS_EthernetPortUpdateResult(Data->UpdateResult, Buf, BufLen, done))    {        _TSC_TRACE("encode_EPMS_EthernetPortUpdateResult fail!\n");        return FALSE;    }}*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_EPMS_ETHERNET_PORT_MANAGEMENT_NOTIFY(EPMS_ETHERNET_PORT_MANAGEMENT_NOTIFY Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_NOTIFY;done        ++;if (!encode_EPMS_EthernetPortStatus(Data->Status, Buf, BufLen, done)){    _TSC_TRACE("encode_EPMS_EthernetPortStatus fail!\n");    return FALSE;}*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_EPMS_ETHERNET_PORT_MANAGEMENT_NOTIFY_ACK(EPMS_ETHERNET_PORT_MANAGEMENT_NOTIFY_ACK Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_NOTIFY_ACK;done        ++;*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_EPMS_ETHERNET_PORT_MANAGEMENT_NOTIFY_COMPLETE(EPMS_ETHERNET_PORT_MANAGEMENT_NOTIFY_COMPLETE Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_NOTIFY_COMPLETE;done        ++;*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_EPMS_ETHERNET_PORT_MANAGEMENT_CAPABILITY(EPMS_ETHERNET_PORT_MANAGEMENT_CAPABILITY Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_CAPABILITY;done        ++;if (!encode_EPMS_EthernetPortManagementCapability(Data->Capability, Buf, BufLen, done)){    _TSC_TRACE("encode_EPMS_EthernetPortManagementCapability fail!\n");    return FALSE;}*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Decode_EPMS_RecvData(const BYTE Buf, WORD32 BufLen, EPMS_RECV Data)
{

_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_TSC_TRACE("recv EPMS\n");printMsgBuf(Buf, BufLen);memset(Data, 0, sizeof(EPMS_RECV));/* message identity */_CHECK_BUFLEN_DEMAND_RETFALSE(0, BufLen, 1);Data->MessageIdentity   = Buf[0];_TSC_TRACE("recv MessageIdentity:%u\n", Data->MessageIdentity);switch (Buf[0]){    case EPMS_MESSAGE_TYPE_MANAGE_ETHERNET_PORT_COMMAND:    {        if (!decode_MANAGE_ETHERNET_PORT_COMMAND(Buf, BufLen, *Data))        {            _TSC_TRACE("decode fail!\n");            return FALSE;        }        break;    }    case EPMS_MESSAGE_TYPE_MANAGE_ETHERNET_PORT_COMPLETE:    {        if (!decode_MANAGE_ETHERNET_PORT_COMPLETE(Buf, BufLen, *Data))        {            _TSC_TRACE("decode fail!\n");            return FALSE;        }        break;    }    case EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_NOTIFY:    {        if (!decode_ETHERNET_PORT_MANAGEMENT_NOTIFY(Buf, BufLen, *Data))        {            _TSC_TRACE("decode fail!\n");            return FALSE;        }        break;    }    case EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_NOTIFY_ACK:    case EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_NOTIFY_COMPLETE:    {        break;    }    case EPMS_MESSAGE_TYPE_ETHERNET_PORT_MANAGEMENT_CAPABILITY:    {        if (!decode_ETHERNET_PORT_MANAGEMENT_CAPABILITY(Buf, BufLen, *Data))        {            _TSC_TRACE("decode fail!\n");            return FALSE;        }        break;    }    default:    {        _TSC_TRACE("recv EPMS MessageIdentity not support. MessageIdentity:%u\n", Buf[0]);        return FALSE;        break;    }}_TSC_TRACE("deal succ.\n");return TRUE;

}

BOOLEAN Encode_BMS_MANAGE_BRIDGE_COMMAND(BMS_MANAGE_BRIDGE_COMMAND Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;WORD32      i;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = BMS_MESSAGE_TYPE_MANAGE_BRIDGE_COMMAND;done        ++;/* Bridge management list IEI */_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 3);Buf[done]   = 0;done        ++;/* Length of Bridge management list contents */WORD32      listLenOffset = done;_SET_HTON16(&Buf[done], 0); /* set after process */done        += 2;/* Bridge management list contents */BMS_BridgeManagementList &listData = Data->BridgeManagementList;listData.OperationNum   = MIN(listData.OperationNum, BMS_BRIDGEMANAGEMENTLISTOPERATION_MAXNUM);for (i = 0; i < listData.OperationNum; i ++){    /* Operation code */    _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);    BYTE    optCode = listData.Operation[i].OperationCode;    Buf[done]   = optCode;    done        ++;    if (BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_GET_CAPABILITIES == optCode)    {        continue;    }        if (BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_READ_PARAMETER == optCode            || BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_SUBSCRIBE_NOTIFY_FOR_PARAMETER == optCode            || BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_UNSUBSCRIBE_FOR_PARAMETER == optCode)    {        _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 2);        _SET_HTON16(&Buf[done], listData.Operation[i].ParameterTL.Name);        done    += 2;        continue;    }        if (BMS_BRIDGE_MANAGEMENT_LIST_OPTCODE_SET_PARAMETER == optCode)    {        WORD16  statuslen = calc_msglen_BMS_BridgeParameter(listData.Operation[i].ParameterTL, listData.OpSetParameterV);        _CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, statuslen);        encode_BMS_BridgeParameter(listData.Operation[i].ParameterTL, listData.OpSetParameterV, Buf, done);        continue;    }}/* set real list contents */_SET_HTON16(&Buf[listLenOffset], done-listLenOffset-2); *MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_BMS_MANAGE_BRIDGE_COMPLETE(BMS_MANAGE_BRIDGE_COMPLETE Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = BMS_MESSAGE_TYPE_MANAGE_BRIDGE_COMPLETE;done        ++;if (Data->hasCapability){    if (!encode_BMS_BridgeManagementCapability(Data->Capability, Buf, BufLen, done))    {        _TSC_TRACE("encode_BMS_BridgeManagementCapability fail!\n");        return FALSE;    }  }if (Data->hasStatus){    if (!encode_BMS_BridgeStatus(Data->Status, Buf, BufLen, done))    {        _TSC_TRACE("encode_BMS_BridgeStatus fail!\n");        return FALSE;    }}if (Data->hasUpdateResult){    if (!encode_BMS_BridgeUpdateResult(Data->UpdateResult, Buf, BufLen, done))    {        _TSC_TRACE("encode_BMS_BridgeUpdateResult fail!\n");        return FALSE;    }}*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_BMS_BRIDGE_MANAGEMENT_NOTIFY(BMS_BRIDGE_MANAGEMENT_NOTIFY Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = BMS_MESSAGE_TYPE_BRIDGE_MANAGEMENT_NOTIFY;done        ++;if (!encode_BMS_BridgeStatus(Data->Status, Buf, BufLen, done)){    _TSC_TRACE("encode_BMS_BridgeStatus fail!\n");    return FALSE;}*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Encode_BMS_BRIDGE_MANAGEMENT_NOTIFY_ACK(BMS_BRIDGE_MANAGEMENT_NOTIFY_ACK Data, BYTE Buf, WORD32 BufLen, WORD32 *MsgLen)
{

_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == MsgLen, FALSE);/* message identity */WORD32      done = 0;_CHECK_BUFLEN_DEMAND_RETFALSE(done, BufLen, 1);Buf[done]   = BMS_MESSAGE_TYPE_BRIDGE_MANAGEMENT_NOTIFY_ACK;done        ++;*MsgLen = done;_TSC_TRACE("deal succ.\n");printMsgBuf(Buf, *MsgLen);return TRUE;

}

BOOLEAN Decode_BMS_RecvData(const BYTE Buf, WORD32 BufLen, BMS_RECV Data)
{

_CHECK_TRUE_RETURN_VAL(NULL == Buf, FALSE);_CHECK_TRUE_RETURN_VAL(NULL == Data, FALSE);_TSC_TRACE("recv BMS\n");printMsgBuf(Buf, BufLen);memset(Data, 0, sizeof(BMS_RECV));/* message identity */_CHECK_BUFLEN_DEMAND_RETFALSE(0, BufLen, 1);Data->MessageIdentity   = Buf[0];_TSC_TRACE("recv MessageIdentity:%u\n", Data->MessageIdentity);switch (Buf[0]){    case BMS_MESSAGE_TYPE_MANAGE_BRIDGE_COMMAND:    {        if (!decode_MANAGE_BRIDGE_COMMAND(Buf, BufLen, *Data))        {            _TSC_TRACE("decode fail!\n");            return FALSE;        }        break;    }    case BMS_MESSAGE_TYPE_MANAGE_BRIDGE_COMPLETE:    {        if (!decode_MANAGE_BRIDGE_COMPLETE(Buf, BufLen, *Data))        {            _TSC_TRACE("decode fail!\n");            return FALSE;        }        break;    }    case BMS_MESSAGE_TYPE_BRIDGE_MANAGEMENT_NOTIFY:    {        if (!decode_BRIDGE_MANAGEMENT_NOTIFY(Buf, BufLen, *Data))        {            _TSC_TRACE("decode fail!\n");            return FALSE;        }        break;    }    case BMS_MESSAGE_TYPE_BRIDGE_MANAGEMENT_NOTIFY_ACK:    {            break;    }    default:    {        _TSC_TRACE("recv BMS MessageIdentity not support. MessageIdentity:%u\n", Buf[0]);        return FALSE;        break;    }}_TSC_TRACE("deal succ.\n");return TRUE;

}

void tscopen(void)
{

dbg_TSCPrt    = TRUE;

}

void tscclose(void)
{

dbg_TSCPrt    = FALSE;

}

}