Signed-off-by: Anders Selhammer <[email protected]>
---
sk.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
sk.h | 18 ++++++++++++++++++
2 files changed, 67 insertions(+)
diff --git a/sk.c b/sk.c
index 69492d4..059980a 100644
--- a/sk.c
+++ b/sk.c
@@ -25,6 +25,8 @@
#include <netinet/in.h>
#include <string.h>
#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <sched.h>
#include <unistd.h>
#include <ifaddrs.h>
#include <stdlib.h>
@@ -42,6 +44,8 @@ int sk_tx_timeout; /* Initialized by configuration file */
int sk_check_fupsync; /* Initialized by configuration file */
enum hwts_filter_mode sk_hwts_filter_mode = HWTS_FILTER_NORMAL;
+static int sk_initial_fd = -1;
+
/* private methods */
static void init_ifreq(struct ifreq *ifreq, struct hwtstamp_config *cfg,
@@ -152,6 +156,51 @@ int sk_general_init(int fd)
return 0;
}
+int sk_init_initial_namespace_fd(void) {
+ sk_initial_fd = open("/proc/self/ns/net", O_RDONLY);
+ if (sk_initial_fd < 0) {
+ pr_err("open initial namespace fd failed: %m");
+ return -1;
+ }
+ return 0;
+}
+
+void sk_close_initial_namespace_fd(void) {
+ if (sk_initial_fd >= 0) {
+ close(sk_initial_fd);
+ sk_initial_fd = -1;
+ }
+}
+
+int sk_reassociate_namespace(const char *ns)
+{
+ char path[64];
+ int fd;
+
+ if (*ns == '\0') {
+ if (setns(sk_initial_fd, CLONE_NEWNET) < 0) {
+ pr_err("setns failed: %m");
+ return -1;
+ }
+ pr_notice("setns for default namespace ok");
+ } else {
+ snprintf(path, sizeof path, "/var/run/netns/%s", ns);
+ fd = open(path, O_RDONLY);
+ if (fd < 0) {
+ pr_err("failed to open %s: %m", path);
+ return -1;
+ }
+ if (setns(fd, CLONE_NEWNET) < 0) {
+ pr_err("setns failed: %m");
+ close(fd);
+ return -1;
+ }
+ pr_notice("setns ok, %s", path);
+ close(fd);
+ }
+ return 0;
+}
+
int sk_get_ts_info(const char *name, struct sk_ts_info *sk_info)
{
#ifdef ETHTOOL_GET_TS_INFO
diff --git a/sk.h b/sk.h
index 04d26ee..1992a66 100644
--- a/sk.h
+++ b/sk.h
@@ -71,6 +71,24 @@ int sk_interface_index(int fd, const char *device);
int sk_general_init(int fd);
/**
+ * Init initial namespace file descriptor
+ * @return zero on success, negative on failure.
+ */
+int sk_init_initial_namespace_fd(void);
+
+/**
+ * Close initial namespace file descriptor
+ */
+void sk_close_initial_namespace_fd(void);
+
+/**
+ * Prepare namespace for the process before socket is opened
+ * @param ns The namespace to reassociate to.
+ * @return zero on success, negative on failure.
+ */
+int sk_reassociate_namespace(const char *ns);
+
+/**
* Obtain supported timestamping information
* @param name The name of the interface
* @param info Struct containing obtained timestamping information.
--
1.8.3.1
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel