2009-04-30 2 views
4

netlink를 사용하여 응용 프로그램과 커널 공간간에 통신하고 싶습니다. 내 리눅스 커널 버전은 2.6.28이며, 다음은 내 잘못된 코드입니다 :커널과 사용자 공간 사이에 "netlink"를 만드는 방법은 무엇입니까?

nf_sock=netlink_kernel_create(NL_PROTO,0,nl_user_skb,THIS_MODULE); 

단축 된 오류 메시지가 : 파일 <linux/netlink.h>에서

error: too few arguments to function 'netlink_kernel_create' 

, 기능 netlink_kernel_create()

으로 정의된다
extern struct sock *netlink_kernel_create(struct net *net,int unit,unsigned int groups,void (*input)(struct sk_buff *skb),struct mutex *cb_mutex,struct module *module) 

첫 번째 인수 인 net에 사용할 내용을 이해하지 못합니다. 누군가 내가 여기서 사용해야 할 것을 설명 할 수 있습니까?

+0

어디에서 함수 정의를 가져 왔습니까? libc API에 대한 사용자 공간이 커널 syscall API에 대한 libc와 정확히 일치하지 않을 수 있음을 기억하십시오. – stsquad

답변

4

struct net에는 프로세스에서 사용할 수있는 네트워크 리소스 집합 인 네트워크 네임 스페이스에 대한 정보가 들어 있습니다. 여러 네트워크 네임 스페이스 (예 : 네트워킹 스택의 여러 인스턴스)가있을 수 있지만 대부분의 드라이버는 init_net 네임 스페이스를 사용합니다.

귀하의 전화는 아마 nl_rcv_func 유일한 인수로 struct sk_buff *skb을 복용하는 기능을하고, 수신 넷 링크 메시지를 처리하는 다음

nf_sock = netlink_kernel_create(&init_net, 
           NETLINK_USERSOCK, 
           0, 
           nl_rcv_func, 
           NULL, 
           THIS_MODULE); 

처럼 보일 것이다.

2

this one과 같은 가이드를 따르는 것처럼 보입니다. (2005 년부터) 커널 개발로 인해 많은 부분을 앞서고 있습니다. 커널 측에서 넷 링크를 만드는 내부 API가 변경된 것 같습니다.

로컬 커널 트리의 Documentation/폴더에서 문서를 확인하거나 코드 자체를 읽으십시오. 또한 일어난 것으로 보이는 변경 사항에 대한 언급을 위해 trawl 리눅스 커널 메일 링리스트 아카이브를 사용할 수도 있습니다.

Here은 실제적으로 2.6.29로 구현됩니다. 역으로 퍼즐을 풀고 싶다면 (물론 자신의 트리에서 아직 확인하지 않은 경우).

+1

@unwind : 마지막 링크가 깨져서 변경했습니다. 나는 내 추측에 확신을 가지고 있지만 올바른 페이지에 링크되어 있는지 확인하십시오. –

-3

커널/사용자 통신을 위해 ioctl을 제안합니다. ioctl 인터페이스는 표준이며 커널간에 업데이트 될 가능성은 적습니다.

+2

ioctl은 단순한 변경 작업을 할 수 있지만 인터페이스는 관리하기가 까다 롭고 부서지기 쉽습니다. Netlink는 보통 정도의 복잡성을 가진 커널 개발자에게 선호되는 API입니다. – stsquad

1

예, 구조체 그물 그물 네임 스페이스 사실이지만,이 같은 자신의 pernet_operations을 등록해야합니다, 항상 init_net 사용하기 적절하지 않다 : 마지막으로

static struct pernet_operations fib_net_ops = { 
     .init = fib_net_init, 
     .exit = fib_net_exit, 
}; 

static int __net_init fib_net_init(struct net *net) 
{ 
     int error; 

#ifdef CONFIG_IP_ROUTE_CLASSID 
     net->ipv4.fib_num_tclassid_users = 0; 
#endif 
     error = ip_fib_net_init(net); 
     if (error < 0) 
       goto out; 
     error = nl_fib_lookup_init(net); 
     if (error < 0) 
       goto out_nlfl; 
     error = fib_proc_init(net); 
     if (error < 0) 
       goto out_proc; 
out: 
     return error; 

out_proc: 
     nl_fib_lookup_exit(net); 
out_nlfl: 
     ip_fib_net_exit(net); 
     goto out; 
} 

static int __net_init nl_fib_lookup_init(struct net *net) 
{ 
     struct sock *sk; 
     struct netlink_kernel_cfg cfg = { 
       .input = nl_fib_input, 
     }; 

     sk = netlink_kernel_create(net, NETLINK_FIB_LOOKUP, &cfg); 
     if (sk == NULL) 
       return -EAFNOSUPPORT; 
     net->ipv4.fibnl = sk; 
     return 0; 
} 

과 :

register_pernet_subsys(&fib_net_ops); 
관련 문제