Может ли процесс читать/записывать файловый дескриптор устройства TAP после изменения сетевых пространств имен?Linux

Ответить
Anonymous
 Может ли процесс читать/записывать файловый дескриптор устройства TAP после изменения сетевых пространств имен?

Сообщение Anonymous »

Я работаю над программой C++ в Linux, которая предполагает взаимодействие с сетевыми пространствами имен (netns) и TAP-устройством.
Моя процедура следующая:
Мой процесс начинается в начальном сетевом пространстве имен (например, корневом пространстве имен).
Программа использует setns(2) для переключения на netns ns1.
В ns1 программа открывает файл устройства TUN/TAP (/dev/net/tun), использует ioctl(TUNSETIFF) для создания устройства Tap1 и получает дескриптор файла (fd) для этого устройства. Само устройство Tap1 находится внутри ns1.
Затем программа снова использует setns(2) для переключения на другое сетевое пространство имен, netns ns2.
Мой вопрос:
После того, как процесс переключился на ns2, сможет ли он читать и записывать исходный файловый дескриптор (fd), который был открыт, пока процесс находился в режиме ns1?
В частности, будут ли вызовы read() и write() на этом файловом диске по-прежнему работать правильно, позволяя процессу в ns2 обмениваться пакетами данных с устройством Tap1, которое расположено в ns1?
Для ответа предоставьте техническую основу или обоснование из документации по вызовам ядра/системы Linux.
Будет ли оно работать правильно? Почему?
#include
#include
#include
#include
#include
#include

// For TAP device
#include
#include
#include
#include
#include

// For network namespaces
#include

bool set_ns_namespace(const std::string& netns_name) {
int netns_fd = open(("/var/run/netns/" + netns_name).c_str(), O_RDONLY);
if (netns_fd < 0) {
return false;
}
if (setns(netns_fd, CLONE_NEWNET) < 0) {
close(netns_fd);
return false;
}
close(netns_fd);
return true;
}

int get_fd_on_tap(const std::string& netns_name, const std::string& tap_name) {
if (!set_ns_namespace(netns_name)) {
return -1;
}

int tap_fd;
struct ifreq ifr;
if ((tap_fd = open("/dev/net/tun", O_RDWR)) < 0) {
return -1;
}

memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
strncpy(ifr.ifr_name, tap_name.c_str(), IFNAMSIZ - 1);

if (ioctl(tap_fd, TUNSETIFF, (void *)&ifr) < 0) {
std::cerr

Подробнее здесь: https://stackoverflow.com/questions/797 ... etwork-nam
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»