如何定义struct msghdr在linux内核中发送UDP数据包而不从用户空间复制数据

时间:2016-06-30 12:54:39

标签: linux-kernel network-programming udp

我试图在UDP连接(调用函数ip4_datagram_connect)之后从linux内核发送Hello消息。由于此消息中的协议号需要与UDP不同(这是我使用UDP作为基本代码构建的自定义协议),因此我无法使用netpoll API。

所以我正在尝试使用这些功能(从udp_sendmsg()中选取) -

ip_make_skb(struct sock *sk,
            struct flowi4 *fl4,
            int getfrag(void *from, char *to, int offset,
                int len, int odd, struct sk_buff *skb),
            void *from, int length, int transhdrlen,
            struct ipcm_cookie *ipc, struct rtable **rtp,
            unsigned int flags)

生成sk_buff和

int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4)

发出生成的sk_buff。

我的问题是,函数ip_make_skb需要指针*fromlengthudp_sendmsg函数中的指针指向用户空间中的数据长度(+长度) (udphdr)然后ip_make_skb()从用户空间复制数据。由于我只是从内核发送Hello消息,这对我来说是一个浪费的步骤(我不需要来自用户空间的任何数据)。

那么我可以将*from指针设置为某个虚拟位置并将length设置为零(+ sizeof(struct udphdr))吗?如果是,*from的哪种价值适合?

或者这是完全错误的,我还应该做点什么?

编辑1:目前,我正在这样做

void *from = "Hello";

这会给我一个有效的指针在内存中,但我觉得这是一个肮脏的方式来做到这一点。但是Tt很有用。

0 个答案:

没有答案