diff options
Diffstat (limited to 'net/ipv4/tcp_diag.c')
-rw-r--r-- | net/ipv4/tcp_diag.c | 34 |
1 files changed, 9 insertions, 25 deletions
diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c index 634befc07921..f66945cb158f 100644 --- a/net/ipv4/tcp_diag.c +++ b/net/ipv4/tcp_diag.c | |||
@@ -42,15 +42,8 @@ struct tcpdiag_entry | |||
42 | 42 | ||
43 | static struct sock *tcpnl; | 43 | static struct sock *tcpnl; |
44 | 44 | ||
45 | |||
46 | #define TCPDIAG_PUT(skb, attrtype, attrlen) \ | 45 | #define TCPDIAG_PUT(skb, attrtype, attrlen) \ |
47 | ({ int rtalen = RTA_LENGTH(attrlen); \ | 46 | RTA_DATA(__RTA_PUT(skb, attrtype, attrlen)) |
48 | struct rtattr *rta; \ | ||
49 | if (skb_tailroom(skb) < RTA_ALIGN(rtalen)) goto nlmsg_failure; \ | ||
50 | rta = (void*)__skb_put(skb, RTA_ALIGN(rtalen)); \ | ||
51 | rta->rta_type = attrtype; \ | ||
52 | rta->rta_len = rtalen; \ | ||
53 | RTA_DATA(rta); }) | ||
54 | 47 | ||
55 | static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, | 48 | static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, |
56 | int ext, u32 pid, u32 seq, u16 nlmsg_flags) | 49 | int ext, u32 pid, u32 seq, u16 nlmsg_flags) |
@@ -61,7 +54,6 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, | |||
61 | struct nlmsghdr *nlh; | 54 | struct nlmsghdr *nlh; |
62 | struct tcp_info *info = NULL; | 55 | struct tcp_info *info = NULL; |
63 | struct tcpdiag_meminfo *minfo = NULL; | 56 | struct tcpdiag_meminfo *minfo = NULL; |
64 | struct tcpvegas_info *vinfo = NULL; | ||
65 | unsigned char *b = skb->tail; | 57 | unsigned char *b = skb->tail; |
66 | 58 | ||
67 | nlh = NLMSG_PUT(skb, pid, seq, TCPDIAG_GETSOCK, sizeof(*r)); | 59 | nlh = NLMSG_PUT(skb, pid, seq, TCPDIAG_GETSOCK, sizeof(*r)); |
@@ -73,9 +65,11 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, | |||
73 | if (ext & (1<<(TCPDIAG_INFO-1))) | 65 | if (ext & (1<<(TCPDIAG_INFO-1))) |
74 | info = TCPDIAG_PUT(skb, TCPDIAG_INFO, sizeof(*info)); | 66 | info = TCPDIAG_PUT(skb, TCPDIAG_INFO, sizeof(*info)); |
75 | 67 | ||
76 | if ((tcp_is_westwood(tp) || tcp_is_vegas(tp)) | 68 | if (ext & (1<<(TCPDIAG_CONG-1))) { |
77 | && (ext & (1<<(TCPDIAG_VEGASINFO-1)))) | 69 | size_t len = strlen(tp->ca_ops->name); |
78 | vinfo = TCPDIAG_PUT(skb, TCPDIAG_VEGASINFO, sizeof(*vinfo)); | 70 | strcpy(TCPDIAG_PUT(skb, TCPDIAG_CONG, len+1), |
71 | tp->ca_ops->name); | ||
72 | } | ||
79 | } | 73 | } |
80 | r->tcpdiag_family = sk->sk_family; | 74 | r->tcpdiag_family = sk->sk_family; |
81 | r->tcpdiag_state = sk->sk_state; | 75 | r->tcpdiag_state = sk->sk_state; |
@@ -166,23 +160,13 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, | |||
166 | if (info) | 160 | if (info) |
167 | tcp_get_info(sk, info); | 161 | tcp_get_info(sk, info); |
168 | 162 | ||
169 | if (vinfo) { | 163 | if (sk->sk_state < TCP_TIME_WAIT && tp->ca_ops->get_info) |
170 | if (tcp_is_vegas(tp)) { | 164 | tp->ca_ops->get_info(tp, ext, skb); |
171 | vinfo->tcpv_enabled = tp->vegas.doing_vegas_now; | ||
172 | vinfo->tcpv_rttcnt = tp->vegas.cntRTT; | ||
173 | vinfo->tcpv_rtt = jiffies_to_usecs(tp->vegas.baseRTT); | ||
174 | vinfo->tcpv_minrtt = jiffies_to_usecs(tp->vegas.minRTT); | ||
175 | } else { | ||
176 | vinfo->tcpv_enabled = 0; | ||
177 | vinfo->tcpv_rttcnt = 0; | ||
178 | vinfo->tcpv_rtt = jiffies_to_usecs(tp->westwood.rtt); | ||
179 | vinfo->tcpv_minrtt = jiffies_to_usecs(tp->westwood.rtt_min); | ||
180 | } | ||
181 | } | ||
182 | 165 | ||
183 | nlh->nlmsg_len = skb->tail - b; | 166 | nlh->nlmsg_len = skb->tail - b; |
184 | return skb->len; | 167 | return skb->len; |
185 | 168 | ||
169 | rtattr_failure: | ||
186 | nlmsg_failure: | 170 | nlmsg_failure: |
187 | skb_trim(skb, b - skb->data); | 171 | skb_trim(skb, b - skb->data); |
188 | return -1; | 172 | return -1; |