문제

NetLink를 사용하여 응용 프로그램과 커널 공간간에 통신하고 싶습니다. 내 Linux 커널 버전은 2.6.28이고 다음은 내 잘못된 코드입니다.

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

약식 오류 메시지는 다음과 같습니다.

error: too few arguments to function 'netlink_kernel_create'

파일에서 <linux/netlink.h>, 함수 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. 누군가 내가 여기서 무엇을 사용해야하는지 설명 할 수 있습니까?

도움이 되었습니까?

해결책

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

당신의 전화는 아마도 다음과 같은 것처럼 보일 것입니다

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

어디 nl_rcv_func 기능을 취합니다 struct sk_buff *skb 유일한 인수와 처리로 수신 된 NetLink 메시지를 처리합니다.

다른 팁

당신은 다음과 같은 가이드를 따르고있는 것 같습니다. 이 하나, (2005 년부터)는 커널의 발전에 의해 우세했을 것입니다. 커널 측에서 넷 링크를 생성하는 내부 API가 변경된 것 같습니다.

로컬 커널 트리의 문서/ 폴더를 확인하거나 일부 (희망적으로 신선한) 문서를 확인하거나 코드 자체를 읽으십시오. 당신도 할 수 있습니다 트롤 그물 Linux 커널 메일 링리스트는 발생한 것으로 보이는 변경 사항에 대한 언급을 보관합니다.

여기 오히려 뒤로 퍼즐을 펼치려면 2.6.29 기준으로 실제 명백한 것입니다 (물론 자신의 나무에서 아직 확인하지 않았습니다).

예, Struct Net은 실제로 Net 네임 스페이스에 대한 것이지만 항상 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);

내가 제안 할게 IOCTL 커널/사용자 통신 용. IOCTL 인터페이스는 표준이며 커널간에 업데이트 될 가능성은 작습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top