+__clib_export clib_error_t *
+clib_socket_init_netns (clib_socket_t *s, u8 *namespace)
+{
+ if (namespace == NULL || namespace[0] == 0)
+ return clib_socket_init (s);
+
+ clib_error_t *error;
+ int old_netns_fd, nfd;
+
+ old_netns_fd = clib_netns_open (NULL /* self */);
+ if ((nfd = clib_netns_open (namespace)) == -1)
+ {
+ error = clib_error_return_unix (0, "clib_netns_open '%s'", namespace);
+ goto done;
+ }
+
+ if (clib_setns (nfd) == -1)
+ {
+ error = clib_error_return_unix (0, "setns '%s'", namespace);
+ goto done;
+ }
+
+ error = clib_socket_init (s);
+
+done:
+ if (clib_setns (old_netns_fd) == -1)
+ clib_warning ("Cannot set old ns");
+ close (old_netns_fd);
+
+ return error;
+}
+