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 ;
@@ -618,6 +629,100 @@ sctp_print(netdissect_options *ndo,
618
629
break ;
619
630
}
620
631
}
632
+ bp += payload_size ;
633
+ sctpPacketLengthRemaining -= payload_size ;
634
+ chunkLengthRemaining -= payload_size ;
635
+ break ;
636
+ }
637
+ case SCTP_I_DATA :
638
+ {
639
+ const struct sctpIData * dataHdrPtr ;
640
+ int Bbit = FALSE;
641
+ uint8_t chunkFlg ;
642
+ uint32_t ppid_fsn ;
643
+ uint16_t payload_size ;
644
+
645
+ chunkFlg = GET_U_1 (chunkDescPtr -> chunkFlg );
646
+ if ((chunkFlg & SCTP_DATA_SACK_IMM ) == SCTP_DATA_SACK_IMM )
647
+ ND_PRINT ("(I)" );
648
+
649
+ if ((chunkFlg & SCTP_DATA_UNORDERED ) == SCTP_DATA_UNORDERED )
650
+ ND_PRINT ("(U)" );
651
+
652
+ if ((chunkFlg & SCTP_DATA_FIRST_FRAG ) == SCTP_DATA_FIRST_FRAG ) {
653
+ ND_PRINT ("(B)" );
654
+ Bbit = TRUE;
655
+ }
656
+
657
+ if ((chunkFlg & SCTP_DATA_LAST_FRAG ) == SCTP_DATA_LAST_FRAG )
658
+ ND_PRINT ("(E)" );
659
+
660
+ if (((chunkFlg & SCTP_DATA_UNORDERED ) == SCTP_DATA_UNORDERED ) ||
661
+ ((chunkFlg & SCTP_DATA_FIRST_FRAG ) == SCTP_DATA_FIRST_FRAG ) ||
662
+ ((chunkFlg & SCTP_DATA_LAST_FRAG ) == SCTP_DATA_LAST_FRAG ) )
663
+ ND_PRINT (" " );
664
+
665
+ ND_ICHECKMSG_ZU ("chunk length" , chunkLengthRemaining , < , sizeof (* dataHdrPtr ));
666
+ dataHdrPtr = (const struct sctpIData * )bp ;
667
+
668
+ ppid_fsn = GET_BE_U_4 (dataHdrPtr -> PPID_FSN );
669
+ ND_PRINT ("[TSN: %u] " , GET_BE_U_4 (dataHdrPtr -> TSN ));
670
+ ND_PRINT ("[SID: %u] " , GET_BE_U_2 (dataHdrPtr -> streamId ));
671
+ ND_PRINT ("[MID: %u] " , GET_BE_U_4 (dataHdrPtr -> MID ));
672
+ if (FALSE == Bbit ) { /* print FSN if B bit is NOT set */
673
+ ND_PRINT ("[FSN: %u] " , ppid_fsn );
674
+ } else { /* print PPID if B bit is set */
675
+ ND_PRINT ("[PPID %s] " , tok2str (PayloadProto_idents , "0x%x" , ppid_fsn ));
676
+ }
677
+
678
+ bp += sizeof (* dataHdrPtr );
679
+ sctpPacketLengthRemaining -= sizeof (* dataHdrPtr );
680
+ chunkLengthRemaining -= sizeof (* dataHdrPtr );
681
+ ND_ICHECKMSG_U ("chunk length" , chunkLengthRemaining , = = , 0 )
682
+ payload_size = chunkLengthRemaining ;
683
+
684
+ if (FALSE == Bbit ) {
685
+ if (ndo -> ndo_vflag >= 2 ) {
686
+ ND_PRINT ("[Payload" );
687
+ if (!ndo -> ndo_suppress_default_print ) {
688
+ ND_PRINT (": " );
689
+ ND_DEFAULTPRINT (bp , payload_size );
690
+ }
691
+ ND_PRINT ("]" );
692
+ }
693
+
694
+ bp += payload_size ;
695
+ sctpPacketLengthRemaining -= payload_size ;
696
+ chunkLengthRemaining -= payload_size ;
697
+ break ; /* do not parse ppid and check for CES when B bit is set */
698
+ }
699
+
700
+ if (!isforces ) {
701
+ isforces = (ppid_fsn == SCTP_PPID_FORCES_HP ) ||
702
+ (ppid_fsn == SCTP_PPID_FORCES_MP ) ||
703
+ (ppid_fsn == SCTP_PPID_FORCES_LP );
704
+ }
705
+
706
+ if (isforces ) {
707
+ forces_print (ndo , bp , payload_size );
708
+ ndo -> ndo_protocol = "sctp" ;
709
+ } else if (ndo -> ndo_vflag >= 2 ) {
710
+ switch (ppid_fsn ) {
711
+ case SCTP_PPID_M3UA :
712
+ m3ua_print (ndo , bp , payload_size );
713
+ ndo -> ndo_protocol = "sctp" ;
714
+ break ;
715
+ default :
716
+ ND_PRINT ("[Payload" );
717
+ if (!ndo -> ndo_suppress_default_print ) {
718
+ ND_PRINT (":" );
719
+ ND_DEFAULTPRINT (bp , payload_size );
720
+ }
721
+ ND_PRINT ("]" );
722
+ break ;
723
+ }
724
+ }
725
+
621
726
bp += payload_size ;
622
727
sctpPacketLengthRemaining -= payload_size ;
623
728
chunkLengthRemaining -= payload_size ;
0 commit comments