linux 内核 发送数据,从Linux内核发送UDP数据包

即使已经存在一个类似的主题,我也注意到它可以追溯到两年前,因此我认为打开一个新主题更为合适。

我试图弄清楚如何从Linux内核(3.3.4)发送UDP数据包,以便监视随机数生成器(/drivers/char/random.c)的行为。到目前为止,由于sock_create和sock_sendmsg函数,我已经设法监视了一些事情。您可以在此消息的末尾找到我使用的典型代码。(您可能还希望在此处下载完整的修改后的random.c文件。)

通过将此代码插入适当的random.c函数中,我能够为每次访问/ dev / random和/ dev /

urandom以及随机数生成器用来收集熵的每个键盘/鼠标事件发送一个UDP数据包。但是,当我尝试监视磁盘事件时,它根本不起作用:它在引导过程中产生内核崩溃。

因此,这是我的主要问题: 您是否知道为什么我的代码在插入磁盘事件函数中时会引起如此多的麻烦? (add_disk_randomness)

另外,我已经阅读了netpoll API,该API应该可以处理此类UDP-in-kernel问题。不幸的是,除了2005年的一个有趣但过时的Red

Hat演示文稿之外,我没有找到任何相关文档。 您认为我应该使用此API吗? 如果是,您有什么例子吗?

任何帮助,将不胜感激。提前致谢。

PS:这是我的第一个问题,所以请不要犹豫告诉我我做错了什么,以后会记住的:)

#include

#include

#include

#define MESSAGE_SIZE 1024

#define INADDR_SEND ((unsigned long int)0x0a00020f) //10.0.2.15

static bool sock_init;

static struct socket *sock;

static struct sockaddr_in sin;

static struct msghdr msg;

static struct iovec iov;

[...]

int error, len;

mm_segment_t old_fs;

char message[MESSAGE_SIZE];

if (sock_init == false)

{

/* Creating socket */

error = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);

if (error<0)

printk(KERN_DEBUG "Can't create socket. Error %d\n",error);

/* Connecting the socket */

sin.sin_family = AF_INET;

sin.sin_port = htons(1764);

sin.sin_addr.s_addr = htonl(INADDR_SEND);

error = sock->ops->connect(sock, (struct sockaddr *)&sin, sizeof(struct sockaddr), 0);

if (error<0)

printk(KERN_DEBUG "Can't connect socket. Error %d\n",error);

/* Preparing message header */

msg.msg_flags = 0;

msg.msg_name = &sin;

msg.msg_namelen = sizeof(struct sockaddr_in);

msg.msg_control = NULL;

msg.msg_controllen = 0;

msg.msg_iov = &iov;

msg.msg_control = NULL;

sock_init = true;

}

/* Sending a message */

sprintf(message,"EXTRACT / Time: %llu / InputPool: %4d / BlockingPool: %4d / NonblockingPool: %4d / Request: %4d\n",

get_cycles(),

input_pool.entropy_count,

blocking_pool.entropy_count,

nonblocking_pool.entropy_count,

nbytes*8);

iov.iov_base = message;

len = strlen(message);

iov.iov_len = len;

msg.msg_iovlen = len;

old_fs = get_fs();

set_fs(KERNEL_DS);

error = sock_sendmsg(sock,&msg,len);

set_fs(old_fs);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值