diff options
Diffstat (limited to 'net/dccp/proto.c')
-rw-r--r-- | net/dccp/proto.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index ef94b0c8a0c0..f644c1a23c4d 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -53,6 +53,58 @@ struct inet_hashinfo __cacheline_aligned dccp_hashinfo = { | |||
53 | 53 | ||
54 | EXPORT_SYMBOL_GPL(dccp_hashinfo); | 54 | EXPORT_SYMBOL_GPL(dccp_hashinfo); |
55 | 55 | ||
56 | void dccp_set_state(struct sock *sk, const int state) | ||
57 | { | ||
58 | const int oldstate = sk->sk_state; | ||
59 | |||
60 | dccp_pr_debug("%s(%p) %-10.10s -> %s\n", | ||
61 | dccp_role(sk), sk, | ||
62 | dccp_state_name(oldstate), dccp_state_name(state)); | ||
63 | WARN_ON(state == oldstate); | ||
64 | |||
65 | switch (state) { | ||
66 | case DCCP_OPEN: | ||
67 | if (oldstate != DCCP_OPEN) | ||
68 | DCCP_INC_STATS(DCCP_MIB_CURRESTAB); | ||
69 | break; | ||
70 | |||
71 | case DCCP_CLOSED: | ||
72 | if (oldstate == DCCP_CLOSING || oldstate == DCCP_OPEN) | ||
73 | DCCP_INC_STATS(DCCP_MIB_ESTABRESETS); | ||
74 | |||
75 | sk->sk_prot->unhash(sk); | ||
76 | if (inet_csk(sk)->icsk_bind_hash != NULL && | ||
77 | !(sk->sk_userlocks & SOCK_BINDPORT_LOCK)) | ||
78 | inet_put_port(&dccp_hashinfo, sk); | ||
79 | /* fall through */ | ||
80 | default: | ||
81 | if (oldstate == DCCP_OPEN) | ||
82 | DCCP_DEC_STATS(DCCP_MIB_CURRESTAB); | ||
83 | } | ||
84 | |||
85 | /* Change state AFTER socket is unhashed to avoid closed | ||
86 | * socket sitting in hash tables. | ||
87 | */ | ||
88 | sk->sk_state = state; | ||
89 | } | ||
90 | |||
91 | EXPORT_SYMBOL_GPL(dccp_set_state); | ||
92 | |||
93 | void dccp_done(struct sock *sk) | ||
94 | { | ||
95 | dccp_set_state(sk, DCCP_CLOSED); | ||
96 | dccp_clear_xmit_timers(sk); | ||
97 | |||
98 | sk->sk_shutdown = SHUTDOWN_MASK; | ||
99 | |||
100 | if (!sock_flag(sk, SOCK_DEAD)) | ||
101 | sk->sk_state_change(sk); | ||
102 | else | ||
103 | inet_csk_destroy_sock(sk); | ||
104 | } | ||
105 | |||
106 | EXPORT_SYMBOL_GPL(dccp_done); | ||
107 | |||
56 | const char *dccp_packet_name(const int type) | 108 | const char *dccp_packet_name(const int type) |
57 | { | 109 | { |
58 | static const char *dccp_packet_names[] = { | 110 | static const char *dccp_packet_names[] = { |