118 lines
2 KiB
C
118 lines
2 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1993 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
slipframe.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Thomas J. Dimitri (TommyD)
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Ray Patch (raypa) 04/13/94 Modified for new WAN wrapper.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "asyncall.h"
|
||
|
|
||
|
|
||
|
VOID
|
||
|
AssembleSLIPFrame(
|
||
|
PNDIS_WAN_PACKET pFrame)
|
||
|
|
||
|
{
|
||
|
PUCHAR pOldFrame;
|
||
|
PUCHAR pNewFrame;
|
||
|
UINT dataSize;
|
||
|
UCHAR c;
|
||
|
|
||
|
//
|
||
|
// Initialize locals
|
||
|
//
|
||
|
|
||
|
pOldFrame=pFrame->CurrentBuffer;
|
||
|
|
||
|
pNewFrame =pFrame->StartBuffer;
|
||
|
|
||
|
//
|
||
|
// for quicker access, get a copy of data length field
|
||
|
//
|
||
|
dataSize=pFrame->CurrentLength;
|
||
|
|
||
|
//
|
||
|
// Now we run through the entire frame and pad it FORWARDS...
|
||
|
//
|
||
|
// <------------- new frame -----------> (could be twice as large)
|
||
|
// +-----------------------------------+
|
||
|
// | |x|
|
||
|
// +-----------------------------------+
|
||
|
// ^
|
||
|
// <---- old frame --> |
|
||
|
// +-----------------+ |
|
||
|
// | |x| |
|
||
|
// +-----------------+ |
|
||
|
// | |
|
||
|
// \-----------------/
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
// 192 is encoded as 219, 220
|
||
|
// 219 is encoded as 219, 221
|
||
|
//
|
||
|
|
||
|
*pNewFrame++ = SLIP_END_BYTE; // 192 - mark beginning of frame
|
||
|
|
||
|
//
|
||
|
// loop to remove all 192 and 219 chars
|
||
|
//
|
||
|
|
||
|
while ( dataSize-- ) {
|
||
|
|
||
|
c = *pOldFrame++;
|
||
|
|
||
|
//
|
||
|
// Check if we have to escape out this byte or not
|
||
|
//
|
||
|
|
||
|
switch (c) {
|
||
|
|
||
|
case SLIP_END_BYTE:
|
||
|
|
||
|
*pNewFrame++ = SLIP_ESC_BYTE;
|
||
|
*pNewFrame++ = SLIP_ESC_END_BYTE;
|
||
|
break;
|
||
|
|
||
|
case SLIP_ESC_BYTE:
|
||
|
*pNewFrame++ = SLIP_ESC_BYTE;
|
||
|
*pNewFrame++ = SLIP_ESC_ESC_BYTE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
*pNewFrame++ = c;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Mark end of frame
|
||
|
//
|
||
|
*pNewFrame++ = SLIP_END_BYTE;
|
||
|
|
||
|
//
|
||
|
// Calc how many bytes we expanded to including CRC
|
||
|
//
|
||
|
pFrame->CurrentLength = (ULONG)(pNewFrame - pFrame->StartBuffer);
|
||
|
|
||
|
//
|
||
|
// Put in the adjusted length -- actual num of bytes to send
|
||
|
//
|
||
|
pFrame->CurrentBuffer = pFrame->StartBuffer;
|
||
|
}
|