2012-02-12 4 views
4

Я пытаюсь обрабатывать простой пакетный контроль с помощью сетевых фильтров.C - Не удается получить доступ к saddr

Декларация представляется достаточно проста:

unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb, 
      const struct net_device *in, 
      const struct net_device *out, int (*okfn)(struct sk_buff *)) 
{ 

    struct iphdr *iph = (struct iphdr *)skb_network_header(skb); 

} 

И я могу получить доступ к части протокола сетевого заголовка

iph->protocol == IPPROTO_TCP

Однако

iph->saddr

терпит неудачу. Какие-либо предложения? Я чувствую, как это довольно простая ошибка с моей стороны, но все примеры следуют либо этот метод, или они просто используют

struct iphdr *iph = ip_hdr(skb);

я получаю такое же поведение с обоими методами. Я просмотрел skbuff.h для любых подсказок, но не повезло.

EDIT:

Может ли это иметь дело с их так, как я к нему доступ? Сейчас для отладки Я просто пытаюсь напечатать значение с помощью:

printk(KERN_DEBUG "%pI4", iph->saddr);

+0

У вас появляется сообщение об ошибке? Что это? –

+0

он убивает машину. Обычно я просто перезагружаю моментальный снимок в моем vm. Ошибок времени компиляции нет. Есть ли способ получить сообщение об ошибке после сбоя ядра? – kevgliss

ответ

2

%pI4 принимает адрес, так что вы читаете, возможно недопустимое память. Вместо этого используйте &iph->saddr.

+0

Это было! Спасибо за уловку. – kevgliss