我试图在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需要指针*from
和length
,udp_sendmsg
函数中的指针指向用户空间中的数据长度(+长度) (udphdr)然后ip_make_skb()
从用户空间复制数据。由于我只是从内核发送Hello消息,这对我来说是一个浪费的步骤(我不需要来自用户空间的任何数据)。
那么我可以将*from
指针设置为某个虚拟位置并将length
设置为零(+ sizeof(struct udphdr))吗?如果是,*from
的哪种价值适合?
或者这是完全错误的,我还应该做点什么?
编辑1:目前,我正在这样做
void *from = "Hello";
这会给我一个有效的指针在内存中,但我觉得这是一个肮脏的方式来做到这一点。但是Tt很有用。