gss_krb5: Introduce encryption type framework
[safe/jmp/linux-2.6] / net / core / gen_stats.c
index 8f21490..393b1d8 100644 (file)
 #include <linux/socket.h>
 #include <linux/rtnetlink.h>
 #include <linux/gen_stats.h>
+#include <net/netlink.h>
 #include <net/gen_stats.h>
 
 
 static inline int
 gnet_stats_copy(struct gnet_dump *d, int type, void *buf, int size)
 {
-       RTA_PUT(d->skb, type, size, buf);
+       NLA_PUT(d->skb, type, size, buf);
        return 0;
 
-rtattr_failure:
+nla_put_failure:
        spin_unlock_bh(d->lock);
        return -1;
 }
@@ -55,13 +56,14 @@ rtattr_failure:
 int
 gnet_stats_start_copy_compat(struct sk_buff *skb, int type, int tc_stats_type,
        int xstats_type, spinlock_t *lock, struct gnet_dump *d)
+       __acquires(lock)
 {
        memset(d, 0, sizeof(*d));
-       
+
        spin_lock_bh(lock);
        d->lock = lock;
        if (type)
-               d->tail = (struct rtattr *) skb->tail;
+               d->tail = (struct nlattr *)skb_tail_pointer(skb);
        d->skb = skb;
        d->compat_tc_stats = tc_stats_type;
        d->compat_xstats = xstats_type;
@@ -104,22 +106,28 @@ gnet_stats_start_copy(struct sk_buff *skb, int type, spinlock_t *lock,
  * if the room in the socket buffer was not sufficient.
  */
 int
-gnet_stats_copy_basic(struct gnet_dump *d, struct gnet_stats_basic *b)
+gnet_stats_copy_basic(struct gnet_dump *d, struct gnet_stats_basic_packed *b)
 {
        if (d->compat_tc_stats) {
                d->tc_stats.bytes = b->bytes;
                d->tc_stats.packets = b->packets;
        }
 
-       if (d->tail)
-               return gnet_stats_copy(d, TCA_STATS_BASIC, b, sizeof(*b));
+       if (d->tail) {
+               struct gnet_stats_basic sb;
 
+               memset(&sb, 0, sizeof(sb));
+               sb.bytes = b->bytes;
+               sb.packets = b->packets;
+               return gnet_stats_copy(d, TCA_STATS_BASIC, &sb, sizeof(sb));
+       }
        return 0;
 }
 
 /**
  * gnet_stats_copy_rate_est - copy rate estimator statistics into statistics TLV
  * @d: dumping handle
+ * @b: basic statistics
  * @r: rate estimator statistics
  *
  * Appends the rate estimator statistics to the top level TLV created by
@@ -129,8 +137,13 @@ gnet_stats_copy_basic(struct gnet_dump *d, struct gnet_stats_basic *b)
  * if the room in the socket buffer was not sufficient.
  */
 int
-gnet_stats_copy_rate_est(struct gnet_dump *d, struct gnet_stats_rate_est *r)
+gnet_stats_copy_rate_est(struct gnet_dump *d,
+                        const struct gnet_stats_basic_packed *b,
+                        struct gnet_stats_rate_est *r)
 {
+       if (b && !gen_estimator_active(b, r))
+               return 0;
+
        if (d->compat_tc_stats) {
                d->tc_stats.bps = r->bps;
                d->tc_stats.pps = r->pps;
@@ -212,7 +225,7 @@ int
 gnet_stats_finish_copy(struct gnet_dump *d)
 {
        if (d->tail)
-               d->tail->rta_len = d->skb->tail - (u8 *) d->tail;
+               d->tail->nla_len = skb_tail_pointer(d->skb) - (u8 *)d->tail;
 
        if (d->compat_tc_stats)
                if (gnet_stats_copy(d, d->compat_tc_stats, &d->tc_stats,