2013-02-08 10 views
10

Wenn ich ein paar Kernel-Module schreiben, und in allen von ihnen angeben, sollten sie die ersten (oder letzten) Netfilter Hook genannt werden, in welcher Reihenfolge werden sie tatsächlich aufgerufen?In welcher Reihenfolge gehen Netfilter-Hooks ein, wenn sie alle NF_IP_PRI_LAST oder NF_IP_PRI_FIRST angeben?

netfilter_ops_out.hook  = hook_func_out; 
netfilter_ops_out.pf  = PF_INET; 
netfilter_ops_out.hooknum = NF_IP_LOCAL_OUT; 
netfilter_ops_out.priority = NF_IP_PRI_FIRST; 

ret = nf_register_hook(&netfilter_ops_out); 
if (0 > ret) { 
    printk("Error registering netfilter hook: %d\n", ret); 
    return ret; 
}  

netfilter_ops_in.hook  = hook_func_in; 
netfilter_ops_in.pf  = PF_INET; 
netfilter_ops_in.hooknum = NF_IP_LOCAL_IN; 
netfilter_ops_in.priority = NF_IP_PRI_LAST; 

ret = nf_register_hook(&netfilter_ops_in); 
if (0 > ret) { 
    printk("Error registering netfilter hook: %d\n", ret); 
    return ret; 
}  

Experimentell, machte ich zwei Module, insmod ed sie in den beiden verschiedenen Ordnungen - aber sie gaben das gleiche Ergebnis, was bedeutet, dass eine Unterordnung ist, die nicht nur ist ‚first come first serve‘. (Es ist auch nicht alphabetisch ...)

+1

'nf_register_hook()' wird in der Funktion 'module_init' aufgerufen. Ein älterer Kernel: 2.6.18. Ein Modul ändert ein Paket, das andere protokolliert es, beide verwenden denselben Registrierungscode (oben). Aber egal in welcher Reihenfolge ich die Module einlade, ich sehe das Paket immer im Logger modifiziert. Ich dachte, irgendwie sollte ich in der Lage sein, den Logger vor dem Modifikator laufen zu lassen ... aber keine Würfel. –

+1

Entschuldigung, meine Erklärung hat das Problem nur noch verwirrender gemacht. Ich habe vier Haken, jeweils 2 von LOCAL_IN und LOCAL_OUT. Die beiden Module hängen beide an den eingehenden und ausgehenden, aber ich konzentriere mich nur auf den eingehenden. –

Antwort

3

Von den nf_register_hook() - Codes können wir wissen, dass, wenn zwei Hooks zu denselben nf_hooks [reg-> pf] [reg-> hooknum] gehören, die Hook-Ausführungssequenz ist nach Priorität entschieden. Wenn die Priorität auch gleich ist, lautet die Reihenfolge "Wer zuerst kommt, mahlt zuerst". Siehe folgende Codes:

int nf_register_hook(struct nf_hook_ops *reg) 
{ 
    struct nf_hook_ops *elem; 
    int err; 

    err = mutex_lock_interruptible(&nf_hook_mutex); 
    if (err < 0) 
     return err; 
    list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) { 
     if (reg->priority < elem->priority) 
      break; 
    } 
    list_add_rcu(&reg->list, elem->list.prev); 
    mutex_unlock(&nf_hook_mutex); 
#if defined(CONFIG_JUMP_LABEL) 
    static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]); 
#endif 
    return 0; 
}