2017-05-24 2 views
5

에서 할당 나는 유사한 오류 메시지가이 페이지를 보았다 : Nf_hook_ops returns incompatible pointer when assigning to hook_func -C -Linux -Netfilternfhook (넷) 오류 : 호환되지 않는 포인터 타입

그러나,이 문제를 해결하는 방법에 대한 명확한 대답을하지 않았다. 그 질문에 대한 저자는 자신의 netfilter.h가 문제를 일으키는 다른 곳에 있다는 것을 알았지 만 포함 된 4 개의 파일 모두 올바른 디렉토리 (usr/src/linux-headers-4.8)에 있다는 것을 알았습니다. 0-22-generic/include/linux 내 경우).

다음은 더 명확하게하는 데 도움이되는 제 코드입니다.

#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이 서명과 일치하지 않습니다, 당신이 그것을 채택해야 다음과 같이 (IMHO)에서

답변

3

최신 (발표) 넷 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 *); 
}; 

priv는 struct 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; 
}; 
관련 문제