可以作为自构建skb xmit发送的示范!  在netfilter 模块中通过!

static int skb_copy_xmit( struct sk_buff *pskb, const struct net_device *in )
{
        struct sk_buff *nskb;
        struct iphdr *oiph, *niph;
        struct tcphdr *oth, *tcph;
        struct ethhdr     *oeth;
        struct ethhdr     *neth ;
        int         retval = 0;

//
        oiph = ip_hdr( pskb );
        oth  = (struct tcphdr *)((u_int32_t *)oiph + oiph->ihl);
   
        //dump_ethhdr( (struct ethhdr *)pskb->mac_header );                        
        //dump_iphdr( oiph );
        //dump_tcphdr( oth );
       
        #if 1
        nskb = skb_copy( pskb, GFP_ATOMIC );
        #else
        nskb = alloc_skb(
                sizeof( struct ethhdr )
                        + sizeof(struct iphdr)
                        + sizeof( struct tcphdr )
                        + LL_MAX_HEADER,
                GFP_ATOMIC
                );
        #endif       
       
        if ( !nskb ) {
                printk( "skb_copy occur error!/n" );
                return -1;
        }
       
       
        //nskb->protocol = pskb->protocol ;//__constant_htons(ETH_P_802_3);
        //skb_reset_mac_header(nskb);
        //skb_reset_network_header(nskb);
       
        nskb->data = skb_mac_header(nskb);
        nskb->len += ETH_HLEN;
   
        nskb->pkt_type = PACKET_OUTGOING; //OUTGOING;
        nskb->dev = (struct net_device *)in;

#if 0
        dev_hard_header(nskb, in, ntohs(pskb->protocol),
                    in->dev_addr, out->dev_addr, pskb->len );
        #else   
        if (pskb->mac_header != NULL) {
            oeth = (struct ethhdr *)pskb->mac_header;
            neth = (struct ethhdr *)nskb->mac_header;
            memcpy( neth->h_source, oeth->h_dest, ETH_ALEN );
            memcpy( neth->h_dest, oeth->h_source, ETH_ALEN );
        }
        #endif         
        niph = ip_hdr( nskb );
        tcph = (struct tcphdr *)((u_int32_t *)niph + niph->ihl);

pkt_create( oiph, niph, oth, tcph );
       
        //dump_ethhdr( (struct ethhdr *)nskb->mac_header );
        //dump_iphdr( niph );
        //dump_tcphdr( tcph );
       
       
        retval = dev_queue_xmit( nskb );
        printk( "dev_queue_xmit return %d/n", retval );       
       
        return retval;
}

static int skb_clone_xmit( struct sk_buff *pskb, const struct net_device *in )
{
        int retval = 0;
        struct sk_buff *nskb;
        struct iphdr *oiph;
        struct tcphdr *tcph;
        unsigned char        eth_addr[ETH_ALEN];
        struct ethhdr     *oeth;
        __be32 addr;
        __be16 port;
        u32         tcplen;
   
   
        oiph = ip_hdr( pskb );
        tcph  = (struct tcphdr *)((u_int32_t *)oiph + oiph->ihl);
   
        //dump_ethhdr( (struct ethhdr *)pskb->mac_header );
        //dump_iphdr( oiph );
        //dump_tcphdr( tcph );
       
        nskb = skb_clone(pskb, GFP_ATOMIC);
       
        if ( !nskb ) {
                printk( "skb_clone occur error!/n" );
                return -1;
        }
       
        nskb->pkt_type = PACKET_OUTGOING; //OUTGOING;
        nskb->dev = (struct net_device *)in;
       
        printk( "data=0x%p mac_header=%p/n", nskb->data, nskb->mac_header );
        nskb->data = skb_mac_header(nskb);
        nskb->len += ETH_HLEN;
   
        if (pskb->mac_header != NULL) {
       
            oeth = (struct ethhdr *)nskb->mac_header;
            memcpy( eth_addr, oeth->h_source, ETH_ALEN );
            memcpy( oeth->h_source, oeth->h_dest, ETH_ALEN );
            memcpy( oeth->h_dest, eth_addr, ETH_ALEN );
        }
        //
        oiph = ip_hdr( pskb );
        tcph  = (struct tcphdr *)((u_int32_t *)oiph + oiph->ihl);
   
        addr = oiph->daddr;
        oiph->daddr = oiph->saddr;
        oiph->saddr = addr;
   
        // tcp
        port = tcph->source;
        tcph->source = tcph->dest;
        tcph->dest        = port;
       
        tcph->doff        = sizeof(struct tcphdr) / 4;
        tcph->ack_seq = htonl( ntohl(tcph->seq) + 1 );
        tcph->seq = 0;
       
        tcph->ack = 1;
        tcph->syn = 1;
        //tcph->psh = 1;
        //tcph->rst = 1;
        tcplen = ntohs( oiph->tot_len ) - oiph->ihl * 4;
        tcph->check = 0;
        tcph->check        = tcp_v4_check( tcplen,
                               oiph->saddr, oiph->daddr,
                               csum_partial(tcph,
                                            tcplen, 0));               
                                           
        ip_send_check( oiph );       
       
        //dump_ethhdr( (struct ethhdr *)nskb->mac_header );
        //dump_iphdr( oiph );
        /dump_tcphdr( tcph );
       
       
        retval = dev_queue_xmit(nskb);
        printk( "dev_queue_xmit return %d/n", retval );       
        return retval;
}

写的将skb copy/clone后转发到源地址的一段代码相关推荐

  1. C语言main()主函数执行完毕后是否会再执行一段代码

    C语言main()主函数执行完毕后是否会再执行一段代码 分享到: QQ空间 新浪微博 腾讯微博 豆瓣 人人网 main() 主函数执行完毕后,是否可能会再执行一段代码?给出说明. main主函数是所有 ...

  2. 写时复制,写时拷贝,写时分裂,Copy on write

    2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比 ...

  3. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx

    PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...

  4. [css] style标签写在body前和body后的区别是什么?

    [css] style标签写在body前和body后的区别是什么? 渲染机制的区别,在body前是已经把样式浏览一遍,到了对应标签直接,渲染样式.显示块. 在body后,是浏览器已经把标签浏览了,但基 ...

  5. [js] 写一个方法实现promise失败后自动重试

    [js] 写一个方法实现promise失败后自动重试 <!DOCTYPE html> <html lang="en"><head><met ...

  6. 关于localhost访问特别快而nginx配置代理后转发特别慢的解决

    关于localhost访问特别快而nginx配置代理后转发特别慢的解决 背景 解决过程 后续 背景 本地启动一个web应用,在采用localhost:port的方式访问的时候特别流畅,因为访问其它资源 ...

  7. uniApp小程序git clone后无法运行

    今天有位小伙伴找我求助关于uniapp小程序问题 ,他在将项目git克隆后,无法运行项目 解决方案以'若依uniapp'版本为例 第一步:先将项目git Clone后,直接拖动文件夹到Hbuild中 ...

  8. 你不是一个人在战斗——写给正在失业的80后

    y你不是一个人在战斗--写给正在失业的80后 好了,又到了找工作的时节了.据说八万人的春季现场会买门票的队伍排了2公里. 春季招工还只是多数招募有经验的跳槽工,不知道4月份开始的应届毕业生现场会,场面 ...

  9. python脚本自动化赚钱系统_自从用python写了个自动弹幕脚本后,各大主播都来找我,净赚十万!...

    Python Python开发 Python语言 自从用python写了个自动弹幕脚本后,各大主播都来找我,净赚十万! 大家好,今天又给大家带来了Python爬虫的分享,今天我们继续上次的问题,继续来 ...

  10. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D

    Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...

最新文章

  1. 【面试必备】javascript操作DOM元素
  2. android studio安装教程博客园独王,Android Studio安装与配置
  3. micropython函数库下载_Python microfs包_程序模块 - PyPI - Python中文网
  4. 逆向工程核心原理读书笔记-代码注入
  5. python3网络爬虫开发实战豆瓣_大牛程序员教你1天入门Python3 网络爬虫例子
  6. C++中的 :: 用法
  7. java 不同分辨率_java9新特性-14-多分辨率图像 API
  8. C#LeetCode刷题之#674-最长连续递增序列( Longest Continuous Increasing Subsequence)
  9. 设置 git/npm/bower/gem 镜像或代理的方法
  10. nodejs笔记--Events篇(二)
  11. 显示部分x_i5 9400F+GTX 1030+23.8英寸,攀升迁跃者X上手简评
  12. 使用Julia进行图像处理--用于扩充训练集的图像增强
  13. Mifare Classic Tool (MCT),Android平台RFID工具
  14. php钉钉机器人,PHP调用钉钉机器人
  15. ORACLE ORDER BY用法总结
  16. LBS学习相关网址(Jonathan Raper教授整理)
  17. tpc-e mysql_mysql评测工具TPC-C使用
  18. mac电脑磁盘满了怎么办?mac电脑磁盘空间不足怎么办
  19. 四. H.264视频编解码器(X264和JM)及参考软件JM的下载与编解码
  20. 优维科技加入信通院“AIOps标准工作组”,智能运维之路更进一步

热门文章

  1. C++线程和Java线程的对比
  2. matlab三维怎么转换二维,求助,二维图像如何绕轴旋转成为三维图像
  3. java长按底栏_java - 如何在导航抽屉物品中添加长按功能? - SO中文参考 - www.soinside.com...
  4. python scipy.stats 正态分布_Python Scipy stats.normaltest()用法及代码示例
  5. ajax split len,jQuery Mobile中的data属性
  6. 手动创建线程池_创建线程池
  7. linux常用命令_linux常用命令
  8. 导航栏html_html操作和思考(二):统一导航栏文字高度的方法
  9. cookie实现上次访问时间
  10. android 悬浮按钮出现隐藏,Android悬浮窗按钮实现点击并显示/隐藏多功能列表