2017-05-24 13 views
5

से काम मैं इसी तरह की त्रुटि संदेश के साथ यह पेज देखा है: Nf_hook_ops returns incompatible pointer when assigning to hook_func -C -Linux -Netfilternfhook (नेटफिल्टर) त्रुटि: असंगत सूचक प्रकार

हालांकि, यह कैसे इस मुद्दे को हल करने के लिए के लिए एक स्पष्ट जवाब नहीं दिया। उस प्रश्न के लेखक ने कहा कि उन्हें पता चला कि उनका netfilter.h कहीं और स्थित है जो परेशानी का कारण बनता है, लेकिन मेरे लिए मुझे पता चला कि सभी चार फाइलें सही निर्देशिका में हैं (usr/src/linux-headers-4.8। मेरे मामले में 0-22-जेनेरिक/शामिल/लिनक्स)।

मेरा कोड निम्नलिखित है जो बेहतर स्पष्टीकरण में मदद कर सकता है।

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/netfilter.h> 
#include <linux/netfilter_ipv4.h> 

static struct nf_hook_ops nfho; 

unsigned int hook_func_incoming(unsigned int hooknum, struct sk_buff *sskb, 
const struct net_device *in, const struct net_device *out, int (*okfn) 
(struct sk_buff *)){ 
    return NF_DROP; 
} 

int init_module(){ 
    nfho.hook = hook_func_incoming; 
    nfho.hooknum = NF_INET_PRE_ROUTING; 
    nfho.pf = PF_INET; 
    nfho.priority = NF_IP_PRI_FIRST; 
    nf_register_hook(&nfho); 
    printk(KERN_INFO "SIMPLE FIREWALL LOADED\n"); 
    return 0; 
} 

सटीक त्रुटि संदेश यह है:

त्रुटि: असंगत सूचक प्रकार से काम [-Werror = असंगत-सूचक प्रकार] nfho.hook = hook_func_incoming; ^ CC1: कुछ चेतावनी त्रुटियों

कृपया मुझे पता है कि मुझे क्या करना चाहिए मेरी नेटफिल्टर संकलित करने के लिए सक्षम होने के लिए करते हैं, किसी भी मदद की सराहना की है के रूप में इलाज किया जा रहा!

typedef unsigned int nf_hookfn(void *priv, 
        struct sk_buff *skb, 
        const struct nf_hook_state *state); 

आपका समारोह hook_func_incoming इस हस्ताक्षर से मेल नहीं खाता, तो आप इसे अपनाना चाहिए: इस प्रकार

उत्तर

3

(IMHO) में नवीनतम (जारी) नेटफिल्टर version, nf_hookfn (nf_hook_ops.hook के आधार प्रकार) परिभाषित किया गया है।

+0

धन्यवाद! इससे मुझे इस मुद्दे को हल करने में मदद मिली। हालांकि, क्या आप मुझे पहले और तीसरे पैरामीटर के बारे में और बता सकते हैं? मुझे ऑनलाइन कोई संबंधित दस्तावेज नहीं मिल रहा है (हालांकि मुझे दूसरे पैरामीटर के बारे में जानकारी पता है)। –

0

तीसरा पैरामीटर यह डेटा संरचना है। हुक फ़ंक्शन की नई परिभाषा में, वे पुराने पैरामीटर को एक डेटा संरचना में जोड़ना चाहते थे। इसलिए, यदि आपको आउट डिवाइस की आवश्यकता है, तो आप इसे इस राज्य पैरामीटर से प्राप्त कर सकते हैं।

struct nf_hook_state { 
     unsigned int hook; 
     int thresh; 
     u_int8_t pf; 
     struct net_device *in; 
     struct net_device *out; 
     struct sock *sk; 
     struct net *net; 
     struct nf_hook_entry __rcu *hook_entries; 
     int (*okfn)(struct net *, struct sock *, struct sk_buff *); 
}; 

निजी संरचना nf_hook_ops के अंदर एक क्षेत्र है। आप इसे अपने मॉड्यूल में किसी भी मूल्य पर सेट कर सकते हैं और इसे अपने हुक फ़ंक्शन में एक्सेस कर सकते हैं।

struct nf_hook_ops { 
     struct list_head  list; 

     /* User fills in from here down. */ 
     nf_hookfn    *hook; 
     struct net_device  *dev; 
     void     *priv; 
     u_int8_t    pf; 
     unsigned int   hooknum; 
     /* Hooks are ordered in ascending priority. */ 
     int      priority; 
}; 
संबंधित मुद्दे