zte's code,first commit

Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/errno_track.h b/ap/os/linux/linux-3.4.x/include/net/SI/errno_track.h
new file mode 100644
index 0000000..86b9e3b
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/errno_track.h
@@ -0,0 +1,23 @@
+/************************************************************************
+*¹¦ÄܽéÉÜ£ºlinuxÖÐÍøÂçÆäËûÐÅÏ¢Ïà¹Ø²Ù×÷½Ó¿Ú
+*¸ºÔðÈË£º
+*±¸·ÝÈË£º
+*ÐÞ¸ÄÈÕ£º
+*ÐÞ¸ÄÄÚÈÝ£º
+*°æ±¾ºÅ£º
+************************************************************************/
+#ifndef _ERRNO_TRACK_H_
+#define _ERRNO_TRACK_H_
+
+extern char errno_proc_name[21];
+
+//extern void dump_mynet_stack(char *dstBuf, int *len);
+extern int errno_track(int errno, int linenum, char *filename);
+
+extern int errno_write_file(char *pbuf);
+
+
+#define ERRNO_TRACK(x) errno_track((x), __LINE__,__FILE__) 
+
+#endif //end _ERRNO_TRACK_H_ 
+
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/ext_mem.h b/ap/os/linux/linux-3.4.x/include/net/SI/ext_mem.h
new file mode 100644
index 0000000..8715e13
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/ext_mem.h
@@ -0,0 +1,118 @@
+#ifndef _LINUX_EXTMEM_H

+#define _LINUX_EXTMEM_H

+

+

+

+

+

+/**************************************************************************************************************************

+ÔÚ½øÐÐÊý¾Ý°üÄÚ´æ¿Õ¼äÉêÇëʱ£¬ÐèÒª½øÐÐ×î´óÖµÔ¤Áô£¬ÒÔ½â¾öÊý¾Ý°ü´¦Àí¹ý³ÌÖÐÄÚ´æÀ©Õ¹µÄÐèÇó£¬ÈçºóÐøÌí¼ÓPPPoEÍ·¡¢wifiÍ·µÈÐèÇó¡£

+AP²àµÄlinux±ê×¼´úÂëÒѾ­ºÜºÃµÄ¿¼ÂÇÁËÔ¤Áô¿Õ¼äÎÊÌ⣬»ù±¾²»»á·¢ÉúÄڴ濽±´£¬¶øÇÒ´«µÝ¸øCPʹÓÃÒ²²»»á·¢ÉúÄÚ´æÔ½½çµÄ¿ÉÄÜ¡£

+µ«ÊÇ£¬±ê×¼linux´æÔÚÄÚ´æÀ˷ѵÄÇé¿ö£¬linux¿ªÔ´¿¼ÂǵÄÊÇ×î´ó¶øÈ«µÄ¹¦Äܼ¯£¬ËùÒÔÔ¤ÁôÖµºÜ¿äÕÅ£¬

+ÀýÈçNET_SKB_PAD¡¢MAX_HEADERÁ½¸öÖµ£¬ÔÚÎÒÃǵIJúÆ·ÖУ¬²»»áÓÐÕâô´ó£¬Èç¹ûºóÐøÄÚ´æ²»×㣬¿ÉÒÔ¿¼ÂÇ¶ÔÆä½øÐÐÓÅ»¯¡£

+CP²àÓÉÓÚʹÓõÄÊÇToS²Ù×÷ϵͳµÄPSBUF»úÖÆ£¬ËùÒÔÔÚÉêÇëʱ£¬ÐèÒª°´ÕÕlinuxµÄskbÔ¤Áô˼Ïë½øÐÐÔ¤ÁôÄÚ´æ¿Õ¼ä£¬

+¼´IPÍ·²¿Ç°ÐèÔ¤ÁôNET_SKB_PAD+ NET_IP_ALIGN+ ETH_HLEN´óСµÄ¿Õ¼ä£¬dataµÄβ²¿ÐèÒªÔ¤ÁôSKBUF_TAIL´óСµÄ¿Õ¼ä,ͬʱ»¹Òª¿¼ÂÇcacheÐÐ¶ÔÆë¡£

+****************************************************************************************************************/

+

+//fastnat´¦ÀíµÄIPºÍTCP±ê×¼³¤¶È·¶Î§

+#define   FASTNAT_IPTCP_LEN        40    

+

+//Ŀǰ×î´óÖµÀ´Ô´ÓÚwifiÇý¶¯£¬¸ÃºêÖµÓ¦¸ÃÓÉÇý¶¯Î¬»¤£»Èç¹ûÇý¶¯Ê¹Óñê×¼µÄNET_SKB_PADºêÖµ£¬ÐèҪͬ²½Ð޸ĸÃÖµ

+#define   DRV_MAX_LEN      64    

+

+//PSÒªÇóµÄ×î´óÔ¤ÁôÖµ£¬¸ÃÖµÓ¦¸ÃÓÉЭÒéջά»¤

+#define   PS_LEN             20    

+

+//PPPoEÍ·³¤¶È£¬¸ÃÖµ¹Ì¶¨Îª8

+#define   PPPOE_LEN         8    

+

+//MACÍ·³¤

+#define   ETHMAC_HLEN         14

+

+

+///skbÊý¾Ý°üβ²¿µÄ¹²ÏíÐÅÏ¢ÌåÄÚ´æ´óС£¬¹©CP²àÉè¼ÆPSBUF´óСʱʹÓÃ

+#define   SKBUF_TAIL    sizeof(struct skb_shared_info)  

+

+#define   CACHE_FASTNAT_LEN    NET_SKB_PAD+ ETHMAC_HLEN+PPPOE_LEN+FASTNAT_IPTCP_LEN

+

+#define MAX_EXT_MEM_HASH  64

+#define MAX_EXT_MEM_HASH_BITS  6

+

+//AP´«µÝ¸øCPµÄskbÊý¾Ý°üÐÅÏ¢£¬¸ÃÄÚÈÝдÈë¹²ÏíDDR

+struct  T_ToExt_info

+{

+    void * skb;//skbÖ¸Õ룬ÓÃÓÚÊÍ·Åʱ´«µÝ¸øºË¼ä£¬ÒÔ±ã¿ìËÙÊÍ·Å£¬¸ÃÖ¸ÕëÔÚºËÄÚ½ûÖ¹·ÃÎÊ£¬½ö×÷¼Ç¼

+    void * skb_data;//ºË¼ä´«µÝÀ´µÄÊý¾Ý°üÊ×µØÖ·£¬Ö¸ÏòMACÖ¡Í·;ÎïÀíµØÖ·

+	void * skb_head;//ºË¼äÄÜʹÓõĵØÖ·±ß½ç£¬²»ÄÜÔ½½ç£¬·ñÔòÄÚ´æÒç³öÒì³££»ÎïÀíµØÖ·

+	int 	datalen;//Êý¾Ý°üÓÐЧ³¤¶È£¬Ò»°ãΪMACÖ¡³¤¶È

+};

+

+

+struct  T_ToExt_mem

+{

+    void * skb;     //skbÖ¸Õ룬ÓÃÓÚ¸ú×ټǼAP·¢Ë͸øCPµÄskb

+};

+

+

+struct extskb_info

+{

+    struct list_head       node;

+	struct T_ToExt_mem     info;

+};

+

+

+struct  T_FromExt_mem

+{

+    void  * pbuf_data;//·¢Ë͸øºË¼äµÄÊý¾Ý°üÊ×µØÖ·£¬Ö¸ÏòMACÖ¡Í·

+	void  * pbuf_head;//·¢Ë͸øºË¼äµÄµØÖ·±ß½ç£¬²»ÄÜÔ½½ç£¬·ñÔòÄÚ´æÒç³öÒì³£

+	int 	datalen;  //Êý¾Ý°üÓÐЧ³¤¶È£¬Ò»°ãΪMACÖ¡³¤¶È

+};

+

+

+struct extpbuf_info

+{

+    struct list_head         node;

+	struct T_FromExt_mem     info;

+};

+struct ext_list

+{

+	int count;

+	struct list_head first;

+};

+

+//²Î¿¼build_skb£¬ÓÃÓÚʵÏÖCP´«µÝÀ´µÄPSBUFµÄskbufÄÚ´æ¹ÜÀí£¬Èë²ÎΪ¹²ÏíDDRÄڴ棻¹©ddrnet_icp_receive_threadµ÷Óã¬ÆäËü¹¦ÄÜÄ£¿é²»×¼µ÷ÓÃ

+extern struct sk_buff *skb_build_psbuf(struct T_FromExt_mem *pbuf_temp);

+//ÔÚskb_release_data»òskb_free_head½Ó¿ÚµÄ×îÉÏÃæÖ´ÐУ¬Ìõ¼þÊÇskb->isExternΪ1£¬ÓÃÓÚÊͷź˼äµÄpsbufÄÚ´æ¿Õ¼ä£»ÄÚ²¿½«´ýÊͷŵÄPSBUFдÈë¹²ÏíDDR

+extern void skb_free_extpsbuf (struct sk_buff *skb);

+//²Î¿¼pskb_expand_head½Ó¿Ú£¬¹©fastnatʧ°Üºó__netif_receive_skbµ÷Ó㻼ì²âµ½ÊÇÀ´×ÔCP²àµÄpsbuf¿Õ¼ä£¬ÉêÇë±ê×¼linuxµÄdataÄÚ´æ¿Õ¼ä½øÐйÜÀí£¬ÒÔÆÁ±ÎÄÚ´æµÄ¹ÜÀí²îÒì,skb´ó²¿·ÖÄÚÈݲ»±ä

+extern int skb_copy_psbuf(struct sk_buff *skb, gfp_t gfp_mask);

+

+//½«·¢Ë͸øCPµÄskbÊý¾Ý°üÐÅÏ¢¼Ç¼µ½¸ú×ÙÁ´±íÖУ¬ÓÉddrnet_tx_packetµ÷ÓÃ

+extern void insert_toext_mem(struct sk_buff *skb);

+//ICPÖжÏÊÕµ½À´×ÔCPºËµÄÊÍ·ÅÇëÇó£¬É¾³ý¶ÔÓ¦µÄskb½Úµã£¬ÒÔ±ã¼ì²éÊÇ·ñ´æÔں˼äÄÚ´æÐ¹Â©£»¸Ã½Ó¿ÚÓÉICPÊͷŽø³Ìµ÷Óã¬×îºóÒÔ±ãÊÍ·Åskb¿Õ¼ä

+extern int free_toext_mem(void *skb);

+

+extern int set_protocol_by_version(struct sk_buff * skb);

+

