windows-nt/Source/XPSP1/NT/net/irda/irtranp/byteswap.cpp
2020-09-26 16:20:57 +08:00

142 lines
5.2 KiB
C++

//--------------------------------------------------------------------
// Copyright (C)1998 Microsoft Corporation, All Rights Reserved.
//
// byteswap.cpp
//
// Routines to byteswap SCEP and bFTP headers from the wire format
// (which is Big-Endian) to Little-Endian (Intel) format.
//
// Author:
//
// Edward Reus (EdwardR) 02-26-98 Initial coding.
//
//--------------------------------------------------------------------
#include "precomp.h"
//--------------------------------------------------------------------
// ByteSwapCommandHeader()
//
// A command header is a 28 byte sub-header embedded in some of the
// SCEP headers.
//--------------------------------------------------------------------
void ByteSwapCommandHeader( COMMAND_HEADER *pCommandHeader )
{
pCommandHeader->Length4 = ByteSwapLong(pCommandHeader->Length4);
pCommandHeader->DestPid = ByteSwapShort(pCommandHeader->DestPid);
pCommandHeader->SrcPid = ByteSwapShort(pCommandHeader->SrcPid);
pCommandHeader->CommandId = ByteSwapShort(pCommandHeader->CommandId);
}
//--------------------------------------------------------------------
// ByteSwapReqHeaderShortNonFrag()
//
// Short non-fragmented SCEP request header.
//--------------------------------------------------------------------
void ByteSwapReqHeaderShortNonFrag( SCEP_REQ_HEADER_SHORT *pReqHeaderShort )
{
pReqHeaderShort->Length3 = ByteSwapShort(pReqHeaderShort->Length3);
if (pReqHeaderShort->Length3 >= COMMAND_HEADER_SIZE)
{
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderShort->CommandHeader );
}
}
//--------------------------------------------------------------------
// ByteSwapReqHeaderLongNonFrag()
//
// Long non-fragmented SCEP request header.
//--------------------------------------------------------------------
void ByteSwapReqHeaderLongNonFrag( SCEP_REQ_HEADER_LONG *pReqHeaderLong )
{
pReqHeaderLong->Length2 = ByteSwapShort(pReqHeaderLong->Length2);
pReqHeaderLong->Length3 = ByteSwapShort(pReqHeaderLong->Length3);
if (pReqHeaderLong->Length3 >= COMMAND_HEADER_SIZE)
{
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderLong->CommandHeader );
}
}
//--------------------------------------------------------------------
// ByteSwapReqHeaderShortFrag()
//
// Short fragmented SCEP request header. SCEP PDUs can be fragmented.
//
// Note: In practice a short fragmented PDU will probably never
// show up, but its part of the spec...
//--------------------------------------------------------------------
void ByteSwapReqHeaderShortFrag(
SCEP_REQ_HEADER_SHORT_FRAG *pReqHeaderShortFrag )
{
pReqHeaderShortFrag->Length3 = ByteSwapShort(pReqHeaderShortFrag->Length3);
pReqHeaderShortFrag->SequenceNo = ByteSwapLong(pReqHeaderShortFrag->SequenceNo);
pReqHeaderShortFrag->RestNo = ByteSwapLong(pReqHeaderShortFrag->RestNo);
if ( (pReqHeaderShortFrag->Length3 >= COMMAND_HEADER_SIZE)
&& (pReqHeaderShortFrag->DFlag == DFLAG_FIRST_FRAGMENT) )
{
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderShortFrag->CommandHeader );
}
}
//--------------------------------------------------------------------
// ByteSwapReqHeaderLongFrag()
//
// Long fragmented SCEP request header.
//--------------------------------------------------------------------
void ByteSwapReqHeaderLongFrag( SCEP_REQ_HEADER_LONG_FRAG *pReqHeaderLongFrag )
{
pReqHeaderLongFrag->Length2 = ByteSwapShort(pReqHeaderLongFrag->Length2);
pReqHeaderLongFrag->Length3 = ByteSwapShort(pReqHeaderLongFrag->Length3);
pReqHeaderLongFrag->SequenceNo = ByteSwapLong(pReqHeaderLongFrag->SequenceNo);
pReqHeaderLongFrag->RestNo = ByteSwapLong(pReqHeaderLongFrag->RestNo);
if ( (pReqHeaderLongFrag->Length3 >= COMMAND_HEADER_SIZE)
&& (pReqHeaderLongFrag->DFlag == DFLAG_FIRST_FRAGMENT) )
{
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderLongFrag->CommandHeader );
}
}
//--------------------------------------------------------------------
// ByteSwapReqHeaderShort()
//
//--------------------------------------------------------------------
void ByteSwapReqHeaderShort( SCEP_REQ_HEADER_SHORT *pReqHeaderShort )
{
if ( (pReqHeaderShort->DFlag == DFLAG_SINGLE_PDU)
|| (pReqHeaderShort->DFlag == DFLAG_INTERRUPT)
|| (pReqHeaderShort->DFlag == DFLAG_CONNECT_REJECT) )
{
ByteSwapReqHeaderShortNonFrag( pReqHeaderShort );
}
else
{
ByteSwapReqHeaderShortFrag(
(SCEP_REQ_HEADER_SHORT_FRAG*)pReqHeaderShort );
}
}
//--------------------------------------------------------------------
// ByteSwapReqHeaderLong()
//
//--------------------------------------------------------------------
void ByteSwapReqHeaderLong( SCEP_REQ_HEADER_LONG *pReqHeaderLong )
{
if ( (pReqHeaderLong->DFlag == DFLAG_SINGLE_PDU)
|| (pReqHeaderLong->DFlag == DFLAG_INTERRUPT)
|| (pReqHeaderLong->DFlag == DFLAG_CONNECT_REJECT) )
{
ByteSwapReqHeaderLongNonFrag( pReqHeaderLong );
}
else
{
ByteSwapReqHeaderLongFrag(
(SCEP_REQ_HEADER_LONG_FRAG*)pReqHeaderLong );
}
}