📄 list.c
字号:
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/netdevice.h> /* for dev_base */
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/file.h>
#include <linux/dnotify.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/time.h>
#include <asm/semaphore.h>
#include <asm/unistd.h>
#include "createDir.h"
#include "DomainIPHash.h"
#include "list.h"
#include "Rule.h"
#include "RuleIp.h"
#include "protocol.h"
#include "function.h"
#define USHORT unsigned short
#define ULONG unsigned long
//#define _LIST_DEBUG
//
//Initialize double list and initialize the FAST_MUTEX
//
//
inline void _InitializeList( PDOUBLE_LIST_HEAD pListHead )
{
if( pListHead == NULL )
return;
pListHead->pHead = pListHead->pTail = NULL;
pListHead->iNumber = 0;
init_MUTEX( &pListHead->fastMutex );
}
//
//Insert only one Item to the head of the double list
//return the old head.if the list is empty, then return NULL
//
inline PDOUBLE_LIST_ITEM _InsertHeadList( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_ITEM pListItem )
{
if( pListHead == NULL || pListItem == NULL )
return NULL;
pListItem->pPre = NULL;
down_interruptible( &pListHead->fastMutex );
if( pListHead->pHead == NULL )
{
//first item
pListItem->pNext = NULL;
pListHead->pHead = pListHead->pTail = pListItem;
}
else
{
pListItem->pNext = pListHead->pHead;
pListHead->pHead->pPre = pListItem;
pListHead->pHead = pListItem;
}
pListHead->iNumber++;
up( &pListHead->fastMutex );
return NULL;
}
inline PDOUBLE_LIST_ITEM _InsertHeadListNonLock( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_ITEM pListItem )
{
if( pListHead == NULL || pListItem == NULL )
return NULL;
pListItem->pPre = NULL;
if( pListHead->pHead == NULL )
{
//first item
pListItem->pNext = NULL;
pListHead->pHead = pListHead->pTail = pListItem;
}
else
{
pListItem->pNext = pListHead->pHead;
pListHead->pHead->pPre = pListItem;
pListHead->pHead = pListItem;
}
pListHead->iNumber++;
return pListHead->pHead->pNext;
}
//
//Insert only one Item to the tail of the double list
//return the old tail, if the list is empty, then return NULL
//
inline PDOUBLE_LIST_ITEM _InsertTailList( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_ITEM pListItem )
{
if( pListHead == NULL || pListItem == NULL )
return NULL;
pListItem->pNext = NULL;
down_interruptible( &pListHead->fastMutex );
if( pListHead->pTail == NULL )
{
//first item
pListItem->pPre = NULL;
pListHead->pHead = pListHead->pTail = pListItem;
}
else
{
pListItem->pPre = pListHead->pTail;
pListHead->pTail->pNext = pListItem;
pListHead->pTail = pListItem;
}
pListHead->iNumber++;
up( &pListHead->fastMutex );
return pListHead->pTail->pPre;
}
inline PDOUBLE_LIST_ITEM _InsertTailListNonLock( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_ITEM pListItem )
{
if( pListHead == NULL || pListItem == NULL )
return NULL;
pListItem->pPre = pListItem->pNext = NULL;
if( pListHead->pTail == NULL )
{
//first item
pListItem->pPre = NULL;
pListHead->pHead = pListHead->pTail = pListItem;
}
else
{
pListItem->pPre = pListHead->pTail;
pListHead->pTail->pNext = pListItem;
pListHead->pTail = pListItem;
}
pListHead->iNumber++;
return pListHead->pTail->pPre;
}
//
//Insert only one Item to the head of the double list
//return the old head.if the list is empty, then return NULL
//
inline void _InsertHeadListMulti( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_HEAD pInputList )
{
if( pListHead == NULL || pInputList == NULL )
return ;
if( pInputList->pHead == NULL || pInputList->pTail == NULL )
return ;
down_interruptible( &pListHead->fastMutex );
if( pListHead->pHead == NULL )
{
//first item
pListHead->pHead = pInputList->pHead;
pListHead->pTail = pInputList->pTail;
}
else
{
pInputList->pTail->pNext = pListHead->pHead;
pListHead->pHead->pPre = pInputList->pTail;
pListHead->pHead = pInputList->pHead;
}
pListHead->iNumber += pInputList->iNumber;
up( &pListHead->fastMutex );
pInputList->pHead = pInputList->pTail = NULL;
pInputList->iNumber = 0;
return ;
}
//
//Insert only one Item to the tail of the double list
//return the old tail, if the list is empty, then return NULL
//
inline void _InsertTailListFromSmtpHashHead( PDOUBLE_LIST_HEAD pListHead,
PSMTP_HASH_HEAD pInputList )
{
if( pListHead == NULL || pInputList == NULL )
return ;
if( pInputList->pHead == NULL || pInputList->pTail == NULL )
return ;
down_interruptible( &pListHead->fastMutex );
if( pListHead->pTail == NULL )
{
//first item
pListHead->pHead = pInputList->pHead;
pListHead->pTail = pInputList->pTail;
}
else
{
pInputList->pHead->pPre = pListHead->pTail;
pListHead->pTail->pNext = pInputList->pHead;
pListHead->pTail = pInputList->pTail;
}
pListHead->iNumber += pInputList->iNumber;
up( &pListHead->fastMutex );
InitializeSmtpHashHead(pInputList);
return;
}
inline void _InsertTailListFromSmtpHashHeadByLong( PSMTP_HASH_HEAD pInputList )
{
PDOUBLE_LIST_PACKET pItem = NULL;
if( pInputList == NULL )
return ;
pItem = (PDOUBLE_LIST_PACKET)pInputList->pHead;
while( pItem )
{
pInputList->pHead = pItem->doubleListItem.pNext;
PutPacketPool( pItem );
pItem = (PDOUBLE_LIST_PACKET)pInputList->pHead;
}
pItem = (PDOUBLE_LIST_PACKET)pInputList->pSHead;
while(pItem)
{
pInputList->pSHead = pItem->doubleListItem.pNext;
PutPacketPool( pItem );
pItem = (PDOUBLE_LIST_PACKET)pInputList->pSHead;
}
InitializeSmtpHashHead(pInputList);
return ;
}
//
//Insert only one Item to the tail of the double list
//return the old tail, if the list is empty, then return NULL
//
inline void _InsertTailListMulti( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_HEAD pInputList )
{
if( pListHead == NULL || pInputList == NULL )
return ;
if( pInputList->pHead == NULL || pInputList->pTail == NULL )
return ;
down_interruptible( &pListHead->fastMutex );
if( pListHead->pTail == NULL )
{
//first item
pListHead->pHead = pInputList->pHead;
pListHead->pTail = pInputList->pTail;
}
else
{
pInputList->pHead->pPre = pListHead->pTail;
pListHead->pTail->pNext = pInputList->pHead;
pListHead->pTail = pInputList->pTail;
}
pListHead->iNumber += pInputList->iNumber;
up( &pListHead->fastMutex );
pInputList->pHead = pInputList->pTail = NULL;
pInputList->iNumber = 0;
return ;
}
inline PDOUBLE_LIST_ITEM _RemoveHeadList( PDOUBLE_LIST_HEAD pListHead )
{
PDOUBLE_LIST_ITEM pTemp = NULL;
if( pListHead == NULL )
return NULL;
if( pListHead->pHead == NULL )
return NULL;
down_interruptible( &pListHead->fastMutex );
pTemp = pListHead->pHead;
if( pTemp == NULL )
{
up( &pListHead->fastMutex );
return pTemp;
}
if( pListHead->pHead == pListHead->pTail )
{
pListHead->pHead = pListHead->pTail = NULL;
}
else
{
pListHead->pHead = pTemp->pNext;
pListHead->pHead->pPre = NULL;
}
pListHead->iNumber--;
up( &pListHead->fastMutex );
return pTemp;
}
inline PDOUBLE_LIST_ITEM _RemoveItemNonLock( PDOUBLE_LIST_HEAD pListHead,
PDOUBLE_LIST_ITEM pItem)
{
PDOUBLE_LIST_ITEM pTemp = NULL;
if( pListHead == NULL || pItem == NULL )
return NULL;
if( pListHead->pHead == NULL )
return NULL;
if( IS_FROM_SMTP_CLIENT( ((PSMTP_HASH_HEAD)pItem)->smtpPop3Type ) )
SetUserAndPass( (PSMTP_HASH_HEAD)pItem );
if( pItem == pListHead->pHead && pItem == pListHead->pTail )
{
pListHead->pHead = pListHead->pTail = NULL;
}
else if( pItem == pListHead->pHead )
{
pListHead->pHead = pItem->pNext;
pItem->pNext->pPre = NULL;
}
else if( pItem == pListHead->pTail )
{
pListHead->pTail = pItem->pPre;
pItem->pPre->pNext = NULL;
}
else
{
pItem->pPre->pNext = pItem->pNext;
pItem->pNext->pPre = pItem->pPre;
}
pItem->pPre = pItem->pNext = NULL;
pListHead->iNumber--;
return pTemp;
}
inline PSMTP_HASH_HEAD _RemoveItemFromHashHead( PSMTP_HASH_HEAD pListHead )
{
UINT MmLen;
PSMTP_HASH_HEAD pTemp = NULL;
MmLen = sizeof(SMTP_HASH_HEAD);
if( pListHead == NULL)
return NULL;
if( pListHead->pHead == NULL )
return NULL;
if( IS_FROM_SMTP_CLIENT( pListHead->smtpPop3Type ) )
SetUserAndPass( pListHead );
pTemp = (SMTP_HASH_HEAD *)ALLOCATE_HASHHEAD( GFP_ATOMIC, MmLen);
if( pTemp == NULL )
{
printk( "Allocate Pool PDOUBLE_LIST_HEAD fail in _RemoveItemNonHashHead()\r\n" );
return NULL;
}
memcpy( pTemp, pListHead, MmLen );
pTemp->pTail = pTemp->pSeq;
pTemp->iNumber = pTemp->iSeqCount;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -