Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[pandora-kernel.git] / include / net / ipv6.h
index 4fa5dfe..31b3f1b 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <linux/ipv6.h>
 #include <linux/hardirq.h>
+#include <net/if_inet6.h>
 #include <net/ndisc.h>
 #include <net/flow.h>
 #include <net/snmp.h>
@@ -111,45 +112,28 @@ struct frag_hdr {
 extern int sysctl_ipv6_bindv6only;
 extern int sysctl_mld_max_msf;
 
-/* MIBs */
-DECLARE_SNMP_STAT(struct ipstats_mib, ipv6_statistics);
-#define IP6_INC_STATS(idev,field)              ({                      \
-       struct inet6_dev *_idev = (idev);                               \
-       if (likely(_idev != NULL))                                      \
-               SNMP_INC_STATS(_idev->stats.ipv6, field);               \
-       SNMP_INC_STATS(ipv6_statistics, field);                         \
-})
-#define IP6_INC_STATS_BH(idev,field)           ({                      \
+#define _DEVINC(statname, modifier, idev, field)                       \
+({                                                                     \
        struct inet6_dev *_idev = (idev);                               \
        if (likely(_idev != NULL))                                      \
-               SNMP_INC_STATS_BH(_idev->stats.ipv6, field);            \
-       SNMP_INC_STATS_BH(ipv6_statistics, field);                      \
-})
-#define IP6_INC_STATS_USER(idev,field)         ({                      \
-       struct inet6_dev *_idev = (idev);                               \
-       if (likely(_idev != NULL))                                      \
-               SNMP_INC_STATS_USER(_idev->stats.ipv6, field);          \
-       SNMP_INC_STATS_USER(ipv6_statistics, field);                    \
+               SNMP_INC_STATS##modifier((_idev)->stats.statname, (field)); \
+       SNMP_INC_STATS##modifier(statname##_statistics, (field));       \
 })
+
+/* MIBs */
+DECLARE_SNMP_STAT(struct ipstats_mib, ipv6_statistics);
+
+#define IP6_INC_STATS(idev,field)      _DEVINC(ipv6, , idev, field)
+#define IP6_INC_STATS_BH(idev,field)   _DEVINC(ipv6, _BH, idev, field)
+#define IP6_INC_STATS_USER(idev,field) _DEVINC(ipv6, _USER, idev, field)
+
 DECLARE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics);
-#define ICMP6_INC_STATS(idev, field)           ({                      \
-       struct inet6_dev *_idev = (idev);                               \
-       if (likely(_idev != NULL))                                      \
-               SNMP_INC_STATS(idev->stats.icmpv6, field);              \
-       SNMP_INC_STATS(icmpv6_statistics, field);                       \
-})
-#define ICMP6_INC_STATS_BH(idev, field)                ({                      \
-       struct inet6_dev *_idev = (idev);                               \
-       if (likely(_idev != NULL))                                      \
-               SNMP_INC_STATS_BH((_idev)->stats.icmpv6, field);        \
-       SNMP_INC_STATS_BH(icmpv6_statistics, field);                    \
-})
-#define ICMP6_INC_STATS_USER(idev, field)      ({                      \
-       struct inet6_dev *_idev = (idev);                               \
-       if (likely(_idev != NULL))                                      \
-               SNMP_INC_STATS_USER(_idev->stats.icmpv6, field);        \
-       SNMP_INC_STATS_USER(icmpv6_statistics, field);                  \
-})
+DECLARE_SNMP_STAT(struct icmpv6msg_mib, icmpv6msg_statistics);
+
+#define ICMP6_INC_STATS(idev, field)   _DEVINC(icmpv6, , idev, field)
+#define ICMP6_INC_STATS_BH(idev, field)        _DEVINC(icmpv6, _BH, idev, field)
+#define ICMP6_INC_STATS_USER(idev, field) _DEVINC(icmpv6, _USER, idev, field)
+
 #define ICMP6_INC_STATS_OFFSET_BH(idev, field, offset) ({                      \
        struct inet6_dev *_idev = idev;                                         \
        __typeof__(offset) _offset = (offset);                                  \
@@ -157,6 +141,20 @@ DECLARE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics);
                SNMP_INC_STATS_OFFSET_BH(_idev->stats.icmpv6, field, _offset);  \
        SNMP_INC_STATS_OFFSET_BH(icmpv6_statistics, field, _offset);            \
 })
+
+#define ICMP6MSGOUT_INC_STATS(idev, field) \
+       _DEVINC(icmpv6msg, , idev, field +256)
+#define ICMP6MSGOUT_INC_STATS_BH(idev, field) \
+       _DEVINC(icmpv6msg, _BH, idev, field +256)
+#define ICMP6MSGOUT_INC_STATS_USER(idev, field) \
+       _DEVINC(icmpv6msg, _USER, idev, field +256)
+#define ICMP6MSGIN_INC_STATS(idev, field) \
+        _DEVINC(icmpv6msg, , idev, field)
+#define ICMP6MSGIN_INC_STATS_BH(idev, field) \
+       _DEVINC(icmpv6msg, _BH, idev, field)
+#define ICMP6MSGIN_INC_STATS_USER(idev, field) \
+       _DEVINC(icmpv6msg, _USER, idev, field)
+
 DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6);
 DECLARE_SNMP_STAT(struct udp_mib, udplite_stats_in6);
 #define UDP6_INC_STATS_BH(field, is_udplite)                         do  {  \
@@ -376,6 +374,12 @@ static inline int ipv6_addr_any(const struct in6_addr *a)
                 a->s6_addr32[2] | a->s6_addr32[3] ) == 0); 
 }
 
+static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
+{
+       return ((a->s6_addr32[0] | a->s6_addr32[1]) == 0 &&
+                a->s6_addr32[2] == htonl(0x0000ffff));
+}
+
 /*
  * find the first different bit between two addresses
  * length of address must be a multiple of 32bits
@@ -469,6 +473,9 @@ extern void                 ip6_flush_pending_frames(struct sock *sk);
 extern int                     ip6_dst_lookup(struct sock *sk,
                                               struct dst_entry **dst,
                                               struct flowi *fl);
+extern int                     ip6_dst_blackhole(struct sock *sk,
+                                                 struct dst_entry **dst,
+                                                 struct flowi *fl);
 extern int                     ip6_sk_dst_lookup(struct sock *sk,
                                                  struct dst_entry **dst,
                                                  struct flowi *fl);
@@ -509,10 +516,6 @@ extern int                         ipv6_ext_hdr(u8 nexthdr);
 
 extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);
 
-extern struct ipv6_txoptions * ipv6_invert_rthdr(struct sock *sk,
-                                                 struct ipv6_rt_hdr *hdr);
-
-
 /*
  *     socket options (ipv6_sockglue.c)
  */