memcpy(dest, &count, sizeof(count));
                return;
        }
+       case NFT_CT_AVGPKT: {
+               const struct nf_conn_acct *acct = nf_conn_acct_find(ct);
+               u64 avgcnt = 0, bcnt = 0, pcnt = 0;
+
+               if (acct) {
+                       pcnt = nft_ct_get_eval_counter(acct->counter,
+                                                      NFT_CT_PKTS, priv->dir);
+                       bcnt = nft_ct_get_eval_counter(acct->counter,
+                                                      NFT_CT_BYTES, priv->dir);
+                       if (pcnt != 0)
+                               avgcnt = div64_u64(bcnt, pcnt);
+               }
+
+               memcpy(dest, &avgcnt, sizeof(avgcnt));
+               return;
+       }
        case NFT_CT_L3PROTOCOL:
                *dest = nf_ct_l3num(ct);
                return;
                break;
        case NFT_CT_BYTES:
        case NFT_CT_PKTS:
+       case NFT_CT_AVGPKT:
                /* no direction? return sum of original + reply */
                if (tb[NFTA_CT_DIRECTION] == NULL)
                        priv->dir = IP_CT_DIR_MAX;
        if (err < 0)
                return err;
 
-       if (priv->key == NFT_CT_BYTES || priv->key == NFT_CT_PKTS)
+       if (priv->key == NFT_CT_BYTES ||
+           priv->key == NFT_CT_PKTS  ||
+           priv->key == NFT_CT_AVGPKT)
                nf_ct_set_acct(ctx->net, true);
 
        return 0;
                break;
        case NFT_CT_BYTES:
        case NFT_CT_PKTS:
+       case NFT_CT_AVGPKT:
                if (priv->dir < IP_CT_DIR_MAX &&
                    nla_put_u8(skb, NFTA_CT_DIRECTION, priv->dir))
                        goto nla_put_failure;