Я работаю над программой 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