Я работаю над программой 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
Может ли процесс читать/записывать файловый дескриптор устройства TAP после изменения сетевых пространств имен? ⇐ Linux
1760510195
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79790858/can-a-process-read-write-a-tap-device-file-descriptor-after-changing-network-nam[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия