aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/request_sock.h
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /include/net/request_sock.h
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'include/net/request_sock.h')
-rw-r--r--include/net/request_sock.h61
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
52extern 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 */
56struct request_sock { 54struct 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 */
129struct 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
171extern int reqsk_queue_alloc(struct request_sock_queue *queue, 134extern 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
174extern void __reqsk_queue_destroy(struct request_sock_queue *queue); 137extern void __reqsk_queue_destroy(struct request_sock_queue *queue);
175extern void reqsk_queue_destroy(struct request_sock_queue *queue); 138extern void reqsk_queue_destroy(struct request_sock_queue *queue);
176extern void reqsk_fastopen_remove(struct sock *sk,
177 struct request_sock *req, bool reset);
178 139
179static inline struct request_sock * 140static 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
193static 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
232static inline int reqsk_queue_removed(struct request_sock_queue *queue, 206static 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