亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4505 | 回復(fù): 13
打印 上一主題 下一主題

[內(nèi)核模塊] netfilter中NF_IP_FORWARD得到的包,data比tail和end都大,詭異 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-05-09 16:21 |只看該作者 |倒序瀏覽
代碼如下:
#include <linux/bootmem.h>
#include <linux/slab.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/list.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/inet.h>
#include <linux/in.h>
#include <linux/hash.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/xfrm.h>

static spinlock_t g_lock;

/******************************************************************
*  show_mem_ascii
*          show a mem area in ASCII, in order to DEBUG
******************************************************************/

static void
show_mem_ascii(char *prompt, char *data, int len)
{
        char buff[128];
        char *pbuff, ch;

        int i, j, col, lines;
        col = 56;
        lines = len / col;
        printk("%s:\n", prompt);
        if(data == NULL) return;

        for(i = 0; i < lines; i ++)
        {
                pbuff = &buff[0];
                for(j = 0; j < col; j ++)
                {
                        ch = *(data + i * col + j);
                        if(ch > 20) sprintf(pbuff, "%c", ch);
                        else sprintf(pbuff, " ");
                        pbuff ++;
                }
                *pbuff = 0;
                printk("    %s\n", buff);
        }
        if(len % col != 0)
        {
                pbuff = &buff[0];
                for(j = 0; j < (len - lines * col); j ++)
                {
                        ch = *(data + lines * col + j);
                        if(ch > 20) sprintf(pbuff, "%c", ch);
                        else sprintf(pbuff, " ");
                        pbuff ++;
                }
                *pbuff = 0;
                printk("    %s\n", buff);
        }
}

/******************************************************************
*  show_mem_hex
*          show a mem area in HEX, in order to DEBUG
******************************************************************/

static void
show_mem_hex(char *prompt, unsigned char *data, int len)
{
        char buff[128];
        char *pbuff;
        int i, j, lines = len / 16;
        printk("%s:\n", prompt);
        for(i = 0; i < lines; i ++)
        {
                pbuff = &buff[0];
                for(j = 0; j < 16; j ++)
                {
                        sprintf(pbuff, "%02X ", *(data + i * 16 + j));
                        pbuff += 3;
                        if(j == 7)
                        {
                                *pbuff = ' ';
                                pbuff ++;
                        }                       
                }
                *pbuff = 0;
                printk("    %s\n", buff);
        }
        if(len % 16 != 0)
        {
                pbuff = &buff[0];
                for(j = 0; j < (len - lines * 16); j ++)
                {
                        sprintf(pbuff, "%02X ", *(data + lines * 16 + j));
                        pbuff += 3;
                        if(j == 7)
                        {
                                *pbuff = ' ';
                                pbuff ++;
                        }                       
                }
                *pbuff = 0;
                printk("    %s\n", buff);
        }
}

/******************************************************************
*  show_skb_content
*         
******************************************************************/
static void
show_skb_content(struct sk_buff *skb)
{
        int i;
        char *t_h, *n_h, *m_h;
        struct skb_shared_info *skb_sh;
        skb_linearize(skb);
        //char flags[8];
        //unsigned char *ips, *ipd;
        //int tcp_data_len, packet_len;
        //struct iphdr *iph = (struct iphdr *)skb->transport_header;
        //struct tcphdr *tcph = (struct tcphdr *)(skb->data + (iph->ihl << 2));
        t_h = skb_transport_header(skb);
        n_h = skb_network_header(skb);
        m_h = skb_mac_header(skb);
        printk("--------------------SKB CONTENT----------------------\n");
        printk("len:%d, data_len:%d, mac_len:%d, hdr_len:%d\n", skb->len, skb->data_len, skb->mac_len, skb->hdr_len);
        printk("head:%p; data:%p\n", skb->head, skb->data);
        printk("tail:%p; end:%p\n", skb->tail, skb->end);
        printk("transport_header:%p, network_header:%p, mac_header:%p\n", t_h, n_h, m_h);
        printk("pkt type:%d, protocol:%d, local_df:%d\n", skb->pkt_type, skb->protocol, skb->local_df);
        skb_sh = skb_shinfo(skb);
        printk("frag count:%d\n", skb_sh->nr_frags);
        if(skb_sh->nr_frags > 0)
        {
                for(i = 0; i < skb_sh->nr_frags; i ++)
                {
                        show_mem_hex("", skb_sh->frags.page + skb_sh->frags.page_offset, skb_sh->frags.size);
                }
        }
        else
        {
                show_mem_hex("data", skb->data, skb->data_len);
        }
}

static unsigned int
hook_ip_forward(unsigned int hook, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
        if(in == NULL) return NF_ACCEPT;
        if(in->name == NULL) return NF_ACCEPT;
        if(out == NULL) return NF_ACCEPT;
        if(out->name == NULL) return NF_ACCEPT;

        if (skb == NULL) return NF_ACCEPT;

        printk("net_device names, in:%s, out %s\n", in->name, out->name);
       
        spin_lock_irq(&g_lock);
        show_skb_content(skb);
        spin_unlock_irq(&g_lock);

        return NF_ACCEPT;
}

static struct nf_hook_ops ops_ip_forward =
{
        .hook                = hook_ip_forward,
        .owner                = THIS_MODULE,
        .pf                = PF_INET,
        .hooknum        = NF_INET_FORWARD,
        .priority        = NF_IP_PRI_FIRST,
};

static int __init t4ipf_init(void)
{
        int ret;

        printk(KERN_EMERG"begin initializing\n");

        spin_lock_init(&g_lock);
       
        ret = nf_register_hook(&ops_ip_forward);

        printk("nf_register_hook return %d\n", ret);

        printk(KERN_EMERG"initialized\n");

        return ret;
}

static void __exit t4ipf_fini(void)
{
        printk(KERN_EMERG"begin finishing\n");

        nf_unregister_hook(&ops_ip_forward);

        printk(KERN_EMERG"finished\n");
}

module_init(t4ipf_init);
module_exit(t4ipf_fini);

MODULE_AUTHOR("ZhengYong, zy_ball@yahoo.com.cn");
MODULE_DESCRIPTION("");
MODULE_LICENSE("GPL");

=====================================================================
帖個struct sk_buff*包:
len:-2085642495, 0x83AF9F01; data_len:52, mac_len:0, hdr_len:0
head:-2104835932, 0x828AC0A4; data:-2104834400, 0x828AC6A0
tail:-2104835984, 0x828AC070; end:-2104835998, 0x828AC062
transport_header:0xA, network_header:0x0, mac_header:0x828AC070
pkt type:0, protocol:0

data_len的長度是對的,除此之外好像都不太對,
特別是data竟然比head大很多,也還可以接受,但是data比tail和end都大,就不對了

len怎么這么大?

論壇徽章:
0
2 [報告]
發(fā)表于 2012-05-09 22:43 |只看該作者
sk_buff的len怎么能是負的呢

論壇徽章:
6
金牛座
日期:2013-10-08 10:19:10技術(shù)圖書徽章
日期:2013-10-14 16:24:09CU十二周年紀念徽章
日期:2013-10-24 15:41:34獅子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亞洲杯之阿聯(lián)酋
日期:2015-05-09 14:36:15
3 [報告]
發(fā)表于 2012-05-10 07:53 |只看該作者
flyfrogs 發(fā)表于 2012-05-09 22:43
sk_buff的len怎么能是負的呢

printk("len:%d, data_len:%d, mac_len:%d, hdr_len:%d\n", skb->len, skb->data_len, skb->mac_len, skb->hdr_len);

skb->mac_len和hdr_len都是u16的,不能使用%d輸出,否則會導(dǎo)致printk解析多個參數(shù)的的時候,出問題。
你可以放到多個printk里面就沒問題了。

論壇徽章:
0
4 [報告]
發(fā)表于 2012-05-10 08:33 |只看該作者
回復(fù) 3# 瀚海書香


    這怎么可能?
不過我試了一下,還是一樣,下面是結(jié)果:
len:-2085857088
data_len:60
mac_len:0
hdr_len:0
head:83261080
data:832617e0
tail:83261044
end:83261036
transport_header:  (null)
network_header:  (null)
mac_header:83261044
pkt type:0
protocol:0
local_df:0
head data:
    C5 78 DC E4 00 00 00 3D  16 0B 07 11 00 00 00 00
    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 DD
    1A 00 50 F2 01 01 00 00  50 F2 02 02 00 00 50 F2
    02 00 50 F2 04 01 CC 06  50 E2 0B 30
data data:
    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00  00 00 00 01 04 10 00 00
    00 40 00 00 40 20 00 01  01 00 01 08
end data:
    5C 63 BF FE 8A 99 74 2F  68 25 0A 9C 08 00 45 00
    00 3C BF 6B 40 00 3F 06  27 BB C0 A8 01 B4 4A 7D
    47 BC DB 5B 14 6C FC 72  51 FC 00 00 00 00 A0 02
    16 D0 AD 1D 00 00 02 04  05 B4 04 02
tail data:
    45 00 00 3C BF 6B 40 00  3F 06 27 BB C0 A8 01 B4
    4A 7D 47 BC DB 5B 14 6C  FC 72 51 FC 00 00 00 00
    A0 02 16 D0 AD 1D 00 00  02 04 05 B4 04 02 08 0A
    02 B2 EE 97 00 00 00 00  01 03 03 03

head data,data tata,end data,tail data分別是以sk_buff的head,data,end,tail為起始指針,data_len為長度的內(nèi)存輸出
可以看到
head:83261080
data:832617e0
tail:83261044
end:83261036
大小順序為end<tail<head<data
太古怪了

論壇徽章:
6
金牛座
日期:2013-10-08 10:19:10技術(shù)圖書徽章
日期:2013-10-14 16:24:09CU十二周年紀念徽章
日期:2013-10-24 15:41:34獅子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亞洲杯之阿聯(lián)酋
日期:2015-05-09 14:36:15
5 [報告]
發(fā)表于 2012-05-10 09:24 |只看該作者
回復(fù) 4# flyfrogs
我這邊測試了一下你的代碼,貌似是沒有問題啊。
你的內(nèi)核版本應(yīng)該大于2.6.28吧?你是什么硬件架構(gòu),是x86 or x86_64嗎?

   

論壇徽章:
0
6 [報告]
發(fā)表于 2012-05-10 10:06 |只看該作者
回復(fù) 5# 瀚海書香


    非常感謝!
我的平臺是一個無線路由器,tp-link的841N,

system type             : Atheros AR7241 rev 1
machine                 : TP-LINK TL-MR3420
processor               : 0
cpu model               : MIPS 24Kc V7.4

論壇徽章:
6
金牛座
日期:2013-10-08 10:19:10技術(shù)圖書徽章
日期:2013-10-14 16:24:09CU十二周年紀念徽章
日期:2013-10-24 15:41:34獅子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亞洲杯之阿聯(lián)酋
日期:2015-05-09 14:36:15
7 [報告]
發(fā)表于 2012-05-10 10:37 |只看該作者
回復(fù) 6# flyfrogs
我的平臺是一個無線路由器,tp-link的841N,

system type             : Atheros AR7241 rev 1
machine                 : TP-LINK TL-MR3420
processor               : 0
cpu model               : MIPS 24Kc V7.4

沒在這個平臺上研發(fā)過,所以無法幫你確定問題原因。
   

論壇徽章:
0
8 [報告]
發(fā)表于 2012-05-10 10:46 |只看該作者
回復(fù) 7# 瀚海書香


    無論如何,非常感謝

這個平臺我做NF_BR_FORWARD就一切正常,怪怪的

論壇徽章:
0
9 [報告]
發(fā)表于 2012-05-10 11:23 |只看該作者
編譯沒有問題吧確認頭文件找的都是對的?

論壇徽章:
0
10 [報告]
發(fā)表于 2012-05-10 11:25 |只看該作者
如果這個包真是這樣的話 在ip_rcv就直接drop了 根本到不了forward 初步判斷是編譯或者哪里馬虎搞得小問題
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP