gpt4 book ai didi

c - 从 linux ntworking 驱动程序内部打印字符串

转载 作者:行者123 更新时间:2023-11-30 15:47:00 25 4
gpt4 key购买 nike

我编写了一个Linux网络驱动程序。

这是我的“hard_header”函数:

 int snull_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type, void *daddr, void *saddr,
unsigned int len)
{
struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);

pr_err("inside snull_header\n");
pr_err("THE DATA TO SEND BEFORE ADDITION IS:%s\n", skb->data);
pr_err("THE SOURCE IS:%s\n", (char*)saddr);
pr_err("THE DEST IS:%s\n", (char*)daddr);
eth->h_proto = htons(type);
memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len);
memcpy(eth->h_dest, daddr ? daddr : dev->dev_addr, dev->addr_len);
eth->h_dest[ETH_ALEN-1] ^= 0x01; /* dest is us xor 1 */
pr_err("THE DATA TO SEND AFTER ADDITION IS:%s\n", skb->data);
return (dev->hard_header_len);
}

这是 pr_err 的定义(来自 printk.h):

    #define pr_err(fmt, ...) \
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)

当我运行加载此驱动程序并尝试发送数据包时,我看到了所有打印,但我看到的不是 skb->data、源和目标的字符串,而是乱码。我的猜测是,它与我所指的内核内存有关,但另一方面,这就是 printk 的用途。

如何正确打印这些字符串?

最佳答案

对于saddrdaddr,你不能用这种方式打印它们。您可以使用以下方式打印它们:

pr_err("THE SOURCE IS:%d.%d.%d.%d\n",
(0xff & saddr),
(0xff00 & saddr) >> 8,
(0xff000000 & saddr) >> 16
(0xff000000 & saddr) >>24);

对于 skb->data,它不是 null('\0') 终止的,因此您不能以 "%s 格式打印为字符串“。由skb->len确定的skb->data的限制。这样就可以打印skb->data的内容了。

int i; 
for (i=0; i<skb->len; i++)
printk("%c", skb->data+i );

关于c - 从 linux ntworking 驱动程序内部打印字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17829736/

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