Kann ein Prozess einen TAP-Gerätedateideskriptor lesen/schreiben, nachdem er Netzwerk-Namespaces geändert hat?C++

Programme in C++. Entwicklerforum
Anonymous
 Kann ein Prozess einen TAP-Gerätedateideskriptor lesen/schreiben, nachdem er Netzwerk-Namespaces geändert hat?

Post by Anonymous »

Ich arbeite an einem C++-Programm unter Linux, das die Interaktion mit Netzwerk-Namespaces (netns) und einem TAP-Gerät beinhaltet.
Mein Verfahren ist wie folgt:
Mein Prozess beginnt in einem anfänglichen Netzwerk-Namespace (z. B. dem Root-Namespace).
Das Programm verwendet setns(2), um zu netns zu wechseln ns1.
In ns1 öffnet das Programm die TUN/TAP-Gerätedatei (/dev/net/tun), erstellt mit ioctl(TUNSETIFF) ein tap1-Gerät und ruft einen Dateideskriptor (fd) für dieses Gerät ab. Das tap1-Gerät selbst befindet sich in ns1.
Das Programm verwendet dann erneut setns(2), um zu einem anderen Netzwerk-Namespace, netns ns2, zu wechseln.
Meine Frage ist:
Nachdem der Prozess zu ns2 gewechselt ist, kann er aus dem ursprünglichen Dateideskriptor (fd) lesen und in diesen schreiben, der während des Prozesses geöffnet wurde? ns1?
Funktionieren insbesondere die read()- und write()-Aufrufe auf diesem fd weiterhin korrekt, sodass der Prozess in ns2 Datenpakete mit dem tap1-Gerät austauschen kann, das sich in ns1 befindet?
Bitte geben Sie die technische Grundlage oder Begründung aus der Dokumentation zu Linux-Kernel-/Systemaufrufen an, um die Antwort zu unterstützen.
Wird es korrekt funktionieren? Warum?

Code: Select all

#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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post