-
Notifications
You must be signed in to change notification settings - Fork 54
Multi Channel MBSS
The changes add a new global list, mesh_bss_list, to net/mac80211/mesh.c. The list keeps track of all locally registered mac80211-based mesh configurations. The configuration information is stored in the struct mesh_local_bss:
struct mesh_local_bss {
u8 mesh_id[IEEE80211_MAX_SSID_LEN];
u8 mesh_id_len;
u8 sync_method;
u8 path_sel_proto;
u8 path_metric;
bool is_secure;
bool can_share;
struct list_head list;
struct list_head if_list;
};
Each struct mesh_local_bss contains a list of interfaces in if_list which are struct ieee80211_sub_if_data (sdata) instances. These interfaces have elected to forward frames among the other interfaces with the same mesh parameters. Each such interface also maintains a pointer back to the mesh_local_bss.
Outbound path: For unicast frames, mpath_lookup(), called from mesh_nexthop_resolve(), has been modified to look for the next hop on all interfaces. Multicast packets originating at a given interface are retransmitted on all other interfaces in ieee80211_xmit() via mesh_local_bss_forward().
Forwarding path: Any ingress frames received on an interface are forwarded in the usual manner, through mesh_nexthop_lookup() and mesh_path_lookup(). Since the latter checks all interfaces for the next hop, the proper interface will be selected. Multicast frames are
Path selection: Path action frames are forwarded through mesh_path_frame_sel_tx(), which now also uses mesh_local_bss_forward().
If a mesh is joined on the local host, and the
linux
To test the multi channel MBSS operation, you just need our custom linux kernel:
repo: [email protected]:cozybit/open80211s.git
branch: ft-multi-if
iw (optional)
A new iw is not required since the kernel will enable forwarding between matching meshIDs by default, but in case disabling this feature is necessary, check out:
repo: [email protected]:cozybit/iw.git
branch: ft-mbss-sharing
Here we assume the reader is familiar with the build and installation process for the above.
MBSS sharing across mesh interfaces is enabled by default. To disable this sharing, add the new mesh setup parameter share {on, off}
while joining a mesh ID:
$ iw wlan0 mesh join meshtest share off
Now wlan0 will be in an isolated mesh from other interfaces on the same system, even if they share the same meshID.
Otherwise path selection information sharing and frame forwarding will take place between interfaces sharing the meshID meshtest
.
You will need 3 mesh nodes, where at least one of them has 2 physical radios. We'll call these node_1, node_2, and node_3.
As an example, let's simulate the following linear topology using multi-channel MBSS:
node_1(0) <-----> [node_2(0), node_2(1)] <-----> node_3(0)
The radio pairs (node_1(0), node_2(0)) and (node_2(1), node_3(0)) are on orthogonal channels as a means of enforcing a certain link topology.
node_1
$ iw wlan0 set type mp
$ iw wlan0 set channel 1
$ ip link set wlan0 up
$ iw wlan0 mesh join meshtest
$ ip addr add 10.10.10.1/24 dev wlan0
node_2
$ iw wlan0 set type mp
$ wi wlan1 set type mp
$ iw wlan0 set channel 1
$ iw wlan1 set channel 149
$ ip link set wlan0 up
$ ip link set wlan1 up
$ iw wlan0 mesh join meshtest
$ iw wlan1 mesh join meshtest
node_3
$ iw wlan0 set type mp
$ iw wlan0 set channel 149
$ ip link set wlan0 up
$ iw wlan0 mesh join meshtest
$ ip addr add 10.10.10.2/24 dev wlan0
Now you can ping node_3 from node_1 through node_2!
TEST THROUGHPUT(Mb/s) LOSS(%)
test_0_single_hop_ab 50.297904 2.312000
test_0_single_hop_cd 90.572187 5.503000
test_1_sim_single_hop_ab 50.438602 2.114000
test_1_sim_single_hop_cd 84.963941 11.084000
test_2_bridge 50.387604 0.787000
test_3_mmbss 47.781674 4.927000
test_4_same_ch_mhop 23.414351 5.893000