/* 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'); }