免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2870 | 回复: 12
打印 上一主题 下一主题

[其他] [Bridge]bridge layer using ip_fragment [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-02 17:44 |只看该作者 |倒序浏览
我想在bridge layer做切割
不過 ip_fragment這個是作用在IP 層
所以我該怎麼使用這個FUNCTION呢
目前我是想寫一個一模一樣的 但是內容做些修改
最後再呼叫ip_fragment(skb, dev_queue_xmit);
不知道可行不可行

1.iph = skb->nh.iph;  這個抓不到 ? 後來用mac.raw去抓 就可以了
2.struct rtable *rt = (struct rtable*)skb->dst; 這裡的rt抓不到 這裡的rt是用來算MTU
如果不用mtu = dst_pmtu(&rt->u.dst) - hlen; 那該如何計算MTU長度?
可以用iph->tot_len來計算?



int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
429{
430        struct iphdr *iph;
431        int raw = 0;
432        int ptr;
433        struct net_device *dev;
434        struct sk_buff *skb2;
435        unsigned int mtu, hlen, left, len, ll_rs;
436        int offset;
437        int not_last_frag;
438        struct rtable *rt = (struct rtable*)skb->dst;
439        int err = 0;
440
441        dev = rt->u.dst.dev;
442
443        /*
444         *      Point into the IP datagram header.
445         */
446
447        iph = skb->nh.iph;  
448
449        if (unlikely((iph->frag_off & htons(IP_DF)) && !skb->local_df)) {
450                icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
451                          htonl(dst_pmtu(&rt->u.dst)));
452                kfree_skb(skb);
453                return -EMSGSIZE;
454        }
455
456        /*
457         *      Setup starting values.
458         */
459
460        hlen = iph->ihl * 4;
461        mtu = dst_pmtu(&rt->u.dst) - hlen;      /* Size of data space */

论坛徽章:
0
2 [报告]
发表于 2012-05-03 19:56 |只看该作者
頂一個
ip_fragment 裡面

ll_rs = LL_RESERVED_SPACE(rt->u.dst.dev);


因為在bridge沒有rt 所以這裡rt是null 所以跑到這邊會CRASH
LL_RESERVED_SPACE 這個函數如下
#define LL_RESERVED_SPACE(dev) \
222        (((dev)->hard_header_len&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)


請問這是??

最後ll_rs會用來當作分配空間用 我如果要寫hard codde 不要使用這個MACRO
可以定為多少??

论坛徽章:
0
3 [报告]
发表于 2012-05-04 15:38 |只看该作者
頂一個
ll_rs 應該填L2 header 大小即可 我猜

另外
     while (left > 0) {
         len = left;
         /* IF: it doesn't fit, use 'mtu' - the data space left */
         /* 如果len大于mtu,设置当前的将要分片的数据大小为mtu */
         if (len > mtu)
             len = mtu;
         /* IF: we are not sending upto and including the packet end
            then align the next start on an eight byte boundary */
         /*長度對齊 */
         if (len < left) {
             len &= ~7;
         }



len &= ~7;  不知道是作何用 ?

當中發現iph=skb2->nh.iph
我去印iph->ihl*4=0 所以我猜指針指錯了

...
skb_reserve(skb2, ll_rs);
我想多加入以下這行
skb_reserve(skb2,sizeof(struct iphdr));
不知道這樣合不合理?
因為感覺她的DATA pointer好像不太對!!

论坛徽章:
0
4 [报告]
发表于 2012-05-04 17:29 |只看该作者
由skb2>nh.raw=skb2->data
可以知道這時候skb2>data應該是指到ip layer
不過我把DATA的資料印出來 是指到l2
所以我可以把
skb2->data+=ETH_HLEN
skb2->len-=ETH_HLEN

這兩個動作就夠了嗎 有需要其他動作?

论坛徽章:
0
5 [报告]
发表于 2012-05-05 23:08 |只看该作者
有高手可以指教一下
在bridge layer看起來 還是把SKB 的相關指標指到ip層 在去做相對應的ip層函數呼叫看起來比較合理
有對應的kernel function可以使用嗎!!!!!

论坛徽章:
0
6 [报告]
发表于 2012-05-07 12:01 |只看该作者
回复 5# dspecialtwo
有高手可以指教一下
在bridge layer看起來 還是把SKB 的相關指標指到ip層 在去做相對應的ip層函數呼叫看起來比較合理
有對應的kernel function可以使用嗎!!!!!
======================================
我觉得还是设置好skb的IP层的指针位置,这样可以复用代码。

另外,你为什么要用繁体字?如果是港澳的兄弟也就算了。


   

论坛徽章:
0
7 [报告]
发表于 2012-05-08 00:26 |只看该作者
  目的是什么? 只是把分片的流程移到2层去吗

论坛徽章:
0
8 [报告]
发表于 2012-05-08 10:33 |只看该作者
For luoyan_xy : Yes

目前看到的现象 copy之后的skb2资料怪怪的
我怀疑可能是指针指错 造成ip_copy_metadata(skb2, skb); 资料错乱
我在自己COPY看看

对了
937static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
938                                              int gfp_mask)
939{
940        struct sk_buff *skb = alloc_skb(length + 16, gfp_mask);
941        if (likely(skb))
942                skb_reserve(skb, 16);
943        return skb;
944}


这里length + 16 为什么是16??

论坛徽章:
0
9 [报告]
发表于 2012-05-08 16:56 |只看该作者
这里length + 16 为什么是16??

16=14+2 两byte看起来是用来优化还对齐用的

我有一份SKB
CALL ip_copy_metadata得到的skb2内容怪怪的

目前知道有skb_clone skb_copy pskb_copy 这三个
如果我要重新skb2 = alloc_skb
并且把SKB的ip hdr+ ip payload整个copy到skb2 可能也需要copy其他东西
要使用那个呢??

论坛徽章:
0
10 [报告]
发表于 2012-05-08 22:57 |只看该作者
回复 9# dspecialtwo


    16是为了对齐

    按照你这种情况,copy skb的函数应该使用 skb_copy ,不仅copy头部,而且需要把frag部分也拷贝到
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP