@@ -40,7 +40,6 @@
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/uio.h>
-#include <sys/utsname.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <net/route.h>
@@ -6427,18 +6426,10 @@ getqdisc_is_safe(void)
static bool safe = false;
if (ovsthread_once_start(&once)) {
- struct utsname utsname;
- int major, minor;
-
- if (uname(&utsname) == -1) {
- VLOG_WARN("uname failed (%s)", ovs_strerror(errno));
- } else if (!ovs_scan(utsname.release, "%d.%d", &major, &minor)) {
- VLOG_WARN("uname reported bad OS release (%s)", utsname.release);
- } else if (major < 2 || (major == 2 && minor < 35)) {
- VLOG_INFO("disabling unsafe RTM_GETQDISC in Linux kernel %s",
- utsname.release);
- } else {
+ if (ovs_kernel_is_version_or_newer(2, 35)) {
safe = true;
+ } else {
+ VLOG_INFO("disabling unsafe RTM_GETQDISC in Linux kernel");
}
ovsthread_once_done(&once);
}
@@ -27,6 +27,7 @@
#include <string.h>
#ifdef __linux__
#include <sys/prctl.h>
+#include <sys/utsname.h>
#endif
#include <sys/stat.h>
#include <unistd.h>
@@ -2500,3 +2501,29 @@ OVS_CONSTRUCTOR(winsock_start) {
}
}
#endif
+
+#ifdef __linux__
+bool
+ovs_kernel_is_version_or_newer(int target_major, int target_minor)
+{
+ static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
+ static int current_major, current_minor = -1;
+
+ if (ovsthread_once_start(&once)) {
+ struct utsname utsname;
+
+ if (uname(&utsname) == -1) {
+ VLOG_WARN("uname failed (%s)", ovs_strerror(errno));
+ } else if (!ovs_scan(utsname.release, "%d.%d",
+ ¤t_major, ¤t_minor)) {
+ VLOG_WARN("uname reported bad OS release (%s)", utsname.release);
+ }
+ ovsthread_once_done(&once);
+ }
+ if (current_major == -1 || current_minor == -1) {
+ return false;
+ }
+ return current_major > target_major || (
+ current_major == target_major && current_minor >= target_minor);
+}
+#endif
@@ -611,4 +611,8 @@ int ftruncate(int fd, off_t length);
}
#endif
+#ifdef __linux__
+bool ovs_kernel_is_version_or_newer(int target_major, int target_minor);
+#endif
+
#endif /* util.h */
Extract checking for a given kernel version to a separate function. It will be used also in the next patch. Signed-off-by: Felix Huettner <felix.huettner@mail.schwarz> --- v5->v6: - fix ovs_kernel_is_version_or_newer returning false if major and minor are equal (thanks Mike) v4->v5: - fix wrong ifdef that broke on macos - fix ovs_kernel_is_version_or_newer working in reverse than desired - ovs_kernel_is_version_or_newer now always returns false if uname errors (Thanks Eelco) v4: - extract function to check kernel version lib/netdev-linux.c | 15 +++------------ lib/util.c | 27 +++++++++++++++++++++++++++ lib/util.h | 4 ++++ 3 files changed, 34 insertions(+), 12 deletions(-) base-commit: 436aba68d52891fb5775ec7651282ccf9d04176b