From 723c3493e9ba2be2a4e2b8c5e4f24c9fe4ddb9e0 Mon Sep 17 00:00:00 2001 From: Michael Tuexen <tuexen@fh-muenster.de> Date: Fri, 18 Sep 2015 00:15:55 +0200 Subject: [PATCH] Add mapping and verification of I-DATA chunks. --- gtests/net/packetdrill/run_packet.c | 53 +++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/gtests/net/packetdrill/run_packet.c b/gtests/net/packetdrill/run_packet.c index 2aa404f1..ffa0d827 100644 --- a/gtests/net/packetdrill/run_packet.c +++ b/gtests/net/packetdrill/run_packet.c @@ -581,6 +581,7 @@ static int map_inbound_sctp_packet( struct sctp_shutdown_chunk *shutdown; struct sctp_ecne_chunk *ecne; struct sctp_cwr_chunk *cwr; + struct sctp_i_data_chunk *i_data; u32 local_diff, remote_diff; u16 nr_gap_blocks, nr_dup_tsns, i; @@ -642,6 +643,10 @@ static int map_inbound_sctp_packet( cwr = (struct sctp_cwr_chunk *)chunk; cwr->lowest_tsn = htonl(ntohl(cwr->lowest_tsn) + local_diff); break; + case SCTP_I_DATA_CHUNK_TYPE: + i_data = (struct sctp_i_data_chunk *)chunk; + i_data->tsn = htonl(ntohl(i_data->tsn) + remote_diff); + break; default: break; } @@ -734,6 +739,7 @@ static int map_outbound_live_sctp_packet( struct sctp_shutdown_chunk *shutdown; struct sctp_ecne_chunk *ecne; struct sctp_cwr_chunk *cwr; + struct sctp_i_data_chunk *i_data; u32 local_diff, remote_diff; u16 nr_gap_blocks, nr_dup_tsns, i; @@ -790,6 +796,10 @@ static int map_outbound_live_sctp_packet( cwr = (struct sctp_cwr_chunk *)chunk; cwr->lowest_tsn = htonl(ntohl(cwr->lowest_tsn) + remote_diff); break; + case SCTP_I_DATA_CHUNK_TYPE: + i_data = (struct sctp_i_data_chunk *)chunk; + i_data->tsn = htonl(ntohl(i_data->tsn) + local_diff); + break; default: break; } @@ -1522,6 +1532,44 @@ static int verify_shutdown_complete_chunk(struct sctp_shutdown_complete_chunk *a return STATUS_OK; } +static int verify_i_data_chunk(struct sctp_i_data_chunk *actual_chunk, + struct sctp_i_data_chunk *script_chunk, + u32 flags, char **error) +{ + if (check_field("sctp_i_data_chunk_tsn", + ntohl(script_chunk->tsn), + ntohl(actual_chunk->tsn), + error) || + (flags & FLAG_I_DATA_CHUNK_SID_NOCHECK ? STATUS_OK : + check_field("sctp_i_data_chunk_sid", + ntohs(script_chunk->sid), + ntohs(actual_chunk->sid), + error)) || + (flags & FLAG_I_DATA_CHUNK_RES_NOCHECK ? STATUS_OK : + check_field("sctp_i_data_chunk_res", + ntohs(script_chunk->res), + ntohs(actual_chunk->res), + error)) || + (flags & FLAG_I_DATA_CHUNK_MID_NOCHECK? STATUS_OK : + check_field("sctp_i_data_chunk_mid", + ntohl(script_chunk->mid), + ntohl(actual_chunk->mid), + error)) || + (flags & FLAG_I_DATA_CHUNK_PPID_NOCHECK? STATUS_OK : + check_field("sctp_i_data_chunk_ppid", + ntohl(script_chunk->field.ppid), + ntohl(actual_chunk->field.ppid), + error)) || + (flags & FLAG_I_DATA_CHUNK_FSN_NOCHECK? STATUS_OK : + check_field("sctp_i_data_chunk_fsn", + ntohl(script_chunk->field.fsn), + ntohl(actual_chunk->field.fsn), + error))) { + return STATUS_ERR; + } + return STATUS_OK; +} + static int verify_pad_chunk(struct sctp_pad_chunk *actual_chunk, struct sctp_pad_chunk *script_chunk, u32 flags, char **error) @@ -1660,6 +1708,11 @@ static int verify_sctp( (struct sctp_shutdown_complete_chunk *)script_chunk, flags, error); break; + case SCTP_I_DATA_CHUNK_TYPE: + result = verify_i_data_chunk((struct sctp_i_data_chunk *)actual_chunk, + (struct sctp_i_data_chunk *)script_chunk, + flags, error); + break; case SCTP_PAD_CHUNK_TYPE: result = verify_pad_chunk((struct sctp_pad_chunk *)actual_chunk, (struct sctp_pad_chunk *)script_chunk, -- GitLab