Fix compatibility back to Linux 2.6.15 and 2.4.32.
authorJustin Pettit <jpettit@nicira.com>
Tue, 2 Dec 2008 06:23:14 +0000 (22:23 -0800)
committerJustin Pettit <jpettit@nicira.com>
Tue, 2 Dec 2008 06:23:29 +0000 (22:23 -0800)
datapath/linux-2.4/compat-2.4/include/linux/dmi.h
datapath/linux-2.4/compat-2.4/include/linux/icmp.h [new file with mode: 0644]
datapath/linux-2.4/compat-2.4/include/linux/string.h
datapath/linux-2.4/compat-2.4/string.c
datapath/linux-2.6/compat-2.6/include/asm-generic/bug.h [new file with mode: 0644]
datapath/linux-2.6/compat-2.6/include/linux/dmi.h [new file with mode: 0644]
datapath/linux-2.6/compat-2.6/include/linux/icmp.h [new file with mode: 0644]
datapath/linux-2.6/compat-2.6/include/linux/ip.h
datapath/linux-2.6/compat-2.6/include/linux/skbuff.h

index bf51e25..9b66cb7 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __LINUX_DMI_H
-#define __LINUX_DMI_H 1
+#ifndef __LINUX_DMI_WRAPPER_H
+#define __LINUX_DMI_WRAPPER_H 1
 
 enum dmi_field {
        DMI_NONE,
diff --git a/datapath/linux-2.4/compat-2.4/include/linux/icmp.h b/datapath/linux-2.4/compat-2.4/include/linux/icmp.h
new file mode 100644 (file)
index 0000000..aabe214
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __LINUX_ICMP_WRAPPER_H
+#define __LINUX_ICMP_WRAPPER_H 1
+
+#include_next <linux/icmp.h>
+
+#ifdef __KERNEL__
+#include <linux/skbuff.h>
+
+static inline struct icmphdr *icmp_hdr(const struct sk_buff *skb)
+{
+       return (struct icmphdr *)skb_transport_header(skb);
+}
+#endif
+
+#endif
index d491226..51b374d 100644 (file)
@@ -7,4 +7,6 @@
 size_t strcspn(const char *s, const char *reject);
 #endif
 
+size_t strlcpy(char *, const char *, size_t);
+
 #endif /* linux/string.h */
index e15c16b..4ccaa5a 100644 (file)
@@ -27,4 +27,29 @@ size_t strcspn(const char *s, const char *reject)
        return count;
 }
 EXPORT_SYMBOL(strcspn);
+
+/**
+ * strlcpy - Copy a %NUL terminated string into a sized buffer
+ * @dest: Where to copy the string to
+ * @src: Where to copy the string from
+ * @size: size of destination buffer
+ *
+ * Compatible with *BSD: the result is always a valid
+ * NUL-terminated string that fits in the buffer (unless,
+ * of course, the buffer size is zero). It does not pad
+ * out the result like strncpy() does.
+ */
+size_t strlcpy(char *dest, const char *src, size_t size)
+{
+        size_t ret = strlen(src);
+
+        if (size) {
+                size_t len = (ret >= size) ? size - 1 : ret;
+                memcpy(dest, src, len);
+                dest[len] = '\0';
+        }
+        return ret;
+}
+EXPORT_SYMBOL(strlcpy);
+
 #endif
diff --git a/datapath/linux-2.6/compat-2.6/include/asm-generic/bug.h b/datapath/linux-2.6/compat-2.6/include/asm-generic/bug.h
new file mode 100644 (file)
index 0000000..f3b5488
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef __ASM_GENERIC_BUG_WRAPPER_H
+#define __ASM_GENERIC_BUG_WRAPPER_H
+
+#include_next <asm-generic/bug.h>
+
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
+
+#define WARN_ON_ONCE(condition)        ({                              \
+       static int __warned;                                    \
+       int __ret_warn_once = !!(condition);                    \
+                                                               \
+       if (unlikely(__ret_warn_once) && !__warned) {           \
+               WARN_ON(1);                                     \
+               __warned = 1;                                   \
+       }                                                       \
+       unlikely(__ret_warn_once);                              \
+})
+
+#endif /* linux kernel < 2.6.19 */
+
+#endif
diff --git a/datapath/linux-2.6/compat-2.6/include/linux/dmi.h b/datapath/linux-2.6/compat-2.6/include/linux/dmi.h
new file mode 100644 (file)
index 0000000..52916fe
--- /dev/null
@@ -0,0 +1,114 @@
+#ifndef __LINUX_DMI_WRAPPER_H
+#define __LINUX_DMI_WRAPPER_H 1
+
+#include <linux/version.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
+
+#include_next <linux/dmi.h>
+
+#else  /* linux version >= 2.6.23 */
+
+#ifndef __DMI_H__
+#define __DMI_H__
+
+#include <linux/list.h>
+
+enum dmi_field {
+        DMI_NONE,
+        DMI_BIOS_VENDOR,
+        DMI_BIOS_VERSION,
+        DMI_BIOS_DATE,
+        DMI_SYS_VENDOR,
+        DMI_PRODUCT_NAME,
+        DMI_PRODUCT_VERSION,
+        DMI_PRODUCT_SERIAL,
+        DMI_PRODUCT_UUID,
+        DMI_BOARD_VENDOR,
+        DMI_BOARD_NAME,
+        DMI_BOARD_VERSION,
+        DMI_BOARD_SERIAL,
+        DMI_BOARD_ASSET_TAG,
+        DMI_CHASSIS_VENDOR,
+        DMI_CHASSIS_TYPE,
+        DMI_CHASSIS_VERSION,
+        DMI_CHASSIS_SERIAL,
+        DMI_CHASSIS_ASSET_TAG,
+        DMI_STRING_MAX,
+};
+
+enum dmi_device_type {
+        DMI_DEV_TYPE_ANY = 0,
+        DMI_DEV_TYPE_OTHER,
+        DMI_DEV_TYPE_UNKNOWN,
+        DMI_DEV_TYPE_VIDEO,
+        DMI_DEV_TYPE_SCSI,
+        DMI_DEV_TYPE_ETHERNET,
+        DMI_DEV_TYPE_TOKENRING,
+        DMI_DEV_TYPE_SOUND,
+        DMI_DEV_TYPE_IPMI = -1,
+        DMI_DEV_TYPE_OEM_STRING = -2
+};
+
+struct dmi_header {
+        u8 type;
+        u8 length;
+        u16 handle;
+};
+
+/*
+ *      DMI callbacks for problem boards
+ */
+struct dmi_strmatch {
+        u8 slot;
+        char *substr;
+};
+
+struct dmi_system_id {
+        int (*callback)(struct dmi_system_id *);
+        const char *ident;
+        struct dmi_strmatch matches[4];
+        void *driver_data;
+};
+
+#define DMI_MATCH(a, b) { a, b }
+
+struct dmi_device {
+        struct list_head list;
+        int type;
+        const char *name;
+        void *device_data;      /* Type specific data */
+};
+
+/* No CONFIG_DMI before 2.6.16 */
+#if defined(CONFIG_DMI) || defined(CONFIG_X86_32)  
+
+extern int dmi_check_system(struct dmi_system_id *list);
+extern char * dmi_get_system_info(int field);
+extern struct dmi_device * dmi_find_device(int type, const char *name,
+        struct dmi_device *from);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+extern void dmi_scan_machine(void);
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
+extern int dmi_get_year(int field);
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+extern int dmi_name_in_vendors(char *str);
+#endif
+
+#else
+
+static inline int dmi_check_system(struct dmi_system_id *list) { return 0; }
+static inline char * dmi_get_system_info(int field) { return NULL; }
+static inline struct dmi_device * dmi_find_device(int type, const char *name,
+        struct dmi_device *from) { return NULL; }
+static inline int dmi_get_year(int year) { return 0; }
+static inline int dmi_name_in_vendors(char *s) { return 0; }
+
+#endif
+
+#endif  /* __DMI_H__ */
+
+#endif /* linux kernel < 2.6.22 */
+
+#endif 
diff --git a/datapath/linux-2.6/compat-2.6/include/linux/icmp.h b/datapath/linux-2.6/compat-2.6/include/linux/icmp.h
new file mode 100644 (file)
index 0000000..b02678b
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef __LINUX_ICMP_WRAPPER_H
+#define __LINUX_ICMP_WRAPPER_H 1
+
+#include_next <linux/icmp.h>
+
+#include <linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
+
+#ifdef __KERNEL__
+static inline struct icmphdr *icmp_hdr(const struct sk_buff *skb)
+{
+        return (struct icmphdr *)skb_transport_header(skb);
+}
+#endif /* __KERNEL__ */
+
+#endif /* linux kernel < 2.6.22 */
+
+#endif
index 7915873..9c8d574 100644 (file)
@@ -13,6 +13,11 @@ static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
 {
        return (struct iphdr *)skb_network_header(skb);
 }
+
+static inline unsigned int ip_hdrlen(const struct sk_buff *skb)
+{
+       return ip_hdr(skb)->ihl * 4;
+}
 #endif /* __KERNEL__ */
 
 #endif /* linux kernel < 2.6.22 */
index 9430f52..a0111fb 100644 (file)
@@ -35,6 +35,11 @@ static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
        return skb->h.raw;
 }
 
+static inline void skb_reset_transport_header(struct sk_buff *skb)
+{
+       skb->h.raw = skb->data;
+}
+
 static inline void skb_set_transport_header(struct sk_buff *skb,
                        const int offset)
 {
@@ -70,6 +75,18 @@ static inline int skb_transport_offset(const struct sk_buff *skb)
 {
     return skb_transport_header(skb) - skb->data;
 }
+
+static inline int skb_network_offset(const struct sk_buff *skb)
+{
+       return skb_network_header(skb) - skb->data;
+}
+
+static inline void skb_copy_to_linear_data(struct sk_buff *skb,
+                                          const void *from,
+                                          const unsigned int len)
+{
+       memcpy(skb->data, from, len);
+}
 #endif /* linux kernel < 2.6.22 */
 
 #endif