1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
50
51#include <linux/types.h>
52#include <linux/list.h>
53#include <linux/socket.h>
54#include <linux/ip.h>
55#include <linux/slab.h>
56#include <net/sock.h>
57
58#include <net/sctp/sctp.h>
59#include <net/sctp/sm.h>
60
61
62static int sctp_acked(struct sctp_sackhdr *sack, __u32 tsn);
63static void sctp_check_transmitted(struct sctp_outq *q,
64 struct list_head *transmitted_queue,
65 struct sctp_transport *transport,
66 struct sctp_sackhdr *sack,
67 __u32 *highest_new_tsn);
68
69static void sctp_mark_missing(struct sctp_outq *q,
70 struct list_head *transmitted_queue,
71 struct sctp_transport *transport,
72 __u32 highest_new_tsn,
73 int count_of_newacks);
74
75static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 sack_ctsn);
76
77static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout);
78
79
80static inline void sctp_outq_head_data(struct sctp_outq *q,
81 struct sctp_chunk *ch)
82{
83 list_add(&ch->list, &q->out_chunk_list);
84 q->out_qlen += ch->skb->len;
85}
86
87
88static inline struct sctp_chunk *sctp_outq_dequeue_data(struct sctp_outq *q)
89{
90 struct sctp_chunk *ch = NULL;
91
92 if (!list_empty(&q->out_chunk_list)) {
93 struct list_head *entry = q->out_chunk_list.next;
94
95 ch = list_entry(entry, struct sctp_chunk, list);
96 list_del_init(entry);
97 q->out_qlen -= ch->skb->len;
98 }
99 return ch;
100}
101
102static inline void sctp_outq_tail_data(struct sctp_outq *q,
103 struct sctp_chunk *ch)
104{
105 list_add_tail(&ch->list, &q->out_chunk_list);
106 q->out_qlen += ch->skb->len;
107}
108
109
110
111
112
113
114
115static inline int sctp_cacc_skip_3_1_d(struct sctp_transport *primary,
116 struct sctp_transport *transport,
117 int count_of_newacks)
118{
119 if (count_of_newacks >=2 && transport != primary)
120 return 1;
121 return 0;
122}
123
124
125
126
127
128
129
130
131static inline int sctp_cacc_skip_3_1_f(struct sctp_transport *transport,
132 int count_of_newacks)
133{
134 if (count_of_newacks < 2 &&
135 (transport && !transport->cacc.cacc_saw_newack))
136 return 1;
137 return 0;
138}
139
140
141
142
143
144
145
146
147static inline int sctp_cacc_skip_3_1(struct sctp_transport *primary,
148 struct sctp_transport *transport,
149 int count_of_newacks)
150{
151 if (!primary->cacc.cycling_changeover) {
152 if (sctp_cacc_skip_3_1_d(primary, transport, count_of_newacks))
153 return 1;
154 if (sctp_cacc_skip_3_1_f(transport, count_of_newacks))
155 return 1;
156 return 0;
157 }
158 return 0;
159}
160
161
162
163
164
165
166
167
168static inline int sctp_cacc_skip_3_2(struct sctp_transport *primary, __u32 tsn)
169{
170 if (primary->cacc.cycling_changeover &&
171 TSN_lt(tsn, primary->cacc.next_tsn_at_change))
172 return 1;
173 return 0;
174}
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190static inline int sctp_cacc_skip(struct sctp_transport *primary,
191 struct sctp_transport *transport,
192 int count_of_newacks,
193 __u32 tsn)
194{
195 if (primary->cacc.changeover_active &&
196 (sctp_cacc_skip_3_1(primary, transport, count_of_newacks) ||
197 sctp_cacc_skip_3_2(primary, tsn)))
198 return 1;
199 return 0;
200}
201
202
203
204
205
206void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q)
207{
208 q->asoc = asoc;
209 INIT_LIST_HEAD(&q->out_chunk_list);
210 INIT_LIST_HEAD(&q->control_chunk_list);
211 INIT_LIST_HEAD(&q->retransmit);
212 INIT_LIST_HEAD(&q->sacked);
213 INIT_LIST_HEAD(&q->abandoned);
214
215 q->fast_rtx = 0;
216 q->outstanding_bytes = 0;
217 q->empty = 1;
218 q->cork = 0;
219
220 q->malloced = 0;
221 q->out_qlen = 0;
222}
223
224
225
226void sctp_outq_teardown(struct sctp_outq *q)
227{
228 struct sctp_transport *transport;
229 struct list_head *lchunk, *temp;
230 struct sctp_chunk *chunk, *tmp;
231
232
233 list_for_each_entry(transport, &q->asoc->peer.transport_addr_list,
234 transports) {
235 while ((lchunk = sctp_list_dequeue(&transport->transmitted)) != NULL) {
236 chunk = list_entry(lchunk, struct sctp_chunk,
237 transmitted_list);
238
239 sctp_chunk_fail(chunk, q->error);
240 sctp_chunk_free(chunk);
241 }
242 }
243
244
245 list_for_each_safe(lchunk, temp, &q->sacked) {
246 list_del_init(lchunk);
247 chunk = list_entry(lchunk, struct sctp_chunk,
248 transmitted_list);
249 sctp_chunk_fail(chunk, q->error);
250 sctp_chunk_free(chunk);
251 }
252
253
254 list_for_each_safe(lchunk, temp, &q->retransmit) {
255 list_del_init(lchunk);
256 chunk = list_entry(lchunk, struct sctp_chunk,
257 transmitted_list);
258 sctp_chunk_fail(chunk, q->error);
259 sctp_chunk_free(chunk);
260 }
261
262
263 list_for_each_safe(lchunk, temp, &q->abandoned) {
264 list_del_init(lchunk);
265 chunk = list_entry(lchunk, struct sctp_chunk,
266 transmitted_list);
267 sctp_chunk_fail(chunk, q->error);
268 sctp_chunk_free(chunk);
269 }
270
271
272 while ((chunk = sctp_outq_dequeue_data(q)) != NULL) {
273
274
275 sctp_chunk_fail(chunk, q->error);
276 sctp_chunk_free(chunk);
277 }
278
279 q->error = 0;
280
281
282 list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) {
283 list_del_init(&chunk->list);
284 sctp_chunk_free(chunk);
285 }
286}
287
288
289void sctp_outq_free(struct sctp_outq *q)
290{
291
292 sctp_outq_teardown(q);
293
294
295 if (q->malloced)
296 kfree(q);
297}
298
299
300int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk)
301{
302 int error = 0;
303
304 SCTP_DEBUG_PRINTK("sctp_outq_tail(%p, %p[%s])\n",
305 q, chunk, chunk && chunk->chunk_hdr ?
306 sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type))
307 : "Illegal Chunk");
308
309
310
311
312 if (sctp_chunk_is_data(chunk)) {
313
314
315
316
317
318
319
320
321
322 switch (q->asoc->state) {
323 case SCTP_STATE_CLOSED:
324 case SCTP_STATE_SHUTDOWN_PENDING:
325 case SCTP_STATE_SHUTDOWN_SENT:
326 case SCTP_STATE_SHUTDOWN_RECEIVED:
327 case SCTP_STATE_SHUTDOWN_ACK_SENT:
328
329 error = -ESHUTDOWN;
330 break;
331
332 default:
333 SCTP_DEBUG_PRINTK("outqueueing (%p, %p[%s])\n",
334 q, chunk, chunk && chunk->chunk_hdr ?
335 sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type))
336 : "Illegal Chunk");
337
338 sctp_outq_tail_data(q, chunk);
339 if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
340 SCTP_INC_STATS(SCTP_MIB_OUTUNORDERCHUNKS);
341 else
342 SCTP_INC_STATS(SCTP_MIB_OUTORDERCHUNKS);
343 q->empty = 0;
344 break;
345 }
346 } else {
347 list_add_tail(&chunk->list, &q->control_chunk_list);
348 SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
349 }
350
351 if (error < 0)
352 return error;
353
354 if (!q->cork)
355 error = sctp_outq_flush(q, 0);
356
357 return error;
358}
359
360
361
362
363static void sctp_insert_list(struct list_head *head, struct list_head *new)
364{
365 struct list_head *pos;
366 struct sctp_chunk *nchunk, *lchunk;
367 __u32 ntsn, ltsn;
368 int done = 0;
369
370 nchunk = list_entry(new, struct sctp_chunk, transmitted_list);
371 ntsn = ntohl(nchunk->subh.data_hdr->tsn);
372
373 list_for_each(pos, head) {
374 lchunk = list_entry(pos, struct sctp_chunk, transmitted_list);
375 ltsn = ntohl(lchunk->subh.data_hdr->tsn);
376 if (TSN_lt(ntsn, ltsn)) {
377 list_add(new, pos->prev);
378 done = 1;
379 break;
380 }
381 }
382 if (!done)
383 list_add_tail(new, head);
384}
385
386
387void sctp_retransmit_mark(struct sctp_outq *q,
388 struct sctp_transport *transport,
389 __u8 reason)
390{
391 struct list_head *lchunk, *ltemp;
392 struct sctp_chunk *chunk;
393
394
395 list_for_each_safe(lchunk, ltemp, &transport->transmitted) {
396 chunk = list_entry(lchunk, struct sctp_chunk,
397 transmitted_list);
398
399
400 if (sctp_chunk_abandoned(chunk)) {
401 list_del_init(lchunk);
402 sctp_insert_list(&q->abandoned, lchunk);
403
404
405
406
407
408
409 if (!chunk->tsn_gap_acked) {
410 if (chunk->transport)
411 chunk->transport->flight_size -=
412 sctp_data_size(chunk);
413 q->outstanding_bytes -= sctp_data_size(chunk);
414 q->asoc->peer.rwnd += sctp_data_size(chunk);
415 }
416 continue;
417 }
418
419
420
421
422
423 if ((reason == SCTP_RTXR_FAST_RTX &&
424 (chunk->fast_retransmit == SCTP_NEED_FRTX)) ||
425 (reason != SCTP_RTXR_FAST_RTX && !chunk->tsn_gap_acked)) {
426
427
428
429
430
431
432
433
434 q->asoc->peer.rwnd += sctp_data_size(chunk);
435 q->outstanding_bytes -= sctp_data_size(chunk);
436 if (chunk->transport)
437 transport->flight_size -= sctp_data_size(chunk);
438
439
440
441
442
443
444 chunk->tsn_missing_report = 0;
445
446
447
448
449
450
451
452 if (chunk->rtt_in_progress) {
453 chunk->rtt_in_progress = 0;
454 transport->rto_pending = 0;
455 }
456
457
458
459
460 list_del_init(lchunk);
461 sctp_insert_list(&q->retransmit, lchunk);
462 }
463 }
464
465 SCTP_DEBUG_PRINTK("%s: transport: %p, reason: %d, "
466 "cwnd: %d, ssthresh: %d, flight_size: %d, "
467 "pba: %d\n", __func__,
468 transport, reason,
469 transport->cwnd, transport->ssthresh,
470 transport->flight_size,
471 transport->partial_bytes_acked);
472
473}
474
475
476
477
478void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport,
479 sctp_retransmit_reason_t reason)
480{
481 int error = 0;
482
483 switch(reason) {
484 case SCTP_RTXR_T3_RTX:
485 SCTP_INC_STATS(SCTP_MIB_T3_RETRANSMITS);
486 sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_T3_RTX);
487
488
489
490 if (transport == transport->asoc->peer.retran_path)
491 sctp_assoc_update_retran_path(transport->asoc);
492 transport->asoc->rtx_data_chunks +=
493 transport->asoc->unack_data;
494 break;
495 case SCTP_RTXR_FAST_RTX:
496 SCTP_INC_STATS(SCTP_MIB_FAST_RETRANSMITS);
497 sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX);
498 q->fast_rtx = 1;
499 break;
500 case SCTP_RTXR_PMTUD:
501 SCTP_INC_STATS(SCTP_MIB_PMTUD_RETRANSMITS);
502 break;
503 case SCTP_RTXR_T1_RTX:
504 SCTP_INC_STATS(SCTP_MIB_T1_RETRANSMITS);
505 transport->asoc->init_retries++;
506 break;
507 default:
508 BUG();
509 }
510
511 sctp_retransmit_mark(q, transport, reason);
512
513
514
515
516
517 if (reason == SCTP_RTXR_T3_RTX)
518 sctp_generate_fwdtsn(q, q->asoc->ctsn_ack_point);
519
520
521
522
523
524 if (reason != SCTP_RTXR_FAST_RTX)
525 error = sctp_outq_flush(q, 1);
526
527 if (error)
528 q->asoc->base.sk->sk_err = -error;
529}
530
531
532
533
534
535
536
537
538
539static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
540 int rtx_timeout, int *start_timer)
541{
542 struct list_head *lqueue;
543 struct sctp_transport *transport = pkt->transport;
544 sctp_xmit_t status;
545 struct sctp_chunk *chunk, *chunk1;
546 int fast_rtx;
547 int error = 0;
548 int timer = 0;
549 int done = 0;
550
551 lqueue = &q->retransmit;
552 fast_rtx = q->fast_rtx;
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577 list_for_each_entry_safe(chunk, chunk1, lqueue, transmitted_list) {
578
579 if (sctp_chunk_abandoned(chunk)) {
580 list_del_init(&chunk->transmitted_list);
581 sctp_insert_list(&q->abandoned,
582 &chunk->transmitted_list);
583 continue;
584 }
585
586
587
588
589
590
591 if (chunk->tsn_gap_acked) {
592 list_del(&chunk->transmitted_list);
593 list_add_tail(&chunk->transmitted_list,
594 &transport->transmitted);
595 continue;
596 }
597
598
599
600
601 if (fast_rtx && !chunk->fast_retransmit)
602 continue;
603
604redo:
605
606 status = sctp_packet_append_chunk(pkt, chunk);
607
608 switch (status) {
609 case SCTP_XMIT_PMTU_FULL:
610 if (!pkt->has_data && !pkt->has_cookie_echo) {
611
612
613
614
615
616
617 sctp_packet_transmit(pkt);
618 goto redo;
619 }
620
621
622 error = sctp_packet_transmit(pkt);
623
624
625
626
627
628 if (rtx_timeout || fast_rtx)
629 done = 1;
630 else
631 goto redo;
632
633
634 break;
635
636 case SCTP_XMIT_RWND_FULL:
637
638 error = sctp_packet_transmit(pkt);
639
640
641
642
643 done = 1;
644 break;
645
646 case SCTP_XMIT_NAGLE_DELAY:
647
648 error = sctp_packet_transmit(pkt);
649
650
651 done = 1;
652 break;
653
654 default:
655
656
657
658 list_del(&chunk->transmitted_list);
659 list_add_tail(&chunk->transmitted_list,
660 &transport->transmitted);
661
662
663
664
665 if (chunk->fast_retransmit == SCTP_NEED_FRTX)
666 chunk->fast_retransmit = SCTP_DONT_FRTX;
667
668 q->empty = 0;
669 break;
670 }
671
672
673 if (!error && !timer)
674 timer = 1;
675
676 if (done)
677 break;
678 }
679
680
681
682
683
684
685 if (rtx_timeout || fast_rtx) {
686 list_for_each_entry(chunk1, lqueue, transmitted_list) {
687 if (chunk1->fast_retransmit == SCTP_NEED_FRTX)
688 chunk1->fast_retransmit = SCTP_DONT_FRTX;
689 }
690 }
691
692 *start_timer = timer;
693
694
695 if (fast_rtx)
696 q->fast_rtx = 0;
697
698 return error;
699}
700
701
702int sctp_outq_uncork(struct sctp_outq *q)
703{
704 int error = 0;
705 if (q->cork)
706 q->cork = 0;
707 error = sctp_outq_flush(q, 0);
708 return error;
709}
710
711
712
713
714
715
716
717
718
719
720
721static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
722{
723 struct sctp_packet *packet;
724 struct sctp_packet singleton;
725 struct sctp_association *asoc = q->asoc;
726 __u16 sport = asoc->base.bind_addr.port;
727 __u16 dport = asoc->peer.port;
728 __u32 vtag = asoc->peer.i.init_tag;
729 struct sctp_transport *transport = NULL;
730 struct sctp_transport *new_transport;
731 struct sctp_chunk *chunk, *tmp;
732 sctp_xmit_t status;
733 int error = 0;
734 int start_timer = 0;
735 int one_packet = 0;
736
737
738 struct list_head transport_list;
739 struct list_head *ltransport;
740
741 INIT_LIST_HEAD(&transport_list);
742 packet = NULL;
743
744
745
746
747
748
749
750
751
752
753
754 list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) {
755
756
757
758
759
760
761 if (asoc->src_out_of_asoc_ok &&
762 chunk->chunk_hdr->type != SCTP_CID_ASCONF)
763 continue;
764
765 list_del_init(&chunk->list);
766
767
768 new_transport = chunk->transport;
769
770 if (!new_transport) {
771
772
773
774
775
776
777
778
779
780
781 if (transport &&
782 sctp_cmp_addr_exact(&chunk->dest,
783 &transport->ipaddr))
784 new_transport = transport;
785 else
786 new_transport = sctp_assoc_lookup_paddr(asoc,
787 &chunk->dest);
788
789
790
791
792 if (!new_transport)
793 new_transport = asoc->peer.active_path;
794 } else if ((new_transport->state == SCTP_INACTIVE) ||
795 (new_transport->state == SCTP_UNCONFIRMED) ||
796 (new_transport->state == SCTP_PF)) {
797
798
799
800
801
802
803
804
805
806
807
808
809
810 if (chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT &&
811 chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT_ACK &&
812 chunk->chunk_hdr->type != SCTP_CID_ASCONF_ACK)
813 new_transport = asoc->peer.active_path;
814 }
815
816
817
818
819 if (new_transport != transport) {
820 transport = new_transport;
821 if (list_empty(&transport->send_ready)) {
822 list_add_tail(&transport->send_ready,
823 &transport_list);
824 }
825 packet = &transport->packet;
826 sctp_packet_config(packet, vtag,
827 asoc->peer.ecn_capable);
828 }
829
830 switch (chunk->chunk_hdr->type) {
831
832
833
834
835
836
837 case SCTP_CID_INIT:
838 case SCTP_CID_INIT_ACK:
839 case SCTP_CID_SHUTDOWN_COMPLETE:
840 sctp_packet_init(&singleton, transport, sport, dport);
841 sctp_packet_config(&singleton, vtag, 0);
842 sctp_packet_append_chunk(&singleton, chunk);
843 error = sctp_packet_transmit(&singleton);
844 if (error < 0)
845 return error;
846 break;
847
848 case SCTP_CID_ABORT:
849 if (sctp_test_T_bit(chunk)) {
850 packet->vtag = asoc->c.my_vtag;
851 }
852
853
854
855
856
857 case SCTP_CID_HEARTBEAT_ACK:
858 case SCTP_CID_SHUTDOWN_ACK:
859 case SCTP_CID_COOKIE_ACK:
860 case SCTP_CID_COOKIE_ECHO:
861 case SCTP_CID_ERROR:
862 case SCTP_CID_ECN_CWR:
863 case SCTP_CID_ASCONF_ACK:
864 one_packet = 1;
865
866
867 case SCTP_CID_SACK:
868 case SCTP_CID_HEARTBEAT:
869 case SCTP_CID_SHUTDOWN:
870 case SCTP_CID_ECN_ECNE:
871 case SCTP_CID_ASCONF:
872 case SCTP_CID_FWD_TSN:
873 status = sctp_packet_transmit_chunk(packet, chunk,
874 one_packet);
875 if (status != SCTP_XMIT_OK) {
876
877 list_add(&chunk->list, &q->control_chunk_list);
878 } else if (chunk->chunk_hdr->type == SCTP_CID_FWD_TSN) {
879
880
881
882
883 sctp_transport_reset_timers(transport);
884 }
885 break;
886
887 default:
888
889 BUG();
890 }
891 }
892
893 if (q->asoc->src_out_of_asoc_ok)
894 goto sctp_flush_out;
895
896
897 switch (asoc->state) {
898 case SCTP_STATE_COOKIE_ECHOED:
899
900
901
902 if (!packet || !packet->has_cookie_echo)
903 break;
904
905
906 case SCTP_STATE_ESTABLISHED:
907 case SCTP_STATE_SHUTDOWN_PENDING:
908 case SCTP_STATE_SHUTDOWN_RECEIVED:
909
910
911
912
913
914
915
916
917
918 if (!list_empty(&q->retransmit)) {
919 if (asoc->peer.retran_path->state == SCTP_UNCONFIRMED)
920 goto sctp_flush_out;
921 if (transport == asoc->peer.retran_path)
922 goto retran;
923
924
925
926 transport = asoc->peer.retran_path;
927
928 if (list_empty(&transport->send_ready)) {
929 list_add_tail(&transport->send_ready,
930 &transport_list);
931 }
932
933 packet = &transport->packet;
934 sctp_packet_config(packet, vtag,
935 asoc->peer.ecn_capable);
936 retran:
937 error = sctp_outq_flush_rtx(q, packet,
938 rtx_timeout, &start_timer);
939
940 if (start_timer)
941 sctp_transport_reset_timers(transport);
942
943
944
945
946 if (packet->has_cookie_echo)
947 goto sctp_flush_out;
948
949
950
951
952 if (!list_empty(&q->retransmit))
953 goto sctp_flush_out;
954 }
955
956
957
958
959
960
961 if (transport)
962 sctp_transport_burst_limited(transport);
963
964
965 while ((chunk = sctp_outq_dequeue_data(q)) != NULL) {
966
967
968
969 if (chunk->sinfo.sinfo_stream >=
970 asoc->c.sinit_num_ostreams) {
971
972
973 sctp_chunk_fail(chunk, SCTP_ERROR_INV_STRM);
974 sctp_chunk_free(chunk);
975 continue;
976 }
977
978
979 if (sctp_chunk_abandoned(chunk)) {
980 sctp_chunk_fail(chunk, 0);
981 sctp_chunk_free(chunk);
982 continue;
983 }
984
985
986
987
988 new_transport = chunk->transport;
989 if (!new_transport ||
990 ((new_transport->state == SCTP_INACTIVE) ||
991 (new_transport->state == SCTP_UNCONFIRMED) ||
992 (new_transport->state == SCTP_PF)))
993 new_transport = asoc->peer.active_path;
994 if (new_transport->state == SCTP_UNCONFIRMED)
995 continue;
996
997
998 if (new_transport != transport) {
999 transport = new_transport;
1000
1001
1002
1003
1004 if (list_empty(&transport->send_ready)) {
1005 list_add_tail(&transport->send_ready,
1006 &transport_list);
1007 }
1008
1009 packet = &transport->packet;
1010 sctp_packet_config(packet, vtag,
1011 asoc->peer.ecn_capable);
1012
1013
1014
1015 sctp_transport_burst_limited(transport);
1016 }
1017
1018 SCTP_DEBUG_PRINTK("sctp_outq_flush(%p, %p[%s]), ",
1019 q, chunk,
1020 chunk && chunk->chunk_hdr ?
1021 sctp_cname(SCTP_ST_CHUNK(
1022 chunk->chunk_hdr->type))
1023 : "Illegal Chunk");
1024
1025 SCTP_DEBUG_PRINTK("TX TSN 0x%x skb->head "
1026 "%p skb->users %d.\n",
1027 ntohl(chunk->subh.data_hdr->tsn),
1028 chunk->skb ?chunk->skb->head : NULL,
1029 chunk->skb ?
1030 atomic_read(&chunk->skb->users) : -1);
1031
1032
1033 status = sctp_packet_transmit_chunk(packet, chunk, 0);
1034
1035 switch (status) {
1036 case SCTP_XMIT_PMTU_FULL:
1037 case SCTP_XMIT_RWND_FULL:
1038 case SCTP_XMIT_NAGLE_DELAY:
1039
1040
1041
1042 SCTP_DEBUG_PRINTK("sctp_outq_flush: could "
1043 "not transmit TSN: 0x%x, status: %d\n",
1044 ntohl(chunk->subh.data_hdr->tsn),
1045 status);
1046 sctp_outq_head_data(q, chunk);
1047 goto sctp_flush_out;
1048 break;
1049
1050 case SCTP_XMIT_OK:
1051
1052
1053
1054
1055 if (asoc->state == SCTP_STATE_SHUTDOWN_PENDING)
1056 chunk->chunk_hdr->flags |= SCTP_DATA_SACK_IMM;
1057
1058 break;
1059
1060 default:
1061 BUG();
1062 }
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074 list_add_tail(&chunk->transmitted_list,
1075 &transport->transmitted);
1076
1077 sctp_transport_reset_timers(transport);
1078
1079 q->empty = 0;
1080
1081
1082
1083
1084 if (packet->has_cookie_echo)
1085 goto sctp_flush_out;
1086 }
1087 break;
1088
1089 default:
1090
1091 break;
1092 }
1093
1094sctp_flush_out:
1095
1096
1097
1098
1099
1100
1101
1102
1103 while ((ltransport = sctp_list_dequeue(&transport_list)) != NULL ) {
1104 struct sctp_transport *t = list_entry(ltransport,
1105 struct sctp_transport,
1106 send_ready);
1107 packet = &t->packet;
1108 if (!sctp_packet_empty(packet))
1109 error = sctp_packet_transmit(packet);
1110
1111
1112 sctp_transport_burst_reset(t);
1113 }
1114
1115 return error;
1116}
1117
1118
1119static void sctp_sack_update_unack_data(struct sctp_association *assoc,
1120 struct sctp_sackhdr *sack)
1121{
1122 sctp_sack_variable_t *frags;
1123 __u16 unack_data;
1124 int i;
1125
1126 unack_data = assoc->next_tsn - assoc->ctsn_ack_point - 1;
1127
1128 frags = sack->variable;
1129 for (i = 0; i < ntohs(sack->num_gap_ack_blocks); i++) {
1130 unack_data -= ((ntohs(frags[i].gab.end) -
1131 ntohs(frags[i].gab.start) + 1));
1132 }
1133
1134 assoc->unack_data = unack_data;
1135}
1136
1137
1138
1139
1140
1141
1142int sctp_outq_sack(struct sctp_outq *q, struct sctp_sackhdr *sack)
1143{
1144 struct sctp_association *asoc = q->asoc;
1145 struct sctp_transport *transport;
1146 struct sctp_chunk *tchunk = NULL;
1147 struct list_head *lchunk, *transport_list, *temp;
1148 sctp_sack_variable_t *frags = sack->variable;
1149 __u32 sack_ctsn, ctsn, tsn;
1150 __u32 highest_tsn, highest_new_tsn;
1151 __u32 sack_a_rwnd;
1152 unsigned int outstanding;
1153 struct sctp_transport *primary = asoc->peer.primary_path;
1154 int count_of_newacks = 0;
1155 int gap_ack_blocks;
1156 u8 accum_moved = 0;
1157
1158
1159 transport_list = &asoc->peer.transport_addr_list;
1160
1161 sack_ctsn = ntohl(sack->cum_tsn_ack);
1162 gap_ack_blocks = ntohs(sack->num_gap_ack_blocks);
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181 if (primary->cacc.changeover_active) {
1182 u8 clear_cycling = 0;
1183
1184 if (TSN_lte(primary->cacc.next_tsn_at_change, sack_ctsn)) {
1185 primary->cacc.changeover_active = 0;
1186 clear_cycling = 1;
1187 }
1188
1189 if (clear_cycling || gap_ack_blocks) {
1190 list_for_each_entry(transport, transport_list,
1191 transports) {
1192 if (clear_cycling)
1193 transport->cacc.cycling_changeover = 0;
1194 if (gap_ack_blocks)
1195 transport->cacc.cacc_saw_newack = 0;
1196 }
1197 }
1198 }
1199
1200
1201 highest_tsn = sack_ctsn;
1202 if (gap_ack_blocks)
1203 highest_tsn += ntohs(frags[gap_ack_blocks - 1].gab.end);
1204
1205 if (TSN_lt(asoc->highest_sacked, highest_tsn))
1206 asoc->highest_sacked = highest_tsn;
1207
1208 highest_new_tsn = sack_ctsn;
1209
1210
1211
1212
1213 sctp_check_transmitted(q, &q->retransmit, NULL, sack, &highest_new_tsn);
1214
1215
1216
1217
1218
1219
1220 list_for_each_entry(transport, transport_list, transports) {
1221 sctp_check_transmitted(q, &transport->transmitted,
1222 transport, sack, &highest_new_tsn);
1223
1224
1225
1226
1227
1228 if (transport->cacc.cacc_saw_newack)
1229 count_of_newacks ++;
1230 }
1231
1232
1233 if (TSN_lt(asoc->ctsn_ack_point, sack_ctsn)) {
1234 asoc->ctsn_ack_point = sack_ctsn;
1235 accum_moved = 1;
1236 }
1237
1238 if (gap_ack_blocks) {
1239
1240 if (asoc->fast_recovery && accum_moved)
1241 highest_new_tsn = highest_tsn;
1242
1243 list_for_each_entry(transport, transport_list, transports)
1244 sctp_mark_missing(q, &transport->transmitted, transport,
1245 highest_new_tsn, count_of_newacks);
1246 }
1247
1248
1249 sctp_sack_update_unack_data(asoc, sack);
1250
1251 ctsn = asoc->ctsn_ack_point;
1252
1253
1254 list_for_each_safe(lchunk, temp, &q->sacked) {
1255 tchunk = list_entry(lchunk, struct sctp_chunk,
1256 transmitted_list);
1257 tsn = ntohl(tchunk->subh.data_hdr->tsn);
1258 if (TSN_lte(tsn, ctsn)) {
1259 list_del_init(&tchunk->transmitted_list);
1260 sctp_chunk_free(tchunk);
1261 }
1262 }
1263
1264
1265
1266
1267
1268
1269 sack_a_rwnd = ntohl(sack->a_rwnd);
1270 outstanding = q->outstanding_bytes;
1271
1272 if (outstanding < sack_a_rwnd)
1273 sack_a_rwnd -= outstanding;
1274 else
1275 sack_a_rwnd = 0;
1276
1277 asoc->peer.rwnd = sack_a_rwnd;
1278
1279 sctp_generate_fwdtsn(q, sack_ctsn);
1280
1281 SCTP_DEBUG_PRINTK("%s: sack Cumulative TSN Ack is 0x%x.\n",
1282 __func__, sack_ctsn);
1283 SCTP_DEBUG_PRINTK("%s: Cumulative TSN Ack of association, "
1284 "%p is 0x%x. Adv peer ack point: 0x%x\n",
1285 __func__, asoc, ctsn, asoc->adv_peer_ack_point);
1286
1287
1288
1289
1290 q->empty = (list_empty(&q->out_chunk_list) &&
1291 list_empty(&q->retransmit));
1292 if (!q->empty)
1293 goto finish;
1294
1295 list_for_each_entry(transport, transport_list, transports) {
1296 q->empty = q->empty && list_empty(&transport->transmitted);
1297 if (!q->empty)
1298 goto finish;
1299 }
1300
1301 SCTP_DEBUG_PRINTK("sack queue is empty.\n");
1302finish:
1303 return q->empty;
1304}
1305
1306
1307int sctp_outq_is_empty(const struct sctp_outq *q)
1308{
1309 return q->empty;
1310}
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326static void sctp_check_transmitted(struct sctp_outq *q,
1327 struct list_head *transmitted_queue,
1328 struct sctp_transport *transport,
1329 struct sctp_sackhdr *sack,
1330 __u32 *highest_new_tsn_in_sack)
1331{
1332 struct list_head *lchunk;
1333 struct sctp_chunk *tchunk;
1334 struct list_head tlist;
1335 __u32 tsn;
1336 __u32 sack_ctsn;
1337 __u32 rtt;
1338 __u8 restart_timer = 0;
1339 int bytes_acked = 0;
1340 int migrate_bytes = 0;
1341
1342
1343
1344#if SCTP_DEBUG
1345 __u32 dbg_ack_tsn = 0;
1346 __u32 dbg_last_ack_tsn = 0;
1347 __u32 dbg_kept_tsn = 0;
1348 __u32 dbg_last_kept_tsn = 0;
1349
1350
1351
1352
1353
1354 int dbg_prt_state = -1;
1355#endif
1356
1357 sack_ctsn = ntohl(sack->cum_tsn_ack);
1358
1359 INIT_LIST_HEAD(&tlist);
1360
1361
1362 while (NULL != (lchunk = sctp_list_dequeue(transmitted_queue))) {
1363 tchunk = list_entry(lchunk, struct sctp_chunk,
1364 transmitted_list);
1365
1366 if (sctp_chunk_abandoned(tchunk)) {
1367
1368 sctp_insert_list(&q->abandoned, lchunk);
1369
1370
1371
1372
1373 if (!tchunk->tsn_gap_acked) {
1374 if (tchunk->transport)
1375 tchunk->transport->flight_size -=
1376 sctp_data_size(tchunk);
1377 q->outstanding_bytes -= sctp_data_size(tchunk);
1378 }
1379 continue;
1380 }
1381
1382 tsn = ntohl(tchunk->subh.data_hdr->tsn);
1383 if (sctp_acked(sack, tsn)) {
1384
1385
1386
1387
1388
1389 if (transport) {
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401 if (!tchunk->tsn_gap_acked &&
1402 tchunk->rtt_in_progress) {
1403 tchunk->rtt_in_progress = 0;
1404 rtt = jiffies - tchunk->sent_at;
1405 sctp_transport_update_rto(transport,
1406 rtt);
1407 }
1408 }
1409
1410
1411
1412
1413
1414
1415
1416 if (!tchunk->tsn_gap_acked) {
1417 tchunk->tsn_gap_acked = 1;
1418 *highest_new_tsn_in_sack = tsn;
1419 bytes_acked += sctp_data_size(tchunk);
1420 if (!tchunk->transport)
1421 migrate_bytes += sctp_data_size(tchunk);
1422 }
1423
1424 if (TSN_lte(tsn, sack_ctsn)) {
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434 restart_timer = 1;
1435
1436 if (!tchunk->tsn_gap_acked) {
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450 if (transport &&
1451 sack->num_gap_ack_blocks &&
1452 q->asoc->peer.primary_path->cacc.
1453 changeover_active)
1454 transport->cacc.cacc_saw_newack
1455 = 1;
1456 }
1457
1458 list_add_tail(&tchunk->transmitted_list,
1459 &q->sacked);
1460 } else {
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476 list_add_tail(lchunk, &tlist);
1477 }
1478
1479#if SCTP_DEBUG
1480 switch (dbg_prt_state) {
1481 case 0:
1482 if (dbg_last_ack_tsn + 1 == tsn) {
1483
1484
1485
1486 break;
1487 }
1488
1489 if (dbg_last_ack_tsn != dbg_ack_tsn) {
1490
1491
1492
1493 SCTP_DEBUG_PRINTK_CONT("-%08x",
1494 dbg_last_ack_tsn);
1495 }
1496
1497
1498 SCTP_DEBUG_PRINTK_CONT(",%08x", tsn);
1499 dbg_ack_tsn = tsn;
1500 break;
1501
1502 case 1:
1503 if (dbg_last_kept_tsn != dbg_kept_tsn) {
1504
1505 SCTP_DEBUG_PRINTK_CONT("-%08x",
1506 dbg_last_kept_tsn);
1507 }
1508
1509 SCTP_DEBUG_PRINTK_CONT("\n");
1510
1511
1512 default:
1513
1514
1515 SCTP_DEBUG_PRINTK("ACKed: %08x", tsn);
1516 dbg_prt_state = 0;
1517 dbg_ack_tsn = tsn;
1518 }
1519
1520 dbg_last_ack_tsn = tsn;
1521#endif
1522
1523 } else {
1524 if (tchunk->tsn_gap_acked) {
1525 SCTP_DEBUG_PRINTK("%s: Receiver reneged on "
1526 "data TSN: 0x%x\n",
1527 __func__,
1528 tsn);
1529 tchunk->tsn_gap_acked = 0;
1530
1531 if (tchunk->transport)
1532 bytes_acked -= sctp_data_size(tchunk);
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543 restart_timer = 1;
1544 }
1545
1546 list_add_tail(lchunk, &tlist);
1547
1548#if SCTP_DEBUG
1549
1550 switch (dbg_prt_state) {
1551 case 1:
1552 if (dbg_last_kept_tsn + 1 == tsn)
1553 break;
1554
1555 if (dbg_last_kept_tsn != dbg_kept_tsn)
1556 SCTP_DEBUG_PRINTK_CONT("-%08x",
1557 dbg_last_kept_tsn);
1558
1559 SCTP_DEBUG_PRINTK_CONT(",%08x", tsn);
1560 dbg_kept_tsn = tsn;
1561 break;
1562
1563 case 0:
1564 if (dbg_last_ack_tsn != dbg_ack_tsn)
1565 SCTP_DEBUG_PRINTK_CONT("-%08x",
1566 dbg_last_ack_tsn);
1567 SCTP_DEBUG_PRINTK_CONT("\n");
1568
1569
1570 default:
1571 SCTP_DEBUG_PRINTK("KEPT: %08x",tsn);
1572 dbg_prt_state = 1;
1573 dbg_kept_tsn = tsn;
1574 }
1575
1576 dbg_last_kept_tsn = tsn;
1577#endif
1578 }
1579 }
1580
1581#if SCTP_DEBUG
1582
1583 switch (dbg_prt_state) {
1584 case 0:
1585 if (dbg_last_ack_tsn != dbg_ack_tsn) {
1586 SCTP_DEBUG_PRINTK_CONT("-%08x\n", dbg_last_ack_tsn);
1587 } else {
1588 SCTP_DEBUG_PRINTK_CONT("\n");
1589 }
1590 break;
1591
1592 case 1:
1593 if (dbg_last_kept_tsn != dbg_kept_tsn) {
1594 SCTP_DEBUG_PRINTK_CONT("-%08x\n", dbg_last_kept_tsn);
1595 } else {
1596 SCTP_DEBUG_PRINTK_CONT("\n");
1597 }
1598 }
1599#endif
1600 if (transport) {
1601 if (bytes_acked) {
1602 struct sctp_association *asoc = transport->asoc;
1603
1604
1605
1606
1607
1608
1609
1610 bytes_acked -= migrate_bytes;
1611
1612
1613
1614
1615
1616
1617
1618
1619 transport->error_count = 0;
1620 transport->asoc->overall_error_count = 0;
1621
1622
1623
1624
1625
1626
1627
1628 if (asoc->state == SCTP_STATE_SHUTDOWN_PENDING &&
1629 del_timer(&asoc->timers
1630 [SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]))
1631 sctp_association_put(asoc);
1632
1633
1634
1635
1636 if ((transport->state == SCTP_INACTIVE) ||
1637 (transport->state == SCTP_UNCONFIRMED)) {
1638 sctp_assoc_control_transport(
1639 transport->asoc,
1640 transport,
1641 SCTP_TRANSPORT_UP,
1642 SCTP_RECEIVED_SACK);
1643 }
1644
1645 sctp_transport_raise_cwnd(transport, sack_ctsn,
1646 bytes_acked);
1647
1648 transport->flight_size -= bytes_acked;
1649 if (transport->flight_size == 0)
1650 transport->partial_bytes_acked = 0;
1651 q->outstanding_bytes -= bytes_acked + migrate_bytes;
1652 } else {
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667 if (!q->asoc->peer.rwnd &&
1668 !list_empty(&tlist) &&
1669 (sack_ctsn+2 == q->asoc->next_tsn) &&
1670 q->asoc->state < SCTP_STATE_SHUTDOWN_PENDING) {
1671 SCTP_DEBUG_PRINTK("%s: SACK received for zero "
1672 "window probe: %u\n",
1673 __func__, sack_ctsn);
1674 q->asoc->overall_error_count = 0;
1675 transport->error_count = 0;
1676 }
1677 }
1678
1679
1680
1681
1682
1683
1684
1685 if (!transport->flight_size) {
1686 if (timer_pending(&transport->T3_rtx_timer) &&
1687 del_timer(&transport->T3_rtx_timer)) {
1688 sctp_transport_put(transport);
1689 }
1690 } else if (restart_timer) {
1691 if (!mod_timer(&transport->T3_rtx_timer,
1692 jiffies + transport->rto))
1693 sctp_transport_hold(transport);
1694 }
1695 }
1696
1697 list_splice(&tlist, transmitted_queue);
1698}
1699
1700
1701static void sctp_mark_missing(struct sctp_outq *q,
1702 struct list_head *transmitted_queue,
1703 struct sctp_transport *transport,
1704 __u32 highest_new_tsn_in_sack,
1705 int count_of_newacks)
1706{
1707 struct sctp_chunk *chunk;
1708 __u32 tsn;
1709 char do_fast_retransmit = 0;
1710 struct sctp_association *asoc = q->asoc;
1711 struct sctp_transport *primary = asoc->peer.primary_path;
1712
1713 list_for_each_entry(chunk, transmitted_queue, transmitted_list) {
1714
1715 tsn = ntohl(chunk->subh.data_hdr->tsn);
1716
1717
1718
1719
1720
1721
1722
1723
1724 if (chunk->fast_retransmit == SCTP_CAN_FRTX &&
1725 !chunk->tsn_gap_acked &&
1726 TSN_lt(tsn, highest_new_tsn_in_sack)) {
1727
1728
1729
1730
1731 if (!transport || !sctp_cacc_skip(primary,
1732 chunk->transport,
1733 count_of_newacks, tsn)) {
1734 chunk->tsn_missing_report++;
1735
1736 SCTP_DEBUG_PRINTK(
1737 "%s: TSN 0x%x missing counter: %d\n",
1738 __func__, tsn,
1739 chunk->tsn_missing_report);
1740 }
1741 }
1742
1743
1744
1745
1746
1747
1748
1749 if (chunk->tsn_missing_report >= 3) {
1750 chunk->fast_retransmit = SCTP_NEED_FRTX;
1751 do_fast_retransmit = 1;
1752 }
1753 }
1754
1755 if (transport) {
1756 if (do_fast_retransmit)
1757 sctp_retransmit(q, transport, SCTP_RTXR_FAST_RTX);
1758
1759 SCTP_DEBUG_PRINTK("%s: transport: %p, cwnd: %d, "
1760 "ssthresh: %d, flight_size: %d, pba: %d\n",
1761 __func__, transport, transport->cwnd,
1762 transport->ssthresh, transport->flight_size,
1763 transport->partial_bytes_acked);
1764 }
1765}
1766
1767
1768static int sctp_acked(struct sctp_sackhdr *sack, __u32 tsn)
1769{
1770 int i;
1771 sctp_sack_variable_t *frags;
1772 __u16 gap;
1773 __u32 ctsn = ntohl(sack->cum_tsn_ack);
1774
1775 if (TSN_lte(tsn, ctsn))
1776 goto pass;
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790 frags = sack->variable;
1791 gap = tsn - ctsn;
1792 for (i = 0; i < ntohs(sack->num_gap_ack_blocks); ++i) {
1793 if (TSN_lte(ntohs(frags[i].gab.start), gap) &&
1794 TSN_lte(gap, ntohs(frags[i].gab.end)))
1795 goto pass;
1796 }
1797
1798 return 0;
1799pass:
1800 return 1;
1801}
1802
1803static inline int sctp_get_skip_pos(struct sctp_fwdtsn_skip *skiplist,
1804 int nskips, __be16 stream)
1805{
1806 int i;
1807
1808 for (i = 0; i < nskips; i++) {
1809 if (skiplist[i].stream == stream)
1810 return i;
1811 }
1812 return i;
1813}
1814
1815
1816static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
1817{
1818 struct sctp_association *asoc = q->asoc;
1819 struct sctp_chunk *ftsn_chunk = NULL;
1820 struct sctp_fwdtsn_skip ftsn_skip_arr[10];
1821 int nskips = 0;
1822 int skip_pos = 0;
1823 __u32 tsn;
1824 struct sctp_chunk *chunk;
1825 struct list_head *lchunk, *temp;
1826
1827 if (!asoc->peer.prsctp_capable)
1828 return;
1829
1830
1831
1832
1833
1834
1835
1836 if (TSN_lt(asoc->adv_peer_ack_point, ctsn))
1837 asoc->adv_peer_ack_point = ctsn;
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860 list_for_each_safe(lchunk, temp, &q->abandoned) {
1861 chunk = list_entry(lchunk, struct sctp_chunk,
1862 transmitted_list);
1863 tsn = ntohl(chunk->subh.data_hdr->tsn);
1864
1865
1866
1867
1868 if (TSN_lte(tsn, ctsn)) {
1869 list_del_init(lchunk);
1870 sctp_chunk_free(chunk);
1871 } else {
1872 if (TSN_lte(tsn, asoc->adv_peer_ack_point+1)) {
1873 asoc->adv_peer_ack_point = tsn;
1874 if (chunk->chunk_hdr->flags &
1875 SCTP_DATA_UNORDERED)
1876 continue;
1877 skip_pos = sctp_get_skip_pos(&ftsn_skip_arr[0],
1878 nskips,
1879 chunk->subh.data_hdr->stream);
1880 ftsn_skip_arr[skip_pos].stream =
1881 chunk->subh.data_hdr->stream;
1882 ftsn_skip_arr[skip_pos].ssn =
1883 chunk->subh.data_hdr->ssn;
1884 if (skip_pos == nskips)
1885 nskips++;
1886 if (nskips == 10)
1887 break;
1888 } else
1889 break;
1890 }
1891 }
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911 if (asoc->adv_peer_ack_point > ctsn)
1912 ftsn_chunk = sctp_make_fwdtsn(asoc, asoc->adv_peer_ack_point,
1913 nskips, &ftsn_skip_arr[0]);
1914
1915 if (ftsn_chunk) {
1916 list_add_tail(&ftsn_chunk->list, &q->control_chunk_list);
1917 SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
1918 }
1919}
1920