免费注册 查看新帖 |

Chinaunix

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

[内核入门] skb_copy出来的包能和原包同时存在并且有不同流向吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-19 14:48 |只看该作者 |倒序浏览
接收同时又转发一个广播包,只有一份要给两个地方,skb_copy一份,然后把原来的接受,把copy的入队,等到到转发了,再把copy的发出去行不行?是在forward发,还是out发,刚开始接触,太菜了

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2012-07-19 15:26 |只看该作者
回复 1# yuxia5454
在FORWARD发。

   

论坛徽章:
0
3 [报告]
发表于 2012-07-19 15:39 |只看该作者
瀚海书香 发表于 2012-07-19 15:26
回复 1# yuxia5454
在FORWARD发。

谢版主

是直接调okfn(skb),就可以转发这个包了吗,不用改源地址什么的没问题吧

论坛徽章:
0
4 [报告]
发表于 2012-08-07 17:28 |只看该作者
本帖最后由 lujian19861986 于 2012-08-07 18:03 编辑

    struct iphdr *iph = (*pskb)->nh.iph;
    struct tcphdr *tcph = (void *)iph + iph->ihl*4;
    unsigned char *data = (void *)tcph + tcph->doff*4;
    unsigned int datalen = (*pskb)->len - (iph->ihl*4) - (tcph->doff*4);
        struct sk_buff *mc=NULL;
        struct rtable *rt;
        struct flowi fl={ .oif = 0,
                        .nl_u = { .ip4_u =
                                        { .daddr = iph->saddr,
                                        .saddr = 0,
                                        .tos = 0 } },
                        .proto = IPPROTO_TCP,
                        .uli_u = { .ports =
                                        { .sport = tcph->dest,
                                        .dport =tcph->source  } } };
        mc = skb_copy(*pskb,GFP_ATOMIC);

        if(mc == NULL)
    {
        return -1;
    }
   
    mc->input_dev=NULL;
        mc->dev=NULL;
        mc->pkt_type = PACKET_HOST;

       
        //printk(KERN_EMERG"http_format_info:%s\n","ippr_send_eboard_notification");
        if( __ip_route_output_key(&rt,&fl) )
        {
                kfree_skb(mc);
                printk("lujian ippr_send_eboard_notification() return -1;\n");
                return -1;
        }
        mc->csum=0;
        mc->dst = &rt->u.dst;//Derek
        mc->dev = mc->dst->dev;
       
        //header definition
        struct iphdr *new_iph = (mc)->nh.iph;
        struct tcphdr *new_tcph = (void *)new_iph + new_iph->ihl*4;
        unsigned char *new_data = (void *)new_tcph + new_tcph->doff*4;
        /* clear memory */
        memset((char *)new_data,0, datalen);
        //lujian 8-6
        memcpy(new_data, block_htm, strlen(block_htm));
        //printk("lujian new_data: %s\n", new_data);
       
        /* fill ip header */
        iph->protocol = IPPROTO_TCP;
        new_iph->saddr = iph->daddr;
        new_iph->daddr = iph->saddr;
        new_iph->ttl = 127;
        new_iph->check =0;
        new_iph->check = ip_fast_csum((void *)new_iph, new_iph->ihl);
        /* fill tcp header */
        new_tcph->source = tcph->dest;
        new_tcph->dest = tcph->source;
        tcp_flag_word(new_tcph) = (TCP_FLAG_ACK | TCP_FLAG_PSH);
        if (tcp_flag_word(new_tcph) & TCP_FLAG_ACK)
                new_tcph->seq = tcph->ack_seq;
        else
                new_tcph->seq = htonl(1);
        new_tcph->doff = (sizeof(tcphdr_t)>>2);
        /* the ack should acknowledge all the packet, find the size */
        new_tcph->ack_seq = htonl(ntohl(tcph->seq) + datalen);
        //lujian 8-6
        //memcpy((char *)new_tcph + sizeof(tcphdr_t), block_htm, strlen(block_htm));
       
        //lujian test
        //new_tcph->check = csum_tcpudp_magic(new_iph->saddr, new_iph->daddr, datalen, IPPROTO_TCP,csum_partial((char *)new_tcph,datalen,0));

printk("lujian ###before ip_finish_output(mc); mc->csum:%u, mc->dev:%s, new_tcph->check=%u\n",  mc->csum, (char *)mc->dev, new_tcph->check);
        ip_finish_output(mc);
printk("lujian ###after ip_finish_output(mc); mc->csum:%u, new_tcph->ack_seq:%u, new_iph->check:%u\n", mc->csum, new_tcph->ack_seq, new_iph->check);

       

论坛徽章:
0
5 [报告]
发表于 2012-08-10 11:47 |只看该作者
感谢楼上
最后用 dev_queue_xmit 实现:
nskb = skb_copy(skb, GFP_ATOMIC);
if (0 > dev_queue_xmit(nskb)) { kfree_skb (nskb); dev_put(dev); printk("dev_queue_xmit error\n"); }

论坛徽章:
0
6 [报告]
发表于 2012-08-10 14:01 |只看该作者
本帖最后由 lujian19861986 于 2012-08-10 14:02 编辑

回复 5# yuxia5454


    kfree_skb需要吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP