diff options
| author | Simon Horman <horms@verge.net.au> | 2010-08-22 08:37:53 -0400 |
|---|---|---|
| committer | Simon Horman <horms@verge.net.au> | 2010-10-04 09:45:24 -0400 |
| commit | a3c918acd29a96aba3b46bf50136e7953a480d17 (patch) | |
| tree | 570a5ea3a3fdef62b86e944ebcfcaf8b88ddb735 /net/netfilter | |
| parent | 85999283a21ab2dd37427fdd8c8e8af57223977c (diff) | |
IPVS: Add persistence engine data to /proc/net/ip_vs_conn
This shouldn't break compatibility with userspace as the new data
is at the end of the line.
I have confirmed that this doesn't break ipvsadm, the main (only?)
user-space user of this data.
Signed-off-by: Simon Horman <horms@verge.net.au>
Acked-by: Julian Anastasov <ja@ssi.bg>
Diffstat (limited to 'net/netfilter')
| -rw-r--r-- | net/netfilter/ipvs/ip_vs_conn.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c index 06da21e9740..4adedefdf56 100644 --- a/net/netfilter/ipvs/ip_vs_conn.c +++ b/net/netfilter/ipvs/ip_vs_conn.c | |||
| @@ -950,30 +950,45 @@ static int ip_vs_conn_seq_show(struct seq_file *seq, void *v) | |||
| 950 | 950 | ||
| 951 | if (v == SEQ_START_TOKEN) | 951 | if (v == SEQ_START_TOKEN) |
| 952 | seq_puts(seq, | 952 | seq_puts(seq, |
| 953 | "Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires\n"); | 953 | "Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires PEName PEData\n"); |
| 954 | else { | 954 | else { |
| 955 | const struct ip_vs_conn *cp = v; | 955 | const struct ip_vs_conn *cp = v; |
| 956 | char pe_data[IP_VS_PENAME_MAXLEN + IP_VS_PEDATA_MAXLEN + 3]; | ||
| 957 | size_t len = 0; | ||
| 958 | |||
| 959 | if (cp->dest && cp->dest->svc->pe && | ||
| 960 | cp->dest->svc->pe->show_pe_data) { | ||
| 961 | pe_data[0] = ' '; | ||
| 962 | len = strlen(cp->dest->svc->pe->name); | ||
| 963 | memcpy(pe_data + 1, cp->dest->svc->pe->name, len); | ||
| 964 | pe_data[len + 1] = ' '; | ||
| 965 | len += 2; | ||
| 966 | len += cp->dest->svc->pe->show_pe_data(cp, | ||
| 967 | pe_data + len); | ||
| 968 | } | ||
| 969 | pe_data[len] = '\0'; | ||
| 956 | 970 | ||
| 957 | #ifdef CONFIG_IP_VS_IPV6 | 971 | #ifdef CONFIG_IP_VS_IPV6 |
| 958 | if (cp->af == AF_INET6) | 972 | if (cp->af == AF_INET6) |
| 959 | seq_printf(seq, "%-3s %pI6 %04X %pI6 %04X %pI6 %04X %-11s %7lu\n", | 973 | seq_printf(seq, "%-3s %pI6 %04X %pI6 %04X " |
| 974 | "%pI6 %04X %-11s %7lu%s\n", | ||
| 960 | ip_vs_proto_name(cp->protocol), | 975 | ip_vs_proto_name(cp->protocol), |
| 961 | &cp->caddr.in6, ntohs(cp->cport), | 976 | &cp->caddr.in6, ntohs(cp->cport), |
| 962 | &cp->vaddr.in6, ntohs(cp->vport), | 977 | &cp->vaddr.in6, ntohs(cp->vport), |
| 963 | &cp->daddr.in6, ntohs(cp->dport), | 978 | &cp->daddr.in6, ntohs(cp->dport), |
| 964 | ip_vs_state_name(cp->protocol, cp->state), | 979 | ip_vs_state_name(cp->protocol, cp->state), |
| 965 | (cp->timer.expires-jiffies)/HZ); | 980 | (cp->timer.expires-jiffies)/HZ, pe_data); |
| 966 | else | 981 | else |
| 967 | #endif | 982 | #endif |
| 968 | seq_printf(seq, | 983 | seq_printf(seq, |
| 969 | "%-3s %08X %04X %08X %04X" | 984 | "%-3s %08X %04X %08X %04X" |
| 970 | " %08X %04X %-11s %7lu\n", | 985 | " %08X %04X %-11s %7lu%s\n", |
| 971 | ip_vs_proto_name(cp->protocol), | 986 | ip_vs_proto_name(cp->protocol), |
| 972 | ntohl(cp->caddr.ip), ntohs(cp->cport), | 987 | ntohl(cp->caddr.ip), ntohs(cp->cport), |
| 973 | ntohl(cp->vaddr.ip), ntohs(cp->vport), | 988 | ntohl(cp->vaddr.ip), ntohs(cp->vport), |
| 974 | ntohl(cp->daddr.ip), ntohs(cp->dport), | 989 | ntohl(cp->daddr.ip), ntohs(cp->dport), |
| 975 | ip_vs_state_name(cp->protocol, cp->state), | 990 | ip_vs_state_name(cp->protocol, cp->state), |
| 976 | (cp->timer.expires-jiffies)/HZ); | 991 | (cp->timer.expires-jiffies)/HZ, pe_data); |
| 977 | } | 992 | } |
| 978 | return 0; | 993 | return 0; |
| 979 | } | 994 | } |
