4
# ip link set  wlan0 netns 1
RTNETLINK answers: Invalid argument

Это работает для обычного Ethernet. Это также работает для проприетарного драйвера "wl" Broadcom.

Как это сделать для обычного драйвера на основе mac80211?

2 ответа2

6

Вам нужно переместить PHY:

iw phy phy0 set netns 666

Где 666 - pid некоторого процесса, выполняющегося в этом пространстве имен сети; для сетевых пространств, созданных инструментами iproute2ip netns), вы можете создать там недолговечный процесс и получить его pid:

iw phy phy0 set netns "$(ip netns exec mynetns sh -c '
  sleep 1 >&- & echo "$!"')"

Чтобы переместить его обратно в корневое пространство имен:

ip netns exec mynetns iw phy phy0 set netns 1
0

Реализовал мой собственный обходной путь: vethify

  1. Создайте пару виртуальных интерфейсов, переместите один из них (например, veth1) в другое пространство имен: ip link add type veth ; ip link set veth1 netns <some_pid> ;
  2. Выведите интерфейс wlan0 и veth0, но не добавляйте к нему никаких адресов;
  3. Запустите vethify wlan0 veth0 в пространстве имен сети хоста. Он скопирует все захваченные на wlan0 в veth0 и обратно;
  4. Настройте IP-адрес и маршрутизацию в другом пространстве имен на veth1;
  5. Отключите выгрузку контрольной суммы для veth1: ethtool --offload veth1 rx off tx off && ethtool -K veth1 gso off .

Примечание: vethify видит все пакеты в пространстве имен сети, а не только wlan0 и veth0. Это добавит задержку и вызовет дополнительные издержки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .