⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpparser.c

📁 Linux下面截获以态网数据包!是在内核态下面运行的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			pHttpHashHead->iNumber++;
			return true;
		}
		else
		{
			pPrePacket = &(((PDOUBLE_LIST_PACKET)(pHttpHashHead->pTail))->packet);
			if( ntohl( pTCPHeader->seq ) >= pPrePacket->nextSeqNumber )
			{
				//add tail
				InitializeDoubleListItem( &pItem->doubleListItem );
				pItem->doubleListItem.pPre = pHttpHashHead->pTail;
				pHttpHashHead->pTail->pNext = &pItem->doubleListItem;
				pHttpHashHead->pTail = &pItem->doubleListItem;
				pHttpHashHead->iNumber++;
				return true;
							
			}
			else
			{
				pListPacket = (PDOUBLE_LIST_PACKET)(PDOUBLE_LIST_PACKET)(pHttpHashHead->pTail)->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, 
						//change the old packe
						//bgPrint("same packet\r\n");;
						if( ((PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext)->packet.nextSeqNumber != pItem->packet.nextSeqNumber )
						{
							//new packet, change the old packet
							pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
							
							pListPacket->doubleListItem.pNext = &(pItem->doubleListItem);
							pItem->doubleListItem.pPre = pOldPacket->doubleListItem.pPre;
							pItem->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
							if( pOldPacket->doubleListItem.pNext )
								((PDOUBLE_LIST_PACKET)pOldPacket->doubleListItem.pNext)->doubleListItem.pPre = &(pItem->doubleListItem);
							else
								pHttpHashHead->pTail = &(pItem->doubleListItem);
							
							
							InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
							_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
							
							
							pListPacket = pItem;
							while( pListPacket && pListPacket->doubleListItem.pNext )
							{
								pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
								pIPHeader2 = (struct iphdr*)(((UCHAR *)pOldPacket->packet.buf) + ETHER_HDR_LEN );
								pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
								if( ntohl( pTCPHeader2->seq ) < pListPacket->packet.nextSeqNumber )
								{
									
									pListPacket->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
									if( pOldPacket->doubleListItem.pNext )
									{
										pOldPacket->doubleListItem.pNext->pPre = &(pListPacket->doubleListItem);
										
										InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
										_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
										pHttpHashHead->iNumber--;
									}
									else
									{
										pHttpHashHead->pTail = &(pListPacket->doubleListItem);
										InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
										_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
										pHttpHashHead->iNumber--;
										break;
									}
								}
								else
									break;
							}
							return true;
							
						}
						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);
					pHttpHashHead->iNumber++;
					
					pListPacket = pItem;
					while( pListPacket && pListPacket->doubleListItem.pNext )
					{
						pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
						pIPHeader2 = (struct iphdr*)(((UCHAR *)pOldPacket->packet.buf) + ETHER_HDR_LEN );
						pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
						if( ntohl( pTCPHeader2->seq ) < pListPacket->packet.nextSeqNumber )
						{
							
							pListPacket->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
							if( pOldPacket->doubleListItem.pNext )
							{
								pOldPacket->doubleListItem.pNext->pPre = &(pListPacket->doubleListItem);
								
								InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
								_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
								pHttpHashHead->iNumber--;
							}
							else
							{
								pHttpHashHead->pTail = &(pListPacket->doubleListItem);
								InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
								_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
								pHttpHashHead->iNumber--;
								break;
							}
						}
						else
							break;
					}
				}
				else
				{
					//add head
					//printk("Add Head\r\n");
					pIPHeader2 = (struct iphdr*)((UCHAR *)((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->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");
						if( ((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.nextSeqNumber != pItem->packet.nextSeqNumber )
						{
							//new packet, change the old packet
							pOldPacket = (PDOUBLE_LIST_PACKET)pHttpHashHead->pHead;
							
							pHttpHashHead->pHead = &(pItem->doubleListItem);
							pItem->doubleListItem.pPre = NULL;
							pItem->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
							if( pOldPacket->doubleListItem.pNext )
								((PDOUBLE_LIST_PACKET)pOldPacket->doubleListItem.pNext)->doubleListItem.pPre = &(pItem->doubleListItem);
							else
								pHttpHashHead->pTail = &(pItem->doubleListItem);
							
							InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
							_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
							
							pListPacket = pItem;
							while( pListPacket && pListPacket->doubleListItem.pNext )
							{
								pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
								pIPHeader2 = (struct iphdr*)(((UCHAR *)pOldPacket->packet.buf) + ETHER_HDR_LEN );
								pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
								if( ntohl( pTCPHeader2->seq ) < pListPacket->packet.nextSeqNumber )
								{
									
									pListPacket->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
									if( pOldPacket->doubleListItem.pNext )
									{
										pOldPacket->doubleListItem.pNext->pPre = &(pListPacket->doubleListItem);
										InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
										_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
										pHttpHashHead->iNumber--;
									}
									else
									{
										pHttpHashHead->pTail = &(pListPacket->doubleListItem);
										InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
										_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
										pHttpHashHead->iNumber--;
										break;
									}
								}
								else
									break;
							}
							return true;
							
						}
						return false;
					}
					
					pItem->doubleListItem.pNext = pHttpHashHead->pHead;
					pItem->doubleListItem.pPre = NULL;
					pHttpHashHead->pHead->pPre = &(pItem->doubleListItem);
					pHttpHashHead->pHead = &(pItem->doubleListItem);
					pHttpHashHead->iNumber++;
					
					pListPacket = pItem;
					while( pListPacket && pListPacket->doubleListItem.pNext )
					{
						pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
						pIPHeader2 = (struct iphdr*)(((UCHAR *)pOldPacket->packet.buf) + ETHER_HDR_LEN );
						pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
						if( ntohl( pTCPHeader2->seq ) < pListPacket->packet.nextSeqNumber )
						{
							
							pListPacket->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
							if( pOldPacket->doubleListItem.pNext )
							{
								pOldPacket->doubleListItem.pNext->pPre = &(pListPacket->doubleListItem);
								InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
								_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
								pHttpHashHead->iNumber--;
							}
							else
							{
								pHttpHashHead->pTail = &(pListPacket->doubleListItem);
								InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
								_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
								pHttpHashHead->iNumber--;
								break;
							}
						}
						else
							break;
					}
				}
										
			}
		}
		
	}
	else
	{
		
		if( pHttpHashHead->nextSSeqNumber == 0 )
		{
			if( ntohl( pTCPHeader->ack_seq) >= pHttpHashHead->cAck )
			{
				//SERVER the first node
				pHttpHashHead->sAck = pHttpHashHead->nextSSeqNumber = pItem->packet.nextSeqNumber;
				//pHttpHashHead->sAck = pHttpHashHead->nextSSeqNumber = ntohl( pTCPHeader->ack_seq );
				pHttpHashHead->pSHead = pHttpHashHead->pSTail = pHttpHashHead->pSSeq = &pItem->doubleListItem;
				pHttpHashHead->iNumber++;
				return true;
			}
			else
				return false;
			
		}
		
		
		if( ntohl( pTCPHeader->seq ) < pHttpHashHead->nextSSeqNumber )
			return false;
			
		if( pHttpHashHead->pSTail == NULL )
		{
			//the first node
			pHttpHashHead->pSTail = pHttpHashHead->pSHead = &pItem->doubleListItem;
			pHttpHashHead->iNumber++;
			return true;
		}
		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);
				pHttpHashHead->iNumber++;
				return true;
							
			}
			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 )
				{
					if( pListPacket->doubleListItem.pNext == NULL )
					{
						printk("server: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");;
						if( ((PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext)->packet.nextSeqNumber != pItem->packet.nextSeqNumber )
						{
							//new packet, change the old packet
							pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
							
							pListPacket->doubleListItem.pNext = &(pItem->doubleListItem);
							pItem->doubleListItem.pPre = pOldPacket->doubleListItem.pPre;
							pItem->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
							if( pOldPacket->doubleListItem.pNext )
								((PDOUBLE_LIST_PACKET)pOldPacket->doubleListItem.pNext)->doubleListItem.pPre = &(pItem->doubleListItem);
							else
								pHttpHashHead->pSTail = &(pItem->doubleListItem);
							
							InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
							_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
							
							pListPacket = pItem;
							while( pListPacket && pListPacket->doubleListItem.pNext )
							{
								pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
								pIPHeader2 = (struct iphdr*)(((UCHAR *)pOldPacket->packet.buf) + ETHER_HDR_LEN );
								pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
								if( ntohl( pTCPHeader2->seq ) < pListPacket->packet.nextSeqNumber )
								{
									
									pListPacket->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
									if( pOldPacket->doubleListItem.pNext )
									{
										pOldPacket->doubleListItem.pNext->pPre = &(pListPacket->doubleListItem);
										InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
										_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
										pHttpHashHead->iNumber--;
									}
									else
									{
										pHttpHashHead->pSTail = &(pListPacket->doubleListItem);
										InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
										_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
										pHttpHashHead->iNumber--;
										break;
									}
								}
								else
									break;
							}
							return true;
							
						}
						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);
					pHttpHashHead->iNumber++;
					
					pListPacket = pItem;
					while( pListPacket && pListPacket->doubleListItem.pNext )
					{
						pOldPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;
						pIPHeader2 = (struct iphdr*)(((UCHAR *)pOldPacket->packet.buf) + ETHER_HDR_LEN );
						pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
						if( ntohl( pTCPHeader2->seq ) < pListPacket->packet.nextSeqNumber )
						{
							
							pListPacket->doubleListItem.pNext = pOldPacket->doubleListItem.pNext;
							if( pOldPacket->doubleListItem.pNext )
							{
								pOldPacket->doubleListItem.pNext->pPre = &(pListPacket->doubleListItem);
								InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
								_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
								pHttpHashHead->iNumber--;
							}
							else
							{
								pHttpHashHead->pSTail = &(pListPacket->doubleListItem);
								InitializeDoubleListItem( &(pOldPacket->doubleListItem) );
								_InsertTailListNonLock( pFree, &(pOldPacket->doubleListItem) );
								pHttpHashHead->iNumber--;
								break;
							}
						}
						else
							break;
					}
				}
				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");
						if( ((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.nextSeqNumber != pItem->packet.nextSeqNumber )
						{
							//new packet, change the old packet
							pOldPacket = (PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead;
							

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -