我需要创建一个可加载的内核模块,它将数据发送到另一台远程计算机。
我正在写4.10内核。
我尝试了netpoll API,但我得到的只是错误,我无法在内核中找到有关套接字编程的任何新的和最新的信息。
任何人都可以给我一个例子(或任何指示)吗?
int init_netpoll(void)
{
np_t.name = "LRNG";
strlcpy(np_t.dev_name, "enp3s0", IFNAMSIZ);
np_t.local_ip.ip = htonl((unsigned long int)0xc6a80121);
np_t.local_ip.in.s_addr = htonl((unsigned long int)0xc6a80121);
np_t.remote_ip.ip = htonl((unsigned long int)0xc6a80114);
np_t.remote_ip.in.s_addr = htonl((unsigned long int)0xc6a80114);
np_t.ipv6 = 0;//no IPv6
np_t.local_port = 6666;
np_t.remote_port = 80;
///////////////
///////////////
memset(np_t.remote_mac, 0xff, ETH_ALEN);
netpoll_print_options(&np_t);
if(!netpoll_setup(&np_t)) {
return 1;
}
np = &np_t;
return 0;
}
void clean_netpoll(void)
{
//nothing
}
void sendUdp(const char* buf)
{
printk("********** SEND UDP **********");
netpoll_send_udp(np,buf,strlen(buf));
}
日志:
[ 278.702352] ********** SEND UDP **********
[ 278.702353] ------------[ cut here ]------------
[ 278.702358] WARNING: CPU: 2 PID: 2153 at /build/linux-nhaT8l/linux-4.10.0/net/core/netpoll.c:394 netpoll_send_udp+0x443/0x450
[ 278.702359] Modules linked in: netCharDev(OE+) rfcomm bnep btusb btrtl btbcm btintel bluetooth uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev media wl(POE) intel_rapl x86_pkg_temp_thermal intel_powerclamp snd_hda_codec_hdmi coretemp kvm irqbypass binfmt_misc crct10dif_pclmul snd_hda_codec_realtek snd_hda_codec_generic crc32_pclmul ghash_clmulni_intel cryptd intel_cstate intel_rapl_perf snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm joydev input_leds serio_raw snd_seq_midi snd_seq_midi_event snd_rawmidi thinkpad_acpi nvram snd_seq snd_seq_device cfg80211 snd_timer lpc_ich snd shpchp mei_me mei soundcore mac_hid parport_pc ppdev lp parport ip_tables x_tables autofs4 uas usb_storage i915 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops
[ 278.702393] psmouse ahci drm r8169 libahci mii wmi fjes video
[ 278.702399] CPU: 2 PID: 2153 Comm: insmod Tainted: P OE 4.10.0-33-generic #37-Ubuntu
[ 278.702400] Hardware name: LENOVO 62742BG/62742BG, BIOS H1ET69WW (1.12 ) 11/15/2012
[ 278.702400] Call Trace:
[ 278.702404] dump_stack+0x63/0x81
[ 278.702406] __warn+0xcb/0xf0
[ 278.702409] warn_slowpath_null+0x1d/0x20
[ 278.702411] netpoll_send_udp+0x443/0x450
[ 278.702413] ? netpoll_setup+0x166/0x2d0
[ 278.702416] sendUdp+0x32/0x35 [netCharDev]
[ 278.702417] ? 0xffffffffc025d000
[ 278.702420] netCharDev_init+0x26/0x1000 [netCharDev]
[ 278.702421] ? 0xffffffffc025d000
[ 278.702423] do_one_initcall+0x52/0x1b0
[ 278.702426] ? kmem_cache_alloc_trace+0x142/0x190
[ 278.702428] do_init_module+0x5f/0x200
[ 278.702432] load_module+0x190b/0x1c70
[ 278.702433] ? __symbol_put+0x60/0x60
[ 278.702436] ? ima_post_read_file+0x7e/0xa0
[ 278.702438] ? security_kernel_post_read_file+0x6b/0x80
[ 278.702440] SYSC_finit_module+0xdf/0x110
[ 278.702443] SyS_finit_module+0xe/0x10
[ 278.702445] entry_SYSCALL_64_fastpath+0x1e/0xad
[ 278.702447] RIP: 0033:0x7feb867b39f9
[ 278.702448] RSP: 002b:00007ffd0e884438 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 278.702449] RAX: ffffffffffffffda RBX: 0000563b09907a70 RCX: 00007feb867b39f9
[ 278.702450] RDX: 0000000000000000 RSI: 0000563b091e7f8b RDI: 0000000000000003
[ 278.702451] RBP: 00007feb86a72b00 R08: 0000000000000000 R09: 00007feb86a74ea0
[ 278.702452] R10: 0000000000000003 R11: 0000000000000246 R12: 00007feb86a72b58
[ 278.702453] R13: 00007feb86a72b58 R14: 000000000000270f R15: 0000000000001010
[ 278.702455] ---[ end trace ca1c43e67bc5a307 ]---
[ 278.702460] BUG: unable to handle kernel NULL pointer dereference at 0000000000000040
[ 278.702507] IP: netpoll_send_udp+0x30/0x450
[ 278.702528] PGD 0
[ 278.702550] Oops: 0000 [#1] SMP
[ 278.702567] Modules linked in: netCharDev(OE+) rfcomm bnep btusb btrtl btbcm btintel bluetooth uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev media wl(POE) intel_rapl x86_pkg_temp_thermal intel_powerclamp snd_hda_codec_hdmi coretemp kvm irqbypass binfmt_misc crct10dif_pclmul snd_hda_codec_realtek snd_hda_codec_generic crc32_pclmul ghash_clmulni_intel cryptd intel_cstate intel_rapl_perf snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm joydev input_leds serio_raw snd_seq_midi snd_seq_midi_event snd_rawmidi thinkpad_acpi nvram snd_seq snd_seq_device cfg80211 snd_timer lpc_ich snd shpchp mei_me mei soundcore mac_hid parport_pc ppdev lp parport ip_tables x_tables autofs4 uas usb_storage i915 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops
[ 278.705010] psmouse ahci drm r8169 libahci mii wmi fjes video
[ 278.705917] CPU: 2 PID: 2153 Comm: insmod Tainted: P W OE 4.10.0-33-generic #37-Ubuntu
[ 278.706956] Hardware name: LENOVO 62742BG/62742BG, BIOS H1ET69WW (1.12 ) 11/15/2012
[ 278.707781] task: ffff95ea2cc78000 task.stack: ffffa707c2318000
[ 278.708618] RIP: 0010:netpoll_send_udp+0x30/0x450
[ 278.709876] RSP: 0018:ffffa707c231bc30 EFLAGS: 00010286
[ 278.711806] RAX: 0000000000000024 RBX: ffffffffc07e33fa RCX: 0000000000000006
[ 278.713766] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000009
[ 278.715709] RBP: ffffa707c231bc70 R08: 0000000000000001 R09: 000000000000035c
[ 278.716998] R10: ffffffffafe06a40 R11: 0000000000000000 R12: 0000000000000000
[ 278.719051] R13: 0000000000000004 R14: ffff95ea0b9b7240 R15: ffff95ea0b9b7288
[ 278.721031] FS: 00007feb86c7c700(0000) GS:ffff95ea9e280000(0000) knlGS:0000000000000000
[ 278.723056] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 278.725069] CR2: 0000000000000040 CR3: 000000008bb50000 CR4: 00000000001406e0
[ 278.727111] Call Trace:
[ 278.729143] ? netpoll_setup+0x166/0x2d0
[ 278.731205] sendUdp+0x32/0x35 [netCharDev]
[ 278.733273] ? 0xffffffffc025d000
[ 278.735303] netCharDev_init+0x26/0x1000 [netCharDev]
[ 278.737356] ? 0xffffffffc025d000
[ 278.739401] do_one_initcall+0x52/0x1b0
[ 278.741440] ? kmem_cache_alloc_trace+0x142/0x190
[ 278.743465] do_init_module+0x5f/0x200
[ 278.745506] load_module+0x190b/0x1c70
[ 278.747510] ? __symbol_put+0x60/0x60
[ 278.749517] ? ima_post_read_file+0x7e/0xa0
[ 278.751477] ? security_kernel_post_read_file+0x6b/0x80
[ 278.753435] SYSC_finit_module+0xdf/0x110
[ 278.755327] SyS_finit_module+0xe/0x10
[ 278.757264] entry_SYSCALL_64_fastpath+0x1e/0xad
[ 278.759180] RIP: 0033:0x7feb867b39f9
[ 278.761256] RSP: 002b:00007ffd0e884438 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 278.761260] RAX: ffffffffffffffda RBX: 0000563b09907a70 RCX: 00007feb867b39f9
[ 278.761261] RDX: 0000000000000000 RSI: 0000563b091e7f8b RDI: 0000000000000003
[ 278.761263] RBP: 00007feb86a72b00 R08: 0000000000000000 R09: 00007feb86a74ea0
[ 278.761265] R10: 0000000000000003 R11: 0000000000000246 R12: 00007feb86a72b58
[ 278.761266] R13: 00007feb86a72b58 R14: 000000000000270f R15: 0000000000001010
[ 278.761269] Code: 55 48 89 e5 41 57 41 56 41 55 41 54 49 89 fc 53 41 89 d5 48 83 ec 18 48 89 34 24 9c 58 0f 1f 44 00 00 f6 c4 02 0f 85 ee 03 00 00 <41> 80 7c 24 40 00 41 8d 45 08 41 8d 55 1c bb 0a 00 00 00 41 bf
[ 278.761336] RIP: netpoll_send_udp+0x30/0x450 RSP: ffffa707c231bc30
[ 278.761337] CR2: 0000000000000040
[ 278.772275] ---[ end trace ca1c43e67bc5a308 ]---
无论如何,我可以调试内核代码,看看错误是在net poll API中的某个地方吗?
P.S。
对于那些会在用户空间中说我应该这样做的人,我做了我的思考,我真的需要在内核空间内。
我也提出了以下问题,对我来说没有任何帮助:
Sending UDP packets from the Linux Kernel
Sending UDP packets from the Linux Kernel (different question)
答案 0 :(得分:0)
当我尝试使用netpoll找到解决方案时,我发现使用套接字可能更有用。 我找到了一个github存储库的this链接,它完全具有linux内核中echo客户端服务器的例子。
希望它能帮助所有搜索它的人。