【问题标题】:Compiling wanpipe driver on kernel 5.11在内核 5.11 上编译 wanpipe 驱动程序
【发布时间】:2021-07-17 00:00:47
【问题描述】:

我正在尝试在带有内核 v5.11 的 Ubuntu 21.04 上编译 Sangoma 的 wanpipe 驱动程序 v7.0.32,以便与我的 A200 电话卡一起使用。该驱动程序是为支持内核 5.8 而编写的。我已经使用 5.8 内核成功构建了它,但希望能够继续使用 5.11 内核,这样我就不必降级我的生产服务器。

我缺乏 C++ 知识来解决如何在编译 wanpipe 驱动程序时解决“'struct' 中字段的位置初始化和“''struct file_operation' 没有名为 'ioctl' 的成员”错误。

这是make的结果:

make KBUILD_VERBOSE=0 KBUILD_MODPOST_WARN=1 -C /lib/modules/5.11.0-22-generic/build M=/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net EXTRA_FLAGS="-I/usr/src/wanpipe-7.0.32/patches/kdrivers/include -I/usr/src/wanpipe-7.0.32/patches/kdrivers/include/annexg -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec -D__LINUX__ -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec/oct6100_api -I/usr/src/wanpipe-7.0.32/patches/kdrivers/wanec/oct6100_api/include  -DCONFIG_PRODUCT_WANPIPE_BASE -DCONFIG_PRODUCT_WANPIPE_AFT -DCONFIG_PRODUCT_WANPIPE_AFT_CORE  -DCONFIG_PRODUCT_WANPIPE_AFT_TE1 -DCONFIG_PRODUCT_WANPIPE_AFT_TE3 -DCONFIG_PRODUCT_WANPIPE_AFT_56K -DCONFIG_WANPIPE_HWEC  -DCONFIG_PRODUCT_WANPIPE_SOCK_DATASCOPE -DCONFIG_PRODUCT_WANPIPE_AFT_BRI -DCONFIG_PRODUCT_WANPIPE_AFT_SERIAL  -DCONFIG_PRODUCT_WANPIPE_TDM_VOICE_DCHAN -DCONFIG_PRODUCT_WANPIPE_CODEC_SLINEAR_LAW -DCONFIG_PRODUCT_WANPIPE_AFT_RM  -DCONFIG_PRODUCT_WANPIPE_USB -DCONFIG_PRODUCT_WANPIPE_A700 -DCONFIG_PRODUCT_A600 -DCONFIG_PRODUCT_WANPIPE_AFT_A600 -DCONFIG_PRODUCT_WANPIPE_AFT_A700 -DCONFIG_PRODUCT_WANPIPE_AFT_B601 -DCONFIG_PRODUCT_WANPIPE_AFT_B800  -I/lib/modules/5.11.0-22-generic/build/include/linux -I/usr/src/dahdi  -DKERN_PROC_PDE_FEATURE=2 -DKERN_MEMCPY_FROM_MSG=1 -DKERN_MEMCPY_TO_MSG=1 -DKERN_SK_FOR_NODE_FEATURE=0 -DKERN_NETIF_TRANS_UPDATE=1 -DKERN_NDO_CHANGE_MTU_RH74=0 -DKERN_CLASS_DEV_GROUPS=1 -DKERN_TIMER_SETUP=2 -DKERN_REFCNT_UPDATE=3 -DKERN_SIG_UPDATE=11 -DKERN_CLASS_PROTO_OPS_UPDATE=0 -DKERN_DEV_CHG_FLAG_UPDATE=2 -DKERN_NDO_TIMEOUT_UPDATE=2 -DKERN_DO_GET_TIME=0 -DKERN_GET_KENEL_DS=0 -DKERN_PROC_CREATE=0 -DKERN_TIMER_32BIT=0  -DWANPIPE_USE_I_PRIVATE " ZAPDIR= ZAPHDLC= HOMEDIR=/usr/src/wanpipe-7.0.32 modules  
make[1]: Entering directory '/usr/src/linux-headers-5.11.0-22-generic'
  CC [M]  /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.o
In file included from /usr/src/wanpipe-7.0.32/patches/kdrivers/include/wanpipe_defines.h:30,
                 from /usr/src/wanpipe-7.0.32/patches/kdrivers/include/wanpipe_cdev_iface.h:9,
                 from /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:16:
/usr/src/wanpipe-7.0.32/patches/kdrivers/include/wanpipe_kernel.h:96:25: error: ‘struct file_operations’ has no member named ‘ioctl’
   96 | #define WAN_IOCTL       ioctl
      |                         ^~~~~
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:2: note: in expansion of macro ‘WAN_IOCTL’
  133 |  WAN_IOCTL: wp_cdev_ioctl,
      |  ^~~~~~~~~
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: error: positional initialization of field in ‘struct’ declared with ‘designated_init’ attribute [-Werror=designated-init]
  133 |  WAN_IOCTL: wp_cdev_ioctl,
      |             ^~~~~~~~~~~~~
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: note: (near initialization for ‘wp_cdev_fops’)
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: error: initialization of ‘int (*)(struct file *, loff_t,  loff_t,  int)’ {aka ‘int (*)(struct file *, long long int,  long long int,  int)’} from incompatible pointer type ‘int (*)(struct inode *, struct file *, unsigned int,  long unsigned int)’ [-Werror=incompatible-pointer-types]
/usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.c:133:13: note: (near initialization for ‘wp_cdev_fops.fsync’)
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:287: /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net/wanpipe_cdev_linux.o] Error 1
make[1]: *** [Makefile:1848: /usr/src/wanpipe-7.0.32/patches/kdrivers/src/net] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.11.0-22-generic'
make: *** [Makefile:399: all_kmod] Error 2

wanpipe_cdev_linux.c 部分:

    /*=========================================================
 * Static Defines
 *=========================================================*/

static struct file_operations wp_cdev_fops = {
        owner: THIS_MODULE,
        llseek: NULL,
        open: wp_cdev_open,
        release: wp_cdev_release,
        WAN_IOCTL: wp_cdev_ioctl,
        read: wp_cdev_read,
        write: wp_cdev_write,
        poll: wp_cdev_poll,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
        compat_ioctl: wp_cdev_compat_ioctl,
#endif

wanpipe_kernel.h:

/////////////2.6.36/////////////////////////////
#ifdef HAVE_UNLOCKED_IOCTL
#define WAN_IOCTL       unlocked_ioctl
#define WAN_IOCTL_RET_TYPE      long
#define WANDEF_IOCTL_FUNC(function, struct_ptr_file, cmd, data) function(struct_ptr_file, cmd, data)
#else
#define WAN_IOCTL       ioctl
#define WAN_IOCTL_RET_TYPE      int
#define WANDEF_IOCTL_FUNC(function, struct_ptr_file, cmd, data) function(struct inode *inode, struct_ptr_file, cmd, data)
#endif
////////////////////////////////////////////////

感谢任何帮助。

【问题讨论】:

  • 驱动程序似乎配置错误:它遵循分支#else(并使用#define WAN_IOCTL ioctl)而Linux内核5.11 hasunlocked_ioctl方法,所以@987654328 @ 应该被定义。

标签: c++ compilation asterisk kernel-module


【解决方案1】:

之前的 wanpipe 代码仅适用于内核版本 2.6.36 或更低版本。在 ubuntu 21.04 中,他们对内核 5.8 进行了一些更改。在 5.8 或以上内核版本中,文件操作中没有 ioctl 函数指针。相反,他们使用的是 unlocked_ioctl。以下更改将消除该错误。你可以用同样的方法检查。谢谢!

#if  ((LINUX_VERSION_CODE >= KERNEL_VERSION(5,8,0)) && (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,36)))
        #ifndef HAVE_UNLOCKED_IOCTL2
        #define HAVE_UNLOCKED_IOCTL2
                #define WAN_IOCTL       unlocked_ioctl
                #define WAN_IOCTL_RET_TYPE      long
                #define WANDEF_IOCTL_FUNC(function, struct_ptr_file, cmd, data) function(struct_ptr_file, cmd, data)
        #endif
#else
        #ifndef HAVE_UNLOCKED_IOCTL2
        #define HAVE_UNLOCKED_IOCTL2
                #define WAN_IOCTL       unlocked_ioctl
                #define WAN_IOCTL_RET_TYPE      long
                #define WANDEF_IOCTL_FUNC(function, struct_ptr_file, cmd, data) function(struct_ptr_file, cmd, data)
        #else
        #       define WAN_IOCTL       ioctl
        #       define WAN_IOCTL_RET_TYPE       int
        #       define WANDEF_IOCTL_FUNC(function, struct_ptr_file, cmd, data) function(struct inode *inode, struct_ptr_file, cmd, data)
        #endif

#endif

【讨论】:

    【解决方案2】:

    https://github.com/torvalds/linux/commit/4e24566a134ea167441a1ffa3d439a27cf400880

    HAVE_UNLOCKED_IOCTL 未定义。一旦我删除了所有 ifdef HAVE_UNLOCKED_IOCTL 引用,我就能解决这个问题。感谢@Tsyvarel 为我指明方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多