111
111
#define SCTP_ECN_ECHO 0x0c
112
112
#define SCTP_ECN_CWR 0x0d
113
113
#define SCTP_SHUTDOWN_COMPLETE 0x0e
114
+ #define SCTP_I_DATA 0x40
114
115
#define SCTP_FORWARD_CUM_TSN 0xc0
115
116
#define SCTP_RELIABLE_CNTL 0xc1
116
117
#define SCTP_RELIABLE_CNTL_ACK 0xc2
@@ -131,6 +132,7 @@ static const struct tok sctp_chunkid_str[] = {
131
132
{ SCTP_ECN_ECHO , "ECN ECHO" },
132
133
{ SCTP_ECN_CWR , "ECN CWR" },
133
134
{ SCTP_SHUTDOWN_COMPLETE , "SHUTDOWN COMPLETE" },
135
+ { SCTP_I_DATA , "I-DATA" },
134
136
{ SCTP_FORWARD_CUM_TSN , "FOR CUM TSN" },
135
137
{ SCTP_RELIABLE_CNTL , "REL CTRL" },
136
138
{ SCTP_RELIABLE_CNTL_ACK , "REL CTRL ACK" },
@@ -144,6 +146,7 @@ static const struct tok sctp_chunkid_str[] = {
144
146
#define SCTP_DATA_FIRST_FRAG 0x02
145
147
#define SCTP_DATA_NOT_FRAG 0x03
146
148
#define SCTP_DATA_UNORDERED 0x04
149
+ #define SCTP_DATA_SACK_IMM 0x08
147
150
148
151
#define SCTP_ADDRMAX 60
149
152
@@ -350,6 +353,14 @@ struct sctpDataPart{
350
353
nd_uint32_t payloadtype ;
351
354
};
352
355
356
+ struct sctpIData {
357
+ nd_uint32_t TSN ;
358
+ nd_uint16_t streamId ;
359
+ nd_uint16_t reserved ;
360
+ nd_uint32_t MID ;
361
+ nd_uint32_t PPID_FSN ;
362
+ };
363
+
353
364
struct sctpUnifiedDatagram {
354
365
struct sctpChunkDesc uh ;
355
366
struct sctpDataPart dp ;
@@ -619,6 +630,100 @@ sctp_print(netdissect_options *ndo,
619
630
break ;
620
631
}
621
632
}
633
+ bp += payload_size ;
634
+ sctpPacketLengthRemaining -= payload_size ;
635
+ chunkLengthRemaining -= payload_size ;
636
+ break ;
637
+ }
638
+ case SCTP_I_DATA :
639
+ {
640
+ const struct sctpIData * dataHdrPtr ;
641
+ uint8_t Bbit = FALSE;
642
+ uint8_t chunkFlg ;
643
+ uint32_t ppid_fsn ;
644
+ uint16_t payload_size ;
645
+
646
+ chunkFlg = GET_U_1 (chunkDescPtr -> chunkFlg );
647
+ if ((chunkFlg & SCTP_DATA_SACK_IMM ) == SCTP_DATA_SACK_IMM )
648
+ ND_PRINT ("(I)" );
649
+
650
+ if ((chunkFlg & SCTP_DATA_UNORDERED ) == SCTP_DATA_UNORDERED )
651
+ ND_PRINT ("(U)" );
652
+
653
+ if ((chunkFlg & SCTP_DATA_FIRST_FRAG ) == SCTP_DATA_FIRST_FRAG ) {
654
+ ND_PRINT ("(B)" );
655
+ Bbit = TRUE;
656
+ }
657
+
658
+ if ((chunkFlg & SCTP_DATA_LAST_FRAG ) == SCTP_DATA_LAST_FRAG )
659
+ ND_PRINT ("(E)" );
660
+
661
+ if (((chunkFlg & SCTP_DATA_UNORDERED ) == SCTP_DATA_UNORDERED ) ||
662
+ ((chunkFlg & SCTP_DATA_FIRST_FRAG ) == SCTP_DATA_FIRST_FRAG ) ||
663
+ ((chunkFlg & SCTP_DATA_LAST_FRAG ) == SCTP_DATA_LAST_FRAG ) )
664
+ ND_PRINT (" " );
665
+
666
+ ND_ICHECKMSG_ZU ("chunk length" , chunkLengthRemaining , < , sizeof (* dataHdrPtr ));
667
+ dataHdrPtr = (const struct sctpIData * )bp ;
668
+
669
+ ppid_fsn = GET_BE_U_4 (dataHdrPtr -> PPID_FSN );
670
+ ND_PRINT ("[TSN: %u] " , GET_BE_U_4 (dataHdrPtr -> TSN ));
671
+ ND_PRINT ("[SID: %u] " , GET_BE_U_2 (dataHdrPtr -> streamId ));
672
+ ND_PRINT ("[MID: %u] " , GET_BE_U_4 (dataHdrPtr -> MID ));
673
+ if (FALSE == Bbit ) { /* print FSN if B bit is NOT set */
674
+ ND_PRINT ("[FSN: %u] " , ppid_fsn );
675
+ } else { /* print PPID if B bit is set */
676
+ ND_PRINT ("[PPID %s] " , tok2str (PayloadProto_idents , "0x%x" , ppid_fsn ));
677
+ }
678
+
679
+ bp += sizeof (* dataHdrPtr );
680
+ sctpPacketLengthRemaining -= sizeof (* dataHdrPtr );
681
+ chunkLengthRemaining -= sizeof (* dataHdrPtr );
682
+ ND_ICHECKMSG_U ("chunk length" , chunkLengthRemaining , = = , 0 )
683
+ payload_size = chunkLengthRemaining ;
684
+
685
+ if (FALSE == Bbit ) {
686
+ if (ndo -> ndo_vflag >= 2 ) {
687
+ ND_PRINT ("[Payload" );
688
+ if (!ndo -> ndo_suppress_default_print ) {
689
+ ND_PRINT (": " );
690
+ ND_DEFAULTPRINT (bp , payload_size );
691
+ }
692
+ ND_PRINT ("]" );
693
+ }
694
+
695
+ bp += payload_size ;
696
+ sctpPacketLengthRemaining -= payload_size ;
697
+ chunkLengthRemaining -= payload_size ;
698
+ break ; /* do not parse ppid and check for CES when B bit is set */
699
+ }
700
+
701
+ if (!isforces ) {
702
+ isforces = (ppid_fsn == SCTP_PPID_FORCES_HP ) ||
703
+ (ppid_fsn == SCTP_PPID_FORCES_MP ) ||
704
+ (ppid_fsn == SCTP_PPID_FORCES_LP );
705
+ }
706
+
707
+ if (isforces ) {
708
+ forces_print (ndo , bp , payload_size );
709
+ ndo -> ndo_protocol = "sctp" ;
710
+ } else if (ndo -> ndo_vflag >= 2 ) {
711
+ switch (ppid_fsn ) {
712
+ case SCTP_PPID_M3UA :
713
+ m3ua_print (ndo , bp , payload_size );
714
+ ndo -> ndo_protocol = "sctp" ;
715
+ break ;
716
+ default :
717
+ ND_PRINT ("[Payload" );
718
+ if (!ndo -> ndo_suppress_default_print ) {
719
+ ND_PRINT (":" );
720
+ ND_DEFAULTPRINT (bp , payload_size );
721
+ }
722
+ ND_PRINT ("]" );
723
+ break ;
724
+ }
725
+ }
726
+
622
727
bp += payload_size ;
623
728
sctpPacketLengthRemaining -= payload_size ;
624
729
chunkLengthRemaining -= payload_size ;
0 commit comments