diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /include/net/request_sock.h | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'include/net/request_sock.h')
-rw-r--r-- | include/net/request_sock.h | 61 |
1 files changed, 17 insertions, 44 deletions
diff --git a/include/net/request_sock.h b/include/net/request_sock.h index a51dbd17c2d..4c0766e201e 100644 --- a/include/net/request_sock.h +++ b/include/net/request_sock.h | |||
@@ -49,16 +49,13 @@ struct request_sock_ops { | |||
49 | struct request_sock *req); | 49 | struct request_sock *req); |
50 | }; | 50 | }; |
51 | 51 | ||
52 | extern int inet_rtx_syn_ack(struct sock *parent, struct request_sock *req); | ||
53 | |||
54 | /* struct request_sock - mini sock to represent a connection request | 52 | /* struct request_sock - mini sock to represent a connection request |
55 | */ | 53 | */ |
56 | struct request_sock { | 54 | struct request_sock { |
57 | struct request_sock *dl_next; /* Must be first member! */ | 55 | struct request_sock *dl_next; /* Must be first member! */ |
58 | u16 mss; | 56 | u16 mss; |
59 | u8 num_retrans; /* number of retransmits */ | 57 | u8 retrans; |
60 | u8 cookie_ts:1; /* syncookie: encode tcpopts in timestamp */ | 58 | u8 cookie_ts; /* syncookie: encode tcpopts in timestamp */ |
61 | u8 num_timeout:7; /* number of timeouts */ | ||
62 | /* The following two fields can be easily recomputed I think -AK */ | 59 | /* The following two fields can be easily recomputed I think -AK */ |
63 | u32 window_clamp; /* window clamp at creation time */ | 60 | u32 window_clamp; /* window clamp at creation time */ |
64 | u32 rcv_wnd; /* rcv_wnd offered first time */ | 61 | u32 rcv_wnd; /* rcv_wnd offered first time */ |
@@ -109,34 +106,6 @@ struct listen_sock { | |||
109 | struct request_sock *syn_table[0]; | 106 | struct request_sock *syn_table[0]; |
110 | }; | 107 | }; |
111 | 108 | ||
112 | /* | ||
113 | * For a TCP Fast Open listener - | ||
114 | * lock - protects the access to all the reqsk, which is co-owned by | ||
115 | * the listener and the child socket. | ||
116 | * qlen - pending TFO requests (still in TCP_SYN_RECV). | ||
117 | * max_qlen - max TFO reqs allowed before TFO is disabled. | ||
118 | * | ||
119 | * XXX (TFO) - ideally these fields can be made as part of "listen_sock" | ||
120 | * structure above. But there is some implementation difficulty due to | ||
121 | * listen_sock being part of request_sock_queue hence will be freed when | ||
122 | * a listener is stopped. But TFO related fields may continue to be | ||
123 | * accessed even after a listener is closed, until its sk_refcnt drops | ||
124 | * to 0 implying no more outstanding TFO reqs. One solution is to keep | ||
125 | * listen_opt around until sk_refcnt drops to 0. But there is some other | ||
126 | * complexity that needs to be resolved. E.g., a listener can be disabled | ||
127 | * temporarily through shutdown()->tcp_disconnect(), and re-enabled later. | ||
128 | */ | ||
129 | struct fastopen_queue { | ||
130 | struct request_sock *rskq_rst_head; /* Keep track of past TFO */ | ||
131 | struct request_sock *rskq_rst_tail; /* requests that caused RST. | ||
132 | * This is part of the defense | ||
133 | * against spoofing attack. | ||
134 | */ | ||
135 | spinlock_t lock; | ||
136 | int qlen; /* # of pending (TCP_SYN_RECV) reqs */ | ||
137 | int max_qlen; /* != 0 iff TFO is currently enabled */ | ||
138 | }; | ||
139 | |||
140 | /** struct request_sock_queue - queue of request_socks | 109 | /** struct request_sock_queue - queue of request_socks |
141 | * | 110 | * |
142 | * @rskq_accept_head - FIFO head of established children | 111 | * @rskq_accept_head - FIFO head of established children |
@@ -160,12 +129,6 @@ struct request_sock_queue { | |||
160 | u8 rskq_defer_accept; | 129 | u8 rskq_defer_accept; |
161 | /* 3 bytes hole, try to pack */ | 130 | /* 3 bytes hole, try to pack */ |
162 | struct listen_sock *listen_opt; | 131 | struct listen_sock *listen_opt; |
163 | struct fastopen_queue *fastopenq; /* This is non-NULL iff TFO has been | ||
164 | * enabled on this listener. Check | ||
165 | * max_qlen != 0 in fastopen_queue | ||
166 | * to determine if TFO is enabled | ||
167 | * right at this moment. | ||
168 | */ | ||
169 | }; | 132 | }; |
170 | 133 | ||
171 | extern int reqsk_queue_alloc(struct request_sock_queue *queue, | 134 | extern int reqsk_queue_alloc(struct request_sock_queue *queue, |
@@ -173,8 +136,6 @@ extern int reqsk_queue_alloc(struct request_sock_queue *queue, | |||
173 | 136 | ||
174 | extern void __reqsk_queue_destroy(struct request_sock_queue *queue); | 137 | extern void __reqsk_queue_destroy(struct request_sock_queue *queue); |
175 | extern void reqsk_queue_destroy(struct request_sock_queue *queue); | 138 | extern void reqsk_queue_destroy(struct request_sock_queue *queue); |
176 | extern void reqsk_fastopen_remove(struct sock *sk, | ||
177 | struct request_sock *req, bool reset); | ||
178 | 139 | ||
179 | static inline struct request_sock * | 140 | static inline struct request_sock * |
180 | reqsk_queue_yank_acceptq(struct request_sock_queue *queue) | 141 | reqsk_queue_yank_acceptq(struct request_sock_queue *queue) |
@@ -229,12 +190,25 @@ static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue | |||
229 | return req; | 190 | return req; |
230 | } | 191 | } |
231 | 192 | ||
193 | static inline struct sock *reqsk_queue_get_child(struct request_sock_queue *queue, | ||
194 | struct sock *parent) | ||
195 | { | ||
196 | struct request_sock *req = reqsk_queue_remove(queue); | ||
197 | struct sock *child = req->sk; | ||
198 | |||
199 | WARN_ON(child == NULL); | ||
200 | |||
201 | sk_acceptq_removed(parent); | ||
202 | __reqsk_free(req); | ||
203 | return child; | ||
204 | } | ||
205 | |||
232 | static inline int reqsk_queue_removed(struct request_sock_queue *queue, | 206 | static inline int reqsk_queue_removed(struct request_sock_queue *queue, |
233 | struct request_sock *req) | 207 | struct request_sock *req) |
234 | { | 208 | { |
235 | struct listen_sock *lopt = queue->listen_opt; | 209 | struct listen_sock *lopt = queue->listen_opt; |
236 | 210 | ||
237 | if (req->num_timeout == 0) | 211 | if (req->retrans == 0) |
238 | --lopt->qlen_young; | 212 | --lopt->qlen_young; |
239 | 213 | ||
240 | return --lopt->qlen; | 214 | return --lopt->qlen; |
@@ -272,8 +246,7 @@ static inline void reqsk_queue_hash_req(struct request_sock_queue *queue, | |||
272 | struct listen_sock *lopt = queue->listen_opt; | 246 | struct listen_sock *lopt = queue->listen_opt; |
273 | 247 | ||
274 | req->expires = jiffies + timeout; | 248 | req->expires = jiffies + timeout; |
275 | req->num_retrans = 0; | 249 | req->retrans = 0; |
276 | req->num_timeout = 0; | ||
277 | req->sk = NULL; | 250 | req->sk = NULL; |
278 | req->dl_next = lopt->syn_table[hash]; | 251 | req->dl_next = lopt->syn_table[hash]; |
279 | 252 | ||