0

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、source、destination の文字列の代わりに意味不明なものが表示されます。私の推測では、これはカーネル メモリについて言及しているという事実に関連していると思われますが、一方で、これが printk の目的です。

これらの文字列を正しく印刷するにはどうすればよいですか?

4

2 に答える 2

1

saddrおよびについてはdaddr、この方法では印刷できません。次の方法で印刷できます。

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

の場合、skb->datanull( '\0') で終了していないため、 format の文字列として出力することはできません"%s"skb->dataによって決定されるの限界skb->len。このようにして、の内容を印刷できますskb->data

int i; 
for (i=0; i<skb->len; i++) 
    printk("%c", skb->data+i ); 
于 2013-07-24T09:22:28.923 に答える