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,103 @@ 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
+ ((chunkFlg & SCTP_DATA_SACK_IMM ) == SCTP_DATA_SACK_IMM ))
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
+
699
+ /* do not parse ppid and check for CES when B bit is not set */
700
+ break ;
701
+ }
702
+
703
+ if (!isforces ) {
704
+ isforces = (ppid_fsn == SCTP_PPID_FORCES_HP ) ||
705
+ (ppid_fsn == SCTP_PPID_FORCES_MP ) ||
706
+ (ppid_fsn == SCTP_PPID_FORCES_LP );
707
+ }
708
+
709
+ if (isforces ) {
710
+ forces_print (ndo , bp , payload_size );
711
+ ndo -> ndo_protocol = "sctp" ;
712
+ } else if (ndo -> ndo_vflag >= 2 ) {
713
+ switch (ppid_fsn ) {
714
+ case SCTP_PPID_M3UA :
715
+ m3ua_print (ndo , bp , payload_size );
716
+ ndo -> ndo_protocol = "sctp" ;
717
+ break ;
718
+ default :
719
+ ND_PRINT ("[Payload" );
720
+ if (!ndo -> ndo_suppress_default_print ) {
721
+ ND_PRINT (":" );
722
+ ND_DEFAULTPRINT (bp , payload_size );
723
+ }
724
+ ND_PRINT ("]" );
725
+ break ;
726
+ }
727
+ }
728
+
621
729
bp += payload_size ;
622
730
sctpPacketLengthRemaining -= payload_size ;
623
731
chunkLengthRemaining -= payload_size ;
0 commit comments