在 Linux 3.2.29 內核上編譯 Broadcom 802.11 STA 驅動(hybrid_wl)時報錯:
src/wl/sys/wl_linux.c:388:2: error: unknown field 'ndo_set_multicast_list' specified in initializer
Linux 內核 2.6.35+ 將網絡設備操作結構體 struct net_device_ops 中的 ndo_set_multicast_list 重命名為 ndo_set_rx_mode,語義相同(設置接收模式/多播列表),但驅動源碼未同步更新。
vim src/wl/sys/wl_linux.c
# 跳轉至 385 行附近
// 原代碼
static const struct net_device_ops wl_netdev_ops = {
// ...
.ndo_set_multicast_list = wl_set_multicast_list,
// ...
};
// 修改為
static const struct net_device_ops wl_netdev_ops = {
// ...
.ndo_set_rx_mode = wl_set_multicast_list,
// ...
};
make
KBUILD_NOPEDANTIC=1 make -C /lib/modules/`uname -r`/build M=`pwd`
make[1]: Entering directory `/usr/src/linux-3.2.29'
Wireless Extension is the only possible API for this kernel version
Using Wireless Extension API
CC [M] /usr/local/src/hybrid_wl/32bits/src/wl/sys/wl_linux.o
CC [M] /usr/local/src/hybrid_wl/32bits/src/wl/sys/wl_iw.o
CC [M] /usr/local/src/hybrid_wl/32bits/src/wl/sys/wl_cfg80211.o
LD [M] /usr/local/src/hybrid_wl/32bits/wl.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: modpost: missing MODULE_LICENSE() in /usr/local/src/hybrid_wl/32bits/wl.o
CC /usr/local/src/hybrid_wl/32bits/wl.mod.o
LD [M] /usr/local/src/hybrid_wl/32bits/wl.ko
make[1]: Leaving directory `/usr/src/linux-3.2.29'
生成 wl.ko 內核模塊,警告缺少 MODULE_LICENSE 不影響功能。
// 在 wl_linux.c 或主模塊文件頂部添加
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Broadcom Corporation");
MODULE_DESCRIPTION("Broadcom 802.11 STA Driver");
| 內核版本 | 舊字段 | 新字段 | 備註 |
|---|---|---|---|
| ≤ 2.6.34 | ndo_set_multicast_list | - | |
| ≥ 2.6.35 | - | ndo_set_rx_mode | 語義相同,參數一致 |
| ≥ 3.10 | ndo_set_rx_mode | ndo_set_rx_mode | 穩定 |