2013-02-08 29 views
10

अगर मैं कुछ कर्नेल मॉड्यूल लिखते हैं, और उन सभी को में निर्दिष्ट वे पहली बार (या पिछले) नेटफिल्टर हुक कहा जाता है, किस क्रम में वे वास्तव में बुलाया जाएगा किया जाना चाहिए?क्या आदेश netfilter हुक अगर वे सब NF_IP_PRI_LAST या NF_IP_PRI_FIRST निर्दिष्ट करते हैं, में जाते हैं?

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; 
}  

प्रयोगात्मक रूप से, मैं दो मॉड्यूल बनाया है, insmod उन्हें दो अलग-अलग आदेश में एड - लेकिन वे एक ही परिणाम दे दी है, वहाँ कुछ उपसमूह कि सिर्फ 'पहले पहले आओ की सेवा' नहीं है जिसका अर्थ है। (यह वर्णमाला भी नहीं है ...)

+1

'nf_register_hook()' 'module_init' फ़ंक्शन में कहा जाता है। एक पुराना कर्नेल: 2.6.18। एक मॉड्यूल एक पैकेट को संशोधित करता है, दूसरा लॉग इन करता है, दोनों एक ही पंजीकरण कोड (उपरोक्त) का उपयोग करते हैं। लेकिन इससे कोई फर्क नहीं पड़ता कि मैं मॉड्यूल को किस क्रम में लोड करता हूं, मैं हमेशा रॉकेट में संशोधित पैकेट को देखता हूं। मुझे लगता है कि किसी भी तरह से मुझे संशोधक से पहले लॉगर चलाने में सक्षम होना चाहिए ... लेकिन कोई पासा नहीं। –

+1

क्षमा करें, मेरी व्याख्या सिर्फ इस मुद्दे को भ्रमित करने में घायल हो गई है। मेरे पास चार हुक, प्रत्येक LOCAL_IN और LOCAL_OUT के 2 हैं। दोनों मॉड्यूल इनकमिंग और आउटगोइंग दोनों पर हुक करते हैं, लेकिन मैं केवल इनकमिंग पर ध्यान केंद्रित कर रहा हूं। –

उत्तर

3

nf_register_hook() कोड से, हम जान सकते हैं कि यदि दो हुक एक ही nf_hooks [reg-> pf] [reg-> hooknum] से संबंधित हैं, तो हुक निष्पादन अनुक्रम है प्राथमिकता से तय किया गया। यदि प्राथमिकता भी वही है, तो अनुक्रम 'पहले आओ पहले सेवा' है। निम्नलिखित कोड देखें:

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; 
}