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
Mobile version