hwmon: ina219: add precision multiplier
[linux-2.6.git] / include / net / ipv6.h
index 1fc5631..e4170a2 100644 (file)
 /*
  *     Addr scopes
  */
-#ifdef __KERNEL__
 #define IPV6_ADDR_MC_SCOPE(a)  \
        ((a)->s6_addr[1] & 0x0f)        /* nonstandard */
 #define __IPV6_ADDR_SCOPE_INVALID      -1
-#endif
 #define IPV6_ADDR_SCOPE_NODELOCAL      0x01
 #define IPV6_ADDR_SCOPE_LINKLOCAL      0x02
 #define IPV6_ADDR_SCOPE_SITELOCAL      0x05
 #define IPV6_ADDR_SCOPE_GLOBAL         0x0e
 
 /*
+ *     Addr flags
+ */
+#define IPV6_ADDR_MC_FLAG_TRANSIENT(a) \
+       ((a)->s6_addr[1] & 0x10)
+#define IPV6_ADDR_MC_FLAG_PREFIX(a)    \
+       ((a)->s6_addr[1] & 0x20)
+#define IPV6_ADDR_MC_FLAG_RENDEZVOUS(a)        \
+       ((a)->s6_addr[1] & 0x40)
+
+/*
  *     fragmentation header
  */
 
@@ -101,8 +109,6 @@ struct frag_hdr {
 
 #define        IP6_MF  0x0001
 
-#ifdef __KERNEL__
-
 #include <net/sock.h>
 
 /* sysctls */
@@ -117,6 +123,24 @@ extern struct ctl_path net_ipv6_ctl_path[];
        SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\
 })
 
+/* per device counters are atomic_long_t */
+#define _DEVINCATOMIC(net, statname, modifier, idev, field)            \
+({                                                                     \
+       struct inet6_dev *_idev = (idev);                               \
+       if (likely(_idev != NULL))                                      \
+               SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
+       SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\
+})
+
+/* per device and per net counters are atomic_long_t */
+#define _DEVINC_ATOMIC_ATOMIC(net, statname, idev, field)              \
+({                                                                     \
+       struct inet6_dev *_idev = (idev);                               \
+       if (likely(_idev != NULL))                                      \
+               SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
+       SNMP_INC_STATS_ATOMIC_LONG((net)->mib.statname##_statistics, (field));\
+})
+
 #define _DEVADD(net, statname, modifier, idev, field, val)             \
 ({                                                                     \
        struct inet6_dev *_idev = (idev);                               \
@@ -148,16 +172,16 @@ extern struct ctl_path net_ipv6_ctl_path[];
 #define IP6_UPD_PO_STATS_BH(net, idev,field,val)   \
                _DEVUPD(net, ipv6, 64_BH, idev, field, val)
 #define ICMP6_INC_STATS(net, idev, field)      \
-               _DEVINC(net, icmpv6, , idev, field)
+               _DEVINCATOMIC(net, icmpv6, , idev, field)
 #define ICMP6_INC_STATS_BH(net, idev, field)   \
-               _DEVINC(net, icmpv6, _BH, idev, field)
+               _DEVINCATOMIC(net, icmpv6, _BH, idev, field)
 
 #define ICMP6MSGOUT_INC_STATS(net, idev, field)                \
-       _DEVINC(net, icmpv6msg, , idev, field +256)
+       _DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
 #define ICMP6MSGOUT_INC_STATS_BH(net, idev, field)     \
-       _DEVINC(net, icmpv6msg, _BH, idev, field +256)
+       _DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
 #define ICMP6MSGIN_INC_STATS_BH(net, idev, field)      \
-       _DEVINC(net, icmpv6msg, _BH, idev, field)
+       _DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field)
 
 struct ip6_ra_chain {
        struct ip6_ra_chain     *next;
@@ -285,11 +309,6 @@ ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
                  ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3]));
 }
 
-static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2)
-{
-       memcpy(a1, a2, sizeof(struct in6_addr));
-}
-
 static inline void ipv6_addr_prefix(struct in6_addr *pfx, 
                                    const struct in6_addr *addr,
                                    int plen)
@@ -364,8 +383,8 @@ enum ip6_defrag_users {
 struct ip6_create_arg {
        __be32 id;
        u32 user;
-       struct in6_addr *src;
-       struct in6_addr *dst;
+       const struct in6_addr *src;
+       const struct in6_addr *dst;
 };
 
 void ip6_frag_init(struct inet_frag_queue *q, void *a);
@@ -448,17 +467,7 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add
        return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
 }
 
-static __inline__ void ipv6_select_ident(struct frag_hdr *fhdr)
-{
-       static u32 ipv6_fragmentation_id = 1;
-       static DEFINE_SPINLOCK(ip6_id_lock);
-
-       spin_lock_bh(&ip6_id_lock);
-       fhdr->identification = htonl(ipv6_fragmentation_id);
-       if (++ipv6_fragmentation_id == 0)
-               ipv6_fragmentation_id = 1;
-       spin_unlock_bh(&ip6_id_lock);
-}
+extern void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt);
 
 /*
  *     Prototypes exported by ipv6
@@ -480,8 +489,9 @@ extern int                  ip6_rcv_finish(struct sk_buff *skb);
  */
 extern int                     ip6_xmit(struct sock *sk,
                                         struct sk_buff *skb,
-                                        struct flowi *fl,
-                                        struct ipv6_txoptions *opt);
+                                        struct flowi6 *fl6,
+                                        struct ipv6_txoptions *opt,
+                                        int tclass);
 
 extern int                     ip6_nd_hdr(struct sock *sk,
                                           struct sk_buff *skb,
@@ -500,7 +510,7 @@ extern int                  ip6_append_data(struct sock *sk,
                                                int hlimit,
                                                int tclass,
                                                struct ipv6_txoptions *opt,
-                                               struct flowi *fl,
+                                               struct flowi6 *fl6,
                                                struct rt6_info *rt,
                                                unsigned int flags,
                                                int dontfrag);
@@ -511,18 +521,17 @@ extern void                       ip6_flush_pending_frames(struct sock *sk);
 
 extern int                     ip6_dst_lookup(struct sock *sk,
                                               struct dst_entry **dst,
-                                              struct flowi *fl);
+                                              struct flowi6 *fl6);
 extern struct dst_entry *      ip6_dst_lookup_flow(struct sock *sk,
-                                                   struct flowi *fl,
+                                                   struct flowi6 *fl6,
                                                    const struct in6_addr *final_dst,
-                                                   bool want_blackhole);
+                                                   bool can_sleep);
 extern struct dst_entry *      ip6_sk_dst_lookup_flow(struct sock *sk,
-                                                      struct flowi *fl,
+                                                      struct flowi6 *fl6,
                                                       const struct in6_addr *final_dst,
-                                                      bool want_blackhole);
-extern int                     ip6_dst_blackhole(struct sock *sk,
-                                                 struct dst_entry **dst,
-                                                 struct flowi *fl);
+                                                      bool can_sleep);
+extern struct dst_entry *      ip6_blackhole_route(struct net *net,
+                                                   struct dst_entry *orig_dst);
 
 /*
  *     skb processing functions
@@ -549,13 +558,13 @@ extern void                       ipv6_push_frag_opts(struct sk_buff *skb,
                                                    u8 *proto);
 
 extern int                     ipv6_skip_exthdr(const struct sk_buff *, int start,
-                                                u8 *nexthdrp);
+                                                u8 *nexthdrp, __be16 *frag_offp);
 
 extern int                     ipv6_ext_hdr(u8 nexthdr);
 
 extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);
 
-extern struct in6_addr *fl6_update_dst(struct flowi *fl,
+extern struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
                                       const struct ipv6_txoptions *opt,
                                       struct in6_addr *orig);
 
@@ -589,8 +598,8 @@ extern int                  ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len);
 extern int                     ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len);
 extern void                    ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
                                                u32 info, u8 *payload);
-extern void                    ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info);
-extern void                    ipv6_local_rxpmtu(struct sock *sk, struct flowi *fl, u32 mtu);
+extern void                    ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
+extern void                    ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
 
 extern int inet6_release(struct socket *sock);
 extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, 
@@ -656,5 +665,4 @@ extern int ipv6_static_sysctl_register(void);
 extern void ipv6_static_sysctl_unregister(void);
 #endif
 
-#endif /* __KERNEL__ */
 #endif /* _NET_IPV6_H */