s.t_seeyou 发表于 2009-08-25 14:55

请大家对帮忙看看这几行代码的问题在那?

代码部分如下:
unsigned char *dest;
dest= skb->mac.ethernet->h_dest;
printk("[%s %d] ==========dest=%02x\n", __FILE__, __LINE__,dest);// 会在这挂掉
    /* broadcast packet limit */
    if(dest & 0x01)

2.6的skb_buff中
         /* Link layer header */
      union
      {      
                  struct ethhdr      *ethernet;//2.6.13中没有。我为了方便加入本项
                  unsigned char         *raw;
      } mac;

这几行代码在2.4上没有问题,我拿到2.6上一直有问题,而且在br_input.c 上也有相同的用法,不知问题在那?另外我去掉struct ethhdr      *ethernet项,用2.6中的用法,改为
const unsigned char *dest = eth_hdr(skb)->h_dest;
printk("[%s %d] ==========dest=%02x\n", __FILE__, __LINE__,dest);

static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
{
      return (struct ethhdr *)skb->mac.raw;
}
还是有相同问题,

emmoblin 发表于 2009-08-26 00:55

ethernet->h_dest
ethernet在哪赋的值?

s.t_seeyou 发表于 2009-08-26 08:55

回复 #2 emmoblin 的帖子

ethernet 与raw同为mac的共同体,所以只要raw有值就行了,这个问题找到了,是因为skb->mac.raw没有在之前赋指针skb->data,所以直接就用了,导致skb->mac.raw=NULL,所以会去错,看来skb->mac.raw=skb->data的动作是在驱动中做的了。
页: [1]
查看完整版本: 请大家对帮忙看看这几行代码的问题在那?