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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3536 | 回復(fù): 10
打印 上一主題 下一主題

[內(nèi)核入門] 新版本內(nèi)核構(gòu)造包發(fā)送問(wèn)題 [復(fù)制鏈接]

論壇徽章:
2
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-12 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-10-14 00:42 |只看該作者 |倒序?yàn)g覽
我在工作中和家中運(yùn)行的ubuntu系統(tǒng)是12.04,發(fā)現(xiàn)內(nèi)核版本已經(jīng)是至少是3.11版本了,其中struct sk_buff的結(jié)構(gòu)相較于以前變化了不少,下面是我摘取的
一個(gè)功能模塊,主要是調(diào)用dev_queue_xmit發(fā)送自己構(gòu)造的包
  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/module.h>
  4. #include <linux/ip.h>
  5. #include <linux/tcp.h>
  6. #include <net/ip.h>
  7. #include <net/checksum.h>


  8. int cp_dev_xmit_tcp (const char *dev_name,
  9.                 const u_char * smac, const u_char * dmac,
  10.                 u_char * pkt, int pkt_len,
  11.                 __be32 sip, __be32 dip,
  12.                 __be16 sport, __be16 dport,
  13.                 __be32 seq, __be32 ack_seq, u_char psh, u_char fin)

  14. {
  15.         struct sk_buff * skb = NULL;
  16.         struct net_device * dev = NULL;
  17.         struct ethhdr * ethdr = NULL;
  18.         struct iphdr * iph = NULL;
  19.         struct tcphdr * tcph = NULL;
  20.         u_char * pdata = NULL;
  21.         int nret = 1;


  22.         if (NULL == smac || NULL == dmac || !dev_name)
  23.                 goto out;

  24.         dev = dev_get_by_name(&init_net,dev_name);

  25.         if (NULL == dev)
  26.         {
  27.                 pr_info("dev is NULL!!!!\n");
  28.                 goto out;
  29.         }

  30.         pr_info("dev->name[%s],mtd[%d]\n",dev->name,dev->mtu);
  31.         skb = alloc_skb (pkt_len + sizeof (struct iphdr) + sizeof (struct tcphdr) + LL_RESERVED_SPACE (dev), GFP_ATOMIC);

  32.         if (NULL == skb)
  33.         {
  34.                 dev_put (dev);
  35.                 pr_info("alloc skb is  NULL!!!!\n");
  36.                 goto out;
  37.         }

  38.         memset(skb,0,pkt_len + sizeof (struct iphdr) + sizeof (struct tcphdr) + LL_RESERVED_SPACE (dev));
  39.         pr_info(" skb is start!!\n");
  40.         skb_reserve (skb, LL_RESERVED_SPACE (dev));
  41.         skb->dev = dev;
  42.         skb->pkt_type = PACKET_OTHERHOST;
  43.         skb->protocol = __constant_htons(ETH_P_IP);
  44.         skb->ip_summed = CHECKSUM_NONE;

  45.         skb->priority = 0;
  46.         skb_put(skb, sizeof (struct iphdr));
  47.         skb_put(skb, sizeof (struct tcphdr));
  48.         skb->network_header = (U8 *)ip_hdr(skb) - skb->head;
  49.         skb->transport_header = (U8 *)tcp_hdr(skb) - skb->head;
  50.         pdata = skb_put (skb, pkt_len);
  51.         {
  52.                 if (NULL != pkt)
  53.                         memcpy (pdata, pkt, pkt_len);

  54.         }

  55.         pr_info("tcphdr is start!!\n");
  56.         {
  57.                 tcph = tcp_hdr(skb);
  58.                 pr_info("tcphdr is start!!1\n");
  59.                 memset (tcph, 0, sizeof (struct tcphdr));
  60.                 pr_info("tcphdr is start!!2\n");
  61.                 pr_info("tcphdr is start!!2\n");
  62.                 tcph->source = sport;
  63.                 pr_info("tcphdr is start!!3\n");
  64.                 tcph->dest = dport;
  65.                 pr_info("tcphdr is start!!4\n");
  66.                 if(seq)
  67.                         tcph->seq = seq;
  68.                 if(ack_seq)
  69.                         tcph->ack_seq = ack_seq;
  70.                 pr_info("tcphdr is start!!5\n");
  71.                 tcph->doff = 5;
  72.                 pr_info("tcphdr is start!!6\n");
  73.                 tcph->psh = psh;
  74.                 pr_info("tcphdr is start!!7\n");
  75.                 tcph->fin = fin;
  76.                 pr_info("tcphdr is start!!8\n");
  77.                 tcph->ack = 1;
  78.                 pr_info("tcphdr is start!!9\n");
  79.                 tcph->window = __constant_htons (65535);
  80.                 pr_info("tcphdr is start!!10\n");
  81.                 skb->csum = 0;
  82.                 pr_info("tcphdr is start!!11\n");
  83.                 tcph->check = 0;
  84.                 pr_info("tcphdr is start!!12\n");
  85.         }

  86.         pr_info("iphdr is start!!13\n");
  87.         {
  88.                 iph = ip_hdr(skb);
  89.                 iph->version = 4;
  90.                 iph->ihl = sizeof(struct iphdr)>>2;
  91.                 iph->frag_off = 0;
  92.                 iph->protocol = IPPROTO_TCP;
  93.                 iph->tos = 0;
  94.                 iph->daddr = dip;
  95.                 iph->saddr = sip;
  96.                 iph->ttl = 0x40;
  97.                 iph->tot_len = __constant_htons(skb->len);
  98.                 iph->check = 0;
  99.         }

  100.         skb->csum = skb_checksum (skb, iph->ihl*4, skb->len - iph->ihl * 4, 0);
  101.         tcph->check = csum_tcpudp_magic (sip, dip, skb->len - iph->ihl * 4, IPPROTO_TCP, skb->csum);
  102.         ip_send_check(iph);

  103.         skb_push (skb, 14);
  104.         { //eth header
  105.                 ethdr = (struct ethhdr *) skb->data;
  106.                 memcpy (ethdr->h_dest, dmac, ETH_ALEN);
  107.                 memcpy (ethdr->h_source, smac, ETH_ALEN);
  108.                 ethdr->h_proto = __constant_htons (ETH_P_IP);
  109.         }
  110.         pr_info("fasong is start!!\n");
  111.         if (0 > dev_queue_xmit(skb))
  112.                 goto out;
  113.         nret = 0;
  114. out:
  115.         if (0 != nret && NULL != skb) {
  116.                 dev_put (dev);
  117.                 kfree_skb (skb);
  118.         }
  119.         return (nret);

  120. }

  121. static int __init hello_kernel(void)
  122. {
  123.         cp_dev_queue_xmit(.......);
  124.         return 0;
  125. }
復(fù)制代碼
結(jié)果使用dmesg后查看發(fā)現(xiàn)內(nèi)核打印“protocol 0x0800 is buggy, dev eth0” (eth0是我在調(diào)用cp_dev_queue_xmit函數(shù)時(shí)傳遞的參數(shù))

請(qǐng)教各位神牛,新版本的內(nèi)核下,我這個(gè)程序有啥問(wèn)題啊?
謝謝了

論壇徽章:
20
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-08-17 12:21:08
2 [報(bào)告]
發(fā)表于 2015-10-14 12:19 |只看該作者
這是xmit上抓包接口打印的信息,從很早的版本就有了,并不是新內(nèi)核才有的。
原因是skb->nh設(shè)置的不對(duì),參見(jiàn)net/dev/core.c里的dev_queue_xmit_nit。

        skb->network_header = (U8 *)ip_hdr(skb) - skb->head;
ip_hdr本來(lái)就是從skb->nh推導(dǎo)出來(lái)的,這里卻用來(lái)設(shè)置skb->nh,有啥意義呢?

論壇徽章:
2
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-12 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
3 [報(bào)告]
發(fā)表于 2015-10-15 00:24 |只看該作者
這個(gè)功能我已經(jīng)調(diào)出來(lái)了,還有,新版本內(nèi)核的sk_buff中沒(méi)有nh這個(gè)成員變量。回復(fù) 2# nswcfd


   

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
4 [報(bào)告]
發(fā)表于 2015-10-15 16:22 |只看該作者
回復(fù) 1# 買單老
  1. skb->protocol = __constant_htons(ETH_P_IP);
復(fù)制代碼
請(qǐng)確認(rèn)一下,skb->protocol 是否需需要使用網(wǎng)絡(luò)字節(jié)序。

結(jié)果使用dmesg后查看發(fā)現(xiàn)內(nèi)核打印“protocol 0x0800 is buggy, dev eth0” (eth0是我在調(diào)用cp_dev_queue_xmit函數(shù)時(shí)傳遞的參數(shù))


從你的報(bào)錯(cuò)結(jié)果,應(yīng)該是 protocol 協(xié)議號(hào)設(shè)置的不對(duì),系統(tǒng)不認(rèn)識(shí)。

   

論壇徽章:
2
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-12 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
5 [報(bào)告]
發(fā)表于 2015-10-16 00:00 |只看該作者
  1. skb->protocol = __constant_htons(ETH_P_IP);
復(fù)制代碼
上面這段語(yǔ)句是正確的,我參照的cu置頂?shù)奈恼吕锩婢褪沁@么寫的。

我是這么修改的
  1. 執(zhí)行skb_put(skb, sizeof (struct iphdr));后
  2. 調(diào)用skb_reset_network_header(skb);
  3. 執(zhí)行skb_put(skb, sizeof (struct tcphdr));后
  4. 調(diào)用skb_reset_transport_header(skb);
  5. 執(zhí)行skb_push (skb, 14);后
  6. skb_reset_mac_header(skb);
復(fù)制代碼
添加了上面三個(gè)reset函數(shù)后就能發(fā)送UDP數(shù)據(jù)了。

現(xiàn)在有新的問(wèn)題了,我使用原來(lái)的上面的代碼,把
  1. dev_queue_xmit(skb);
復(fù)制代碼
替換成
  1. netif_receive_skb(skb);
復(fù)制代碼
想實(shí)現(xiàn)在pre routing這個(gè)鉤子點(diǎn)之前發(fā)送數(shù)據(jù),然后希望數(shù)據(jù)稍后流進(jìn)這個(gè)鉤子點(diǎn),鉤子函數(shù)觸發(fā)。
但是,鉤子函數(shù)沒(méi)有被觸發(fā),不過(guò)tcpdump 命令卻輸出了這個(gè)UDP報(bào)文數(shù)據(jù)。

想請(qǐng)問(wèn)一下,如果使用netif_receive_skb(skb);發(fā)送數(shù)據(jù),還需要注意哪些參數(shù)設(shè)置啊?

麻煩了


回復(fù) 4# Godbach


   

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
6 [報(bào)告]
發(fā)表于 2015-10-16 01:58 |只看該作者
回復(fù) 5# 買單老

想請(qǐng)問(wèn)一下,如果使用netif_receive_skb(skb);發(fā)送數(shù)據(jù),還需要注意哪些參數(shù)設(shè)置啊


這個(gè)是從網(wǎng)卡驅(qū)動(dòng)中讀取 skb 的。你要發(fā)送數(shù)據(jù),為什么用這個(gè)函數(shù)?


   

論壇徽章:
2
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-12 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
7 [報(bào)告]
發(fā)表于 2015-10-16 23:40 |只看該作者
我想讓自己構(gòu)造的包流進(jìn)協(xié)議棧。
現(xiàn)在有個(gè)疑問(wèn)啊,調(diào)用ip_local_deliver這個(gè)函數(shù),結(jié)果在內(nèi)核模塊編譯的時(shí)候提示undefined,怎么解決呢?


回復(fù) 6# Godbach


   

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
8 [報(bào)告]
發(fā)表于 2015-10-18 22:59 |只看該作者
回復(fù) 7# 買單老

意味著這個(gè)函數(shù)并未 export 出來(lái),你沒(méi)辦法調(diào)用。你可嘗試把這個(gè)函數(shù) export 出來(lái),然后重新編譯 kernel。


   

論壇徽章:
20
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-08-17 12:21:08
9 [報(bào)告]
發(fā)表于 2015-10-19 11:54 |只看該作者
想發(fā)送自己,把dev換成lo,調(diào)用xmit接口。

論壇徽章:
2
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-12 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
10 [報(bào)告]
發(fā)表于 2015-10-19 20:58 |只看該作者
好的,我看看去,謝謝持續(xù)支持啊回復(fù) 9# nswcfd


   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP