diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index a0b4d4300dafdb8f8885beaada1f86339fa773bc..419f45ca34f4dbef4bc2c0dd542e3c6c8cd40471 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -322,6 +322,9 @@ void free_expression(struct expression *expression) #ifdef SCTP_STATUS case EXPR_SCTP_PADDRINFO: assert(expression->value.sctp_paddrinfo); +#if 0 + free_expression(expression->value.sctp_paddrinfo->spinfo_address); +#endif free_expression(expression->value.sctp_paddrinfo->spinfo_state); free_expression(expression->value.sctp_paddrinfo->spinfo_cwnd); free_expression(expression->value.sctp_paddrinfo->spinfo_srtt); @@ -519,57 +522,6 @@ static int evaluate_msghdr_expression(struct expression *in, return STATUS_OK; } -#ifdef SCTP_STATUS -static int evaluate_sctp_status_expression(struct expression *in, - struct expression *out, char **error) -{ - struct sctp_status_expr *in_status; - struct sctp_status_expr *out_status; - - assert(in->type == EXPR_SCTP_STATUS); - assert(in->value.sctp_status); - assert(out->type == EXPR_SCTP_STATUS); - - out->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr)); - - in_status = in->value.sctp_status; - out_status = out->value.sctp_status; - - if (evaluate(in_status->sstat_state, - &out_status->sstat_state, - error)) - return STATUS_ERR; - if (evaluate(in_status->sstat_rwnd, - &out_status->sstat_rwnd, - error)) - return STATUS_ERR; - if (evaluate(in_status->sstat_unackdata, - &out_status->sstat_unackdata, - error)) - return STATUS_ERR; - if (evaluate(in_status->sstat_penddata, - &out_status->sstat_penddata, - error)) - return STATUS_ERR; - if (evaluate(in_status->sstat_instrms, - &out_status->sstat_instrms, - error)) - return STATUS_ERR; - if (evaluate(in_status->sstat_outstrms, - &out_status->sstat_outstrms, - error)) - return STATUS_ERR; - if (evaluate(in_status->sstat_fragmentation_point, - &out_status->sstat_fragmentation_point, - error)) - return STATUS_ERR; - if (evaluate(in_status->sstat_primary, - &out_status->sstat_primary, - error)) - return STATUS_ERR; - return STATUS_OK; -} -#endif static int evaluate_pollfd_expression(struct expression *in, struct expression *out, char **error) { @@ -595,6 +547,40 @@ static int evaluate_pollfd_expression(struct expression *in, return STATUS_OK; } +#ifdef SCTP_RTOINFO +static int evaluate_sctp_rtoinfo_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_rtoinfo_expr *in_rtoinfo; + struct sctp_rtoinfo_expr *out_rtoinfo; + + assert(in->type == EXPR_SCTP_RTOINFO); + assert(in->value.sctp_rtoinfo); + assert(out->type == EXPR_SCTP_RTOINFO); + + out->value.sctp_rtoinfo = calloc(1, sizeof(struct sctp_rtoinfo_expr)); + + in_rtoinfo = in->value.sctp_rtoinfo; + out_rtoinfo = out->value.sctp_rtoinfo; + + if (evaluate(in_rtoinfo->srto_initial, + &out_rtoinfo->srto_initial, + error)) + return STATUS_ERR; + if (evaluate(in_rtoinfo->srto_max, + &out_rtoinfo->srto_max, + error)) + return STATUS_ERR; + if (evaluate(in_rtoinfo->srto_min, + &out_rtoinfo->srto_min, + error)) + return STATUS_ERR; + + return STATUS_OK; +} +#endif + #if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) static int evaluate_sctp_assoc_value_expression(struct expression *in, struct expression *out, @@ -612,13 +598,163 @@ static int evaluate_sctp_assoc_value_expression(struct expression *in, in_value = in->value.sctp_assoc_value; out_value = out->value.sctp_assoc_value; - if (evaluate(in_value->assoc_value, &out_value->assoc_value, error)) + if (evaluate(in_value->assoc_value, + &out_value->assoc_value, + error)) return STATUS_ERR; return STATUS_OK; } #endif +#ifdef SCTP_STATUS +static int evaluate_sctp_paddrinfo_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_paddrinfo_expr *in_paddrinfo; + struct sctp_paddrinfo_expr *out_paddrinfo; + + assert(in->type == EXPR_SCTP_PADDRINFO); + assert(in->value.sctp_paddrinfo); + assert(out->type == EXPR_SCTP_PADDRINFO); + + out->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr)); + + in_paddrinfo = in->value.sctp_paddrinfo; + out_paddrinfo = out->value.sctp_paddrinfo; + +#if 0 + if (evaluate(in_paddrinfo->spinfo_address, + &out_value->spinfo_addresss, + error)) + return STATUS_ERR; +#endif + if (evaluate(in_paddrinfo->spinfo_state, + &out_paddrinfo->spinfo_state, + error)) + return STATUS_ERR; + if (evaluate(in_paddrinfo->spinfo_cwnd, + &out_paddrinfo->spinfo_cwnd, + error)) + return STATUS_ERR; + if (evaluate(in_paddrinfo->spinfo_srtt, + &out_paddrinfo->spinfo_srtt, + error)) + return STATUS_ERR; + if (evaluate(in_paddrinfo->spinfo_rto, + &out_paddrinfo->spinfo_rto, + error)) + return STATUS_ERR; + if (evaluate(in_paddrinfo->spinfo_mtu, + &out_paddrinfo->spinfo_mtu, + error)) + return STATUS_ERR; + + return STATUS_OK; +} + + +static int evaluate_sctp_status_expression(struct expression *in, + struct expression *out, char **error) +{ + struct sctp_status_expr *in_status; + struct sctp_status_expr *out_status; + + assert(in->type == EXPR_SCTP_STATUS); + assert(in->value.sctp_status); + assert(out->type == EXPR_SCTP_STATUS); + + out->value.sctp_status = calloc(1, sizeof(struct sctp_status_expr)); + + in_status = in->value.sctp_status; + out_status = out->value.sctp_status; + + if (evaluate(in_status->sstat_state, + &out_status->sstat_state, + error)) + return STATUS_ERR; + if (evaluate(in_status->sstat_rwnd, + &out_status->sstat_rwnd, + error)) + return STATUS_ERR; + if (evaluate(in_status->sstat_unackdata, + &out_status->sstat_unackdata, + error)) + return STATUS_ERR; + if (evaluate(in_status->sstat_penddata, + &out_status->sstat_penddata, + error)) + return STATUS_ERR; + if (evaluate(in_status->sstat_instrms, + &out_status->sstat_instrms, + error)) + return STATUS_ERR; + if (evaluate(in_status->sstat_outstrms, + &out_status->sstat_outstrms, + error)) + return STATUS_ERR; + if (evaluate(in_status->sstat_fragmentation_point, + &out_status->sstat_fragmentation_point, + error)) + return STATUS_ERR; + if (evaluate(in_status->sstat_primary, + &out_status->sstat_primary, + error)) + return STATUS_ERR; + return STATUS_OK; +} +#endif + +#ifdef SCTP_PEER_ADDR_PARAMS +static int evaluate_sctp_peer_addr_param_expression(struct expression *in, + struct expression *out, + char **error) +{ + struct sctp_paddrparams_expr *in_paddrparams; + struct sctp_paddrparams_expr *out_paddrparams; + + assert(in->type == EXPR_SCTP_PEER_ADDR_PARAMS); + assert(in->value.sctp_paddrparams); + assert(out->type == EXPR_SCTP_PEER_ADDR_PARAMS); + + out->value.sctp_paddrparams = calloc(1, sizeof(struct sctp_paddrparams_expr)); + + in_paddrparams = in->value.sctp_paddrparams; + out_paddrparams = out->value.sctp_paddrparams; + + if (evaluate(in_paddrparams->spp_address, + &out_paddrparams->spp_address, + error)) + return STATUS_ERR; + if (evaluate(in_paddrparams->spp_hbinterval, + &out_paddrparams->spp_hbinterval, + error)) + return STATUS_ERR; + if (evaluate(in_paddrparams->spp_pathmaxrxt, + &out_paddrparams->spp_pathmaxrxt, + error)) + return STATUS_ERR; + if (evaluate(in_paddrparams->spp_pathmtu, + &out_paddrparams->spp_pathmtu, + error)) + return STATUS_ERR; + if (evaluate(in_paddrparams->spp_flags, + &out_paddrparams->spp_flags, + error)) + return STATUS_ERR; + if (evaluate(in_paddrparams->spp_ipv6_flowlabel, + &out_paddrparams->spp_ipv6_flowlabel, + error)) + return STATUS_ERR; + if (evaluate(in_paddrparams->spp_dscp, + &out_paddrparams->spp_dscp, + error)) + return STATUS_ERR; + return STATUS_OK; +} +#endif + #ifdef SCTP_SS_VALUE static int evaluate_sctp_stream_value_expression(struct expression *in, struct expression *out, @@ -636,9 +772,13 @@ static int evaluate_sctp_stream_value_expression(struct expression *in, in_value = in->value.sctp_stream_value; out_value = out->value.sctp_stream_value; - if (evaluate(in_value->stream_id, &out_value->stream_id, error)) + if (evaluate(in_value->stream_id, + &out_value->stream_id, + error)) return STATUS_ERR; - if (evaluate(in_value->stream_value, &out_value->stream_value, error)) + if (evaluate(in_value->stream_value, + &out_value->stream_value, + error)) return STATUS_ERR; return STATUS_OK; @@ -669,9 +809,8 @@ static int evaluate(struct expression *in, sizeof(in->value.linger)); break; #ifdef SCTP_RTOINFO - case EXPR_SCTP_RTOINFO: /* copy as-is */ - memcpy(&out->value.sctp_rtoinfo, &in->value.sctp_rtoinfo, - sizeof(in->value.sctp_rtoinfo)); + case EXPR_SCTP_RTOINFO: + evaluate_sctp_rtoinfo_expression(in, out, error); break; #endif #ifdef SCTP_INITMSG @@ -681,7 +820,7 @@ static int evaluate(struct expression *in, break; #endif #if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED) - case EXPR_SCTP_ASSOC_VALUE: /* copy as-is */ + case EXPR_SCTP_ASSOC_VALUE: evaluate_sctp_assoc_value_expression(in, out, error); break; #endif @@ -693,25 +832,15 @@ static int evaluate(struct expression *in, #endif #ifdef SCTP_STATUS case EXPR_SCTP_PADDRINFO: - memcpy(&out->value.sctp_paddrinfo, &in->value.sctp_paddrinfo, - sizeof(in->value.sctp_paddrinfo)); - if (evaluate(in->value.sctp_paddrinfo->spinfo_state, - &out->value.sctp_paddrinfo->spinfo_state, - error)) - return STATUS_ERR; + evaluate_sctp_paddrinfo_expression(in, out, error); break; - case EXPR_SCTP_STATUS: /* copy as-is */ + case EXPR_SCTP_STATUS: result = evaluate_sctp_status_expression(in, out, error); break; #endif #ifdef SCTP_PEER_ADDR_PARAMS case EXPR_SCTP_PEER_ADDR_PARAMS: - memcpy(&out->value.sctp_paddrparams, &in->value.sctp_paddrparams, - sizeof(in->value.sctp_paddrparams)); - if (evaluate(in->value.sctp_paddrparams->spp_flags, - &out->value.sctp_paddrparams->spp_flags, - error)) - return STATUS_ERR; + result = evaluate_sctp_peer_addr_param_expression(in, out, error); break; #endif #ifdef SCTP_SS_VALUE