免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: SCDXMOE
打印 上一主题 下一主题

[内核模块] 修改了linux内核的tcp.c tcpsendmsg()函数 出现奔溃 求大侠帮助!!满屏幕的跑00000 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
11 [报告]
发表于 2012-12-02 18:24 |只看该作者
回复 10# SCDXMOE
你是在 TCP 载荷中添加的 flag 吗,那应该不影响吧


   

论坛徽章:
0
12 [报告]
发表于 2012-12-03 15:01 |只看该作者
就是啊 在数据部分加了一个标志flag  在接收方在读取数据的时候不会最为真正的数据向应用层传送
就是不明白为什么为奔溃... 麻烦Godbach 帮我看看 谢谢啦
下面是我在tcp_sendmsg()
                        修改的部分

........

                off = 0;
                               
                                if (copy > PAGE_SIZE - off)
                                        copy = PAGE_SIZE - off;

                                if (!sk_wmem_schedule(sk, copy))
                                        goto wait_for_memory;

                                if (!page) {
                                        /* Allocate new cache page. */
                                        if (!(page = sk_stream_alloc_page(sk)))
                                                goto wait_for_memory;
                                }

                                if(copy>=mss_now-1)
                                {//mss_now-1
                                        copy=mss_now-1;
                                //else
                                        //copy=copy-1;
                                duBufferTemp=duBuffer;
                                duBuffer=duBuffer+copy;
                                *duBuffer=0x23;
                                duBuffer=duBufferTemp;
                                if((copy_from_user(duBuffer, from, copy)))       
                                        {
                                                printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) Unsuccess!\n";
                                                goto wait_for_memory;       
                                        }                               
                                else                               
                                        {
                                                printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) success!\n";       
                                        }

                                copyOrginal=copy;//to restore the orign data
                                copy=copy+1;
                                }
                                else
                                        {
                                                duBufferTemp=duBuffer;
                                                duBuffer=duBuffer+copy;
                                                *duBuffer=0x23;//flag
                                                duBuffer=duBufferTemp;
                                                if((copy_from_user(duBuffer, from, copy)))       
                                                {
                                                        printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) Unsuccess!\n";
                                                        goto wait_for_memory;       
                                                }                               
                                                else                               
                                                {
                                                        printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) success!\n";       
                                                }
                                                copyOrginal=copy;
                                                copy=copy+1;
                                        }
                               
                                duBuffer=duBufferTemp;
                                fromTMP=from;  
                                from=duBuffer;
                                                       
                                /* Time to copy data. We are close to
                                 * the end! */
                                err = skb_copy_to_page_nocache(sk, from, skb,
                                                               page, off, copy);
                                if (err) {
                                        /* If this page was new, give it to the
                                         * socket so it does not get leaked.
                                         */
                                        if (!TCP_PAGE(sk)) {
                                                TCP_PAGE(sk) = page;
                                                TCP_OFF(sk) = 0;
                                        }
                                        goto do_error;
                                }
回复 11# Godbach


   

论坛徽章:
0
13 [报告]
发表于 2012-12-03 15:04 |只看该作者
红色部分是我修改了的
再次感谢您的时间
  if(copy>=mss_now-1)
                                 {//mss_now-1
                                         copy=mss_now-1;
                                 //else
                                         //copy=copy-1;
                                 duBufferTemp=duBuffer;
                                 duBuffer=duBuffer+copy;
                                 *duBuffer=0x23;
                                 duBuffer=duBufferTemp;
                                 if((copy_from_user(duBuffer, from, copy)))        
                                        {
                                                 printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) Unsuccess!\n";
                                                 goto wait_for_memory;        
                                        }                                
                                else                                
                                        {
                                                 printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) success!\n";        
                                        }

                                copyOrginal=copy;//to restore the orign data
                                copy=copy+1;
                                 }
                                 else
                                         {
                                                 duBufferTemp=duBuffer;
                                                 duBuffer=duBuffer+copy;
                                                 *duBuffer=0x23;//flag
                                                duBuffer=duBufferTemp;
                                                 if((copy_from_user(duBuffer, from, copy)))        
                                                {
                                                         printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) Unsuccess!\n";
                                                         goto wait_for_memory;        
                                                }                                
                                                else                                
                                                {
                                                         printk(KERN_INFO "tcp_sendmsg copy_from_user(duBuffer, from, copy) success!\n";        
                                                }
                                                 copyOrginal=copy;
                                                 copy=copy+1;
                                         }
                                 
                                duBuffer=duBufferTemp;
                                 fromTMP=from;  
                                 from=duBuffer;
回复 11# Godbach


   

论坛徽章:
0
14 [报告]
发表于 2012-12-04 10:18 |只看该作者
Godbach前辈 我把我日志的最后一部分贴出来了,我觉得红色部分必有蹊跷   
麻烦您再帮晚辈看看
谢谢啦
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   period_event : 0
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   start_threshold  : -1
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   stop_threshold   : 1073741824
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   silence_threshold: 0
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   silence_size : 0
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   boundary     : 1073741824
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c: Slave: Hardware PCM card 0 'HDA Intel' device 0 subdevice 0
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c: Its setup is:
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   stream       : CAPTURE
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   access       : MMAP_INTERLEAVED
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   format       : S16_LE
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   subformat    : STD
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   channels     : 2
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   rate         : 44100
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   exact rate   : 44100 (44100/1)
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   msbits       : 16
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   buffer_size  : 16384
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   period_size  : 8192
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   period_time  : 185759
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   tstamp_mode  : ENABLE
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   period_step  : 1
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   avail_min    : 15502
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   period_event : 0
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   start_threshold  : -1
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   stop_threshold   : 1073741824
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   silence_threshold: 0
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   silence_size : 0
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   boundary     : 1073741824
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   appl_ptr     : 31024
Dec  4 08:57:04 ubuntu pulseaudio[1129]: alsa-util.c:   hw_ptr       : 31024
Dec  4 08:57:21 ubuntu gdm-session-worker[1120]: GLib-GObject-CRITICAL: g_value_get_boolean: assertion `G_VALUE_HOLDS_BOOLEAN (value)' failed
Dec  4 08:57:28 ubuntu gdm-session-worker[1214]: WARNING: Unable to load file '/etc/gdm/custom.conf': 娌℃湁閭d釜鏂囦欢鎴栫洰褰?
Dec  4 08:57:31 ubuntu gdm-session-worker[1214]: GLib-GObject-CRITICAL: g_value_get_boolean: assertion `G_VALUE_HOLDS_BOOLEAN (value)' failed
Dec  4 08:57:34 ubuntu NetworkManager[788]: <error> [1354582654.846588] [nm-manager.c:1317] user_proxy_init(): could not init user settings proxy: (3) Could not get owner of name 'org.freedesktop.NetworkManagerUserSettings': no such name
Dec  4 08:57:34 ubuntu NetworkManager[788]: <error> [1354582654.869214] [nm-manager.c:1317] user_proxy_init(): could not init user settings proxy: (3) Could not get owner of name 'org.freedesktop.NetworkManagerUserSettings': no such name

Dec  4 08:57:36 ubuntu kernel: [   54.348398] mou tcp_transmit_skb skb->len=0回复 11# Godbach


    回复 11# Godbach


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
15 [报告]
发表于 2012-12-04 10:39 |只看该作者
回复 13# SCDXMOE
你加密之后报文的长度变化了吗,如果没有变化的话,可以考虑直接修改 skb 的方式


   

论坛徽章:
0
16 [报告]
发表于 2012-12-04 11:00 |只看该作者
现在还没有加密,我做的加密之后的数据长度是不会变化的,现在相当于仿真,看加的标志之后双方能否正常通信。建立在正常通信之后再加入加密算法....
问题现在可以通信,只是发送较大文件之后就会出现这样的情况。回复 15# Godbach


   

论坛徽章:
0
17 [报告]
发表于 2012-12-04 13:02 |只看该作者
Godbach兄:我想问一下您所说的更改SKB的方式是指?
晚辈愚昧望指教
谢谢:回复 15# Godbach


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
18 [报告]
发表于 2012-12-04 13:36 |只看该作者
回复 17# SCDXMOE
skb 就是更底层的数据报文的标识。你需要了解一下这个结构体



   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
19 [报告]
发表于 2012-12-04 13:44 |只看该作者
SCDXMOE 发表于 2012-12-03 15:04
红色部分是我修改了的
再次感谢您的时间
  if(copy>=mss_now-1)


你如果是只添加一个标记的话,应该只改一处吧,怎么改这么多代码

论坛徽章:
0
20 [报告]
发表于 2012-12-04 13:49 |只看该作者
谢谢Godbach前辈的多次抽出时间给晚辈回复!嗯。SKB的结构我算是比较熟悉了;只是没有明白您的“可以考虑直接修改 skb 的方式”指的是?  我主要是在skb的数据末尾加一个FLAG,我理解您的意思是加flag的位置变动一下,不知道理解的对不对?或者说是直接在头部加选项,选项感觉是比较麻烦的事情...?
回复 15# Godbach


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP