Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[safe/jmp/linux-2.6] / include / linux / icmpv6.h
index 0cf6c8b..c0d8357 100644 (file)
@@ -1,23 +1,24 @@
 #ifndef _LINUX_ICMPV6_H
 #define _LINUX_ICMPV6_H
 
+#include <linux/types.h>
 #include <asm/byteorder.h>
 
 struct icmp6hdr {
 
        __u8            icmp6_type;
        __u8            icmp6_code;
-       __u16           icmp6_cksum;
+       __sum16         icmp6_cksum;
 
 
        union {
-               __u32                   un_data32[1];
-               __u16                   un_data16[2];
+               __be32                  un_data32[1];
+               __be16                  un_data16[2];
                __u8                    un_data8[4];
 
                struct icmpv6_echo {
-                       __u16           identifier;
-                       __u16           sequence;
+                       __be16          identifier;
+                       __be16          sequence;
                } u_echo;
 
                 struct icmpv6_nd_advt {
@@ -40,18 +41,22 @@ struct icmp6hdr {
                 struct icmpv6_nd_ra {
                        __u8            hop_limit;
 #if defined(__LITTLE_ENDIAN_BITFIELD)
-                       __u8            reserved:6,
+                       __u8            reserved:3,
+                                       router_pref:2,
+                                       home_agent:1,
                                        other:1,
                                        managed:1;
 
 #elif defined(__BIG_ENDIAN_BITFIELD)
                        __u8            managed:1,
                                        other:1,
-                                       reserved:6;
+                                       home_agent:1,
+                                       router_pref:2,
+                                       reserved:3;
 #else
 #error "Please fix <asm/byteorder.h>"
 #endif
-                       __u16           rt_lifetime;
+                       __be16          rt_lifetime;
                 } u_nd_ra;
 
        } icmp6_dataun;
@@ -70,8 +75,22 @@ struct icmp6hdr {
 #define icmp6_addrconf_managed icmp6_dataun.u_nd_ra.managed
 #define icmp6_addrconf_other   icmp6_dataun.u_nd_ra.other
 #define icmp6_rt_lifetime      icmp6_dataun.u_nd_ra.rt_lifetime
+#define icmp6_router_pref      icmp6_dataun.u_nd_ra.router_pref
 };
 
+#ifdef __KERNEL__
+#include <linux/skbuff.h>
+
+static inline struct icmp6hdr *icmp6_hdr(const struct sk_buff *skb)
+{
+       return (struct icmp6hdr *)skb_transport_header(skb);
+}
+#endif
+
+#define ICMPV6_ROUTER_PREF_LOW         0x3
+#define ICMPV6_ROUTER_PREF_MEDIUM      0x0
+#define ICMPV6_ROUTER_PREF_HIGH                0x1
+#define ICMPV6_ROUTER_PREF_INVALID     0x2
 
 #define ICMPV6_DEST_UNREACH            1
 #define ICMPV6_PKT_TOOBIG              2
@@ -152,20 +171,27 @@ struct icmp6_filter {
 #ifdef __KERNEL__
 
 #include <linux/netdevice.h>
-#include <linux/skbuff.h>
-
 
 extern void                            icmpv6_send(struct sk_buff *skb,
-                                                   int type, int code,
+                                                   u8 type, u8 code,
                                                    __u32 info, 
                                                    struct net_device *dev);
 
-extern int                             icmpv6_init(struct net_proto_family *ops);
-extern int                             icmpv6_err_convert(int type, int code,
+extern int                             icmpv6_init(void);
+extern int                             icmpv6_err_convert(u8 type, u8 code,
                                                           int *err);
 extern void                            icmpv6_cleanup(void);
 extern void                            icmpv6_param_prob(struct sk_buff *skb,
-                                                         int code, int pos);
+                                                         u8 code, int pos);
+
+struct flowi;
+struct in6_addr;
+extern void                            icmpv6_flow_init(struct sock *sk,
+                                                        struct flowi *fl,
+                                                        u8 type,
+                                                        const struct in6_addr *saddr,
+                                                        const struct in6_addr *daddr,
+                                                        int oif);
 #endif
 
 #endif