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