+#endif

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/fast6.h b/ap/os/linux/linux-3.4.x/include/net/SI/fast6.h
new file mode 100644
index 0000000..dac21fe
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/fast6.h
@@ -0,0 +1,92 @@
+/* * Copyright (c) 2011 Qualcomm Atheros, Inc. * */
+#ifndef _FAST_6_H
+#define _FAST_6_H
+
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <linux/udp.h>
+#include <linux/tcp.h>
+#include <linux/icmp.h>
+#include <net/ip.h>
+#include <linux/if_arp.h>
+
+#include <linux/inetdevice.h>
+#include <linux/netfilter.h>
+#include <linux/netfilter_ipv6.h>
+#include <linux/netfilter_arp.h>
+//#include <linux/netfilter_ipv4/ip_tables.h>
+#include <linux/netfilter/xt_multiport.h>
+#include <linux/netfilter/xt_iprange.h>
+#include <linux/netfilter/nf_conntrack_tcp.h>
+#include <net/checksum.h>
+#include <net/dsfield.h>
+#include <net/route.h>
+#include <net/netfilter/nf_nat.h>
+#include <net/netfilter/nf_nat_core.h>
+#include <net/netfilter/nf_nat_rule.h>
+#include <net/netfilter/nf_conntrack_helper.h>
+#include <linux/module.h>
+
+#include <linux/proc_fs.h>
+
+#include <net/SI/fast_common.h>
+
+/* *******************************ºê¶¨Òå******************************* */
+/* *******************************ºê¶¨Òå******************************* */
+/* *******************************ºê¶¨Òå******************************* */
+
+/* *****************************½á¹¹Ì嶨Òå***************************** */
+/* *****************************½á¹¹Ì嶨Òå***************************** */
+/* *****************************½á¹¹Ì嶨Òå***************************** */
+struct ip6_opthdr
+{
+    unsigned char nxt;
+    unsigned char len;
+};
+
+struct ip6_hdr
+{
+    union
+    {
+        struct ip6_hdrctl
+        {
+            uint32_t ip6_un1_flow;   /* 4 bits version, 8 bits TC,
+                    20 bits flow-ID */
+            uint16_t ip6_un1_plen;   /* payload length */
+            uint8_t  ip6_un1_nxt;    /* next header */
+            uint8_t  ip6_un1_hlim;   /* hop limit */
+        } ip6_un1;
+        uint8_t ip6_un2_vfc;       /* 4 bits version, top 4 bits tclass */
+    } ip6_ctlun;
+    struct in6_addr ip6_src;      /* source address */
+    struct in6_addr ip6_dst;      /* destination address */
+};
+
+#define ip6_vfc   ip6_ctlun.ip6_un2_vfc
+#define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt   ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops  ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+/* *****************************±äÁ¿ÉùÃ÷***************************** */
+/* *****************************±äÁ¿ÉùÃ÷***************************** */
+/* *****************************±äÁ¿ÉùÃ÷***************************** */
+extern spinlock_t fast6_spinlock; //×ÔÐýËø£¬±£»¤Á´±íµÄ²Ù×÷
+extern fast_list_t working_list6 ;
+extern struct hlist_nulls_head *working_hash6;
+
+/* *****************************½Ó¿ÚÉùÃ÷***************************** */
+/* *****************************½Ó¿ÚÉùÃ÷***************************** */
+/* *****************************½Ó¿ÚÉùÃ÷***************************** */
+int fast6_get_tuple(struct sk_buff *skb, struct nf_conntrack_tuple *tuple);
+
+int fast6_recv(struct sk_buff *skb);
+
+unsigned int napt6_handle(unsigned int hooknum,
+            struct sk_buff *skb,
+            const struct net_device *in,
+            const struct net_device *out, int (*okfn) (struct sk_buff *));
+
+#endif //_FAST_6_H
+
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/fast_common.h b/ap/os/linux/linux-3.4.x/include/net/SI/fast_common.h
new file mode 100755
index 0000000..0061759
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/fast_common.h
@@ -0,0 +1,367 @@
+/* * Copyright (c) 2011 Qualcomm Atheros, Inc. * */
+#ifndef _FAST_COMMON_H
+#define _FAST_COMMON_H
+
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <linux/udp.h>
+#include <linux/tcp.h>
+#include <linux/icmp.h>
+#include <net/ip.h>
+#include <linux/if_arp.h>
+#include <linux/if_addr.h>
+#include <linux/ipv6.h>
+#include <net/ipv6.h>
+#include <net/protocol.h>
+
+#include <linux/inetdevice.h>
+#include <linux/netfilter.h>
+#include <linux/netfilter_ipv4.h>
+#include <linux/netfilter_arp.h>
+#include <linux/netfilter_ipv4/ip_tables.h>
+#include <linux/netfilter/xt_multiport.h>
+#include <linux/netfilter/xt_iprange.h>
+#include <linux/netfilter/nf_conntrack_tcp.h>
+#include <net/checksum.h>
+#include <net/dsfield.h>
+#include <net/route.h>
+#include <net/netfilter/nf_nat.h>
+#include <net/netfilter/nf_nat_core.h>
+#include <net/netfilter/nf_nat_rule.h>
+#include <net/netfilter/nf_conntrack_helper.h>
+#include <net/addrconf.h>
+
+#include <linux/module.h>
+
+#include <linux/proc_fs.h>
+#include <linux/interrupt.h>
+/* ******************************ºê¶¨Òå******************************* */
+/* ******************************ºê¶¨Òå******************************* */
+/* ******************************ºê¶¨Òå******************************* */
+#define MONITOR_PROCESS_INTERVAL    60 /* seconds */
+#define ENTRY_TIMEOUT_TIME  300        /* seconds */
+#define FAST_DSCP_MASK 0xfc
+#define FAST_ALL_DIR ((1<<IP_CT_DIR_MAX) - 1)
+
+#define WWW_PORT 80
+
+#define MAX_NET_DEVICE_NAME_LEN 10
+
+#define NOFAST_PROTO_MAX 100
+//for cov
+#define fast_test_bit(nr, val)   ((val) & (1UL<<(nr)))
+/* *****************************½á¹¹Ì嶨Òå***************************** */
+/* *****************************½á¹¹Ì嶨Òå***************************** */
+/* *****************************½á¹¹Ì嶨Òå***************************** */
+enum{
+    FN_TYPE_SRC = 0,
+    FN_TYPE_DST,
+};
+
+// ¿ìËÙת·¢¼¶±ð£¬¿ìËÙת·¢µ÷Óõã
+enum{
+    FAST_CLOSE = 0,               // ¹Ø±Õfastnat£¬×ß±ê×¼linux£¬±£³ÖÔ­Á´½Ó²»ÖØÐÂÁ´½Ó
+    FAST_NET_CORE,                // ×ßIP²ã±ê×¼fasnat£¬½ø¶øÒýÓÃÈíÖжϵ÷¶È£¬ÐÔÄÜÂԲ³¡¾°ÈçÁ÷¿Ø¹¦ÄÜ
+    FAST_NET_DEVICE,              // ×ßnet_device²ãÃæµÄÇý¶¯µ½Çý¶¯£¬ÎÞÈíÖжÏ
+    FAST_PS_USB,                  // Ö»ÔÚucÖÐʹÓã¬usbÓëpsÖ®¼äÖ±½Ó͸´«
+    FAST_CLOSE_KEEP_LINK = 5,     // ¹Ø±Õfastnat£¬×ß±ê×¼linux£¬±£³ÖÔ­Á´½Ó²»ÖØÐÂÁ´½Ó
+};
+
+/* λͼ·½Ê½  --- ¸÷×Ó¹¦ÄÜ¿ìËÙת·¢¿ª¹Ø */
+enum{
+    /* 0: ÀϵÄfast·½Ê½£¬×Ô¼º´æ´¢fastÏà¹ØÊý¾Ý£» 1: еÄfast·½Ê½£¬Ê¹ÓÃÄÚºË×Ô´øµÄÊý¾Ý*/
+    FAST_TYPE_VERSION_BIT = 0,
+    FAST_TYPE_VERSION       = (1 << FAST_TYPE_VERSION_BIT),
+
+    /* IPv4ת·¢Àà¿ìËÙת·¢¿ªÆô¡¢¹Ø±Õ */
+    FAST_TYPE_FW4_BIT = 1,
+    FAST_TYPE_FW4     = (1 << FAST_TYPE_FW4_BIT), 
+
+    /* IPv6ת·¢Àà¿ìËÙת·¢¿ªÆô¡¢¹Ø±Õ */
+    FAST_TYPE_FW6_BIT = 2,
+    FAST_TYPE_FW6     = (1 << FAST_TYPE_FW6_BIT),
+
+    /* IPv4±¾µØ¿ìËÙת·¢¿ªÆô¡¢¹Ø±Õ */
+    FAST_TYPE_LOCAL4_BIT = 3,
+    FAST_TYPE_LOCAL4     = (1 << FAST_TYPE_LOCAL4_BIT),
+
+    /* IPv6±¾µØ¿ìËÙת·¢¿ªÆô¡¢¹Ø±Õ */
+    FAST_TYPE_LOCAL6_BIT = 4,
+    FAST_TYPE_LOCAL6     = (1 << FAST_TYPE_LOCAL6_BIT),
+
+    /* ×ÓÍø¼ä¿ìËÙת·¢¿ªÆô¡¢¹Ø±Õ */
+    FAST_TYPE_BR_BIT = 5,
+    FAST_TYPE_BR     = (1 << FAST_TYPE_BR_BIT),
+
+    /* 2¡¢3²ãÖ±½Óµ½µ½Çŵã */
+    FAST_TYPE_BR_LOCAL_BIT = 6,
+    FAST_TYPE_BR_LOCAL     = (1 << FAST_TYPE_BR_LOCAL_BIT),
+};
+
+// ָʾ¾ßÌåijÌõconnµ±Ç°Ê¹ÓõÄÊÇÄÄÖÖÐÔÄÜÓÅ»¯Á÷³Ì£¬²Î¼û¸³Öµct->fast_ct.isFast
+enum conn_fast_type{
+    FAST_CT_NOT = 0,          // δ½øÐпìËÙת·¢
+    FAST_CT_WND4,              // ÀÏģʽÏÂIPv4½øÐпìËÙת·¢
+    FAST_CT_WND6,              // ÀÏģʽÏÂIPv6½øÐпìËÙת·¢
+    FAST_CT_FW4,              // ÓÃÓÚIPv4ת·¢Àà¿ìËÙת·¢
+    FAST_CT_FW6,             // ÓÃÓÚIPv6ת·¢Àà¿ìËÙת·¢
+    FAST_CT_LOCAL4,          // ÓÃÓÚIPv4±¾µØÀà¿ìËÙת·¢
+    FAST_CT_LOCAL6,          //ÓÃÓÚIPv6±¾µØÀà¿ìËÙת·¢
+};
+
+enum{
+    RELEASE_ALL_SK_BIT = 0,
+    RELEASE_ALL_SK = (1 << RELEASE_ALL_SK_BIT),
+    
+    RELEASE_ALL_DST_BIT = 1,
+    RELEASE_ALL_DST = (1 << RELEASE_ALL_DST_BIT),
+};
+
+typedef struct fast_sysctl_arg
+{
+    u_int32_t path[8];
+    u_int32_t path_len;
+    void *value;
+    u_int32_t value_len;
+}fast_sysctl_arg_t;
+
+/* all information set from conntrack */
+typedef struct fast_entry_data_s{
+    struct nf_conntrack_tuple_hash tuplehash;
+    u_int32_t     nat_addr;
+    u_int16_t     nat_port;
+    //u_int8_t      flow_lbl[3];
+    u_int8_t      type;
+    u_int8_t      dmac[ETH_ALEN];
+    u_int8_t      tos;
+    u_int8_t      pad;
+    u_int32_t     priority;
+    u_int32_t     mark;
+    struct net_device *indev;
+    struct net_device *outdev;
+    unsigned long packet_num;
+
+    //Èç¹ûÊÇethÀàÐÍ£¬Ôò´Ë´¦±£´æMACÍ·£¬ÒÔ¿ìËÙʵÏÖMACÍ·¸³Öµ
+    u_int8_t            hh_flag;
+    unsigned char        hh_data[14];
+    
+    u_int8_t       is_not_nat; //Ϊ1£¬±íʾ²»Ö§³ÖNAT
+}fast_entry_data_t;
+
+typedef struct fast_entry_s{
+    struct fast_entry_s *next;
+    struct fast_list_s *list_head;       //ËùÊôÁ´±í
+    spinlock_t *fast_spinlock;           //ËùÊôÁ´±íËø
+    struct nf_conn *ct;
+    struct fast_entry_data_s data[IP_CT_DIR_MAX];
+    u_int32_t flags;
+    struct timer_list timeout;
+    
+    int ackdrop_num;                //ÒѶªÆúµÄack±¨ÎĸöÊý
+    struct sk_buff *predrop_skb;    //¼Ç¼×î½üÒ»´Î»º´æµÄakc±¨ÎÄ
+    unsigned long ackstart_tick;    //Ò»¸ö¶ªack°üÖÜÆÚµÄÆðʼʱ¿Ìµã
+}fast_entry_t;
+
+typedef struct fast_list_s{
+    u_int32_t count;
+    struct fast_entry_s *next;
+}fast_list_t;
+
+struct conn_list{    
+    struct nf_conn __rcu *nfct;
+    struct list_head list;
+};
+
+enum{
+    TRAVERSE_CMD_TIMEOUT = 0,
+    TRAVERSE_CMD_DEV_DOWN,
+    TRAVERSE_CMD_IP_MAC,
+    TRAVERSE_CMD_MAX,
+};
+
+typedef struct traverse_command{
+    u_int32_t cmd;
+    unsigned long arg;
+}traverse_command_t;
+
+/* *****************************±äÁ¿ÉùÃ÷***************************** */
+/* *****************************±äÁ¿ÉùÃ÷***************************** */
+/* *****************************±äÁ¿ÉùÃ÷***************************** */
+extern struct kmem_cache *fast_head_cache;
+
+/* 
+* 0: ¹Ø±Õfastnat£¬×ß±ê×¼linux£¬¿ÉÒÔÖжÏÔ­Á´½ÓÖØÐÂÁ´½Ó
+* 1: ×ßIP²ã±ê×¼fasnat£¬½ø¶øÒýÓÃÈíÖжϵ÷¶È£¬ÐÔÄÜÂԲ³¡¾°ÈçÁ÷¿Ø¹¦ÄÜ
+* 2: ×ßnet_device²ãÃæµÄÇý¶¯µ½Çý¶¯£¬ÎÞÈíÖжÏ
+* 5: ¹Ø±Õfastnat£¬×ß±ê×¼linux£¬±£³ÖÔ­Á´½Ó²»ÖØÐÂÁ´½Ó
+* ¿ÉÒÔͨ¹ýprocÐÞ¸ÄÖµ
+*/
+extern int fastnat_level;
+
+/* λͼ·½Ê½  --- ¸÷×Ó¹¦ÄÜ¿ìËÙת·¢¿ª¹Ø */
+extern unsigned long fast_switch;
+
+extern int fastbr_level;                 //×ÓÍø¼ä¿ìËÙת·¢¿ª¹Ø
+
+/* ***************************** ƽ̨»¯Ïà¹Ø±äÁ¿ ***************************** */
+/*
+ *ÏÂÃæbr_nameµÈ¼¸¸ö×Ö·û´®Êý×éͨ¹ýproc½ÚµãÉèÖã¬
+ *´Ë´¦½öÊǶ¨ÒåºÍ¸³³õÖµ¡£
+ */
+extern char br_name[];
+extern char ps_name[];
+extern char usb_name[];
+extern char ppp_name[];
+//cp:µ¥ºË£¬Ä£¿éÐÎ̬ÐèҪ·Óɶ¨ÖÆ
+//ap:Ë«ºË£¬Ä£¿éÐÎ̬¿É¼òµ¥ÇŽÓ
+extern char need_jilian[];
+
+extern unsigned int tcp_timeouts[] __read_mostly;
+
+extern unsigned int fast_udp_timeout_stream;
+extern unsigned int fast_udp_timeout; /*normal is 30*HZ*/
+
+extern unsigned int nofast_port[];
+
+extern unsigned char zeromac[];
+
+extern spinlock_t fast_fw_spinlock;
+extern spinlock_t fastlocal_spinlock;
+
+//¸ù¾Ý¿ìËÙת·¢¼¶±ðºÍ¸÷×Ó¹¦ÄÜ¿ª¹ØÉèÖõĻص÷º¯Êý
+extern int (*fast_nat4_proc)(struct sk_buff *skb);
+extern int (*fast_nat6_proc)(struct sk_buff *skb);
+extern int (*fast_fw4_proc)(struct nf_conn * tmpl, 
+    struct sk_buff *skb, 
+    struct nf_conn * ct, 
+    struct nf_conntrack_l4proto *l4proto,
+    unsigned int dataoff,
+    int dir,
+    u_int8_t protonum);
+extern int (*fast_fw6_proc)(struct nf_conn * tmpl, 
+    struct sk_buff *skb, 
+    struct nf_conn * ct, 
+    struct nf_conntrack_l4proto *l4proto,
+    unsigned int dataoff,
+    int dir,
+    u_int8_t protonum);
+
+extern int (*fast_local4_proc)(struct nf_conn * tmpl, 
+    struct sk_buff *skb, 
+    struct nf_conn * ct, 
+    struct nf_conntrack_l4proto *l4proto,
+    unsigned int dataoff,
+    int dir,
+    u_int8_t protonum);
+extern int (*fast_local6_proc)(struct nf_conn * tmpl, 
+    struct sk_buff *skb, 
+    struct nf_conn * ct, 
+    struct nf_conntrack_l4proto *l4proto,
+    unsigned int dataoff,
+    int dir,
+    u_int8_t protonum);
+
+extern int (*fast_local4_output_proc)(struct sk_buff *skb);
+extern int (*fast_local6_output_proc)(struct sk_buff *skb);
+
+extern int (*fast_br_proc)(struct sk_buff *skb);
+
+/* *****************************½Ó¿ÚÉùÃ÷***************************** */
+/* *****************************½Ó¿ÚÉùÃ÷***************************** */
+/* *****************************½Ó¿ÚÉùÃ÷***************************** */
+static inline struct fast_entry_data_s *
+fast_hash_to_data(const struct nf_conntrack_tuple_hash *hash)
+{
+    return container_of(hash, struct fast_entry_data_s, tuplehash);
+}
+
+static inline struct fast_entry_s *
+fast_data_to_entry(const struct fast_entry_data_s *edata)
+{
+    return container_of(edata, struct fast_entry_s, data[edata->tuplehash.tuple.dst.dir]);
+}
+
+fast_entry_t *fn_list_del(fast_list_t *list_head, fast_entry_t *entry, bool free_entry);
+void fn_list_add(fast_list_t *list_head, fast_entry_t *entry);
+
+fast_entry_data_t *fast_find_entry_data(const struct hlist_nulls_head *working_hash, const struct nf_conntrack_tuple *tuple);
+int fast_add_entry(struct hlist_nulls_head *working_hash, fast_entry_data_t *entry_data);
+fast_entry_t *fast_get_entry(fast_list_t *list_head, struct nf_conn *ct, char dir, int version);
+void fast_entry_del_cleanup(void);
+
+unsigned int get_conntrack_index(const struct tcphdr *tcph);
+
+void update_tcp_timeout(fast_entry_t *entry, fast_entry_data_t *entry_data, struct tcphdr *tcph);
+
+int record_MAC_header(const struct hlist_nulls_head *working_hash, struct nf_conn *ct, 
+    fast_entry_t *entry, fast_entry_data_t *entry_data, 
+    struct neighbour *neigh, const struct net_device *out, int proto);
+
+struct net_device *getBridgePort(struct neighbour *neigh, const struct net_device *out);
+
+int check_skip_ports(unsigned int net_dst_port);
+
+void traverse_process(fast_list_t *list_head, unsigned long param);
+
+void fast_device_down_event_by_name(char *dev_name);
+
+void fast_cleanup_links(fast_list_t *list_head);
+
+void athr_fast_dump(int ctl);
+
+//void fast_dump_entry(fast_entry_t *fast_entry, int debug_it, int debug_level, int detail);
+
+extern u_int32_t hash_conntrack_fast(const struct nf_conntrack_tuple *tuple);
+
+void fast_level_change(int new_level);
+void fast_switch_change(unsigned long new_switch);
+
+struct dst_entry *dst_get_by_ct(struct nf_conn *ct, int dir);
+
+struct nf_conn *skb_get_ct(struct nf_conn **tmpl,
+          struct sk_buff *skb,
+          struct nf_conntrack_l4proto **l4proto,
+          unsigned int *dataoff,
+          u_int8_t pf,
+          unsigned int hooknum,
+          int *dir,
+          u_int8_t *protonum);
+
+int fast_local4_recv(struct nf_conn *tmpl, 
+    struct sk_buff *skb, 
+    struct nf_conn *ct, 
+    struct nf_conntrack_l4proto *l4proto,
+    unsigned int dataoff,
+    int dir,
+    u_int8_t protonum);
+int fast_local_output(struct sk_buff *skb);
+
+int fast_local6_recv(struct nf_conn *tmpl, 
+    struct sk_buff *skb, 
+    struct nf_conn *ct, 
+    struct nf_conntrack_l4proto *l4proto,
+    unsigned int dataoff,
+    int dir,
+    u_int8_t protonum);
+
+int fast_local_output_v6(struct sk_buff *skb);
+
+void fast_sk_add_ct(struct sk_buff *skb, struct sock *sk);
+void fast_dst_add_ct(struct dst_entry *dst, struct nf_conn *ct);
+void fast_fw_conn_release(struct nf_conn *ct);
+void fast_fw_dst_entry_release(struct dst_entry *dst);
+void fast_release_all(int mark);
+void fast_tcpdump(struct sk_buff *skb);
+struct sk_buff *fast_expand_headroom(struct sk_buff *skb, struct net_device *dev);
+struct sk_buff *fast_expand_headroom_v6(struct sk_buff *skb, struct net_device *dev);
+uint32_t ip_checksum_add(uint32_t current_value, const void *data, int len);
+uint16_t ip_checksum_finish(uint32_t temp_sum);
+uint16_t ip_checksum(const void *data, int len);
+
+uint32_t ipv6_pseudo_header_checksum(const struct ipv6hdr *ip6, uint16_t len, uint8_t protocol);
+uint32_t ipv4_pseudo_header_checksum(const struct iphdr *ip, uint16_t len);
+
+uint16_t ip_checksum_adjust(uint16_t checksum, uint32_t old_hdr_sum, uint32_t new_hdr_sum);
+
+#endif //_FAST_COMMON_H
+
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/fastnat.h b/ap/os/linux/linux-3.4.x/include/net/SI/fastnat.h
new file mode 100755
index 0000000..64f5191
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/fastnat.h
@@ -0,0 +1,82 @@
+/* * Copyright (c) 2011 Qualcomm Atheros, Inc. * */
+#ifndef _FAST_NAT_H
+#define _FAST_NAT_H
+
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <linux/udp.h>
+#include <linux/tcp.h>
+#include <linux/icmp.h>
+#include <net/ip.h>
+#include <linux/if_arp.h>
+
+#include <linux/inetdevice.h>
+#include <linux/netfilter.h>
+#include <linux/netfilter_ipv4.h>
+#include <linux/netfilter_arp.h>
+#include <linux/netfilter_ipv4/ip_tables.h>
+#include <linux/netfilter/xt_multiport.h>
+#include <linux/netfilter/xt_iprange.h>
+#include <linux/netfilter/nf_conntrack_tcp.h>
+#include <net/checksum.h>
+#include <net/dsfield.h>
+#include <net/route.h>
+#include <net/netfilter/nf_nat.h>
+#include <net/netfilter/nf_nat_core.h>
+#include <net/netfilter/nf_nat_rule.h>
+#include <net/netfilter/nf_conntrack_helper.h>
+#include <linux/module.h>
+
+#include <linux/proc_fs.h>
+
+#include <net/SI/fast_common.h>
+#include <net/SI/pkt_lost_track.h>
+
+/******************************ºê¶¨Òå***********************/
+/******************************ºê¶¨Òå***********************/
+/******************************ºê¶¨Òå***********************/
+
+/******************************½á¹¹Ì嶨Òå***********************/
+/******************************½á¹¹Ì嶨Òå***********************/
+/******************************½á¹¹Ì嶨Òå***********************/
+typedef struct ack_delay_stats_s{
+    unsigned long total_count;         //×ÓÍø·¢Ë͸øÍâÍø¿ÚµÄ¶Ìack×ܸöÊý
+    unsigned long forword_count;       //ÕæÕý·¢Ë͸øÍâÍø¿ÚµÄ¶Ìack±¨ÎĸöÊý
+    unsigned long drop_count;          //Ö÷¶¯¶ªÆúµÄ¶Ìack±¨ÎĸöÊý
+    unsigned long timeout_xmit_count;  //ack³¬Ê±ºó³ö·¢µÄ¶Ìack·¢Ë͸öÊý
+    unsigned long timeout_drop_count;  //ûÓÐʵ¼ÊÒâÒ壬½¨ÒéÈ¥³ý
+}ack_delay_stats_t;
+
+/******************************±äÁ¿ÉùÃ÷***********************/
+/******************************±äÁ¿ÉùÃ÷***********************/
+/******************************±äÁ¿ÉùÃ÷***********************/
+
+extern spinlock_t fastnat_spinlock; //×ÔÐýËø£¬±£»¤Á´±íµÄ²Ù×÷
+extern fast_list_t working_list;
+extern struct hlist_nulls_head *working_hash;
+extern traverse_command_t timeout_cmd;
+
+extern struct ack_delay_stats_s ack_delay_stats;
+
+extern int ackdrop_maxnum;
+extern int ackdrop_tick_num;
+extern int fastnat_ack_param;
+
+/******************************½Ó¿ÚÉùÃ÷***********************/
+/******************************½Ó¿ÚÉùÃ÷***********************/
+/******************************½Ó¿ÚÉùÃ÷***********************/
+int fast_nat_get_tuple(struct sk_buff *skb, struct nf_conntrack_tuple *tuple);
+
+int fast_nat_recv(struct sk_buff *skb);
+
+unsigned int napt_handle(unsigned int hooknum,
+            struct sk_buff *skb,
+            const struct net_device *in,
+            const struct net_device *out, int (*okfn) (struct sk_buff *));
+
+int ackfilter(struct sk_buff *skb, fast_entry_t *nat_entry, fast_list_t *list_head);
+int tcpack_timeout(fast_entry_t *entry, unsigned long *next_schedule, int *set_next);
+int tcpack_rel(fast_entry_t *entry);
+
+#endif //_FAST_NAT_H
+
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/mnl_netlink.h b/ap/os/linux/linux-3.4.x/include/net/SI/mnl_netlink.h
new file mode 100644
index 0000000..5a231e7
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/mnl_netlink.h
@@ -0,0 +1,46 @@
+#ifndef _MNL_NETLINK_H_

+#define _MNL_NETLINK_H_

+

+enum mnl_msg_type {

+	MNL_PPP,

+	MNL_DEV,

+	MNL_FLG,

+};

+

+/*

+ *TODO: ¸÷Ä£¿éµÄ¾ßÌå³ÉÔ±´ýÀ©Õ¹ 

+ */

+typedef struct mnl_ppp_s {

+	char info[64];

+} mnl_ppp_t;

+

+typedef struct mnl_dev_s {

+	long flag;

+	char name[32];

+} mnl_dev_t;

+

+typedef struct mnl_flg_s {

+	long oldflag;

+	long newflag;

+	char name[32];

+} mnl_flg_t;

+

+typedef struct mnl_msg_s {

+	unsigned int id;

+	union {

+		mnl_ppp_t 	ppp;

+		mnl_dev_t 	dev;

+		mnl_flg_t 	flg;

+	} u;

+

+} mnl_msg_t;

+

+struct net_device;

+/* ·¢ËÍ×Ô¶¨ÒåµÄnetlinkЭÒéʼþ£¬¹©Ó¦Óýø³Ì¶Áд×Ô¶¨Òåʼþ */

+extern int mnl_send_to_user(void *mnl_msg);

+/* af_netlink.c */

+extern u32 mnl_get_pid(struct sock *sk);

+extern void mnl_send_devopen_stat(struct net_device *dev);

+extern void mnl_send_flg_stat(struct net_device *dev, int flag);

+extern void mnl_send_ppp_info(const char *p);

+#endif

diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/net_cache.h b/ap/os/linux/linux-3.4.x/include/net/SI/net_cache.h
new file mode 100644
index 0000000..52d398d
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/net_cache.h
@@ -0,0 +1,9 @@
+#ifndef __NET_CACHE_H__
+#define __NET_CACHE_H__
+extern struct sk_buff * skb_head_expand(struct sk_buff * skb ,unsigned int lenth_expand);
+extern struct sk_buff * flush_skbuf(struct sk_buff *skb);
+extern unsigned long virtaddr_to_phys(unsigned long virt);
+extern unsigned long physaddr_to_virt(unsigned long phys);
+extern void invalid_cache(unsigned char *data,int len);
+extern void clean_cache(unsigned char *data,int len);
+#endif
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/net_ext_modul.h b/ap/os/linux/linux-3.4.x/include/net/SI/net_ext_modul.h
new file mode 100644
index 0000000..8e39c50
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/net_ext_modul.h
@@ -0,0 +1,23 @@
+#ifndef _NET_EXT_MODUL_H

+#define _NET_EXT_MODUL_H

+//´ò¿ª·½Ê½ÎªÄ£¿é±äÁ¿:sys/module/net_ziyan/parameters

+

+

+extern int net_run_track;

+extern int net_info_track;

+extern int skb_info_track;

+extern int set_print;        //ÍøÂç×Ô¶¨ÒåµÄ´òÓ¡¿ª¹Ø

+extern int set_tcpdump ;  //ÈÎÒâµã×¥°ü¿ª¹Ø

+extern int leak_set; //ͨ¹ýmodule¿ª¹Ø¿ØÖÆ,1±íʾ¸ú×Ùskb¼°dataÉêÇëÊͷŵ㣻2±íʾ¸ú×Ùusers£¬ÒÔ¼ì²âΪºÎskbʼÖÕ²»ÄÜÊÍ·Å£¬ÔÝʱ¸Ã¹¦ÄÜÉв»¿ÉÓÃ

+extern int leak_list_max ; //ͨ¹ýmodule¿ª¹Ø¿ØÖÆ£¬ÈÝÐí»º´æµÄ´ýÊͷŵÄskb¼°dataµÄ¸öÊý£¬¿Éµ÷Õû£»

+extern int track_max;      //¹ì¼£¸ú×ÙÊý×éµÄÉÏÏÞ£¬½öµ±user++--ʱ²ÅÐèÒªÀ©´ó£¬·ñÔò2¼´¿É£»

+extern int stack_lenmax;  //Õ»º¯Êý¹ì¼£µÄ×Ö·û¸öÊýÉÏÏÞ£»

+

+

+//ÒÔÏÂÈý¸öÓÅÏȼ¶ÅäÖã¬Ö»×¼ÍøÂç×é¹Ç¸Éµ÷Õû£¬·ñÔòÑÏÖØÓ°Ïì¸÷¸ö·½ÏòµÄÐÔÄÜ

+extern int  fast_br_level ;

+extern int  fast_fwd_level ;

+extern int  fast_local_level;

+

+#endif

+

diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/net_other.h b/ap/os/linux/linux-3.4.x/include/net/SI/net_other.h
new file mode 100644
index 0000000..f3103cf
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/net_other.h
@@ -0,0 +1,146 @@
+#ifndef _NET_OTHER_H_

+#define _NET_OTHER_H_

+

+/*DHCP option¶¨Òå*/

+#define DHCP_PADDING            0x00

+#define DHCP_MSG_TYPE           0x35

+#define DHCP_END                0xff

+

+/*DHCP¶Ë¿Ú*/

+#define DHCP_SERVER_PORT   67

+#define DHCP_CLIENT_PORT   68

+

+/*ÓÃÓÚ¼ì²âÖ¸¶¨ÀàÐ͵İü*/

+enum skb_queue_type

+{

+    /*ping°ü*/

+    PKT_TYPE_PING_BIT = 0,

+    PKT_TYPE_PING = (1 << PKT_TYPE_PING_BIT),

+

+    /*DHCP±¨ÎÄ*/

+    PKT_TYPE_DHCP_BIT = 1,

+    PKT_TYPE_DHCP = (1 << PKT_TYPE_DHCP_BIT),

+

+    /*ARP±¨ÎÄ*/

+    PKT_TYPE_ARP_BIT = 2,

+    PKT_TYPE_ARP = (1 << PKT_TYPE_ARP_BIT),

+};

+

+static char *proto_str[] = 

+{

+    "ping",

+    "dhcp",

+    "arp"

+};

+

+/*Ö¸¶¨¼ì²âµÄЭÒéÀàÐÍ*/

+enum

+{

+    PROTO_TYPE_PING = 0,

+    PROTO_TYPE_DHCP,

+    PROTO_TYPE_ARP,

+    PROTO_TYPE_END,

+};

+

+struct pkt_info

+{

+    unsigned short proto_type;   /*ЭÒéÀàÐÍ*/

+    unsigned short msg_type;     /*ЭÒé¶ÔÓ¦µÄÏûÏ¢ÀàÐÍ*/

+    unsigned long  time;         

+};

+

+#define MAX_PKT_NUM   10

+struct check_pkt_info

+{

+    int pkt_num;

+    struct pkt_info info[MAX_PKT_NUM];

+};

+

+

+#define MAX_IPADDR_LEN          16

+#define MAX_MACADDR_LEN 		14

+struct neigh_info

+{

+    unsigned int ip_len;          //IPµØÖ·³¤¶È£¬Çø·ÖV4ºÍV6

+    unsigned char ip_addr[MAX_IPADDR_LEN];

+    unsigned char mac_addr[MAX_MACADDR_LEN];

+};

+

+#define MAX_NEIGH_NUM           20

+struct dev_neigh_info

+{

+    unsigned int num;

+    struct neigh_info neigh_nod[MAX_NEIGH_NUM];

+};

+

+enum dev_layer{

+	L3_DEV=0,    //²ã3É豸

+	BR_DEV,  //ÍøÇŵÄL3ÌØÊâÉ豸

+	L2_DEV,     //L2²ãÉ豸

+};

+

+enum IFMAC_ERR{

+	ZERO_ADDRERR=1,   

+	MULTICAST_ADDRERR,     

+    BROADCAST_ADDRERR,

+};

+

+/*±¾µØÍø¿ÚµÄµØÖ·¡¢ÁÚ¾ÓÁÐ±í¡¢ÊÕ·¢Í³¼ÆµÈÐÅÏ¢*/

+struct dev_and_neigh

+{

+	char name[20];

+	unsigned char  dev_layer;   //ָʾ¸Ã±¾µØÍø¿ÚµÄЭÒé²ã£¬²Î¼ûºêÖµL3_DEV

+    /*MACµØÖ·,IPv4µØÖ·*/

+	unsigned char		mac_addr[20];  //±¾µØÍø¿ÚµØÖ·

+	unsigned int		ipv4_addr;        //±¾µØÍø¿ÚIPµØÖ·

+	struct dev_neigh_info  dev_neigh;  //¸Ã±¾µØÍø¿ÚЯ´øµÄÔ¶³ÌÁÚ¾ÓµØÖ·ÐÅÏ¢Êý×é

+	int mac_errtype;

+};

+#define MAX_DEV_NUM   30

+/*Íø¿ÚÏà¹ØµÄÐÅÏ¢*/

+struct devlist_info

+{

+	unsigned int num;        //±¾µØÓÐÐ§Íø¿ÚµÄ¸öÊý

+	struct dev_and_neigh info[MAX_DEV_NUM];  //±¾µØÓÐÐ§Íø¿ÚµÄ¾ßÌåÐÅÏ¢²ÎÊý

+};

+

+extern struct list_head ptype_base[] ;

+extern struct list_head ptype_all;	/* Taps */

+extern int addr_check;

+

+extern unsigned long skb_max_panic ; //skb×ÜÊýÉÏÏÞ£¬³¬³ö»áµ¼ÖÂpanic

+extern int skb_num_limit ;  //skb×ÜÊýÉÏÏÞ£¬³¬³ö²»»áµ¼ÖÂpanic

+extern char netioctl_cmpstr[] ;

+extern unsigned int netioctl_cmplen ;

+

+extern unsigned long check_pkt;              /*ÓÃÓÚ¼ì²âÖ¸¶¨ÀàÐ͵İü£¬¿ÉÒÔÓÃ×÷°üÀàÐÍ£¬²Î¿¼check_pkt_type*/

+extern int set_print_pkt;      /*´òÓ¡°üÄÚÈÝ¿ª¹Ø*/

+

+extern struct check_pkt_info skb_insert_info;

+extern struct check_pkt_info skb_unlink_info;

+

+extern void print_check_pkt_info(struct check_pkt_info *pkt_info, int num);

+

+extern int check_packet_type(struct sk_buff *skb, struct pkt_info *pkt_info);

+

+extern void net_print_packet(unsigned char *data, unsigned int len, int flag);  /*flagÓÃÓÚ±ê¼ÇÊÇsend»¹ÊÇrecv, 0:recv, 1:send*/

+

+

+extern void check_macaddr_only(unsigned char *ha, unsigned char ha_len);

+extern void dump_net_stack(struct sk_buff *skb, unsigned int offset);

+extern void tcpdumpin_sq(struct sk_buff *skb);

+extern void tcpdumpout_sq(struct sk_buff *skb);

+extern int get_devlist_info(unsigned long arg);

+extern struct net_device *getbrport_bydst(struct net_device *dev,unsigned char *dest);

+extern void skb_alloc_track(struct sk_buff *skb);

+extern void skb_free_track(struct sk_buff *skb);

+extern void skbdata_alloc_track(struct sk_buff *skb);

+extern void skbdata_free_track(struct sk_buff *skb);

+extern void fromext_alloc_track(struct sk_buff *skb);

+extern void fromext_free_track(struct sk_buff *skb);

+extern void toext_alloc_track(struct sk_buff *skb);

+extern void toext_free_track(struct sk_buff *skb);

+

+#endif

+

+

diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/net_track.h b/ap/os/linux/linux-3.4.x/include/net/SI/net_track.h
new file mode 100644
index 0000000..ecd632d
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/net_track.h
@@ -0,0 +1,59 @@
+#ifndef __NET_TRACK_H__
+#define __NET_TRACK_H__
+
+//#define  tnode_len	(sizeof(struct track_info)+track_max*stack_lenmax)
+#define  tnode_len	sizeof(struct track_info)
+
+//ÓÃÓÚ¸ú×ÙδÊͷŵÄskbÔËÐе½Äĸö½ÚµãÁË£¬±ãÓÚ²éÇåÊý¾Ý°ü¶Ñ»ýµÄµã
+enum location_define {
+    INPUT_QUEUE   = 1 << 0,     //Çý¶¯½«Æä´æÈëЭÒéÕ»µÄÈë¶ÓÁÐÖУ¬´ýIP²ã¶ÁÈ¡´¦Àí
+    DEQUEUE_INPUT = 1 << 1,     //´ÓÈë¶ÓÁÐÖÐÈ¡³ö£¬¿ªÊ¼IP²ã´¦Àí
+    LOCAL_INPUT   = 1 << 2,     //±íÃ÷Ϊ±¾µØÊý¾Ý°ü£¬½øÈë´«Êä²ã
+    PRE_OUTPUT    = 1 << 3,     //±íÃ÷½øÈëIP²ãµÄ·¢ËÍÁ÷³Ì
+    WRITE_DEV     = 1 << 4,     //±íÃ÷ÒÑдÈëÇý¶¯
+    IN_SOCKQUEUE  = 1 << 5,     //±íÃ÷Êý¾Ý°üÒÑ·ÅÈësockµÄÈë¶ÓÁУ¬´ýÓ¦ÓöÁÈ¡
+    FASTNAT_SUCC  = 1 << 6,
+    FAST6_SUCC    = 1 << 7,
+    FASTBR_SUCC   = 1 << 8,
+};
+
+/*Èç¹û×÷Ϊ¿ª·Å½Ó¿ÚµÄ»°£¬ËùÓÐÀàÐͶ¼¼Ç¼¾ÍÌ«¶àÁË£¬»áµ¼ÖÂÓÐÓõļǼ±»³åµô£¬ËùÒÔÖ»¸ú×ټǼָ¶¨ÀàÐÍ*/
+enum track_type {
+	TRACK_START = -1,
+    SKB_INFO ,  //¸ú×Ùskb½á¹¹ÌåµÄÉêÇëÓëÊÍ·Å
+    DATA_INFO,     //¸ú×Ùskb->dataµÄÉêÇëÓëÊÍ·Å£¬Ò²°üÀ¨PSBUF
+    USER_INFO,     //¸ú×Ùskb->usersµÄ++--ÒÔ¼°set¶¯×÷£¬ÓÈÆä¹Ø×¢kfree_skb½Ó¿ÚÄÚ²¿µÄʵÏÖ
+    CONN_INFO,     //¸ú×Ùskb->usersµÄ++--ÒÔ¼°set¶¯×÷
+    NETDEV_INFO,   //¸ú×Ùnfct->useµÄ++--ÒÔ¼°set¶¯×÷£¬ÔÝδʵÏÖ£¬ºóÐø¿ÉÏȽö¿¼ÂÇfastÖеIJÙ×÷
+    LIST_INFO,        //ÔÝδʹÓÃ
+    LIST_SKB_INFO, //¸ú×Ùsk_buff_head½á¹¹ÌåÁ´±íµÄ++--
+    QUEUE_STATE_INFO,//¸ú×Ùnetdev_queueµÄ״̬¸Ä±ä
+    /*********Ìí¼ÓÆäËûÄ£¿é¼à¿Ø×ÊÔ´ÀàÐÍ**********/
+	/*******************************************/
+    TRACK_END,
+};
+
+struct track_info {
+    struct track_info *next;
+    void *addr;//¼Ç¼skb»òÕßÊý¾ÝµÄheadµÄµØÖ·
+    int len;//¼Ç¼ÉêÇëµÄÄڴ泤¶È
+    unsigned long pri_time;//×îÐÂÒ»´Î·ÃÎÊʱ¼ä
+    int user_num;  //µ±Ç°data»òskb±»Ê¹ÓõļÆÊýÖµ£¬°éËæskbÖеÄusersºÍdataref¶ø±ä»¯
+    int track_num; //¼Ç¼ÒѼǼµ½Êý×é¹ì¼£µÄϱêË÷Òý
+    char* func_track;//º¯Êý»ØËݹ켣
+};
+
+struct leak_list
+{
+    int    count;
+    struct track_info *next;
+};
+
+
+extern void track_add(void *addr, int type1, int type2, int len);
+extern void track_del(void *addr, int type1, int type2);
+extern int test_data_addr(struct sk_buff *skb,int type);
+extern void get_stack_func(unsigned char *my_bkp,int my_len);
+extern void track_init(int type);
+
+#endif
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/netioc_proc.h b/ap/os/linux/linux-3.4.x/include/net/SI/netioc_proc.h
new file mode 100644
index 0000000..bb304d6
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/netioc_proc.h
@@ -0,0 +1,487 @@
+/************************************************************************
+*¹¦ÄܽéÉÜ£ºlinuxÖÐÍøÂçfastnat¡¢fastbrÏà¹Ø²Ù×÷½Ó¿Ú
+*¸ºÔðÈË£º
+*±¸·ÝÈË£º
+*ÐÞ¸ÄÈÕ£º
+*ÐÞ¸ÄÄÚÈÝ£º
+*°æ±¾ºÅ£º
+************************************************************************/
+#ifndef _NETIO_PROC_H_
+#define _NETIO_PROC_H_
+
+#define  PC_MAX_NUM   100
+#define  DEV_NAME_LEN 50
+
+#define  DEV_NAME_LEN_20 20
+
+#define ETH_ALEN            6
+
+#define SLAB_NUM  21
+
+#define HASH_ARRAY_COUNT 512
+//SKBͳ¼ÆÖµ£¬°üÀ¨Òì³£µãµÄͳ¼ÆÖµ
+enum skbinfo_type{
+    SKB_TYPE_ALL = 0,     //skb½á¹¹ÌåÕýÔÚ¹¤×÷µÄ¸öÊý
+    SKB_TYPE_DATA,        //SKBÖеÄslab»úÖÆµÄdataÕýÔÚ¹¤×÷µÄ¸öÊý£¬°üº¬SKB_TYPE_TOCP£¬µ«²»°üº¬SKB_TYPE_FROMCP
+    SKB_TYPE_TOCP,        //·¢ÍùCPµÄskbÕýÔÚ¹¤×÷µÄ¸öÊý
+    SKB_TYPE_FROMCP,      //´ÓCP½ÓÊÕµ½µÄPSBUFÕýÔÚ¹¤×÷µÄ¸öÊý
+    SKB_DATA_BYTES,        //µ±Ç°ÉêÇëµÄdata×Ü×Ö½ÚÊý  £¬ksize·½Ê½ÀÛ¼ÓµÄ
+
+    //ÐÔÄÜÏà¹ØµÄÈ«¾ÖÐÅÏ¢£¬Äں˽öÀÛ¼Ó·¢ÉúµÄ´ÎÊý£¬²»¸ºÔð·ÖÎö
+    SKB_QUEUE_STOP,      //xmit_stopÔì³ÉµÄ¶ª°ü¸öÊý£¬ÀÛ¼ÓÖµ
+    SKB_QUEUE_LOCK,      //QUEUE_LOCKÔì³ÉµÄ¶ª°ü¸öÊý£¬ÀÛ¼ÓÖµ
+    SKB_COPY_CACHE,      //net_cacheÔ´ÎļþÖнøÐÐÈ«¿½±´µÄÀÛ¼ÓÖµ£¬Ä¿Ç°½öÔÚPPPºÍ·ÖƬʱ¿½±´£¬Ó°ÏìÐÔÄÜ
+    SKB_IRQ_FREE,           //ͨ¹ýÈíÖжÏÊͷŵÄskb£¬ÐÔÄÜÏà¹Ø
+    SKB_COPY,                   //Êý¾Ý¿½±´µÄskb£¬ÐÔÄÜÏà¹Ø
+    SKB_FLOOD,                 //·ººéµÄskb£¬ÐÔÄÜÏà¹Ø
+    SKB_ERRFREE,             //devÔ´ÎļþÖдíÎóÊͷŵÄskb¼ÆÊý£¬°üÀ¨SKB_QUEUE_STOPºÍSKB_QUEUE_LOCKÁ½¸ö¼ÆÊýÖµ
+    SKB_FRAG,                   //½ÓÊÕµ½µÄ·ÖƬ±¨ÎÄ£¬ÐÔÄÜÏà¹Ø
+    SKB_OVER_MTU,           //fastÖÐÊý¾Ý³¤¶È´óÓÚ³ö¿Údev MTUʱ£¬fastʧ°Ü¸öÊýͳ¼Æ
+    SKB_LOOP,                   //ͶµÝ¸øÇý¶¯£¬ÓÖ´ÓÇý¶¯ÊÕµ½µÄÒì³£»Ø»·¸öÊýͳ¼Æ£¬´óÓÚ0±íʾÇý¶¯Òì³£
+    SKB_ALLOC_FIAL,         //ÉêÇëskbʧ°ÜµÄ¸öÊýÀÛ¼ÓÖµ
+    SKB_INFO_MAX,
+};
+
+//ÍøÂçÄÚºËÔËÐÐʱµÄͳ¼ÆÖµ£¬ÖØµã¹Ø×¢½á¹¹ÌåµÄÉêÇëµã
+enum net_run_info{
+    BR_MAC_CHANGE = 0,        //ÍøÇÅmacµØÖ·±»¸Ä±ä´ÎÊý
+    NEIGH_ALLOC,                    //neighbourÉêÇë´ÎÊý
+    NEIGH_FREE,                        //neighbourÊͷŵãÀÛ¼ÓÖµ
+    BR_NEIGH_VARY,               //ÇŵãµÄ³ö¿ÚdevµÄMACµØÖ·±»¶à¸öPC¹²Ïí
+    CONN_ALLOC,                      //CONNÉêÇë´ÎÊýÀÛ¼ÓÖµ
+    CONN_FREE,                         //CONNÊͷŵãÀÛ¼ÓÖµ
+    BRFDB_ALLOC,                    //ÇŵãÉêÇë´ÎÊýÀÛ¼ÓÖµ
+    DST_ALLOC,                         //dst_entryÉêÇëÀÛ¼ÓÖµ
+    DST_FREE,                            //dst_entryÊͷŵãÀÛ¼ÓÖµ
+    HH_UPDATE,                         //HH¶þ²ãMACÍ·¸üÐÂÀÛ¼ÓÖµ
+    RT_CACHE_INVALID,               //Çå¿Õ·ÓÉcacheµÄÀÛ¼ÓÖµ
+    RT_HASH_ADD,                        //ÐÂÔört_hash_table½ÚµãµÄÀÛ¼ÓÖµ
+    RT_HASH_DEL,                        //ɾ³ýrt_hash_table½ÚµãµÄÀÛ¼ÓÖµ
+    SSMAC_CHANGE_INDEV,                //ͬһԴMACµØÖ·Èë¿Údev¸Ä±äµÄ´ÎÊý
+    NET_INFO_MAX,
+};
+enum dev_opt_state{
+    DEV_UNOPT=0,    //ÈôÓû§Î´×öÈκβÙ×÷£¬³õʼֵΪ0
+    DEV_NOPRESENT,  //¶ÔÓ¦!netif_device_presentÒì³££¬±íÃ÷Çý¶¯µ×²ãÉÐδ׼±¸ºÃ
+    DEV_OPENED,     //dev is opened
+    DEV_OPEN_FAIL,      //open  fail
+    DEV_CLOSED,          //dev is closed 
+};
+
+enum slabinfo_file{
+    FAST_SLAB = 0,
+    SKB_SLAB,
+    BRFDB_SLAB,
+    DST_SLAB,
+    FIB_TRIE_SLAB,
+    FLOW_SLAB,
+    INETPEER_SLAB,
+    INET_HASHTABLES_SLAB,
+    INET_TIMEWAIT_SOCK_SLAB,
+    MYSOCKET_SLAB,
+    NF_CONNTRACK_CORE_SLAB,
+    NF_CONNTRACK_EXCEPT_SLAB,
+    REQUEST_SOCK_SLAB,
+    SOCK_SLAB,
+    SOCKET_SLAB,
+    XFRM6_TUNNEL_SLAB,
+    XT_HASHLIMIT_SLAB,
+    SOCK_ALLOC_PAGES,           //ÓÉÓÚÎÞ·¨×¼È·ÕÒµ½Êͷŵ㣬ËùÒÔ½öÓÐ++¶¯×÷£¬--Ó¦¸ÃÓÉput_page´¥·¢
+    IP6_OUTPUT_ALLOC_PAGES,     //ÓÉÓÚÎÞ·¨×¼È·ÕÒµ½Êͷŵ㣬ËùÒÔ½öÓÐ++¶¯×÷£¬--Ó¦¸ÃÓÉput_page´¥·¢
+    IP_OUTPUT_ALLOC_PAGES,      //ÓÉÓÚÎÞ·¨×¼È·ÕÒµ½Êͷŵ㣬ËùÒÔ½öÓÐ++¶¯×÷£¬--Ó¦¸ÃÓÉput_page´¥·¢
+    SKB_ALLOC_PAGES,            //ÓÉÓÚÎÞ·¨×¼È·ÕÒµ½Êͷŵ㣬ËùÒÔ½öÓÐ++¶¯×÷£¬--Ó¦¸ÃÓÉput_page´¥·¢
+};
+
+
+/*±¾µØTCPͳ¼ÆÐÅÏ¢*/
+enum tcp_stat_info
+{
+    TCP_RECV_PKTS = 0,       /*½ÓÊÕµÄTCPÊýÄ¿*/
+    TCP_SEND_PKTS,           /*·¢Ë͵ÄTCPÊýÄ¿*/
+    TCP_RETRANS_PKTS,        /*·¢Ë͵ÄÖØ´«TCPÊýÄ¿*/
+    TCP_RECV_DROPS,          /*½ÓÊն˵ÄTCP¶ª°üÊý*/
+    TCP_SEND_DROPS,          /*·¢ËͶ˵ÄTCP¶ª°üÊý*/
+    TCP_RST_SEND_NUM,        /*·¢Ë͵ÄRSTÊý*/
+    TCP_RST_RECV_NUM,        /*½ÓÊÕµÄRSTÊý*/
+    TCP_STATS_MAX,
+};
+
+
+struct tcp_sock_stat
+{
+    unsigned long tcp_recv_num;
+    unsigned long tcp_send_num;
+    unsigned long tcp_retrans_num;
+    unsigned long tcp_recv_drops;
+    unsigned long tcp_send_drops;
+    unsigned long tcp_rst_send;
+    unsigned long tcp_rst_recv;
+};
+
+/****×ÊԴʹÓü°ÉÏÏÞÐÅÏ¢£¬ËùÓбê×¼ÄÚºËÓÐÉÏÏÞÇé¿öµÄ£¬½ÔÐè¼ì²â£¬ÒÔ·ÀÖ¹Òì³£·¢Éú****/
+struct net_max_check_msg
+{
+    /*nf_conntrack*/
+    unsigned long nf_conntrack_max;  //nf_conntrack_max = 4832
+    unsigned long nf_conntrack_now;  //net->ct.count
+    /*enqueue*/
+    int             netdev_max_backlog;    //netdev_max_backlog=1000
+    int          input_queue_len;          //²Î¿´enqueue_to_backlog½Ó¿ÚʵÏÖ
+    int          rx_dropped;                 //ÒòΪÈë¶ÓÁÐÒÑÂúÔì³ÉµÄÈë¶ÓÁжª°üµÄÀÛ¼ÓÖµ
+    /*ÐÔÄÜÏà¹Ø*/
+    int          fastnat_link_max;                //nf_conntrack_max
+    int          fastnat_link_now;                //working_list.count
+    int          fast6_link_max;                  //nf_conntrack_max
+    int          fast6_link_now;                  //working_list6.count
+    
+    /*ÍøÂçÄÚºËÔËÐÐʱµÄͳ¼ÆÖµ£¬ÖØµã¹Ø×¢½á¹¹ÌåµÄÉêÇëµã*/
+    unsigned long br_mac_change;          //ÍøÇÅmacµØÖ·±»¸Ä±ä´ÎÊý
+    unsigned long neigh_alloc;                   //neighbourÉêÇë´ÎÊý
+    unsigned long neigh_free;                      //neighbourÊͷŵãÀÛ¼ÓÖµ
+    unsigned long br_neigh_vary;                //ÇŵãµÄ³ö¿ÚdevµÄmacµØÖ·±»¶à¸öpc¹²Ïí
+    unsigned long conn_alloc;                    //connÉêÇë´ÎÊýÀÛ¼ÓÖµ
+    unsigned long conn_free;                          //connÊͷŵãÀÛ¼ÓÖµ
+    unsigned long brfdb_alloc;                    //ÇŵãÉêÇë´ÎÊýÀÛ¼ÓÖµ
+    unsigned long dst_alloc;                          //dst_entryÉêÇëÀÛ¼ÓÖµ
+    unsigned long dst_free;                            //dst_entryÊͷŵãÀÛ¼ÓÖµ
+    unsigned long hh_update;                          //hh¶þ²ãmacÍ·¸üÐÂÀÛ¼ÓÖµ
+    unsigned long rt_cache_invalid;                           //Çå¿Õ·ÓÉcacheµÄÀÛ¼ÓÖµ
+    unsigned long rt_hash_add;                        //ÐÂÔört_hash_table½ÚµãµÄÀÛ¼ÓÖµ
+    unsigned long rt_hash_del;                        //ɾ³ýrt_hash_table½ÚµãµÄÀÛ¼ÓÖµ
+    unsigned long ssmac_change_indev;           //ͬһԴMACµØÖ·Èë¿Údev¸Ä±äµÄ´ÎÊý
+};
+
+/*************************  SKBÏà¹ØÐÅÏ¢£¬°üÀ¨Í³¼ÆÐÅÏ¢ºÍfastÐÅÏ¢ ***********************/
+struct skb_and_fast_msg
+{
+    int  skb_num4;              //½ÓÊÕµ½µÄV4Êý¾Ý°ü
+    int  skb_num6;              //½ÓÊÕµ½µÄV6Êý¾Ý°ü
+    int  skb_big_num;           //len³¤¶È³¬¹ý1000µÄÊý¾Ý°ü£¬º¬V4ºÍV6
+    int  skb_small_num;         //len³¤¶ÈСÓÚ100µÄÊý¾Ý°ü£¬º¬V4ºÍV6
+    int  skb_bytes4;            //½ÓÊÕµ½µÄV4Êý¾Ý°ü×Ö½ÚÊý
+    int  skb_bytes6;            //½ÓÊÕµ½µÄV6Êý¾Ý°ü×Ö½ÚÊý
+    int  skb_unknown;           //½ÓÊÕµ½µÄδ֪ЭÒéÊý¾Ý°ü£¬°üÀ¨ARPµÈ·ÇV4ºÍV6µÄ±¨ÎÄ
+    int  skb_tcpnum;            //½ÓÊÕµ½µÄtcpÊý¾Ý°ü£¬º¬V4ºÍV6£¬µ«²»º¬fastbrµÄ±¨ÎÄ
+    int  skb_udpnum;            //½ÓÊÕµ½µÄudpÊý¾Ý°ü£¬º¬V4ºÍV6£¬µ«²»º¬fastbrµÄ±¨ÎÄ
+    int  broadcast_num4;        //½ÓÊÕµ½µÄV4¹ã²¥°ü
+    int  broadcast_num6;        //½ÓÊÕµ½µÄV6¹ã²¥°ü
+    int  multicast_num4;        //½ÓÊÕµ½µÄV4×é²¥±¨
+    int  multicast_num6;        //½ÓÊÕµ½µÄV6×é²¥±¨
+    int  fastnat_num;           //fastnat³É¹¦µÄ±¨ÎÄ
+    int  fast6_num;             //fast6³É¹¦µÄ±¨ÎÄ
+    int  fastbr_num;            //fastbr³É¹¦µÄ±¨ÎÄ
+    int  fastnat_level;         //²Î¿´FAST_NET_DEVICE
+    int  fastbr_level;          //²¼¶ûÀàÐÍ
+    //ÏÂÃæ¼¸¸öֵΪÀÛ¼ÓÖµ£¬ÐÔÄÜÏà¹Ø
+    int  irqfree_num;           //ͨ¹ýÈíÖжÏÊͷŵÄskb£¬ÐÔÄÜÏà¹Ø
+    int  skbcopy_num;           //Êý¾Ý¿½±´µÄskb£¬ÐÔÄÜÏà¹Ø
+    int  cache_copy;             //net_cacheÔ´Îļþ½øÐп½±´µÄÀÛ»ý¼ÆÊý£¬ÐÔÄÜÏà¹Ø
+    int  skbflood_num;          //·ººéµÄskb£¬ÐÔÄÜÏà¹Ø
+    int  errfree_num;          //devÔ´ÎļþÖдíÎóÊͷŵÄskb¼ÆÊý£¬°üÀ¨SKB_QUEUE_STOPºÍSKB_QUEUE_LOCKÁ½¸ö¼ÆÊýÖµ
+    int  frag_num;              //½ÓÊÕµ½µÄ·ÖƬ±¨ÎÄ£¬ÐÔÄÜÏà¹Ø
+    int  mtu_num;               //fastÖÐÊý¾Ý³¤¶È´óÓÚ³ö¿Údev MTUʱ£¬fastʧ°Ü¸öÊýͳ¼Æ
+    int  fast_loop;             //ͶµÝ¸øÇý¶¯£¬ÓÖ´ÓÇý¶¯ÊÕµ½µÄÒì³£»Ø»·¸öÊýͳ¼Æ
+    int  skb_alloc_fail ;        //ÉêÇëskbʧ°ÜµÄ¸öÊýÀÛ¼ÓÖµ
+    int  xmit_lock_num;        //xmit_lock_owner±»Ëø×¡Ôì³ÉµÄ¶ª°üµÄÀÛ¼Ó¼ÆÊý£¬Çý¶¯Ôì³ÉµÄ
+    int  xmit_stop_num;      //!netif_xmit_stopped(txq)Ôì³ÉµÄ¶ª°üµÄÀÛ¼Ó¼ÆÊý£¬Çý¶¯Ôì³ÉµÄ
+    int  br_mac_change_num;      //ÍøÇÅmacµØÖ·±»¸Ä±ä´ÎÊý
+    int  fast_tcpdump_num;      //fast×¥°ü¸öÊý
+    int  fast_switch;
+    int  fast_local4_rcv_num;       //±¾µØfast_local4³É¹¦½ÓÊÕ±¨ÎÄ
+    int  fast_local6_rcv_num;       //±¾µØfast_local6³É¹¦½ÓÊÕ±¨ÎÄ
+    int  fast_local4_output_num;    //±¾µØfast_local4³É¹¦·¢Ëͱ¨ÎÄ
+    int  fast_local6_output_num;    //±¾µØfast_local6³É¹¦·¢Ëͱ¨ÎÄ
+};
+
+struct skb_using_msg
+{
+    unsigned long skb_all;
+    unsigned long skb_tocp;
+    unsigned long skb_fromcp;
+    unsigned long skb_data_num;
+    unsigned long skb_data_size;
+    unsigned long skb_stop;
+    unsigned long skb_lock;
+    unsigned long skb_panic;
+    unsigned long skb_fail;
+};
+
+/*************************  ½á¹¹Ì嶨Òå    DEV  ***********************/
+//ÍøÂçÌí¼Ó£¬Í³¼ÆÍøÂç²ãÃæÊÕ·¢°üÇé¿ö
+struct net_dev_skbinfo {
+    unsigned long    rx_packets;  //Çý¶¯·¢ËÍÀ´µÄÊý¾Ý°ü¸öÊý£¬ÔÚnetif_rxÍ·ÀÛ¼Ó
+    unsigned long    tx_packets;  //·¢Ë͸øÇý¶¯µÄÊý¾Ý°ü¸öÊý£¬ÔÚdev_queue_xmitÍ·ÀÛ¼Ó
+    unsigned long    rx_bytes;    //×Ö½ÚÊý
+    unsigned long    tx_bytes;    //×Ö½ÚÊý
+    unsigned long    rx_dropped;  //netif_rxÄÚ²¿Á÷³ÌÖÐËùÓÐÒì³£ÊÍ·ÅskbµÄÀÛ¼Ó£¬Èç´ïµ½netdev_max_backlogÈë¶ÓÁÐÉÏÏÞ¶ø¶ª°ü
+    unsigned long    tx_dropped;  //dev_queue_xmitÄÚ²¿Á÷³ÌÖÐËùÓÐÒì³£ÊÍ·ÅskbµÄÀÛ¼Ó£¬Èç(txq->xmit_lock_owner == cpu)Ôì³ÉµÄ¶ª°ü
+};
+
+//ÍøÂçÌí¼Ó£¬connÊÕ·¢°üÇé¿ö
+struct conn_skbinfo {
+    unsigned long    packets;  //Êý¾Ý°ü¸öÊý
+    unsigned long    bytes;    //×Ö½ÚÊý
+};
+
+/* ¸Ã½á¹¹ÌåÖеÄËùÓÐÐÅÏ¢½ÔÓÉÇý¶¯¸³Öµ£¬ÍøÂç×é²»»á¸³Öµ */
+//Õâ¸ö½á¹¹Ì屨ÐëºÍ <linux/netdevice.h>ÖеÄnet_device_stats±£³ÖÒ»Ö   
+struct net_dev_stats {
+            unsigned long    rx_packets;
+            unsigned long    tx_packets;
+            unsigned long    rx_bytes;
+            unsigned long    tx_bytes;
+            unsigned long    rx_errors;   //Ðè¼à¿Ø
+            unsigned long    tx_errors;   //Ðè¼à¿Ø
+            unsigned long    rx_dropped;   //Ðè¼à¿Ø
+            unsigned long    tx_dropped;   //Ðè¼à¿Ø
+            unsigned long    multicast;
+            unsigned long    collisions;
+            unsigned long    rx_length_errors;   //Ðè¼à¿Ø
+            unsigned long    rx_over_errors;   //Ðè¼à¿Ø
+            unsigned long    rx_crc_errors;   //Ðè¼à¿Ø
+            unsigned long    rx_frame_errors;   //Ðè¼à¿Ø
+            unsigned long    rx_fifo_errors;   //Ðè¼à¿Ø
+            unsigned long    rx_missed_errors;   //Ðè¼à¿Ø
+            unsigned long    tx_aborted_errors;   //Ðè¼à¿Ø
+            unsigned long    tx_carrier_errors;   //Ðè¼à¿Ø
+            unsigned long    tx_fifo_errors;   //Ðè¼à¿Ø
+            unsigned long    tx_heartbeat_errors;   //Ðè¼à¿Ø
+            unsigned long    tx_window_errors;   //Ðè¼à¿Ø
+            unsigned long    rx_compressed;
+            unsigned long    tx_compressed;         
+};
+
+struct ioctl_dev_netstats
+{
+    char dev_name[20];
+    struct net_dev_skbinfo  stats_dbg;  //ÍøÂçÌí¼ÓµÄ£¬Í³¼ÆÍøÂç²ãÃæÊÕ·¢°üÇé¿ö
+    struct net_dev_stats  stats;     //Êý¾ÝÊÕ·¢Í³¼ÆÖµ£¬¸Ãֵȫ²¿ÓÉÇý¶¯¸³ÖµµÄ£¬ÍøÂç²»¸³Öµ
+    unsigned int        flags;           //IFF_UPµÈ
+    unsigned char       operstate;    //ĿǰûɶÓÃ
+    unsigned long       state;           //µ×²ãÇý¶¯×´Ì¬£¬__LINK_STATE_NOCARRIER
+    int                 net_flag;        //Óû§ifconfigµÄ½á¹û״̬£¬ÈçDEV_OPEN_FAIL
+    unsigned long       que_state;       //¶ÓÁÐ״̬£¬¶ÔÓ¦ dev->_tx[0].state£¬Èç__QUEUE_STATE_DRV_XOFF
+    unsigned int        num_tx_queues;   //TX¶ÓÁÐÊýÁ¿£¬¶àÊýÇý¶¯Ê¹ÓÃΨһ¶ÓÁУ¬ÔòֵΪ1
+};
+
+
+/*************************  ½á¹¹Ì嶨Òå    OTHER  ***********************/
+struct pc_info
+{  
+    unsigned char mac_addr[6];
+    char dev_name[DEV_NAME_LEN];
+};
+
+struct pc_node
+{
+    unsigned int num;
+    struct pc_info info[PC_MAX_NUM];
+};
+
+struct leak_info
+{  
+    void *addr;
+    int user_num;  //µ±Ç°data»òskb±»Ê¹ÓõļÆÊýÖµ£¬°éËæskbÖеÄusersºÍdataref¶ø±ä»¯
+    int track_num; //¼Ç¼ÒѼǼµ½Êý×é¹ì¼£µÄϱêË÷Òý
+    char func_track[10][100];//º¯Êý»ØËݹ켣
+};
+
+struct slab_info
+{
+    int num[SLAB_NUM][2];
+};
+
+ 
+struct hash_info
+{
+    int max_hash_size;
+    int current_hash_num;
+    int hash[HASH_ARRAY_COUNT][2];
+    int current_array_size;
+};
+
+struct ptype_info
+{
+    unsigned long ptype_all[5];
+    unsigned long ptype_base[15];
+};
+
+struct pkt_lost_stats
+{
+    unsigned int send_drops;
+    unsigned int send_drop_bytes;
+    unsigned int recv_drops;
+    unsigned int recv_drop_bytes;
+    unsigned int total_packets;
+    unsigned int total_bytes;
+};
+
+struct pkt_lost_info
+{
+    struct pkt_lost_stats stats[2];
+};
+
+typedef struct
+{
+    char usb[DEV_NAME_LEN_20];
+    char ps[DEV_NAME_LEN_20];
+    char wifi_wan[DEV_NAME_LEN_20];
+    char wifi_lan[DEV_NAME_LEN_20];
+    char eth_wan[DEV_NAME_LEN_20];
+    char eth_lan[DEV_NAME_LEN_20];
+    char ps_ext1[DEV_NAME_LEN_20];
+    char ps_ext2[DEV_NAME_LEN_20];
+    char ps_ext3[DEV_NAME_LEN_20];
+    char ps_ext4[DEV_NAME_LEN_20];
+} net_dbg_dev_info_t;
+
+struct time_list{
+    struct timeval tv;
+    struct list_head packet_list;
+};
+
+struct net_debug_packet_list{
+    struct list_head list;
+    struct list_head time;
+    int pid;
+	int tgid;
+	char pname[DEV_NAME_LEN];
+    int count;
+};
+
+/******************************±äÁ¿ÉùÃ÷***********************/
+/******************************±äÁ¿ÉùÃ÷***********************/
+/******************************±äÁ¿ÉùÃ÷***********************/
+extern int leak_set;      // 1±íʾ¸ú×Ùskb¼°dataÉêÇëÊͷŵ㣻2±íʾ¸ú×Ùusers£¬ÒÔ¼ì²âΪºÎskbʼÖÕ²»ÄÜÊÍ·Å£¬ÔÝʱ¸Ã¹¦ÄÜÉв»¿ÉÓÃ
+extern int leak_list_max; // ÈÝÐí»º´æµÄ´ýÊͷŵÄskb¼°dataµÄ¸öÊý£¬¿Éµ÷Õû£»
+extern int track_max;     //¹ì¼£¸ú×ÙÊý×éµÄÉÏÏÞ£¬½öµ±user++--ʱ²ÅÐèÒªÀ©´ó£¬·ñÔò2¼´¿É£»
+extern int stack_lenmax;  //Õ»º¯Êý¹ì¼£µÄ×Ö·û¸öÊýÉÏÏÞ£»
+extern int leak_full_panic;
+extern unsigned long  now_time; //µ±Ç°Ê±¿Ìµã
+extern spinlock_t  leak_lock;   //·ÀÖ¹ÔÚbhÖб»µ÷Óã¬Ê¹ÓÃbhËø
+
+
+extern struct leak_list data_leak[TRACK_END];
+extern struct leak_list data_free[TRACK_END];//·Ö±ð¶ÔÓ¦ÕýÔÚʹÓõÄÊý¾ÝºÍÒѾ­ÊͷŵÄÊý¾ÝÁ´±í
+extern void *data_head[TRACK_END];//ÿ¸öÄÚ´æ¼à¿ØÀàÐ͵ijõʼ»¯Ê×µØÖ·£¬È·±£Á´±íµÄÊý¾ÝÇøÁ¬Ðø£¬ÒÔ±ãramdumpʱֱ½ÓËÑË÷
+extern int init_finish ;//Á´±í³õʼ»¯±êÖ¾
+
+/*dump stkÓõ½µÄÏà¹Ø±äÁ¿*/
+extern unsigned int skb_dump_len;
+extern char skb_dump_str[];
+
+/*ºË¼äÖØ¸´Êͷżì²â¿ª¹Ø*/
+extern int set_psbufleak ;  
+extern int set_extskbleak ;
+
+extern unsigned long skbinfo_dbg[SKB_INFO_MAX];
+extern unsigned long netruninfo_dbg[NET_INFO_MAX]; 
+extern unsigned char br_ipchange_flag; //br0 ip´Û¸Ä¶ÏÑÔ
+extern int set_tcpdump; //¶¨µã×¥°ü¿ª¹Ø
+
+extern unsigned char ignoremac[ETH_ALEN];
+
+/*¶Ô±¾µØTCP½øÐÐÏà¹ØÍ³¼Æ*/
+extern unsigned long tcp_stats_dbg[TCP_STATS_MAX];
+
+extern char br_name[];
+extern char ps_name[];
+extern char usb_name[];
+extern char ppp_name[];
+
+
+//sqÌí¼Ó£¬ÓÃÓÚÊý¾Ý°ü½¨Ä£ÒÔ¼°ÐÔÄÜͳ¼ÆÏà¹Ø£¬net_info_numÈ«¾ÖÖÐÐÔÄÜÏà¹ØµÄͳ¼ÆÒ²ÐèÌåÏÖ
+extern  int  skb_num4;                  //½ÓÊÕµ½µÄV4Êý¾Ý°ü
+extern  int  skb_num6;                  //½ÓÊÕµ½µÄV6Êý¾Ý°ü
+extern  int  skb_big_num;               //len³¤¶È³¬¹ý1000µÄÊý¾Ý°ü£¬º¬V4ºÍV6
+extern  int  skb_small_num;             //len³¤¶ÈСÓÚ100µÄÊý¾Ý°ü£¬º¬V4ºÍV6
+extern  int  skb_bytes4;                //½ÓÊÕµ½µÄV4Êý¾Ý°ü×Ö½ÚÊý
+extern  int  skb_bytes6;                //½ÓÊÕµ½µÄV6Êý¾Ý°ü×Ö½ÚÊý
+extern  int  skb_unknown;               //½ÓÊÕµ½µÄδ֪ЭÒéÊý¾Ý°ü£¬°üÀ¨ARP
+extern  int  skb_tcpnum;                //½ÓÊÕµ½µÄtcpÊý¾Ý°ü£¬º¬V4ºÍV6
+extern  int  skb_udpnum;                //½ÓÊÕµ½µÄudpÊý¾Ý°ü£¬º¬V4ºÍV6
+extern  int  broadcast_num4;            //½ÓÊÕµ½µÄV4¹ã²¥°ü
+extern  int  broadcast_num6;            //½ÓÊÕµ½µÄV6¹ã²¥°ü
+extern  int  multicast_num4;            //½ÓÊÕµ½µÄV4×é²¥±¨
+extern  int  multicast_num6;            //½ÓÊÕµ½µÄV6×é²¥±¨
+extern  int  fastnat_num;               //fastnat³É¹¦µÄ±¨ÎÄ
+extern  int  fast6_num;                 //fast6³É¹¦µÄ±¨ÎÄ
+extern  int  fastbr_num;                //fastbr³É¹¦µÄ±¨ÎÄ
+extern  int  fast_local4_rcv_num;       //±¾µØfast_local4³É¹¦½ÓÊÕ±¨ÎÄ
+extern  int  fast_local6_rcv_num;       //±¾µØfast_local6³É¹¦½ÓÊÕ±¨ÎÄ
+extern  int  fast_local4_output_num;    //±¾µØfast_local4³É¹¦·¢Ëͱ¨ÎÄ
+extern  int  fast_local6_output_num;    //±¾µØfast_local6³É¹¦·¢Ëͱ¨ÎÄ
+extern  int  fast_tcpdump_num;          //fast×¥°üÊýÁ¿
+
+extern int double_mac; 
+
+extern int net_debug_ping;               //×ÔÑÐping°ü¼Ç¼¶ª°üʱÑÓ¹¦ÄÜ
+extern int net_debug_perf;               //×ÔÑÐtcp/udp°ü¼Ç¼¶ª°üʱÑÓ¹¦ÄÜ£¬ÐèÒªserver¶ÎÄܰ²×°×ÔÑÐÓ¦ÓÃ
+
+//slabÄÚ´æÊ¹ÓÃÏà¹ØÍ³¼Æ£¬Î´¿¼ÂÇͨÓÃslabµØÖ·³Ø£¬Èçkmalloc
+extern struct slab_info slab_count;
+
+//·¢Ë͸øCP´¦ÀíµÄ£¬´ýÊͷŵÄskbÁ´±í£¬ÓÃÓÚlog¸ú×Ù£¬·ÀÖ¹ºË¼äÄÚ´æÐ¹Â©£»
+extern struct ext_list toCp_listlog[MAX_EXT_MEM_HASH];
+
+//CP·¢Ë͸øAPµÄpsbufÐÅÏ¢Á´±í£¬ÓÃÓÚlog¸ú×Ù£¬·ÀÖ¹ºË¼äÄÚ´æÐ¹Â©;
+extern struct ext_list fromCp_list[MAX_EXT_MEM_HASH];
+
+/*½øÐÐTCPͳ¼Æ*/
+#define TCP_PKT_STATS_INC(_mod)    tcp_stats_dbg[_mod]++
+
+
+/******************************Íⲿ½Ó¿ÚÉùÃ÷***********************/
+/******************************Íⲿ½Ó¿ÚÉùÃ÷***********************/
+/******************************Íⲿ½Ó¿ÚÉùÃ÷***********************/
+extern void skbinfo_add(unsigned char *addr,unsigned int skb_type);
+extern void skbinfo_del(unsigned char *addr,unsigned int skb_type);
+extern void netruninfo_add(unsigned char *addr,unsigned int info_type);
+extern void netruninfo_del(unsigned char *addr,unsigned int info_type);
+
+extern int get_skbcnt(unsigned long arg);
+extern int get_dev_info(unsigned long arg);
+extern int get_skb_using(unsigned long arg);
+extern int network_get_pcmac(unsigned long arg);
+extern int get_kernelparam(unsigned long arg);
+extern int get_slab_info(unsigned long arg);
+extern int get_hash_info(unsigned long arg);
+
+extern int set_fastnat_level(void *arg);
+extern int set_fastbr_level(void *arg);
+extern int set_fast_debug_panic(void *arg);
+extern int set_fast_dev_xmit(void *arg);
+extern int set_ackdrop(void *arg);
+extern int set_dumpflag(void *arg);
+extern int set_skb_dump(unsigned long arg);
+extern int set_print_opt(void *arg);
+extern int set_sq_tcpdump(void *arg);
+extern int set_leak(void *arg);
+extern int set_max(unsigned long arg);
+extern int set_stacklenmax(unsigned long arg);
+extern int set_trackmax(unsigned long arg);
+extern int set_tcpdump_opt(unsigned long arg);
+extern int set_br_name(void *arg);
+extern int set_ps_name(void *arg);
+extern int set_usb_name(void *arg);
+extern int set_ppp_name(void *arg);
+extern int set_brip(unsigned long arg);
+extern int set_kernelparam(unsigned long arg);
+extern int set_errno_procname(void *arg);
+extern int get_neigh_ip(unsigned long arg);
+extern int get_skb_fast(unsigned long arg);
+extern int get_max_msg(unsigned long arg);
+extern int get_ptype(unsigned long arg);
+extern int get_process_info(void *arg);
+extern void netslab_inc(int i);
+extern void netslab_dec(int i);
+extern void track_netlink(struct sk_buff *skb,u32 group);
+extern void record_app_atcive_net();
+
+int get_pkt_lost_info(unsigned long arg);
+
+int get_tcp_stat_info(unsigned long arg);
+
+#endif //end _NETIO_FASTINFO_H_
+
+
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/netioctl.h b/ap/os/linux/linux-3.4.x/include/net/SI/netioctl.h
new file mode 100644
index 0000000..43ac97a
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/netioctl.h
@@ -0,0 +1,101 @@
+/************************************************************************
+*¹¦ÄܽéÉÜ£º×ÔÑÐʵÏÖµÄioctl½Ó¿Ú²ÎÊý¶¨Òå
+*¸ºÔðÈË£º
+*±¸·ÝÈË£º
+*ÐÞ¸ÄÈÕ£º
+*ÐÞ¸ÄÄÚÈÝ£º
+*°æ±¾ºÅ£º
+************************************************************************/
+
+#ifndef __NIOCTL_H_
+#define __NIOCTL_H_
+
+ 
+#define NIOCTL_MAGIC 'x'   
+#define NIOCTL_MAX_NR 32         //IOCTL¿ÉÓÃÃüÁîµÄ×î´ó¸öÊý
+#define NIOCTL_MAX_MSGLEN 128    //×Ö·û´®ÀàÐͲÎÊýÖµµÄ×î´ó³¤¶È
+#define NIOCTL_MAX_NAMELEN 20    //²ÎÊýÃû³ÆµÄ×î´ó³¤¶È
+#define NETIOCTL_MAJOR    222    //ioctlÉ豸½Úµã
+
+/*
+    ͨÓÃioctlµÄ²ÎÊýÀàÐÍ£¬µ±´ÓÄں˷µ»ØÓ¦ÓÃʱ£¬ÔÚbufÖзµ»Ø²Ù×÷½á¹û¡£
+*/
+
+typedef struct
+{
+    unsigned int size;                       //×Ö·û´®ÀàÐͲÎÊýµÄ³¤¶È£¬¶ÔÓÚÕûÐͲÎÊý£¬¸ÃÖµ½¨Ò鸳ֵΪ0
+    char name[NIOCTL_MAX_NAMELEN];           //²ÎÊýÃû³Æ£¬ÀýÈçfastnat¡¢fastbr¡¢leak
+    unsigned char buf[NIOCTL_MAX_MSGLEN];    //×Ö·û´®ÀàÐͲÎÊýÖµ£¬ÀýÈçon/off
+    void *data;                              //×Ô¶¨Òå½á¹¹Ìå
+    int value;                               //ÕûÐͲÎÊýÖµ£¬ÀýÈç0/1/2/3
+    
+}__attribute__((packed))  ioctl_data;
+
+#define NIOCTL_READ _IO(NIOCTL_MAGIC,0)
+
+/*»ñÈ¡¶þ²ãÁÚ¾ÓÁбíÖÐmacµØÖ·ºÍ³ö¿Údevname*/
+
+#define NIOCGPCINFO  _IOWR(NIOCTL_MAGIC,1,ioctl_data)
+
+/*»ñÈ¡ÍøÂçÉ豸tx¡¢rx¡¢dropµÈͳ¼Æ£¬ÍøÂçÉ豸״̬ÐÅÏ¢*/
+
+#define NIOCGSTATS _IOWR(NIOCTL_MAGIC,2,ioctl_data)
+
+/*ÉèÖÃÄں˲ÎÊýͨÓÃÃüÁÀýÈçfastnat/fastbr/leak/brmoniterµÈ¿ª¹Ø»ò¼¶±ð*/
+
+#define NIOCSKPARAM _IOWR(NIOCTL_MAGIC,3,ioctl_data)
+
+
+/*»ñÈ¡fastnat ×î´óÁ´½ÓÊý*/
+
+#define NIOCGFASTMAXLINKS _IOR(NIOCTL_MAGIC,7,ioctl_data)//È·¶¨ºóÐøÊÇ·ñ»¹ÒªÊ¹ÓÃ
+
+
+
+/*»ñÈ¡×Ô´ò¿ªÍ³¼Æ¿ª¹ØÖ®ºó£¬skb µÄµ±Ç°¸öÊý¡¢Ë²¼ä·åÖµµÈͳ¼ÆÐÅÏ¢¡¢skb¿½±´´ÎÊý¡¢skbÍ·À©Õ¹´ÎÊý
+skbÔÚÈíÖжÏÊÍ·Å´ÎÊý*/
+
+#define NIOCGSKBNUM _IOWR(NIOCTL_MAGIC,13,ioctl_data)
+
+/*ÉèÖÃÄÚºËskb dumpÆ¥ÅäÐÅÏ¢£¬ÀýÈçÆ¥ÅäÌØ¶¨macµØÖ·¡¢IPµØÖ·*/
+
+#define NIOCGSKBDUMP _IOR(NIOCTL_MAGIC,14,ioctl_data)
+
+/*ÉèÖÃÄÚºËtcpdump ¿ª¹Ø*/
+
+#define NIOCSTCPDUMP _IOR(NIOCTL_MAGIC,15,ioctl_data)
+
+/**/
+
+#define NIOCPDP     _IOR(NIOCTL_MAGIC,17,ioctl_data)
+
+/**/
+
+#define NIOCGKPARAM _IOR(NIOCTL_MAGIC,19,ioctl_data)
+
+
+/*slab ÐÅÏ¢»ñÈ¡*/
+#define NIOCGSLAB _IOR(NIOCTL_MAGIC,21,ioctl_data)
+
+/*add by jiangjing,»ñÈ¡init_netÖÐËùÓÐÍøÂçÉ豸µÄÃû³ÆºÍ״̬ÐÅÏ¢*/
+#define NIOCGDEVLIST  _IOR(NIOCTL_MAGIC, 22, ioctl_data)
+
+/*add by zhangpeimin£¬»ñÈ¡SKB FASTµ±Ç°Í³¼ÆÐÅÏ¢*/
+#define NIOCGSKBFAST _IOR(NIOCTL_MAGIC, 24, ioctl_data)
+
+#define NIOCGMAXMSG  _IOR(NIOCTL_MAGIC, 25, ioctl_data)
+
+#define NIOCGPTYPE  _IOR(NIOCTL_MAGIC, 26, ioctl_data)
+
+#define NIOCGPSINFO  _IOR(NIOCTL_MAGIC, 27, ioctl_data)
+
+#define NIOCGHASH   _IOR(NIOCTL_MAGIC, 28, ioctl_data)
+
+/*»ñÈ¡µ±Ç°TCP¶ª°üͳ¼ÆÐÅÏ¢*/
+#define NIOCGPKTLOST _IOR(NIOCTL_MAGIC, 29, ioctl_data)
+
+/*»ñÈ¡±¾µØTCPÌ×½Ó×Öͳ¼ÆÐÅÏ¢*/
+#define NIOCGTCPSOCKSTATS _IOR(NIOCTL_MAGIC, 30, ioctl_data)
+
+#endif //end _ZXIC_IOCTL_H_ 
+
diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/pkt_lost_track.h b/ap/os/linux/linux-3.4.x/include/net/SI/pkt_lost_track.h
new file mode 100644
index 0000000..68e77ee
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/pkt_lost_track.h
@@ -0,0 +1,43 @@
+#ifndef _PKT_LOST_TRACK_H

+#define _PKT_LOST_TRACK_H

+

+/*¶ª°ü¸ú×Ù¿ª¹Ø*/

+extern int pkt_lost_track;

+

+extern spinlock_t plt_spinlock;

+

+struct conn_stats

+{

+    unsigned int recv_packets;

+    unsigned int recv_bytes;

+};

+

+

+struct send_drop_frag_t{

+    struct send_drop_frag_t *prev;

+    struct send_drop_frag_t *next;

+    //struct hlist_nulls_node hnnode;

+	unsigned int lower_seq;

+	unsigned int upper_seq;

+};

+struct conn_seq_track{

+	unsigned int cur_send_seq;           //µ±Ç°·¢ËÍ·½µÄ×îÐÂseqÐòÁÐ

+	int cur_ack_seq;                     //µ±Ç°·¢ËÍ·½µÄ×îÐÂackÐòÁÐ

+	unsigned int send_drops;             //·¢ËÍ·½¶ª°ü¸öÊýÀÛ¼ÓÖµ

+    unsigned int send_drop_bytes;

+	//int send_suspends;                 //·¢ËÍ·½¹ÒÆðÊý¾Ý·¢Ë͵ļÆÊý

+	unsigned int recv_drops;             //½ÓÊÕ·½¶ª°ü¸öÊýÀÛ¼ÓÖµ

+	unsigned int recv_drop_bytes;

+	//hlist_nulls_head *send_drop_head;  //µ½Ä¿Ç°ÎªÖ¹·¢ËÍ·½¶ªÊ§µÄ·¢ËÍÐòÁжΣ¬ÉÐÎ´ÖØ´«

+	struct send_drop_frag_t *send_drop_frag;

+};

+

+void pkt_lost_init(struct nf_conn *ct);

+

+void free_drop_frag(void *pct);

+

+void packet_lost_track(struct sk_buff *skb, struct nf_conn *ct);

+

+

+#endif

+

diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/print_sun.h b/ap/os/linux/linux-3.4.x/include/net/SI/print_sun.h
new file mode 100644
index 0000000..b28a43a
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/print_sun.h
@@ -0,0 +1,84 @@
+#ifndef _PRINT_SUN_H

+#define _PRINT_SUN_H

+#include <net/SI/net_ext_modul.h> 

+

+

+enum{

+	SUN_DBG=1,    //µ÷ÊÔ¼¶±ð£¬´òÓ¡²»×¼Ë¢ÆÁ£¬²»×¼Ó°ÏìÐÔÄÜ

+	SUN_LEARN,    //ѧϰ¼¶±ð£¬Á÷³Ì´òÓ¡Óã¬ÑÏÖØÓ°ÏìÐÔÄÜ

+	SUN_ERR,//ÒÉËÆ´íÎó£¬ÄÚ²¿½øÐÐÕ»´òÓ¡£¬²»×¼ÇáÒ×ʹÓ㬽ӽü¶ÏÑÔ 

+};

+/********************************************************************************/

+/***********************   ËïȪstart      ***********************/

+/*ΪÁ˱ãÓÚ¸ú×Ù´úÂ룬½¨ÒéËùÓдòÓ¡µØ·½Ìí¼ÓskbºÍdataµÄµØÖ·£¬ÕâÑùËÑË÷ÏÂÎļþ¾ÍÄÜÕÒµ½¶ÔÓ¦µÄ¹ì¼£ÁË*/

+/********************************************************************************/

+

+//ÓÃÓÚ¶ÔÍøÂçÖйؼüµã½øÐдòÓ¡¸ú×Ù

+//ÈçʹÓÃif else·ÖÖ§£¬ÐèҪʹÓÃ{}°Ñprint_sunÀ¨ÆðÀ´

+#define print_sun(n,f,args...)                       \

+{  \

+	if(set_print) \

+	{ \

+		if(set_print<=n&&net_ratelimit())   \

+		{    \

+			printk( "print_sun::::::::::file =%s; line =%d; time = %d  S\n", __func__,__LINE__ ,jiffies/HZ);    \

+			printk(f,## args);   \

+			if(set_print > SUN_DBG) \

+			{ \

+				dump_stack(); \

+				if(set_print == SUN_ERR) \

+				{ \

+					panic("net ERR!!!"); \

+				} \

+			} \

+		}  \

+	} \

+}

+

+enum  {

+	PRT_CONN = 1,

+	PRT_NAT=2,

+	PRT_SOCK=3,

+	PRT_SOCKET=4,

+	PRT_SLAB=5,

+	PRT_DST=6,

+	PRT_HOOK=7,

+	PRT_NEIGHBOUR=8,

+	PRT_BR=9,

+	PRT_ROUTE=10,

+	PRT_LOCAL=11,

+	PRT_FWD=12,

+	PRT_MULTI=13,

+	PRT_FLOOD=14,

+	PRT_BROAD=15,

+	PRT_DEV=16,

+	PRT_QOS=17,

+	PRT_FILTER=18,

+	PRT_IFA=19,

+	PRT_VLAN=20,

+	PRT_TCPDUMP=21,

+	PRT_NEXTHOP=22,

+	PRT_FRAGMENT=23,

+	PRT_RTNL_SEND=24,

+	PRT_RTNL_RCV=25,

+	PRT_NOTIFY_CALL=26,

+    PRT_TC=27,

+	PRT_OTHER=28,//¹©¸÷ͬѧѧϰʱÌí¼Ó£¬Õýʽ´úÂëÖÐûÓе÷Óõã

+};

+/////¸Ã½Ó¿ÚÖ÷ÒªÓÃÓÚ×¥È¡ÍøÂçÖØÒªÁ÷³ÌµÄÕ»¹ØÏµ£¬½ö¹©ÄÚ²¿Ñ§Ï°Ê¹Ó㬲»ÄÜÓÃÓÚÕý³£µÄÎÊÌⶨλ

+#define net_run_track(n,f,args...)                       \

+{  \

+	if(n==net_run_track) \

+	{ \

+		printk("net tcpdump!!!"f,## args);   \

+		dump_stack(); \

+	} \

+}

+

+

+/********************************************************************************/

+/**************************ËïȪend**********************************/

+/********************************************************************************/

+

+#endif

+

diff --git a/ap/os/linux/linux-3.4.x/include/net/SI/sock_track.h b/ap/os/linux/linux-3.4.x/include/net/SI/sock_track.h
new file mode 100644
index 0000000..8b419c6
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/include/net/SI/sock_track.h
@@ -0,0 +1,28 @@
+#ifndef _SOCK_TRACK_H_

+#define _SOCK_TRACK_H_

+

+#include <net/sock.h>

+

+#define SOCK_TRACK_STR_LEN	512

+

+

+enum sock_err_type

+{

+    TCP_ACCEPT_QUEUE_FULL,      /*tcpµÄaccept¶ÓÁÐÂú*/

+    TCP_REQ_QUEUE_FULL,         /*tcpµÄÇëÇó¶ÓÁÐÂú*/

+    TCP_RECV_BUFF_FULL,         /*tcpµÄ½ÓÊÕ»º´æÂú*/

+    TCP_SEND_BUFF_FULL,         /*tcpµÄ·¢ËÍ»º´æÂú*/

+    TCP_RECV_WINDOW_FULL,       /*tcpµÄ½ÓÊÕ´°¿ÚÂú*/

+    TCP_RST_SEND,               /*tcp·¢ËÍÁËRST*/

+    TCP_FIN_SEND,               /*tcp·¢ËÍÁËFIN*/

+    TCP_RST_RECV,               /*tcp½ÓÊÕRST°ü*/

+    TCP_FIN_RECV,               /*tcp½ÓÊÕFIN°ü*/

+    TCP_ERR_MAX,

+};

+

+int tcp_sock_track(struct sock *sk, int err_type, char *function, int linenum);

+

+#define TCP_SOCK_TRACK(x, y)  tcp_sock_track((x), (y), __func__, __LINE__)

+

+#endif

+