datapath: Fix undefined symbol "set_normalized_timespec"
authorJustin Pettit <jpettit@nicira.com>
Sat, 31 Jul 2010 23:05:20 +0000 (16:05 -0700)
committerJustin Pettit <jpettit@nicira.com>
Sat, 31 Jul 2010 23:24:29 +0000 (16:24 -0700)
The commit "datapath: Don't query time for every packet." (6bfafa55)
introduced the use of "set_normalized_timespec".  Unfortunately, older
kernels don't export the symbol.  This implements the function on those
older kernels.

datapath/linux-2.6/Modules.mk
datapath/linux-2.6/compat-2.6/include/linux/time.h [new file with mode: 0644]

index baa6f53cd161d529580ccbda41a7cabf9afceaf0..b6cb3e9296bdae157c2c11a3af74875dfb8a0d84 100644 (file)
@@ -38,6 +38,7 @@ openvswitch_headers += \
        linux-2.6/compat-2.6/include/linux/slab.h \
        linux-2.6/compat-2.6/include/linux/stddef.h \
        linux-2.6/compat-2.6/include/linux/tcp.h \
+       linux-2.6/compat-2.6/include/linux/time.h \
        linux-2.6/compat-2.6/include/linux/timer.h \
        linux-2.6/compat-2.6/include/linux/types.h \
        linux-2.6/compat-2.6/include/linux/udp.h \
diff --git a/datapath/linux-2.6/compat-2.6/include/linux/time.h b/datapath/linux-2.6/compat-2.6/include/linux/time.h
new file mode 100644 (file)
index 0000000..fa325fa
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __LINUX_TIME_WRAPPER_H
+#define __LINUX_TIME_WRAPPER_H 1
+
+#include_next <linux/time.h>
+
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
+
+/* "set_normalized_timespec" is defined but not exported in kernels 
+ * before 2.6.26. */
+#define set_normalized_timespec(ts, sec, nsec) \
+       rpl_set_normalized_timespec(ts, sec, nsec)
+
+/**
+ * set_normalized_timespec - set timespec sec and nsec parts and normalize
+ *
+ * @ts:         pointer to timespec variable to be set
+ * @sec:        seconds to set
+ * @nsec:       nanoseconds to set
+ *
+ * Set seconds and nanoseconds field of a timespec variable and
+ * normalize to the timespec storage format
+ *
+ * Note: The tv_nsec part is always in the range of
+ *      0 <= tv_nsec < NSEC_PER_SEC
+ * For negative values only the tv_sec field is negative !
+ */
+static inline void rpl_set_normalized_timespec(struct timespec *ts, 
+                   time_t sec, long nsec)
+{
+       while (nsec >= NSEC_PER_SEC) {
+               nsec -= NSEC_PER_SEC;
+               ++sec;
+       }
+       while (nsec < 0) {
+               nsec += NSEC_PER_SEC;
+               --sec;
+       }
+       ts->tv_sec = sec;
+       ts->tv_nsec = nsec;
+}
+
+#endif /* linux kernel < 2.6.26 */
+
+#endif