📄 httpparser.c
字号:
}
if( ntohl( pTCPHeader->seq )< pHttpHashHead->nextSSeqNumber )
return false;
if( pHttpHashHead->pSTail == NULL )
{
//the first node
pHttpHashHead->pSTail = pHttpHashHead->pSHead = &pItem->doubleListItem;
if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSSeqNumber )
pHttpHashHead->pSSeq = pHttpHashHead->pSTail;
}
else
{
pPrePacket = &(((PDOUBLE_LIST_PACKET)(pHttpHashHead->pSTail))->packet);
if( ntohl( pTCPHeader->seq ) >= pPrePacket->nextSeqNumber )
{
//add tail
pItem->doubleListItem.pPre = pHttpHashHead->pSTail;
pHttpHashHead->pSTail->pNext = &pItem->doubleListItem;
pHttpHashHead->pSTail = &pItem->doubleListItem;
}
else
{
pListPacket = (PDOUBLE_LIST_PACKET)(pHttpHashHead->pSTail)->pPre;
while( pListPacket )
{
if( ntohl(pTCPHeader->seq) >= pListPacket->packet.nextSeqNumber )
{
break;
}
pListPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pPre;
}
if( pListPacket )
{
//Handle the same packet
if( pListPacket->doubleListItem.pNext == NULL )
{
printk("pListPacket->doubleListItem.pNext\r\n");
}
pIPHeader2 = (struct iphdr*)((UCHAR *)(((PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext)->packet.buf) + ETHER_HDR_LEN );
pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
if( pTCPHeader->seq == pTCPHeader2->seq )
{
//same packet,
//reclaim the packet to the pLeisurePool
// printk("same packet\r\n");;
return false;
}
//add middle
//printk("Add Middle\r\n");
pItem->doubleListItem.pNext = pListPacket->doubleListItem.pNext;
pItem->doubleListItem.pPre = &pListPacket->doubleListItem;
pListPacket->doubleListItem.pNext->pPre = &(pItem->doubleListItem);
pListPacket->doubleListItem.pNext = &(pItem->doubleListItem);
}
else
{
//add head
//printk("Add Head\r\n");
pIPHeader2 = (struct iphdr*)((UCHAR *)((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ETHER_HDR_LEN );
pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
if( pTCPHeader->seq == pTCPHeader2->seq )
{
//same packet,
//reclaim the packet to the pLeisurePool
// printk("Add Head same packet\r\n");
return false;
}
pItem->doubleListItem.pNext = pHttpHashHead->pSHead;
pItem->doubleListItem.pPre = NULL;
pHttpHashHead->pSHead->pPre = &(pItem->doubleListItem);
pHttpHashHead->pSHead = &(pItem->doubleListItem);
if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSSeqNumber )
pHttpHashHead->pSSeq = pHttpHashHead->pSHead;
else
pHttpHashHead->pSSeq = NULL;
}
}
}
}
return true;
}
USHORT HandleMail(PSMTP_HASH_HEAD pHttpHashHead , PDOUBLE_LIST_HEAD pOutPut,
PDOUBLE_LIST_HEAD pFree)
{
struct iphdr *pIPHeader; // See ip.h
struct tcphdr *pTCPHeader; // See tcp.h
PSMTP_HASH_HEAD pSmtpHashHead;
PSMTP_HASH_HEAD pOKHashHead = NULL;
UINT zero;
char *pHttp = NULL;
UCHAR uChar;
USHORT webMailType = 0;
PDOUBLE_LIST_PACKET pItem = NULL;
USHORT handleType = 0;
zero = 0;
if( IsCSortPacket(pHttpHashHead) )
{
pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.buf + ETHER_HDR_LEN );
pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );
pItem = (PDOUBLE_LIST_PACKET)pHttpHashHead->pHead;
if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSSeqNumber || pHttpHashHead->nextSSeqNumber == 0 )
{
if( pItem->packet.dataLen > 0 )
{
if( pItem->packet.dataLen > 20 )
{
pHttp = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.buf + ((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataOffset;
uChar = *(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataLen);
*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataLen) = '\0';
if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSSeqNumber || pHttpHashHead->nextSSeqNumber == 0 )
{
if(kstristr( pHttp, pHttpHashHead->pConfig->rcflag, 100 ))
{
pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
pHttpHashHead->webMailType = (WEBMAIL_RECEIVE|WEBMAIL_CON);
//输出
handleType = HANDLE_TYPE_OUTPUT;
//printk("%s\r\n", pHttp);
}
else if(kstristr( pHttp, pHttpHashHead->pConfig->raflag, 2 ))
{
pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
pHttpHashHead->webMailType = (WEBMAIL_RECEIVE|WEBMAIL_ATTACH);
//输出
handleType = HANDLE_TYPE_OUTPUT;
//printk("%s\r\n", pHttp);
}
else if(kstristr( pHttp, pHttpHashHead->pConfig->scflag, 100 ))
{
pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
pHttpHashHead->webMailType = (WEBMAIL_SEND|WEBMAIL_CON);
//输出
handleType = HANDLE_TYPE_OUTPUT;
//printk("%s\r\n", pHttp);
}
else if(kstristr( pHttp, pHttpHashHead->pConfig->saflag, 2 ))
{
pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
pHttpHashHead->webMailType = (WEBMAIL_SEND|WEBMAIL_ATTACH);
//输出
handleType = HANDLE_TYPE_OUTPUT;
//printk("%s\r\n", pHttp);
}
else
{
if( pHttpHashHead->webMailType & WEBMAIL_SEND )
{
//输出
handleType = HANDLE_TYPE_OUTPUT;
}
else
{
pHttpHashHead->webMailType = WEBMAIL_INIT;
//丢弃
handleType = HANDLE_TYPE_FREE;
//_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
}
}
}
else
{
//等待
handleType = HANDLE_TYPE_WAITE;
}
*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataLen) = uChar;
}
else
{
if( pHttpHashHead->webMailType & WEBMAIL_SEND )
{
//输出
handleType = HANDLE_TYPE_OUTPUT;
}
else
{
pHttpHashHead->webMailType = WEBMAIL_INIT;
//丢弃
handleType = HANDLE_TYPE_FREE;
//_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
}
}
}
else
{
//Ack,Fin
if( pTCPHeader->fin )
{
handleType = HANDLE_TYPE_CONNECTION_CLOSE;
pItem->packet.type = WEB_MAIL_END_PACKET;
}
else
handleType = HANDLE_TYPE_FREE;
}
}
else
{
handleType = HANDLE_TYPE_WAITE;
}
switch( handleType )
{
case HANDLE_TYPE_OUTPUT:
case HANDLE_TYPE_FREE:
case HANDLE_TYPE_CONNECTION_CLOSE:
pHttpHashHead->nextSeqNumber = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.nextSeqNumber;
pHttpHashHead->pHead = pHttpHashHead->pHead->pNext;
if( pHttpHashHead->pHead == NULL )
{
pHttpHashHead->pTail = pHttpHashHead->pSeq = NULL;
}
else
{
pHttpHashHead->pHead->pPre = NULL;
pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.buf + ETHER_HDR_LEN );
pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );
if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSeqNumber )
pHttpHashHead->pSeq = pHttpHashHead->pHead;
else
pHttpHashHead->pSeq = NULL;
}
InitializeDoubleListItem( &pItem->doubleListItem );
if( handleType == HANDLE_TYPE_OUTPUT || handleType == HANDLE_TYPE_CONNECTION_CLOSE)
_InsertTailListNonLock( pOutPut, &(pItem->doubleListItem) );
else
_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
break;
case HANDLE_TYPE_WAITE:
break;
default:
break;
}
}
if( IsSSortPacket(pHttpHashHead) )
{
pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ETHER_HDR_LEN );
pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );
pItem = (PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead;
if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSeqNumber )
{
if( pItem->packet.dataLen > 0 )
{
if( pItem->packet.dataLen > 10 )
{
pHttp = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataOffset;
uChar = *(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataLen);
*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataLen) = '\0';
if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSeqNumber )
{
if(kstristr( pHttp, "HTTP", 2 ))
{
//输出
handleType = HANDLE_TYPE_OUTPUT;
//printk("%s\r\n", pHttp);
}
else
{
if( pHttpHashHead->webMailType & WEBMAIL_RECEIVE )
{
//输出
handleType = HANDLE_TYPE_OUTPUT;
}
else
{
//丢弃
handleType = HANDLE_TYPE_FREE;
}
}
}
else
{
//等待
handleType = HANDLE_TYPE_WAITE;
}
*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataLen) = uChar;
}
else
{
if( pHttpHashHead->webMailType & WEBMAIL_RECEIVE )
{
//输出
handleType = HANDLE_TYPE_OUTPUT;
}
else
{
//丢弃
handleType = HANDLE_TYPE_FREE;
}
}
}
else
{
//Ack,Fin
if( pTCPHeader->fin )
{
handleType = HANDLE_TYPE_CONNECTION_CLOSE;
pItem->packet.type = WEB_MAIL_END_PACKET;
}
else
handleType = HANDLE_TYPE_FREE;
}
}
else
handleType = HANDLE_TYPE_WAITE;
switch( handleType )
{
case HANDLE_TYPE_OUTPUT:
case HANDLE_TYPE_FREE:
case HANDLE_TYPE_CONNECTION_CLOSE:
pHttpHashHead->nextSSeqNumber = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.nextSeqNumber;
pHttpHashHead->pSHead = pHttpHashHead->pSHead->pNext;
if( pHttpHashHead->pSHead == NULL )
{
pHttpHashHead->pSTail = pHttpHashHead->pSSeq = NULL;
}
else
{
pHttpHashHead->pSHead->pPre = NULL;
pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ETHER_HDR_LEN );
pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );
if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSSeqNumber )
pHttpHashHead->pSSeq = pHttpHashHead->pSHead;
else
pHttpHashHead->pSSeq = NULL;
}
InitializeDoubleListItem( &pItem->doubleListItem );
if( handleType == HANDLE_TYPE_OUTPUT
|| handleType == HANDLE_TYPE_CONNECTION_CLOSE)
{
_InsertTailListNonLock( pOutPut, &(pItem->doubleListItem) );
}
else
{
_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
}
break;
case HANDLE_TYPE_WAITE:
break;
default:
break;
}
}
return handleType;
}
char SortPacketEx(PSMTP_HASH_HEAD pHttpHashHead ,PDOUBLE_LIST_PACKET pItem,
PDOUBLE_LIST_HEAD pFree)
{
struct iphdr *pIPHeader; // See ip.h
struct tcphdr *pTCPHeader; // See tcp.h
struct iphdr *pIPHeader2; // See ip.h
struct tcphdr *pTCPHeader2; // See tcp.h
PSMTP_HASH_HEAD pOKHashHead = NULL;
struct timeval zero;
char *pHttp = NULL;
UCHAR uChar;
USHORT webMailType = 0;
char bReturn = false;
PPACKET_DATA pPrePacket;
PDOUBLE_LIST_PACKET pListPacket;
PDOUBLE_LIST_PACKET pOldPacket;
pIPHeader = (struct iphdr*)(pItem->packet.buf + ETHER_HDR_LEN );
pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );
InitializeDoubleListItem( &pItem->doubleListItem );
if( IS_FROM_CLIENT( pItem->packet.type ) )
{
//client the first node
if( pHttpHashHead->nextSeqNumber == 0 )
{
pHttpHashHead->cAck = pHttpHashHead->nextSeqNumber = pItem->packet.nextSeqNumber;
pHttpHashHead->pHead = pHttpHashHead->pTail = &pItem->doubleListItem;
pHttpHashHead->iNumber++;
return true;
}
if( ntohl( pTCPHeader->seq ) < pHttpHashHead->nextSeqNumber )
return false;
if( pHttpHashHead->pTail == NULL )
{
//the first node
pHttpHashHead->pTail = pHttpHashHead->pHead = &pItem->doubleListItem;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -