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