[DCCP]: Dedicated auxiliary states to support passive-close
This adds two auxiliary states to deal with passive closes: * PASSIVE_CLOSE (reached from OPEN via reception of Close) and * PASSIVE_CLOSEREQ (reached from OPEN via reception of CloseReq) as internal intermediate states. These states are used to allow a receiver to process unread data before acknowledging the received connection-termination-request (the Close/CloseReq). Without such support, it will happen that passively-closed sockets enter CLOSED state while there is still unprocessed data in the queue; leading to unexpected and erratic API behaviour. PASSIVE_CLOSE has been mapped into TCPF_CLOSE_WAIT, so that the code will seamlessly work with inet_accept() (which tests for this state). The state names are thanks to Arnaldo, who suggested this naming scheme following an earlier revision of this patch. Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

gecommit door
David S. Miller

bovenliggende
f53dc67c5e
commit
f11135a344
@@ -60,8 +60,7 @@ void dccp_set_state(struct sock *sk, const int state)
|
||||
{
|
||||
const int oldstate = sk->sk_state;
|
||||
|
||||
dccp_pr_debug("%s(%p) %-10.10s -> %s\n",
|
||||
dccp_role(sk), sk,
|
||||
dccp_pr_debug("%s(%p) %s --> %s\n", dccp_role(sk), sk,
|
||||
dccp_state_name(oldstate), dccp_state_name(state));
|
||||
WARN_ON(state == oldstate);
|
||||
|
||||
@@ -134,14 +133,17 @@ EXPORT_SYMBOL_GPL(dccp_packet_name);
|
||||
const char *dccp_state_name(const int state)
|
||||
{
|
||||
static char *dccp_state_names[] = {
|
||||
[DCCP_OPEN] = "OPEN",
|
||||
[DCCP_REQUESTING] = "REQUESTING",
|
||||
[DCCP_PARTOPEN] = "PARTOPEN",
|
||||
[DCCP_LISTEN] = "LISTEN",
|
||||
[DCCP_RESPOND] = "RESPOND",
|
||||
[DCCP_CLOSING] = "CLOSING",
|
||||
[DCCP_TIME_WAIT] = "TIME_WAIT",
|
||||
[DCCP_CLOSED] = "CLOSED",
|
||||
[DCCP_OPEN] = "OPEN",
|
||||
[DCCP_REQUESTING] = "REQUESTING",
|
||||
[DCCP_PARTOPEN] = "PARTOPEN",
|
||||
[DCCP_LISTEN] = "LISTEN",
|
||||
[DCCP_RESPOND] = "RESPOND",
|
||||
[DCCP_CLOSING] = "CLOSING",
|
||||
[DCCP_ACTIVE_CLOSEREQ] = "CLOSEREQ",
|
||||
[DCCP_PASSIVE_CLOSE] = "PASSIVE_CLOSE",
|
||||
[DCCP_PASSIVE_CLOSEREQ] = "PASSIVE_CLOSEREQ",
|
||||
[DCCP_TIME_WAIT] = "TIME_WAIT",
|
||||
[DCCP_CLOSED] = "CLOSED",
|
||||
};
|
||||
|
||||
if (state >= DCCP_MAX_STATES)
|
||||
|
Verwijs in nieuw issue
Block a user