diff options
author | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2007-11-24 19:14:15 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 17:55:02 -0500 |
commit | ce865a61c810c971b47f57c729ec6e9b2d522d94 (patch) | |
tree | 95e3013184679deb4699d416f2431910b9dd5c68 /net/dccp | |
parent | d83bd95bf11444993b9c405b255ffa644c32d414 (diff) |
[DCCP]: Add support for abortive release
This continues from the previous patch and adds support for actively aborting
a DCCP connection, using a Reset Code 2, "Aborted" to inform the peer of an
abortive release.
I have tried this in various client/server settings and it works as expected.
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dccp')
-rw-r--r-- | net/dccp/proto.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 5f47b458ed8f..73006b747678 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -276,6 +276,12 @@ static inline int dccp_listen_start(struct sock *sk, int backlog) | |||
276 | return inet_csk_listen_start(sk, backlog); | 276 | return inet_csk_listen_start(sk, backlog); |
277 | } | 277 | } |
278 | 278 | ||
279 | static inline int dccp_need_reset(int state) | ||
280 | { | ||
281 | return state != DCCP_CLOSED && state != DCCP_LISTEN && | ||
282 | state != DCCP_REQUESTING; | ||
283 | } | ||
284 | |||
279 | int dccp_disconnect(struct sock *sk, int flags) | 285 | int dccp_disconnect(struct sock *sk, int flags) |
280 | { | 286 | { |
281 | struct inet_connection_sock *icsk = inet_csk(sk); | 287 | struct inet_connection_sock *icsk = inet_csk(sk); |
@@ -286,10 +292,15 @@ int dccp_disconnect(struct sock *sk, int flags) | |||
286 | if (old_state != DCCP_CLOSED) | 292 | if (old_state != DCCP_CLOSED) |
287 | dccp_set_state(sk, DCCP_CLOSED); | 293 | dccp_set_state(sk, DCCP_CLOSED); |
288 | 294 | ||
289 | /* ABORT function of RFC793 */ | 295 | /* |
296 | * This corresponds to the ABORT function of RFC793, sec. 3.8 | ||
297 | * TCP uses a RST segment, DCCP a Reset packet with Code 2, "Aborted". | ||
298 | */ | ||
290 | if (old_state == DCCP_LISTEN) { | 299 | if (old_state == DCCP_LISTEN) { |
291 | inet_csk_listen_stop(sk); | 300 | inet_csk_listen_stop(sk); |
292 | /* FIXME: do the active reset thing */ | 301 | } else if (dccp_need_reset(old_state)) { |
302 | dccp_send_reset(sk, DCCP_RESET_CODE_ABORTED); | ||
303 | sk->sk_err = ECONNRESET; | ||
293 | } else if (old_state == DCCP_REQUESTING) | 304 | } else if (old_state == DCCP_REQUESTING) |
294 | sk->sk_err = ECONNRESET; | 305 | sk->sk_err = ECONNRESET; |
295 | 306 | ||