net/wireless/util.c
net/bridge/br_if.c
net/bridge/br_notify.c
net/bridge/br_stp_if.c
b. 打开内核选项:
我这里选的是M,编译成ko,后面手动加载到系统。
c. 编译内核:
先整体编译,再进入内核目录,编译驱动。
make
make ARCH=arm CROSS_COMPILE=arm-linux- modules
编译成功会生成如下几个驱动文件,这是我们需要的:
cp ./net/bridge/bridge.ko ../modules/ -rf
cp ./net/llc/llc.ko ../modules/ -rf
cp ./net/802/stp.ko ../modules/ -rf
cp ./net/mac80211/mac80211.ko ../modules/ -rf
cp ./net/wireless/cfg80211.ko ../modules/ -rf
注意,mac80211和cfg80211选项我也是在内核里面配置成<M>,单独编译出来,因为后续的WiFi模组驱动的加载有些需要用到,所以也编译成单独的ko。
到此,内核的修改和配置问题已经完成。
2. 需要用到的命令brctl
可以在busybox里面配置:
3. 正式配置网桥:
用到的硬件平台和网卡设备:
一个arm板,两个WiFi模组。
a. 加载WiFi模组的驱动,将两个WiFi都up起来
/sbin/insmod /app/lib/modules/cfg80211.ko
/sbin/insmod /app/lib/modules/mac80211.ko
记得这两个依赖的mac和cfg也要加载。
ifconfig wlan0 up
ifconfig wlan1 up
记住这两个WiFi不要给IP,wlan0作为AP,wlan1作为STA。我的理解是两个设备都绑定到br0,共用br0的设备,至于网络的网段,网络的ip分配,都是AP端连接的路由决定的。这两个网卡都只作为br0的绑定,
整个板配置完成之后,相当于只有br0一个网卡,也只有一个IP。
b. 新建网桥br0,并将两个网卡加入到网桥。
/sbin/insmod /app/lib/modules/llc.ko
/sbin/insmod /app/lib/modules/stp.ko
/sbin/insmod /app/lib/modules/bridge.ko
先加载内核编译的驱动,以支持网桥功能。
/sbin/brctl addbr br0
ifconfig br0 172.16.11.8
新建一个网桥br0,给网桥一个固定的IP。当然这个网段要和你连接的路由器在同一网段。
c. 两个网卡,一个作为STA,连接路由器,另外一个作为AP,桥接到网络之后,对外发射新的AP信号。
/sbin/brctl addif br0 wlan0 #wlan0 加入网桥br0
/app/hostapd -B hostapd.conf #wlan0作为AP,开启AP,这里不需要起udhcpd,成功建立之后,ip的分配由路由器决定。
此处的hostapd.conf参考:
interface=wlan0 driver=nl80211 ctrl_interface=/var/run/hostapd ssid=Bridge #country_code=US ieee80211n=1 hw_mode=a channel=36 bridge=br0 #require_ht=1 #ht_capab=[HT20-][SHORT-GI-20][SHORT-GI-20] auth_algs=1 #wpa=3 #wpa_pairwise=TKIP CCMP #wpa_passphrase=12345678
/sbin/brctl addif br0 wlan1 #wlan1加入到网桥
/app/wpa_supplicant -Dnl80211 -iwlan1 -c /app/wpa-wlan.conf -b br0 & #wlan1开启STA模式,不需要起udhcpc,此时的ip由br0的静态ip来决定。
此处的wpa-wlan.conf参考:
ctrl_interface=/var/run/wpa_supplicant update_config=1 ap_scan=1 fast_reauth=1 network={ ssid="aaa" psk="12345678" }
看结果:
两个网卡,加入到了br0
两个网卡设备,整机只有一个br0的IP地址。
到此,wlan1连接到路由器之后,wlan0发射的AP可以直接连接,自动分配到IP。网桥的功能实现。