diff options
Diffstat (limited to 'net/dccp/proto.c')
-rw-r--r-- | net/dccp/proto.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 9fe25bf63296..b68168fcc06a 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <net/checksum.h> | 24 | #include <net/checksum.h> |
25 | 25 | ||
26 | #include <net/inet_sock.h> | 26 | #include <net/inet_sock.h> |
27 | #include <net/inet_common.h> | ||
27 | #include <net/sock.h> | 28 | #include <net/sock.h> |
28 | #include <net/xfrm.h> | 29 | #include <net/xfrm.h> |
29 | 30 | ||
@@ -170,6 +171,15 @@ const char *dccp_packet_name(const int type) | |||
170 | 171 | ||
171 | EXPORT_SYMBOL_GPL(dccp_packet_name); | 172 | EXPORT_SYMBOL_GPL(dccp_packet_name); |
172 | 173 | ||
174 | static void dccp_sk_destruct(struct sock *sk) | ||
175 | { | ||
176 | struct dccp_sock *dp = dccp_sk(sk); | ||
177 | |||
178 | ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk); | ||
179 | dp->dccps_hc_tx_ccid = NULL; | ||
180 | inet_sock_destruct(sk); | ||
181 | } | ||
182 | |||
173 | int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized) | 183 | int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized) |
174 | { | 184 | { |
175 | struct dccp_sock *dp = dccp_sk(sk); | 185 | struct dccp_sock *dp = dccp_sk(sk); |
@@ -179,6 +189,7 @@ int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized) | |||
179 | icsk->icsk_syn_retries = sysctl_dccp_request_retries; | 189 | icsk->icsk_syn_retries = sysctl_dccp_request_retries; |
180 | sk->sk_state = DCCP_CLOSED; | 190 | sk->sk_state = DCCP_CLOSED; |
181 | sk->sk_write_space = dccp_write_space; | 191 | sk->sk_write_space = dccp_write_space; |
192 | sk->sk_destruct = dccp_sk_destruct; | ||
182 | icsk->icsk_sync_mss = dccp_sync_mss; | 193 | icsk->icsk_sync_mss = dccp_sync_mss; |
183 | dp->dccps_mss_cache = 536; | 194 | dp->dccps_mss_cache = 536; |
184 | dp->dccps_rate_last = jiffies; | 195 | dp->dccps_rate_last = jiffies; |
@@ -201,10 +212,7 @@ void dccp_destroy_sock(struct sock *sk) | |||
201 | { | 212 | { |
202 | struct dccp_sock *dp = dccp_sk(sk); | 213 | struct dccp_sock *dp = dccp_sk(sk); |
203 | 214 | ||
204 | /* | 215 | __skb_queue_purge(&sk->sk_write_queue); |
205 | * DCCP doesn't use sk_write_queue, just sk_send_head | ||
206 | * for retransmissions | ||
207 | */ | ||
208 | if (sk->sk_send_head != NULL) { | 216 | if (sk->sk_send_head != NULL) { |
209 | kfree_skb(sk->sk_send_head); | 217 | kfree_skb(sk->sk_send_head); |
210 | sk->sk_send_head = NULL; | 218 | sk->sk_send_head = NULL; |
@@ -222,8 +230,7 @@ void dccp_destroy_sock(struct sock *sk) | |||
222 | dp->dccps_hc_rx_ackvec = NULL; | 230 | dp->dccps_hc_rx_ackvec = NULL; |
223 | } | 231 | } |
224 | ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk); | 232 | ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk); |
225 | ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk); | 233 | dp->dccps_hc_rx_ccid = NULL; |
226 | dp->dccps_hc_rx_ccid = dp->dccps_hc_tx_ccid = NULL; | ||
227 | 234 | ||
228 | /* clean up feature negotiation state */ | 235 | /* clean up feature negotiation state */ |
229 | dccp_feat_list_purge(&dp->dccps_featneg); | 236 | dccp_feat_list_purge(&dp->dccps_featneg); |