2017-12-27 309 views
0

我计划约在Mac屯内核扩展,我用的是API proto_register_plumber喜欢如下: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); 
} 

在一个MAC(10.13),它返回17,它意味着什么?我该如何解决它?

我阅读了关于https://developer.apple.com/documentation/kernel/1532491-proto_register_plumber?language=objc的API文档,但我没有发现任何有关错误代码的含义。

回答

1

17几乎肯定是errno,特别是因为这是来自KPI的BSD部分。如果您在errno.h看你会发现,它对应于EEXIST

#define EEXIST  17  /* File exists */ 

在你的API调用的情况下,这可能意味着已经是你想注册登记的事情的东西。我不熟悉的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功能!)应该修复它。
  • 另一个加载的kext已经注册了它自己的处理程序?如果是这样,请尝试卸载可能的候选人。
  • xnu内核已经为此协议族提供了默认处理程序?也许你需要以不同的方式去做你想要做的事情。
+0

坦克,这是因为另一个kext注册其处理程序! – waitianlou