~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/dccp/output.c

Version: ~ [ linux-5.8 ] ~ [ linux-5.7.14 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.57 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.138 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.193 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.232 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.232 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *  net/dccp/output.c
  3  *
  4  *  An implementation of the DCCP protocol
  5  *  Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  6  *
  7  *      This program is free software; you can redistribute it and/or
  8  *      modify it under the terms of the GNU General Public License
  9  *      as published by the Free Software Foundation; either version
 10  *      2 of the License, or (at your option) any later version.
 11  */
 12 
 13 #include <linux/dccp.h>
 14 #include <linux/kernel.h>
 15 #include <linux/skbuff.h>
 16 #include <linux/slab.h>
 17 #include <linux/sched/signal.h>
 18 
 19 #include <net/inet_sock.h>
 20 #include <net/sock.h>
 21 
 22 #include "ackvec.h"
 23 #include "ccid.h"
 24 #include "dccp.h"
 25 
 26 static inline void dccp_event_ack_sent(struct sock *sk)
 27 {
 28         inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK);
 29 }
 30 
 31 /* enqueue @skb on sk_send_head for retransmission, return clone to send now */
 32 static struct sk_buff *dccp_skb_entail(struct sock *sk, struct sk_buff *skb)
 33 {
 34         skb_set_owner_w(skb, sk);
 35         WARN_ON(sk->sk_send_head);
 36         sk->sk_send_head = skb;
 37         return skb_clone(sk->sk_send_head, gfp_any());
 38 }
 39 
 40 /*
 41  * All SKB's seen here are completely headerless. It is our
 42  * job to build the DCCP header, and pass the packet down to
 43  * IP so it can do the same plus pass the packet off to the
 44  * device.
 45  */
 46 static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
 47 {
 48         if (likely(skb != NULL)) {
 49                 struct inet_sock *inet = inet_sk(sk);
 50                 const struct inet_connection_sock *icsk = inet_csk(sk);
 51                 struct dccp_sock *dp = dccp_sk(sk);
 52                 struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
 53                 struct dccp_hdr *dh;
 54                 /* XXX For now we're using only 48 bits sequence numbers */
 55                 const u32 dccp_header_size = sizeof(*dh) +
 56                                              sizeof(struct dccp_hdr_ext) +
 57                                           dccp_packet_hdr_len(dcb->dccpd_type);
 58                 int err, set_ack = 1;
 59                 u64 ackno = dp->dccps_gsr;
 60                 /*
 61                  * Increment GSS here already in case the option code needs it.
 62                  * Update GSS for real only if option processing below succeeds.
 63                  */
 64                 dcb->dccpd_seq = ADD48(dp->dccps_gss, 1);
 65 
 66                 switch (dcb->dccpd_type) {
 67                 case DCCP_PKT_DATA:
 68                         set_ack = 0;
 69                         /* fall through */
 70                 case DCCP_PKT_DATAACK:
 71                 case DCCP_PKT_RESET:
 72                         break;
 73 
 74                 case DCCP_PKT_REQUEST:
 75                         set_ack = 0;
 76                         /* Use ISS on the first (non-retransmitted) Request. */
 77                         if (icsk->icsk_retransmits == 0)
 78                                 dcb->dccpd_seq = dp->dccps_iss;
 79                         /* fall through */
 80 
 81                 case DCCP_PKT_SYNC:
 82                 case DCCP_PKT_SYNCACK:
 83                         ackno = dcb->dccpd_ack_seq;
 84                         /* fall through */
 85                 default:
 86                         /*
 87                          * Set owner/destructor: some skbs are allocated via
 88                          * alloc_skb (e.g. when retransmission may happen).
 89                          * Only Data, DataAck, and Reset packets should come
 90                          * through here with skb->sk set.
 91                          */
 92                         WARN_ON(skb->sk);
 93                         skb_set_owner_w(skb, sk);
 94                         break;
 95                 }
 96 
 97                 if (dccp_insert_options(sk, skb)) {
 98                         kfree_skb(skb);
 99                         return -EPROTO;
100                 }
101 
102 
103                 /* Build DCCP header and checksum it. */
104                 dh = dccp_zeroed_hdr(skb, dccp_header_size);
105                 dh->dccph_type  = dcb->dccpd_type;
106                 dh->dccph_sport = inet->inet_sport;
107                 dh->dccph_dport = inet->inet_dport;
108                 dh->dccph_doff  = (dccp_header_size + dcb->dccpd_opt_len) / 4;
109                 dh->dccph_ccval = dcb->dccpd_ccval;
110                 dh->dccph_cscov = dp->dccps_pcslen;
111                 /* XXX For now we're using only 48 bits sequence numbers */
112                 dh->dccph_x     = 1;
113 
114                 dccp_update_gss(sk, dcb->dccpd_seq);
115                 dccp_hdr_set_seq(dh, dp->dccps_gss);
116                 if (set_ack)
117                         dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), ackno);
118 
119                 switch (dcb->dccpd_type) {
120                 case DCCP_PKT_REQUEST:
121                         dccp_hdr_request(skb)->dccph_req_service =
122                                                         dp->dccps_service;
123                         /*
124                          * Limit Ack window to ISS <= P.ackno <= GSS, so that
125                          * only Responses to Requests we sent are considered.
126                          */
127                         dp->dccps_awl = dp->dccps_iss;
128                         break;
129                 case DCCP_PKT_RESET:
130                         dccp_hdr_reset(skb)->dccph_reset_code =
131                                                         dcb->dccpd_reset_code;
132                         break;
133                 }
134 
135                 icsk->icsk_af_ops->send_check(sk, skb);
136 
137                 if (set_ack)
138                         dccp_event_ack_sent(sk);
139 
140                 DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
141 
142                 err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl);
143                 return net_xmit_eval(err);
144         }
145         return -ENOBUFS;
146 }
147 
148 /**
149  * dccp_determine_ccmps  -  Find out about CCID-specific packet-size limits
150  * We only consider the HC-sender CCID for setting the CCMPS (RFC 4340, 14.),
151  * since the RX CCID is restricted to feedback packets (Acks), which are small
152  * in comparison with the data traffic. A value of 0 means "no current CCMPS".
153  */
154 static u32 dccp_determine_ccmps(const struct dccp_sock *dp)
155 {
156         const struct ccid *tx_ccid = dp->dccps_hc_tx_ccid;
157 
158         if (tx_ccid == NULL || tx_ccid->ccid_ops == NULL)
159                 return 0;
160         return tx_ccid->ccid_ops->ccid_ccmps;
161 }
162 
163 unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
164 {
165         struct inet_connection_sock *icsk = inet_csk(sk);
166         struct dccp_sock *dp = dccp_sk(sk);
167         u32 ccmps = dccp_determine_ccmps(dp);
168         u32 cur_mps = ccmps ? min(pmtu, ccmps) : pmtu;
169 
170         /* Account for header lengths and IPv4/v6 option overhead */
171         cur_mps -= (icsk->icsk_af_ops->net_header_len + icsk->icsk_ext_hdr_len +
172                     sizeof(struct dccp_hdr) + sizeof(struct dccp_hdr_ext));
173 
174         /*
175          * Leave enough headroom for common DCCP header options.
176          * This only considers options which may appear on DCCP-Data packets, as
177          * per table 3 in RFC 4340, 5.8. When running out of space for other
178          * options (eg. Ack Vector which can take up to 255 bytes), it is better
179          * to schedule a separate Ack. Thus we leave headroom for the following:
180          *  - 1 byte for Slow Receiver (11.6)
181          *  - 6 bytes for Timestamp (13.1)
182          *  - 10 bytes for Timestamp Echo (13.3)
183          *  - 8 bytes for NDP count (7.7, when activated)
184          *  - 6 bytes for Data Checksum (9.3)
185          *  - %DCCPAV_MIN_OPTLEN bytes for Ack Vector size (11.4, when enabled)
186          */
187         cur_mps -= roundup(1 + 6 + 10 + dp->dccps_send_ndp_count * 8 + 6 +
188                            (dp->dccps_hc_rx_ackvec ? DCCPAV_MIN_OPTLEN : 0), 4);
189 
190         /* And store cached results */
191         icsk->icsk_pmtu_cookie = pmtu;
192         dp->dccps_mss_cache = cur_mps;
193 
194         return cur_mps;
195 }
196 
197 EXPORT_SYMBOL_GPL(dccp_sync_mss);
198 
199 void dccp_write_space(struct sock *sk)
200 {
201         struct socket_wq *wq;
202 
203         rcu_read_lock();
204         wq = rcu_dereference(sk->sk_wq);
205         if (skwq_has_sleeper(wq))
206                 wake_up_interruptible(&wq->wait);
207         /* Should agree with poll, otherwise some programs break */
208         if (sock_writeable(sk))
209                 sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
210 
211         rcu_read_unlock();
212 }
213 
214 /**
215  * dccp_wait_for_ccid  -  Await CCID send permission
216  * @sk:    socket to wait for
217  * @delay: timeout in jiffies
218  *
219  * This is used by CCIDs which need to delay the send time in process context.
220  */
221 static int dccp_wait_for_ccid(struct sock *sk, unsigned long delay)
222 {
223         DEFINE_WAIT(wait);
224         long remaining;
225 
226         prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
227         sk->sk_write_pending++;
228         release_sock(sk);
229 
230         remaining = schedule_timeout(delay);
231 
232         lock_sock(sk);
233         sk->sk_write_pending--;
234         finish_wait(sk_sleep(sk), &wait);
235 
236         if (signal_pending(current) || sk->sk_err)
237                 return -1;
238         return remaining;
239 }
240 
241 /**
242  * dccp_xmit_packet  -  Send data packet under control of CCID
243  * Transmits next-queued payload and informs CCID to account for the packet.
244  */
245 static void dccp_xmit_packet(struct sock *sk)
246 {
247         int err, len;
248         struct dccp_sock *dp = dccp_sk(sk);
249         struct sk_buff *skb = dccp_qpolicy_pop(sk);
250 
251         if (unlikely(skb == NULL))
252                 return;
253         len = skb->len;
254 
255         if (sk->sk_state == DCCP_PARTOPEN) {
256                 const u32 cur_mps = dp->dccps_mss_cache - DCCP_FEATNEG_OVERHEAD;
257                 /*
258                  * See 8.1.5 - Handshake Completion.
259                  *
260                  * For robustness we resend Confirm options until the client has
261                  * entered OPEN. During the initial feature negotiation, the MPS
262                  * is smaller than usual, reduced by the Change/Confirm options.
263                  */
264                 if (!list_empty(&dp->dccps_featneg) && len > cur_mps) {
265                         DCCP_WARN("Payload too large (%d) for featneg.\n", len);
266                         dccp_send_ack(sk);
267                         dccp_feat_list_purge(&dp->dccps_featneg);
268                 }
269 
270                 inet_csk_schedule_ack(sk);
271                 inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
272                                               inet_csk(sk)->icsk_rto,
273                                               DCCP_RTO_MAX);
274                 DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_DATAACK;
275         } else if (dccp_ack_pending(sk)) {
276                 DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_DATAACK;
277         } else {
278                 DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_DATA;
279         }
280 
281         err = dccp_transmit_skb(sk, skb);
282         if (err)
283                 dccp_pr_debug("transmit_skb() returned err=%d\n", err);
284         /*
285          * Register this one as sent even if an error occurred. To the remote
286          * end a local packet drop is indistinguishable from network loss, i.e.
287          * any local drop will eventually be reported via receiver feedback.
288          */
289         ccid_hc_tx_packet_sent(dp->dccps_hc_tx_ccid, sk, len);
290 
291         /*
292          * If the CCID needs to transfer additional header options out-of-band
293          * (e.g. Ack Vectors or feature-negotiation options), it activates this
294          * flag to schedule a Sync. The Sync will automatically incorporate all
295          * currently pending header options, thus clearing the backlog.
296          */
297         if (dp->dccps_sync_scheduled)
298                 dccp_send_sync(sk, dp->dccps_gsr, DCCP_PKT_SYNC);
299 }
300 
301 /**
302  * dccp_flush_write_queue  -  Drain queue at end of connection
303  * Since dccp_sendmsg queues packets without waiting for them to be sent, it may
304  * happen that the TX queue is not empty at the end of a connection. We give the
305  * HC-sender CCID a grace period of up to @time_budget jiffies. If this function
306  * returns with a non-empty write queue, it will be purged later.
307  */
308 void dccp_flush_write_queue(struct sock *sk, long *time_budget)
309 {
310         struct dccp_sock *dp = dccp_sk(sk);
311         struct sk_buff *skb;
312         long delay, rc;
313 
314         while (*time_budget > 0 && (skb = skb_peek(&sk->sk_write_queue))) {
315                 rc = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb);
316 
317                 switch (ccid_packet_dequeue_eval(rc)) {
318                 case CCID_PACKET_WILL_DEQUEUE_LATER:
319                         /*
320                          * If the CCID determines when to send, the next sending
321                          * time is unknown or the CCID may not even send again
322                          * (e.g. remote host crashes or lost Ack packets).
323                          */
324                         DCCP_WARN("CCID did not manage to send all packets\n");
325                         return;
326                 case CCID_PACKET_DELAY:
327                         delay = msecs_to_jiffies(rc);
328                         if (delay > *time_budget)
329                                 return;
330                         rc = dccp_wait_for_ccid(sk, delay);
331                         if (rc < 0)
332                                 return;
333                         *time_budget -= (delay - rc);
334                         /* check again if we can send now */
335                         break;
336                 case CCID_PACKET_SEND_AT_ONCE:
337                         dccp_xmit_packet(sk);
338                         break;
339                 case CCID_PACKET_ERR:
340                         skb_dequeue(&sk->sk_write_queue);
341                         kfree_skb(skb);
342                         dccp_pr_debug("packet discarded due to err=%ld\n", rc);
343                 }
344         }
345 }
346 
347 void dccp_write_xmit(struct sock *sk)
348 {
349         struct dccp_sock *dp = dccp_sk(sk);
350         struct sk_buff *skb;
351 
352         while ((skb = dccp_qpolicy_top(sk))) {
353                 int rc = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb);
354 
355                 switch (ccid_packet_dequeue_eval(rc)) {
356                 case CCID_PACKET_WILL_DEQUEUE_LATER:
357                         return;
358                 case CCID_PACKET_DELAY:
359                         sk_reset_timer(sk, &dp->dccps_xmit_timer,
360                                        jiffies + msecs_to_jiffies(rc));
361                         return;
362                 case CCID_PACKET_SEND_AT_ONCE:
363                         dccp_xmit_packet(sk);
364                         break;
365                 case CCID_PACKET_ERR:
366                         dccp_qpolicy_drop(sk, skb);
367                         dccp_pr_debug("packet discarded due to err=%d\n", rc);
368                 }
369         }
370 }
371 
372 /**
373  * dccp_retransmit_skb  -  Retransmit Request, Close, or CloseReq packets
374  * There are only four retransmittable packet types in DCCP:
375  * - Request  in client-REQUEST  state (sec. 8.1.1),
376  * - CloseReq in server-CLOSEREQ state (sec. 8.3),
377  * - Close    in   node-CLOSING  state (sec. 8.3),
378  * - Acks in client-PARTOPEN state (sec. 8.1.5, handled by dccp_delack_timer()).
379  * This function expects sk->sk_send_head to contain the original skb.
380  */
381 int dccp_retransmit_skb(struct sock *sk)
382 {
383         WARN_ON(sk->sk_send_head == NULL);
384 
385         if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk) != 0)
386                 return -EHOSTUNREACH; /* Routing failure or similar. */
387 
388         /* this count is used to distinguish original and retransmitted skb */
389         inet_csk(sk)->icsk_retransmits++;
390 
391         return dccp_transmit_skb(sk, skb_clone(sk->sk_send_head, GFP_ATOMIC));
392 }
393 
394 struct sk_buff *dccp_make_response(const struct sock *sk, struct dst_entry *dst,
395                                    struct request_sock *req)
396 {
397         struct dccp_hdr *dh;
398         struct dccp_request_sock *dreq;
399         const u32 dccp_header_size = sizeof(struct dccp_hdr) +
400                                      sizeof(struct dccp_hdr_ext) +
401                                      sizeof(struct dccp_hdr_response);
402         struct sk_buff *skb;
403 
404         /* sk is marked const to clearly express we dont hold socket lock.
405          * sock_wmalloc() will atomically change sk->sk_wmem_alloc,
406          * it is safe to promote sk to non const.
407          */
408         skb = sock_wmalloc((struct sock *)sk, MAX_DCCP_HEADER, 1,
409                            GFP_ATOMIC);
410         if (!skb)
411                 return NULL;
412 
413         skb_reserve(skb, MAX_DCCP_HEADER);
414 
415         skb_dst_set(skb, dst_clone(dst));
416 
417         dreq = dccp_rsk(req);
418         if (inet_rsk(req)->acked)       /* increase GSS upon retransmission */
419                 dccp_inc_seqno(&dreq->dreq_gss);
420         DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE;
421         DCCP_SKB_CB(skb)->dccpd_seq  = dreq->dreq_gss;
422 
423         /* Resolve feature dependencies resulting from choice of CCID */
424         if (dccp_feat_server_ccid_dependencies(dreq))
425                 goto response_failed;
426 
427         if (dccp_insert_options_rsk(dreq, skb))
428                 goto response_failed;
429 
430         /* Build and checksum header */
431         dh = dccp_zeroed_hdr(skb, dccp_header_size);
432 
433         dh->dccph_sport = htons(inet_rsk(req)->ir_num);
434         dh->dccph_dport = inet_rsk(req)->ir_rmt_port;
435         dh->dccph_doff  = (dccp_header_size +
436                            DCCP_SKB_CB(skb)->dccpd_opt_len) / 4;
437         dh->dccph_type  = DCCP_PKT_RESPONSE;
438         dh->dccph_x     = 1;
439         dccp_hdr_set_seq(dh, dreq->dreq_gss);
440         dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), dreq->dreq_gsr);
441         dccp_hdr_response(skb)->dccph_resp_service = dreq->dreq_service;
442 
443         dccp_csum_outgoing(skb);
444 
445         /* We use `acked' to remember that a Response was already sent. */
446         inet_rsk(req)->acked = 1;
447         DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
448         return skb;
449 response_failed:
450         kfree_skb(skb);
451         return NULL;
452 }
453 
454 EXPORT_SYMBOL_GPL(dccp_make_response);
455 
456 /* answer offending packet in @rcv_skb with Reset from control socket @ctl */
457 struct sk_buff *dccp_ctl_make_reset(struct sock *sk, struct sk_buff *rcv_skb)
458 {
459         struct dccp_hdr *rxdh = dccp_hdr(rcv_skb), *dh;
460         struct dccp_skb_cb *dcb = DCCP_SKB_CB(rcv_skb);
461         const u32 dccp_hdr_reset_len = sizeof(struct dccp_hdr) +
462                                        sizeof(struct dccp_hdr_ext) +
463                                        sizeof(struct dccp_hdr_reset);
464         struct dccp_hdr_reset *dhr;
465         struct sk_buff *skb;
466 
467         skb = alloc_skb(sk->sk_prot->max_header, GFP_ATOMIC);
468         if (skb == NULL)
469                 return NULL;
470 
471         skb_reserve(skb, sk->sk_prot->max_header);
472 
473         /* Swap the send and the receive. */
474         dh = dccp_zeroed_hdr(skb, dccp_hdr_reset_len);
475         dh->dccph_type  = DCCP_PKT_RESET;
476         dh->dccph_sport = rxdh->dccph_dport;
477         dh->dccph_dport = rxdh->dccph_sport;
478         dh->dccph_doff  = dccp_hdr_reset_len / 4;
479         dh->dccph_x     = 1;
480 
481         dhr = dccp_hdr_reset(skb);
482         dhr->dccph_reset_code = dcb->dccpd_reset_code;
483 
484         switch (dcb->dccpd_reset_code) {
485         case DCCP_RESET_CODE_PACKET_ERROR:
486                 dhr->dccph_reset_data[0] = rxdh->dccph_type;
487                 break;
488         case DCCP_RESET_CODE_OPTION_ERROR:      /* fall through */
489         case DCCP_RESET_CODE_MANDATORY_ERROR:
490                 memcpy(dhr->dccph_reset_data, dcb->dccpd_reset_data, 3);
491                 break;
492         }
493         /*
494          * From RFC 4340, 8.3.1:
495          *   If P.ackno exists, set R.seqno := P.ackno + 1.
496          *   Else set R.seqno := 0.
497          */
498         if (dcb->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ)
499                 dccp_hdr_set_seq(dh, ADD48(dcb->dccpd_ack_seq, 1));
500         dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), dcb->dccpd_seq);
501 
502         dccp_csum_outgoing(skb);
503         return skb;
504 }
505 
506 EXPORT_SYMBOL_GPL(dccp_ctl_make_reset);
507 
508 /* send Reset on established socket, to close or abort the connection */
509 int dccp_send_reset(struct sock *sk, enum dccp_reset_codes code)
510 {
511         struct sk_buff *skb;
512         /*
513          * FIXME: what if rebuild_header fails?
514          * Should we be doing a rebuild_header here?
515          */
516         int err = inet_csk(sk)->icsk_af_ops->rebuild_header(sk);
517 
518         if (err != 0)
519                 return err;
520 
521         skb = sock_wmalloc(sk, sk->sk_prot->max_header, 1, GFP_ATOMIC);
522         if (skb == NULL)
523                 return -ENOBUFS;
524 
525         /* Reserve space for headers and prepare control bits. */
526         skb_reserve(skb, sk->sk_prot->max_header);
527         DCCP_SKB_CB(skb)->dccpd_type       = DCCP_PKT_RESET;
528         DCCP_SKB_CB(skb)->dccpd_reset_code = code;
529 
530         return dccp_transmit_skb(sk, skb);
531 }
532 
533 /*
534  * Do all connect socket setups that can be done AF independent.
535  */
536 int dccp_connect(struct sock *sk)
537 {
538         struct sk_buff *skb;
539         struct dccp_sock *dp = dccp_sk(sk);
540         struct dst_entry *dst = __sk_dst_get(sk);
541         struct inet_connection_sock *icsk = inet_csk(sk);
542 
543         sk->sk_err = 0;
544         sock_reset_flag(sk, SOCK_DONE);
545 
546         dccp_sync_mss(sk, dst_mtu(dst));
547 
548         /* do not connect if feature negotiation setup fails */
549         if (dccp_feat_finalise_settings(dccp_sk(sk)))
550                 return -EPROTO;
551 
552         /* Initialise GAR as per 8.5; AWL/AWH are set in dccp_transmit_skb() */
553         dp->dccps_gar = dp->dccps_iss;
554 
555         skb = alloc_skb(sk->sk_prot->max_header, sk->sk_allocation);
556         if (unlikely(skb == NULL))
557                 return -ENOBUFS;
558 
559         /* Reserve space for headers. */
560         skb_reserve(skb, sk->sk_prot->max_header);
561 
562         DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_REQUEST;
563 
564         dccp_transmit_skb(sk, dccp_skb_entail(sk, skb));
565         DCCP_INC_STATS(DCCP_MIB_ACTIVEOPENS);
566 
567         /* Timer for repeating the REQUEST until an answer. */
568         icsk->icsk_retransmits = 0;
569         inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
570                                   icsk->icsk_rto, DCCP_RTO_MAX);
571         return 0;
572 }
573 
574 EXPORT_SYMBOL_GPL(dccp_connect);
575 
576 void dccp_send_ack(struct sock *sk)
577 {
578         /* If we have been reset, we may not send again. */
579         if (sk->sk_state != DCCP_CLOSED) {
580                 struct sk_buff *skb = alloc_skb(sk->sk_prot->max_header,
581                                                 GFP_ATOMIC);
582 
583                 if (skb == NULL) {
584                         inet_csk_schedule_ack(sk);
585                         inet_csk(sk)->icsk_ack.ato = TCP_ATO_MIN;
586                         inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
587                                                   TCP_DELACK_MAX,
588                                                   DCCP_RTO_MAX);
589                         return;
590                 }
591 
592                 /* Reserve space for headers */
593                 skb_reserve(skb, sk->sk_prot->max_header);
594                 DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_ACK;
595                 dccp_transmit_skb(sk, skb);
596         }
597 }
598 
599 EXPORT_SYMBOL_GPL(dccp_send_ack);
600 
601 #if 0
602 /* FIXME: Is this still necessary (11.3) - currently nowhere used by DCCP. */
603 void dccp_send_delayed_ack(struct sock *sk)
604 {
605         struct inet_connection_sock *icsk = inet_csk(sk);
606         /*
607          * FIXME: tune this timer. elapsed time fixes the skew, so no problem
608          * with using 2s, and active senders also piggyback the ACK into a
609          * DATAACK packet, so this is really for quiescent senders.
610          */
611         unsigned long timeout = jiffies + 2 * HZ;
612 
613         /* Use new timeout only if there wasn't a older one earlier. */
614         if (icsk->icsk_ack.pending & ICSK_ACK_TIMER) {
615                 /* If delack timer was blocked or is about to expire,
616                  * send ACK now.
617                  *
618                  * FIXME: check the "about to expire" part
619                  */
620                 if (icsk->icsk_ack.blocked) {
621                         dccp_send_ack(sk);
622                         return;
623                 }
624 
625                 if (!time_before(timeout, icsk->icsk_ack.timeout))
626                         timeout = icsk->icsk_ack.timeout;
627         }
628         icsk->icsk_ack.pending |= ICSK_ACK_SCHED | ICSK_ACK_TIMER;
629         icsk->icsk_ack.timeout = timeout;
630         sk_reset_timer(sk, &icsk->icsk_delack_timer, timeout);
631 }
632 #endif
633 
634 void dccp_send_sync(struct sock *sk, const u64 ackno,
635                     const enum dccp_pkt_type pkt_type)
636 {
637         /*
638          * We are not putting this on the write queue, so
639          * dccp_transmit_skb() will set the ownership to this
640          * sock.
641          */
642         struct sk_buff *skb = alloc_skb(sk->sk_prot->max_header, GFP_ATOMIC);
643 
644         if (skb == NULL) {
645                 /* FIXME: how to make sure the sync is sent? */
646                 DCCP_CRIT("could not send %s", dccp_packet_name(pkt_type));
647                 return;
648         }
649 
650         /* Reserve space for headers and prepare control bits. */
651         skb_reserve(skb, sk->sk_prot->max_header);
652         DCCP_SKB_CB(skb)->dccpd_type = pkt_type;
653         DCCP_SKB_CB(skb)->dccpd_ack_seq = ackno;
654 
655         /*
656          * Clear the flag in case the Sync was scheduled for out-of-band data,
657          * such as carrying a long Ack Vector.
658          */
659         dccp_sk(sk)->dccps_sync_scheduled = 0;
660 
661         dccp_transmit_skb(sk, skb);
662 }
663 
664 EXPORT_SYMBOL_GPL(dccp_send_sync);
665 
666 /*
667  * Send a DCCP_PKT_CLOSE/CLOSEREQ. The caller locks the socket for us. This
668  * cannot be allowed to fail queueing a DCCP_PKT_CLOSE/CLOSEREQ frame under
669  * any circumstances.
670  */
671 void dccp_send_close(struct sock *sk, const int active)
672 {
673         struct dccp_sock *dp = dccp_sk(sk);
674         struct sk_buff *skb;
675         const gfp_t prio = active ? GFP_KERNEL : GFP_ATOMIC;
676 
677         skb = alloc_skb(sk->sk_prot->max_header, prio);
678         if (skb == NULL)
679                 return;
680 
681         /* Reserve space for headers and prepare control bits. */
682         skb_reserve(skb, sk->sk_prot->max_header);
683         if (dp->dccps_role == DCCP_ROLE_SERVER && !dp->dccps_server_timewait)
684                 DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_CLOSEREQ;
685         else
686                 DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_CLOSE;
687 
688         if (active) {
689                 skb = dccp_skb_entail(sk, skb);
690                 /*
691                  * Retransmission timer for active-close: RFC 4340, 8.3 requires
692                  * to retransmit the Close/CloseReq until the CLOSING/CLOSEREQ
693                  * state can be left. The initial timeout is 2 RTTs.
694                  * Since RTT measurement is done by the CCIDs, there is no easy
695                  * way to get an RTT sample. The fallback RTT from RFC 4340, 3.4
696                  * is too low (200ms); we use a high value to avoid unnecessary
697                  * retransmissions when the link RTT is > 0.2 seconds.
698                  * FIXME: Let main module sample RTTs and use that instead.
699                  */
700                 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
701                                           DCCP_TIMEOUT_INIT, DCCP_RTO_MAX);
702         }
703         dccp_transmit_skb(sk, skb);
704 }
705 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp