LINUX.ORG.RU

Отваливается netif_rx при передаче sk_buff от netlink socket


0

0

Создал соединение между user space и kernel space через netlink socket. В программе формирую Ethernet-пакет и шлю его через netlink socket в модуль. В модуле принимаю его как sk_buff. Пробовал 2 разных способа передачи sk_buff в netif_rx ( пробовал так же netif_recive_skb ). Первый: следуя LDD3, создавал через dev_alloc_skb новый sk_buff, memcpy копировал данные с пришедшей sk_buff в новый буфер. И отправлял в netif_rx. Ядро при этом висло намертво, а логи просто обрывались. Второй способ: не создавал новый буфер, а отпарвлял пришедший sk_buff в netif_rx. При этом ядро не падало, а вот функция netif_rx отавливалась. Как все таки правильно отправить буффер в netif_rx?

Код:

В таком виде ядро падает:

static void recive(struct sk_buff *skb)
{
        struct drv_priv *priv = netdev_priv(mydev);
        struct sk_buff *new_skb;

        new_skb = dev_alloc_skb(skb->len + 2);

        if (!new_skb) {
                if (printk_ratelimit( ))
                DPRINTK( KERN_ERR, "low on mem - packet dropped" );
                priv->stats.rx_dropped++;
                return;
        }

        memcpy(skb_put(new_skb, skb->len), skb->data + sizeof(ethhdr), skb->len);

        new_skb->dev = mydev;
        new_skb->ip_summed = CHECKSUM_UNNECESSARY;
        new_skb->protocol = eth_type_trans( new_skb, mydev );
        netif_rx( new_skb );
        dev_kfree_skb( new_skb );
}

А так отваливается netif_rx:

static void recive(struct sk_buff *skb)
{
        struct drv_priv *priv = netdev_priv(mydev);

        skb_orphan( skb );

        skb->dev = mydev;
        skb->ip_summed = CHECKSUM_UNNECESSARY;
        skb->protocol = eth_type_trans( skb, mydev );
        netif_rx( skb );
}

Лог:

Aug 24 13:56:25 ubuntu-desktop kernel: [  101.041920] BUG: unable to handle kernel NULL pointer dereference at (null)
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.041927] IP: [<e1ae3799>] socket_recive+0x169/0x390 [btmbnepdrv]
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.041937] *pde = 1e467067 *pte = 00000000 
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.041943] Oops: 0000 [#1] SMP 
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.041948] last sysfs file: /sys/devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sda/sda5/stat
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.041953] Modules linked in: btmbnepdrv binfmt_misc btmhid(P) snd_hda_codec_realtek snd_hda_intel snd_hda_codec snd_hwdep snd_pcm_oss snd_mixer_oss fbcon tileblit font bitblit softcursor snd_pcm vga16fb snd_seq_dummy vgastate snd_seq_oss snd_seq_midi snd_rawmidi snd_seq_midi_event i915 snd_seq drm_kms_helper snd_timer uinput snd_seq_device drm btmusb(P) snd btmwrapper ppdev parport_pc usbhid i2c_algo_bit hid video output soundcore lp intel_agp agpgart parport snd_page_alloc psmouse serio_raw floppy tg3
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042015] 
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042020] Pid: 1631, comm: btmnet_srv Tainted: P           (2.6.32-22-generic #36-Ubuntu) HP Compaq dc7600 Convertible Minitower
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042025] EIP: 0060:[<e1ae3799>] EFLAGS: 00010292 CPU: 1
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042029] EIP is at socket_recive+0x169/0x390 [btmbnepdrv]
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042033] EAX: 00000033 EBX: d957c300 ECX: fffffe6b EDX: 00000000
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042036] ESI: 00000000 EDI: c1d03cbc EBP: c1d03ce4 ESP: c1d03c94
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042040]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042043] Process btmnet_srv (pid: 1631, ti=c1d02000 task=ca3e8000 task.ti=c1d02000)
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042047] Stack:
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042049]  e1ae3d22 d64a8800 e1ae3c60 0000002a ca07322a ca073240 d530b700 00000000
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042059] <0> 00000206 0030b700 c04e11c1 c1d03cf0 00000246 ffff926d ffffffff 19831500
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042070] <0> 060867de dd906200 0000002a 00000000 c1d03d0c c04e11b9 0000002a ca073200
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042082] Call Trace:
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042092]  [<c04e11c1>] ? netlink_unicast+0x261/0x280
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042098]  [<c04e11b9>] ? netlink_unicast+0x259/0x280
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042103]  [<c04e1dda>] ? netlink_sendmsg+0x1ba/0x2a0
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042110]  [<c03208b5>] ? apparmor_socket_sendmsg+0x15/0x20
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042116]  [<c04b38b5>] ? sock_sendmsg+0xe5/0x110
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042123]  [<c0167740>] ? autoremove_wake_function+0x0/0x50
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042130]  [<c0142a58>] ? try_to_wake_up+0x288/0x3b0
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042135]  [<c0142b90>] ? default_wake_function+0x10/0x20
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042141]  [<c03532bd>] ? copy_from_user+0x3d/0x130
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042146]  [<c04bc8da>] ? verify_iovec+0x5a/0xa0
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042151]  [<c04b41fd>] ? sys_sendmsg+0x15d/0x290
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042157]  [<c020f709>] ? pipe_write+0x229/0x540
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042163]  [<c022002f>] ? mntput_no_expire+0x1f/0xe0
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042169]  [<c0167740>] ? autoremove_wake_function+0x0/0x50
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042176]  [<c02f4414>] ? security_file_permission+0x14/0x20
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042184]  [<c0207ad4>] ? rw_verify_area+0x64/0xe0
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042190]  [<c04b481c>] ? sys_socketcall+0xcc/0x280
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042195]  [<c01033ec>] ? syscall_call+0x7/0xb
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042199] Code: de 8b 43 50 89 44 24 0c a1 d4 42 ae e1 c7 44 24 08 60 3c ae e1 c7 04 24 22 3d ae e1 89 44 24 04 e8 e2 57 aa de 8b b3 9c 00 00 00 <a5> a5 a5 66 a5 0f b6 45 dd c7 44 24 08 60 3c ae e1 c7 04 24 04 
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042267] EIP: [<e1ae3799>] socket_recive+0x169/0x390 [btmbnepdrv] SS:ESP 0068:c1d03c94
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042275] CR2: 0000000000000000
Aug 24 13:56:25 ubuntu-desktop kernel: [  101.042280] ---[ end trace 536cb2168dbea19e ]---

Если передавать во второй вариант функции sk_buff, который сама система шлет (ARP, multicast-пакет), то передача происходит без ошибок. Пробовал вместо memcpy использовать skb_copy. Результат тот же - отваливается ядро.


Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.