gpt4 book ai didi

sockets - 在Linux内核中发送UDP数据包

转载 作者:行者123 更新时间:2023-12-03 12:01:45 24 4
gpt4 key购买 nike

对于一个项目,我正在尝试从Linux内核空间发送UDP数据包。我目前正在将我的代码“硬编码”到内核中(我知道这不是最好/最有效的方法),但是我试图使一个简单的测试生效(发送“TEST”)。应该提到的是,我是内核黑客的新手-在很多原理和技术上,我的理解不是那么丰富!

每次我的代码运行时,系统都会挂起,并且必须重新引导-没有鼠标/键盘响应,并且滚动键和大写锁定键指示灯一起闪烁-我不确定这是什么意思,但是我假设这是内核 panic ?

对于此测试代码,无需repeat_send代码,但是在工作时,我想发送可能需要多次“发送”的大型邮件-我不确定是否会引起我的问​​题?

N.B.这段代码被插入到linux-source/net/core/origin的neighbour.c中,因此使用NEIGH_PRINTK1,它只是一个围绕printk的宏包装器。

我的头真的撞到了砖墙上,我看不到任何明显的东西,任何人都可以将我指向正确的方向(或发现那令人眼花obvious乱的错误!)?

这是我到目前为止的内容:

void mymethod()
{
struct socket sock;
struct sockaddr_in addr_in;
int ret_val;
unsigned short port = htons(2048);
unsigned int host = in_aton("192.168.1.254");
unsigned int length = 5;
char *buf = "TEST\0";
struct msghdr msg;
struct iovec iov;
int len = 0, written = 0, left = length;
mm_segment_t oldmm;

NEIGH_PRINTK1("forwarding sk_buff at: %p.\n", skb);

if ((ret_val = sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock)) < 0) {
NEIGH_PRINTK1("Error during creation of socket; terminating. code: %d\n", ret_val);
return;
}

memset(&addr_in, 0, sizeof(struct sockaddr_in));
addr_in.sin_family=AF_INET;
addr_in.sin_port = port;
addr_in.sin_addr.s_addr = host;

if((ret_val = sock.ops->bind(&sock, (struct sockaddr *)&addr_in, sizeof(struct sockaddr_in))) < 0) {
NEIGH_PRINTK1("Error trying to bind socket. code: %d\n", ret_val);
goto close;
}

memset(&msg, 0, sizeof(struct msghdr));
msg.msg_flags = 0;
msg.msg_name = &addr_in;
msg.msg_namelen = sizeof(struct sockaddr_in);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = NULL;
msg.msg_controllen = 0;

repeat_send:
msg.msg_iov->iov_len = left;
msg.msg_iov->iov_base = (char *)buf + written;

oldmm = get_fs();
set_fs(KERNEL_DS);
len = sock_sendmsg(&sock, &msg, left);
set_fs(oldmm);

if (len == -ERESTARTSYS)
goto repeat_send;
if (len > 0) {
written += len;
left -= len;
if (left)
goto repeat_send;
}

close:
sock_release(&sock);
}

任何帮助将不胜感激,谢谢!

最佳答案

您可能会发现将netpoll API用于UDP更容易。查看netconsole的用法示例。您正在使用的API更适合用于用户空间(您不必使用段描述符来发送网络数据!)

关于sockets - 在Linux内核中发送UDP数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1814485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com