a question on passthru

hi,

I want to make an IPIP encapsulation in protocolreceive() function in protocol.c file under windows CE4.2. My NIC is RTL8139, and I could only have pvLookAheadbuffer and the pRecvPacket is NULL. In order to implement IPIP encapsulation, I have write a function named ProtocolEncapIpv4WithoutPpacket() as follows.
I want to know why I could ping long time if I substitute pvLookAheadBuffer with pData(no encapsulation, please see the code below); but if encapsulation is made, I could ping about 3 minutes, and then the network will crash. the following is some of my code(Please notice the variable in red):

thanks very much!!!

Chenwei
2005-8-8


NDIS_STATUS
ProtocolEncapIpv4WithoutPpacket(
IN BINDING* pBinding,
IN NDIS_HANDLE hMacReceiveContext,
IN PVOID pvHeaderBuffer,
IN UINT uiHeaderBufferSize,
IN PVOID pvLookAheadBuffer,
IN UINT uiLookAheadBufferSize,
IN UINT uiPacketSize
)
/*++
Routine Description:
Encapsulate IPv4 Packet.
Arguments:

Return Value:
NDIS_STATUS_SUCCESS if we processed the encapsulation successfully,
NDIS_STATUS_XXX error code if we discarded it.

–*/
{
//***********************************************************
//added by tong
//***********************************************************

NDIS_STATUS status = NDIS_STATUS_SUCCESS;
UINT PacketSize;
PUCHAR pData = NULL;
PUCHAR pEncapData = NULL;
PUCHAR pUnEncapData = NULL;
PUCHAR pIpHeader = NULL;
PUCHAR pIpHeader2 = NULL;

UINT j;

ULONG cksum = 0;
UINT size = 20;

typedef struct
{
UCHAR ip_ihl:4,ip_version:4;
UCHAR ip_tos;
USHORT ip_totallength;
USHORT ip_id;
USHORT ip_offset;
UCHAR ip_ttl;
UCHAR ip_protocol;
USHORT ip_checksum;
UINT ip_srcaddr;
UINT ip_destaddr;
}ip_header;

ip_header * myhead= NULL;
ip_header * myhead2= NULL;

NDIS_PHYSICAL_ADDRESS noMaxAddr= NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);

//total length of this packet

PacketSize = uiHeaderBufferSize + uiLookAheadBufferSize;

if(PacketSize <= (1514-20))
{
//copy this packet to pData

status = NdisAllocateMemory( (PVOID *)&pData, uiLookAheadBufferSize, 0, noMaxAddr);
if(status != NDIS_STATUS_SUCCESS) return 1;
NdisZeroMemory (pData, uiLookAheadBufferSize);

NdisMoveMemory(pData, pvLookAheadBuffer, uiLookAheadBufferSize);

//***********************************************************

//UnEncapsulate

if( ((UCHAR *)pData)[9] == 4)
{
status= NdisAllocateMemory((PVOID *)&pUnEncapData, uiLookAheadBufferSize-20, 0,noMaxAddr);
if (status!=NDIS_STATUS_SUCCESS ) return 1;
NdisZeroMemory (pUnEncapData, uiLookAheadBufferSize-20);

NdisMoveMemory(pUnEncapData, pData+sizeof(ip_header), uiLookAheadBufferSize-sizeof(ip_header));

NdisMEthIndicateReceive(pBinding->hMPBinding, hMacReceiveContext, pvHeaderBuffer,
uiHeaderBufferSize, (PVOID)pUnEncapData, uiLookAheadBufferSize-20,
uiPacketSize-20);
NdisFreeMemory(pUnEncapData, uiLookAheadBufferSize-20, 0);
goto next;

}
//***********************************************************

//Encapsulation

if((((UCHAR *)pData)[9] != 4)
&&
( (((UCHAR *)pData)[16] == 192 && ((UCHAR *)pData)[17] == 168 &&
((UCHAR *)pData)[18] == 13 && ((UCHAR *)pData)[19] == 1 &&
((UCHAR *)pData)[12] == 192 && ((UCHAR *)pData)[13] == 168 &&
((UCHAR *)pData)[14] == 11 && ((UCHAR *)pData)[15] == 1
)
||
(((UCHAR *)pData)[16] == 192 && ((UCHAR *)pData)[17] == 168 &&
((UCHAR *)pData)[18] == 11 && ((UCHAR *)pData)[19] == 1 &&
((UCHAR *)pData)[12] == 192 && ((UCHAR *)pData)[13] == 168 &&
((UCHAR *)pData)[14] == 13 && ((UCHAR *)pData)[15] == 1
)
)
)
{

pIpHeader = VirtualAlloc(0,sizeof(ip_header), MEM_COMMIT, PAGE_READWRITE);
NdisMoveMemory(pIpHeader,pData, sizeof(ip_header));

myhead = (ip_header*)pIpHeader;
myhead->ip_totallength = myhead->ip_totallength + 0x1400;

if (((UCHAR *)pData)[16] == 192 && ((UCHAR *)pData)[17] == 168 &&
((UCHAR *)pData)[18] == 13 && ((UCHAR *)pData)[19] == 1)
{
//IP-in-IP Source Address
pIpHeader[12]=192;
pIpHeader[13]=168;
pIpHeader[14]=12;
pIpHeader[15]=1;

//IP-in-IP Destination Address
pIpHeader[16]=192;
pIpHeader[17]=168;
pIpHeader[18]=12;
pIpHeader[19]=2;
}

if (((UCHAR *)pData)[16] == 192 && ((UCHAR *)pData)[17] == 168 &&
((UCHAR *)pData)[18] == 11 && ((UCHAR *)pData)[19] == 1)
{
//IP-in-IP Source Address
pIpHeader[12]=192;
pIpHeader[13]=168;
pIpHeader[14]=12;
pIpHeader[15]=2;

//IP-in-IP Destination Address

pIpHeader[16]=192;
pIpHeader[17]=168;
pIpHeader[18]=12;
pIpHeader[19]=1;
}

pIpHeader[9] = 4;
pIpHeader2 = VirtualAlloc(0, sizeof(ip_header), MEM_COMMIT, PAGE_READWRITE);
NdisMoveMemory(pIpHeader2, pIpHeader, sizeof(ip_header));
myhead2 = (ip_header*)pIpHeader2;
myhead2->ip_checksum = 0;

while(size >1)
{
cksum+=*((USHORT *)pIpHeader2)++;
if (cksum & 0x80000000)
cksum = (cksum & 0xffff) + (cksum >> 16);
size -=sizeof(USHORT);
}
if(size ) cksum += (USHORT)*(UCHAR*)pIpHeader2;
while (cksum >> 16)
cksum = (cksum & 0xffff) + (cksum >> 16);

myhead->ip_checksum = (USHORT)(~cksum);

status = NdisAllocateMemory((PVOID *)&pEncapData, uiLookAheadBufferSize+sizeof(ip_header), 0, noMaxAddr);
if (status!=NDIS_STATUS_SUCCESS ) return 1;
NdisZeroMemory(pEncapData, uiLookAheadBufferSize+sizeof(ip_header));
NdisMoveMemory(pEncapData, pIpHeader, sizeof(ip_header));
NdisMoveMemory(pEncapData+sizeof(ip_header), pData, uiLookAheadBufferSize);

//Ö¸¶¨°ü

NdisMEthIndicateReceive(pBinding->hMPBinding, hMacReceiveContext, pvHeaderBuffer,
uiHeaderBufferSize, (PVOID)pEncapData, uiLookAheadBufferSize+20,
uiPacketSize+20);

VirtualFree(pIpHeader, sizeof(ip_header), MEM_DECOMMIT);
VirtualFree(pIpHeader2, sizeof(ip_header), MEM_DECOMMIT);
NdisFreeMemory(pEncapData, uiLookAheadBufferSize+20, 0);
goto next;
}
NdisMEthIndicateReceive(
pBinding->hMPBinding, hMacReceiveContext, pvHeaderBuffer,
uiHeaderBufferSize, pData, uiLookAheadBufferSize,
uiPacketSize);
next:

NdisFreeMemory(pData, uiLookAheadBufferSize, 0);
}

return status;
}

NDIS_STATUS
ProtocolReceive(
IN NDIS_HANDLE hProtocolBindingContext,
IN NDIS_HANDLE hMacReceiveContext,
IN PVOID pvHeaderBuffer,
IN UINT uiHeaderBufferSize,
IN PVOID pvLookAheadBuffer,
IN UINT uiLookAheadBufferSize,
IN UINT uiPacketSize
)
{

pBinding->bIndicateRecvComplete = TRUE;
switch (pBinding->medium) {
case NdisMedium802_3:
case NdisMediumWan:
status = ProtocolEncapIpv4WithoutPpacket(
pBinding,
hMacReceiveContext,
pvHeaderBuffer,
uiHeaderBufferSize,
pvLookAheadBuffer,
uiLookAheadBufferSize, uiPacketSize);
/*
NdisMEthIndicateReceive(
pBinding->hMPBinding, hMacReceiveContext, pvHeaderBuffer,
uiHeaderBufferSize, pvLookAheadBuffer, uiLookAheadBufferSize,
uiPacketSize
);*/
break;
case NdisMedium802_5:


}


DO YOU YAHOO!?
ÑÅ»¢ÓÊÏ䳬ǿÔöÖµ·þÎñ£­2G³¬´ó¿Õ¼ä¡¢pop3ÊÕÐÅ¡¢ÎÞÏÞÁ¿ÓʼþÌáÐÑ