2017-12-27 10 views
0

私はproto_register_plumberが好きなAPIを使用して、Mac上tunのカーネル拡張プログラムだったが、以下:1のMAC(10.13)でmac kernel-extensionのエラーコードの意味は何ですか?

err = proto_register_plumber(PF_INET, IFNET_FAMILY_TUN, method_attach, method_detach); 
if (err) { 
    printf("error code is : %d\n", err); 
} 

を、それが何を意味するのか、17を返しますか?どうすれば修正できますか?

私はhttps://developer.apple.com/documentation/kernel/1532491-proto_register_plumber?language=objcのAPIドキュメントについて読んでいますが、エラーコードの意味については何も見つかりませんでした。

答えて

1

17は、確かにerrnoです。これは特にKPIのBSD部分のものです。あなたはerrno.hで見れば、あなたはそれがEEXISTに対応していることがわかります:

あなたのAPI呼び出しのコンテキストで
#define EEXIST  17  /* File exists */ 

が、これはおそらくすでにあなたが登録しようとしているもののために登録された何かがあることを意味します。私はproto_register_plumber()機能に慣れていないんだけど、its source codeで非常に簡単に見ては、私の疑いを確認するために表示され、関数の先頭付近、以下のチェックを明らかにする:

lck_mtx_lock(proto_family_mutex); 

TAILQ_FOREACH(proto_family, &proto_family_head, proto_fam_next) { 
    if (proto_family->proto_family == protocol_family && 
     proto_family->if_family == interface_family) { 
     lck_mtx_unlock(proto_family_mutex); 
     return (EEXIST); 
    } 
} 

それは次のようになります。

  • 以前にハンドラを登録し、登録を解除していないkextをアンロードしてから、kextを再ロードして再度登録しようとしましたか?この場合、再起動(そしてkext stop機能の修正!)がそれを修正するはずです。
  • もう1つロードされたkextはすでに独自のハンドラを登録していますか?その場合は、候補者をアンロードしてみてください。
  • xnuカーネルは、すでにこのプロトコルファミリ用のデフォルトのハンドラを提供していますか?たぶんあなたは、あなたが別のやり方でやろうとしていることについて行く必要があります。
+0

タンク、それは別のkextがハンドラを登録しているからです! – waitianlou