diff --git a/gtests/net/packetdrill/run_packet.c b/gtests/net/packetdrill/run_packet.c index 79953ee8fa8578fb1c57f0e4f1f4adf2de692159..c3a3d5d87b04a38ddcfb961529da0f43cc06467e 100644 --- a/gtests/net/packetdrill/run_packet.c +++ b/gtests/net/packetdrill/run_packet.c @@ -1800,6 +1800,7 @@ static int verify_reconfig_chunk(struct sctp_reconfig_chunk *actual_chunk, error))) { return STATUS_ERR; } + //TODO: check Parameter return verify_sctp_parameters(actual_chunk->parameter, parameter_length, script_chunk_item, diff --git a/gtests/net/packetdrill/sctp_packet.c b/gtests/net/packetdrill/sctp_packet.c index 126d1f5166d8eef7e0451b9f526e9727f34decfb..11e0b9d4a13599c9746ee1a7cca6782b62369060 100644 --- a/gtests/net/packetdrill/sctp_packet.c +++ b/gtests/net/packetdrill/sctp_packet.c @@ -1862,7 +1862,7 @@ sctp_reconfig_response_new(s64 respsn, s64 result, s64 sender_next_tsn, s64 rece if (respsn == -1) { flags |= FLAG_RECONFIG_RESP_SN_NOCHECK; - parameter->respsn = 0; + parameter->respsn = 0; } else { parameter->respsn = htonl((u32)respsn); } @@ -1872,7 +1872,7 @@ sctp_reconfig_response_new(s64 respsn, s64 result, s64 sender_next_tsn, s64 rece } else { parameter->result = htonl((u32)result); } - if (receiver_next_tsn != -2 && sender_next_tsn != -2) { + if (receiver_next_tsn != -2 && sender_next_tsn != -2) { if (sender_next_tsn == -1) { flags |= FLAG_RECONFIG_SENDER_NEXT_TSN_NOCHECK; parameter->sender_next_tsn = 0; @@ -2524,9 +2524,45 @@ new_sctp_packet(int address_family, for (parameter_item = chunk_item->parameter_list->first; parameter_item != NULL; parameter_item = parameter_item->next) { - if (ntohs(parameter_item->parameter->type) == - SCTP_STATE_COOKIE_PARAMETER_TYPE) { + switch(ntohs(parameter_item->parameter->type)) { + case SCTP_STATE_COOKIE_PARAMETER_TYPE: continue; + case SCTP_OUTGOING_SSN_RESET_REQUEST_PARAMETER_TYPE: + if (parameter_item->flags & FLAG_RECONFIG_REQ_SN_NOCHECK) { + asprintf(error, + "reqsn value must be specified for inbound packets"); + return NULL; + } + if (parameter_item->flags & FLAG_RECONFIG_RESP_SN_NOCHECK) { + asprintf(error, + "respsn value must be specified for inbound packets"); + return NULL; + } + if (parameter_item->flags & FLAG_RECONFIG_LAST_TSN_NOCHECK) { + asprintf(error, + "last_tsn value must be specified for inbound packets"); + return NULL; + } + break; + case SCTP_RECONFIG_RESPONSE_PARAMETER_TYPE: + if (parameter_item->flags & FLAG_RECONFIG_RESULT_NOCHECK) { + asprintf(error, + "result value must be specified for inbound packets"); + return NULL; + } + if (parameter_item->flags & FLAG_RECONFIG_SENDER_NEXT_TSN_NOCHECK) { + asprintf(error, + "sender_next_tsn value must be specified for inbound packets"); + return NULL; + } + if (parameter_item->flags & FLAG_RECONFIG_RECEIVER_NEXT_TSN_NOCHECK) { + asprintf(error, + "receiver_next_tsn value must be specified for inbound packets"); + return NULL; + } + break; + default: + break; } if (parameter_item->flags & FLAG_PARAMETER_LENGTH_NOCHECK) { asprintf(error, diff --git a/gtests/net/packetdrill/sctp_packet.h b/gtests/net/packetdrill/sctp_packet.h index 530530e9ef0f1a332f996ba2b880de5fb7194c8c..59d988ec52e7fd6f0f2e0c5f1427c521397f6cc0 100644 --- a/gtests/net/packetdrill/sctp_packet.h +++ b/gtests/net/packetdrill/sctp_packet.h @@ -376,16 +376,16 @@ sctp_supported_extensions_parameter_new(struct sctp_byte_list *list); struct sctp_parameter_list_item * sctp_pad_parameter_new(s64 len, u8 *padding); -#define FLAG_RECONFIG_REQ_SN_NOCHECK 0x00000001 -#define FLAG_RECONFIG_RESP_SN_NOCHECK 0x00000002 -#define FLAG_RECONFIG_LAST_TSN_NOCHECK 0x00000004 +#define FLAG_RECONFIG_REQ_SN_NOCHECK 0x00000010 +#define FLAG_RECONFIG_RESP_SN_NOCHECK 0x00000020 +#define FLAG_RECONFIG_LAST_TSN_NOCHECK 0x00000040 struct sctp_parameter_list_item * sctp_outgoing_ssn_reset_request_parameter_new(s64 reqsn, s64 respsn, s64 last_tsn, struct sctp_u16_list *sids); -#define FLAG_RECONFIG_RESULT_NOCHECK 0x00000001 -#define FLAG_RECONFIG_SENDER_NEXT_TSN_NOCHECK 0x00000004 -#define FLAG_RECONFIG_RECEIVER_NEXT_TSN_NOCHECK 0x00000008 +#define FLAG_RECONFIG_RESULT_NOCHECK 0x00000010 +#define FLAG_RECONFIG_SENDER_NEXT_TSN_NOCHECK 0x00000040 +#define FLAG_RECONFIG_RECEIVER_NEXT_TSN_NOCHECK 0x00000080 struct sctp_parameter_list_item * sctp_reconfig_response_new(s64 respsn, s64 result, s64 sender_next_tsn, s64 receiver_next_tsn); diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/reset_outgoing_ssn_passiv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/reset_outgoing_ssn_passiv.pkt index 45f0576e1ec4c64b4c1b0b267741aab5a2301318..e130bb9792abc07930d7f6b71d5fbf870ba45311 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/reset_outgoing_ssn_passiv.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_reconfig/reset_outgoing_ssn_passiv.pkt @@ -34,5 +34,5 @@ * > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] +0.0 read(4, ..., 1000) = 1000 -+0.0 < sctp: RECONFIG[flgs=0, OUTGOING_SSN_RESET[req_sn=0, resp_sn=10, last_tsn=2, sids=[0]]] -+0.0 > sctp: RECONFIG[flgs=0, RECONFIG_RESPONSE[resp_sn=0, result=0]] ++0.0 < sctp: RECONFIG[flgs=0, OUTGOING_SSN_RESET[req_sn=0, resp_sn=0, last_tsn=11, sids=[0]]] ++0.0 > sctp: RECONFIG[flgs=0, RECONFIG_RESPONSE[resp_sn=..., result=...]]