/* return 0 on success, 1 in case of error */
static int ct_seq_real_show(const struct ip_conntrack_tuple_hash *hash,
			    struct seq_file *s)
{
	struct ip_conntrack *conntrack = hash->ctrack;
	struct ip_conntrack_protocol *proto;

	MUST_BE_READ_LOCKED(&ip_conntrack_lock);

	IP_NF_ASSERT(conntrack);

	/* we only want to print DIR_ORIGINAL */
	if (DIRECTION(hash))
		return 0;

	proto = ip_ct_find_proto(conntrack->tuplehash[IP_CT_DIR_ORIGINAL]
			       .tuple.dst.protonum);
	IP_NF_ASSERT(proto);

	if (seq_printf(s, "%-8s %u %lu ",
		      proto->name,
		      conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum,
		      timer_pending(&conntrack->timeout)
		      ? (conntrack->timeout.expires - jiffies)/HZ : 0) != 0)
		return 1;

	if (proto->print_conntrack(s, conntrack))
		return 1;
  
	if (print_tuple(s, &conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
			proto))
		return 1;

 	if (seq_print_counters(s, &conntrack->counters[IP_CT_DIR_ORIGINAL]))
		return 1;

	if (!(test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)))
		if (seq_printf(s, "[UNREPLIED] "))
			return 1;

	if (print_tuple(s, &conntrack->tuplehash[IP_CT_DIR_REPLY].tuple,
			proto))
		return 1;

 	if (seq_print_counters(s, &conntrack->counters[IP_CT_DIR_REPLY]))
		return 1;

	if (test_bit(IPS_ASSURED_BIT, &conntrack->status))
		if (seq_printf(s, "[ASSURED] "))
			return 1;

#if defined(CONFIG_IP_NF_CONNTRACK_MARK)
	if (seq_printf(s, "mark=%ld ", conntrack->mark))
		return 1;
#endif

	if (seq_printf(s, "use=%u\n", atomic_read(&conntrack->ct_general.use)))
		return 1;

	return 0;
}
static int exp_seq_show(struct seq_file *s, void *v)
{
	struct ip_conntrack_expect *expect = v;

	if (expect->timeout.function)
		seq_printf(s, "%lu ", timer_pending(&expect->timeout)
			   ? (expect->timeout.expires - jiffies)/HZ : 0);
	else
		seq_printf(s, "- ");

	seq_printf(s, "proto=%u ", expect->tuple.dst.protonum);

	print_tuple(s, &expect->tuple,
		    ip_ct_find_proto(expect->tuple.dst.protonum));
	return seq_putc(s, '\n');
}