📄 decdirda.c
字号:
*ppOutStr += wsprintf(*ppOutStr, TEXT("Bad LM-PDU type: "));
RawDump((BYTE *) pLMHeader, pEndBuf, ppOutStr);
}
}
/*---------------------------------------------------------------------------*/
void
DumpPV(TCHAR *PVTable[], UINT PV, TCHAR **ppOutStr)
{
int i;
BOOL First = TRUE;
UINT Mask = 1;
for (i = 0; i < 16; i++)
{
if (PV & (Mask))
{
if (First)
{
*ppOutStr += wsprintf(*ppOutStr, PVTable[i]);
First = FALSE;
}
else
*ppOutStr += wsprintf(*ppOutStr, TEXT(",%s"), PVTable[i]);
}
Mask *= 2;
}
*(*ppOutStr)++ = '>';
}
/*---------------------------------------------------------------------------*/
void
DecodeNegParms(BYTE *pCurPos, BYTE *pEndBuf, TCHAR **ppOutStr)
{
int Len;
UINT Value;
while (pCurPos+2 <= pEndBuf) {
Len = *(pCurPos+1);
switch (Len) {
case 1 :
Value = (UINT) *(pCurPos+2);
break;
case 2 :
Value = (UINT) (((*(pCurPos+3)) << 8) | *(pCurPos+2));
break;
}
switch (*pCurPos)
{
case NEG_PI_BAUD:
*ppOutStr += wsprintf(*ppOutStr, TEXT("<baud:"));
DumpPV(vBaud, Value, ppOutStr);
BaudBitMask = Value;
break;
case NEG_PI_MAX_TAT:
*ppOutStr += wsprintf(*ppOutStr, TEXT("<max TAT:"));
DumpPV(vMaxTAT, Value, ppOutStr);
break;
case NEG_PI_DATA_SZ:
*ppOutStr += wsprintf(*ppOutStr, TEXT("<data size:"));
DumpPV(vDataSize, Value, ppOutStr);
break;
case NEG_PI_WIN_SZ:
*ppOutStr += wsprintf(*ppOutStr, TEXT("<win size:"));
DumpPV(vWinSize, Value, ppOutStr);
break;
case NEG_PI_BOFS:
*ppOutStr += wsprintf(*ppOutStr, TEXT("<BOFs:"));
DumpPV(vNumBofs, Value, ppOutStr);
break;
case NEG_PI_MIN_TAT:
*ppOutStr += wsprintf(*ppOutStr, TEXT("<min TAT:"));
DumpPV(vMinTAT, Value, ppOutStr);
break;
case NEG_PI_DISC_THRESH:
*ppOutStr += wsprintf(*ppOutStr, TEXT("<disc thresh:"));
DumpPV(vDiscThresh, Value, ppOutStr);
break;
default:
*ppOutStr += wsprintf(*ppOutStr, TEXT("!!BAD PARM:%02X!!"),*pCurPos);
break;
}
pCurPos += Len + 2;
}
}
/*---------------------------------------------------------------------------*/
void
DecodeXID(BYTE *FormatID, BYTE *pEndBuf, TCHAR **ppOutStr)
{
XID_DISCV_FORMAT *DiscvFormat=(XID_DISCV_FORMAT *)((BYTE *)FormatID + 1);
BYTE *NegParms = FormatID + 1;
BYTE *DiscvInfo = FormatID + sizeof(XID_DISCV_FORMAT);
switch (*FormatID)
{
case XID_DISCV_FORMAT_ID:
*ppOutStr += wsprintf(*ppOutStr, TEXT("dscv "));
if (DiscvFormat->GenNewAddr)
*ppOutStr += wsprintf(*ppOutStr, TEXT("new addr "));
*ppOutStr += wsprintf(*ppOutStr, TEXT("sa:%02X%02X%02X%02X "),
DiscvFormat->SrcAddr[0],
DiscvFormat->SrcAddr[1],
DiscvFormat->SrcAddr[2],
DiscvFormat->SrcAddr[3]);
*ppOutStr += wsprintf(*ppOutStr, TEXT("da:%02X%02X%02X%02X "),
DiscvFormat->DestAddr[0],
DiscvFormat->DestAddr[1],
DiscvFormat->DestAddr[2],
DiscvFormat->DestAddr[3]);
*ppOutStr += wsprintf(*ppOutStr, TEXT("Slot:%02X/%X "),
DiscvFormat->SlotNo,
vSlotTable[DiscvFormat->NoOfSlots]);
RawDump(DiscvInfo, pEndBuf, ppOutStr);
break;
case XID_NEGPARMS_FORMAT_ID:
*ppOutStr += wsprintf(*ppOutStr, TEXT("Neg Parms "));
DecodeNegParms(NegParms, pEndBuf, ppOutStr);
break;
}
}
/*---------------------------------------------------------------------------*/
void
BadFrame(BYTE *pFrameBuf, BYTE *pEndBuf, TCHAR **ppOutStr)
{
*ppOutStr += wsprintf(*ppOutStr, TEXT("Undefined Frame: "));
RawDump(pFrameBuf, pEndBuf, ppOutStr);
}
/*---------------------------------------------------------------------------*/
TCHAR *DecodeIRDA(int *pFrameType,// returned frame type (-1=bad frame)
BYTE *pFrameBuf, // pointer to buffer containing IRLAP frame
UINT FrameLen, // length of buffer
TCHAR *pOutStr, // string where decoded packet is placed
UINT DecodeLayer,// 1,LAP only, 2 LAP/LMP, 3, LAP/LMP/TTP
BOOL fNoConnAddr,// TRUE->Don't show connection address in str
int DispMode
)
{
UINT CRBit;
UINT PFBit;
BYTE *Addr = pFrameBuf;
BYTE *Cntl = pFrameBuf + 1;
TCHAR CRStr[] = TEXT(" ");
TCHAR PFChar = TEXT(' ');
SNRM_FORMAT *SNRMFormat = (SNRM_FORMAT *) ((BYTE *) pFrameBuf + 2);
UA_FORMAT *UAFormat = (UA_FORMAT *) ((BYTE *) pFrameBuf + 2);
UINT Nr = IRLAP_GET_NR(*Cntl);
UINT Ns = IRLAP_GET_NS(*Cntl);
BYTE *pEndBuf = pFrameBuf + FrameLen - 1;
TCHAR *First = pOutStr;
vDispMode = DispMode;
vDecodeLayer = DecodeLayer;
if ( !fNoConnAddr)
pOutStr += wsprintf(pOutStr, TEXT("ca:%02X "), IRLAP_GET_ADDR(*Addr));
CRBit = IRLAP_GET_CRBIT(*Addr);
_tcscpy(CRStr, CRBit == _IRLAP_CMD ? TEXT("cmd"):TEXT("rsp"));
PFBit = IRLAP_GET_PFBIT(*Cntl);
if (1 == PFBit)
{
if (CRBit == _IRLAP_CMD)
PFChar = 'P';
else
PFChar ='F';
}
*pFrameType = IRLAP_FRAME_TYPE(*Cntl);
switch (IRLAP_FRAME_TYPE(*Cntl))
{
case IRLAP_I_FRM:
pOutStr += wsprintf(pOutStr, TEXT("I %s %c ns:%01d nr:%01d "),
CRStr, PFChar, Ns, Nr);
DecodeIFrm(pFrameBuf + 2, pEndBuf, &pOutStr);
break;
case IRLAP_S_FRM:
*pFrameType = IRLAP_GET_SCNTL(*Cntl);
switch (IRLAP_GET_SCNTL(*Cntl))
{
case IRLAP_RR:
pOutStr += wsprintf(pOutStr, TEXT("RR %s %c nr:%01d"),
CRStr, PFChar, Nr);
break;
case IRLAP_RNR:
pOutStr += wsprintf(pOutStr, TEXT("RNR %s %c nr:%01d"),
CRStr, PFChar, Nr);
break;
case IRLAP_REJ:
pOutStr += wsprintf(pOutStr, TEXT("REJ %s %c nr:%01d"),
CRStr, PFChar, Nr);
break;
case IRLAP_SREJ:
pOutStr += wsprintf(pOutStr, TEXT("SREJ %s %c nr:%01d"),
CRStr, PFChar, Nr);
break;
default:
BadFrame(pFrameBuf, pEndBuf, &pOutStr);
}
break;
case IRLAP_U_FRM:
*pFrameType = IRLAP_GET_UCNTL(*Cntl);
switch (IRLAP_GET_UCNTL(*Cntl))
{
case IRLAP_UI:
pOutStr += wsprintf(pOutStr,TEXT("UI %s %c "),
CRStr, PFChar);
RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
break;
case IRLAP_XID_CMD:
case IRLAP_XID_RSP:
pOutStr += wsprintf(pOutStr,TEXT("XID %s %c "),
CRStr, PFChar);
DecodeXID(pFrameBuf + 2, pEndBuf, &pOutStr);
break;
case IRLAP_TEST:
pOutStr += wsprintf(pOutStr, TEXT("TEST %s %c "),
CRStr, PFChar);
pOutStr += wsprintf(pOutStr,
TEXT("sa:%02X%02X%02X%02X da:%02X%02X%02X%02X "),
UAFormat->SrcAddr[0],
UAFormat->SrcAddr[1],
UAFormat->SrcAddr[2],
UAFormat->SrcAddr[3],
UAFormat->DestAddr[0],
UAFormat->DestAddr[1],
UAFormat->DestAddr[2],
UAFormat->DestAddr[3]);
RawDump(pFrameBuf + 1 + sizeof(UA_FORMAT), pEndBuf,
&pOutStr);
break;
case IRLAP_SNRM:
if (CRBit == _IRLAP_CMD)
{
pOutStr += wsprintf(pOutStr,TEXT("SNRM %s %c "),
CRStr,PFChar);
if ((BYTE *) SNRMFormat < pEndBuf)
{
pOutStr += wsprintf(pOutStr,
TEXT("sa:%02X%02X%02X%02X da:%02X%02X%02X%02X ca:%02X "),
SNRMFormat->SrcAddr[0],
SNRMFormat->SrcAddr[1],
SNRMFormat->SrcAddr[2],
SNRMFormat->SrcAddr[3],
SNRMFormat->DestAddr[0],
SNRMFormat->DestAddr[1],
SNRMFormat->DestAddr[2],
SNRMFormat->DestAddr[3],
// CRBit stored in conn addr
// according to spec...
(SNRMFormat->ConnAddr) >>1);
DecodeNegParms(&(SNRMFormat->FirstPI),
pEndBuf, &pOutStr);
if (vDispMode == DISP_HEX || vDispMode == DISP_BOTH)
{
RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
}
}
}
else
pOutStr += wsprintf(pOutStr,
TEXT("RNRM %s %c "),CRStr,PFChar);
break;
case IRLAP_DISC:
if (CRBit == _IRLAP_CMD)
pOutStr += wsprintf(pOutStr, TEXT("DISC %s %c "),
CRStr, PFChar);
else
pOutStr += wsprintf(pOutStr, TEXT("RD %s %c "),
CRStr, PFChar);
break;
case IRLAP_UA:
pOutStr += wsprintf(pOutStr,
TEXT("UA %s %c "),CRStr,PFChar);
if ((BYTE *) UAFormat < pEndBuf)
{
pOutStr += wsprintf(pOutStr,
TEXT("sa:%02X%02X%02X%02X da:%02X%02X%02X%02X "),
UAFormat->SrcAddr[0],
UAFormat->SrcAddr[1],
UAFormat->SrcAddr[2],
UAFormat->SrcAddr[3],
UAFormat->DestAddr[0],
UAFormat->DestAddr[1],
UAFormat->DestAddr[2],
UAFormat->DestAddr[3]);
DecodeNegParms(&(UAFormat->FirstPI), pEndBuf,
&pOutStr);
if (vDispMode == DISP_HEX || vDispMode == DISP_BOTH)
{
RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
}
}
break;
case IRLAP_FRMR:
pOutStr += wsprintf(pOutStr, TEXT("FRMR %s %c "),
CRStr, PFChar);
RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
break;
case IRLAP_DM:
pOutStr += wsprintf(pOutStr, TEXT("DM %s %c "),
CRStr, PFChar);
break;
default:
BadFrame(pFrameBuf, pEndBuf, &pOutStr);
}
break;
default:
*pFrameType = -1;
BadFrame(pFrameBuf, pEndBuf, &pOutStr);
}
*pOutStr = 0;
return (First);
}
#endif // DEBUG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -