diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index 634e6487ca851432dcdfa00aa68661357d846eba..35c278a374e511c3312ae9f72f2a683d52de789b 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -3300,11 +3300,11 @@ rcv_flags ; rcv_ppid -: RCV_PPID '=' INTEGER { - if (!is_valid_u32($3)) { - semantic_error("sinfo_cumtsn out of range"); +: RCV_PPID '=' _HTONL_ '(' INTEGER ')' { + if (!is_valid_u32($5)) { + semantic_error("rcv_ppid out of range"); } - $$ = new_integer_expression($3, "%u"); + $$ = new_integer_expression(htonl($5), "%u"); } | RCV_PPID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; @@ -3421,11 +3421,11 @@ nxt_flags ; nxt_ppid -: NXT_PPID '=' INTEGER { - if (!is_valid_u32($3)) { +: NXT_PPID '=' _HTONL_ '(' INTEGER ')' { + if (!is_valid_u32($5)) { semantic_error("nxt_ppid out of range"); } - $$ = new_integer_expression($3, "%u"); + $$ = new_integer_expression(htonl((u32)$5), "%u"); } | NXT_PPID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; @@ -3452,7 +3452,7 @@ sctp_nxtinfo ; sctp_recvv_rn -: '{' RECVV_RCVINFO '=' sctp_rcvinfo ',' RECVV_NXTINFO '=' sctp_nxtinfo '}' { +: '{' RECVV_RCVINFO '=' expression ',' RECVV_NXTINFO '=' expression '}' { $$ = new_expression(EXPR_SCTP_RECVV_RN); $$->value.sctp_sendv_spa = calloc(1, sizeof(struct sctp_recvv_rn_expr)); $$->value.sctp_recvv_rn->recvv_rcvinfo = $4; diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 05feed477cfb59f5aa7b1de282043f9d85389a10..3b4a81066a162039231a7d1692805ffecb24a902 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -3505,7 +3505,7 @@ static int syscall_sctp_sendv(struct state *state, struct syscall_spec *syscall, #endif } -#ifdef SCTP_RECVV_RCVINFO +#if defined(__FreeBSD__) static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr, struct sctp_rcvinfo *sctp_rcvinfo, char **error) @@ -3598,7 +3598,7 @@ static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr, } #endif -#ifdef SCTP_RECVV_NXTINFO +#if defined(__FreeBSD__) static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr, struct sctp_nxtinfo *sctp_nxtinfo, char **error) @@ -3635,7 +3635,7 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr, } if (sctp_nxtinfo->nxt_ppid != nxt_ppid) { asprintf(error, "sctp_nxtinfo.nxt_ppid: expected: %u actual: %u", - nxt_ppid, sctp_nxtinfo->nxt_ppid); + htonl(nxt_ppid), htonl(sctp_nxtinfo->nxt_ppid)); return STATUS_ERR; } } @@ -3655,17 +3655,23 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr, } #endif -#ifdef SCTP_RECVV_RN +#if defined(__FreeBSD__) static int check_sctp_recvv_rn(struct sctp_recvv_rn_expr *expr, struct sctp_recvv_rn *sctp_recvv_rn, char **error) { if (expr->recvv_rcvinfo->type != EXPR_ELLIPSIS) { - if (check_sctp_rcvinfo((struct sctp_rcvinfo_expr *)expr->recvv_rcvinfo, - &sctp_recvv_rn->recvv_rcvinfo, error)) + if (check_type(expr->recvv_rcvinfo, EXPR_SCTP_RCVINFO, error)) + return STATUS_ERR; + if (check_sctp_rcvinfo(expr->recvv_rcvinfo->value.sctp_rcvinfo, + &(sctp_recvv_rn->recvv_rcvinfo), error)) return STATUS_ERR; - if (check_sctp_nxtinfo((struct sctp_nxtinfo_expr *)expr->recvv_nxtinfo, - &sctp_recvv_rn->recvv_nxtinfo, error)) + } + if (expr->recvv_nxtinfo->type != EXPR_ELLIPSIS) { + if (check_type(expr->recvv_nxtinfo, EXPR_SCTP_NXTINFO, error)) + return STATUS_ERR; + if (check_sctp_nxtinfo(expr->recvv_nxtinfo->value.sctp_nxtinfo, + &(sctp_recvv_rn->recvv_nxtinfo), error)) return STATUS_ERR; } return STATUS_OK; @@ -3687,6 +3693,7 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall, begin_syscall(state, syscall); struct expression *iovec_expr_list, *iovcnt_expr, *addr_expr, *fromlen_expr; struct expression *infolen_expr, *info_expr, *infotype_expr, *flags_expr; + struct expression *infolen_list_expr, *infotype_list_expr, *flags_list_expr; struct sctp_recvv_rn recvv_rn; struct sctp_rcvinfo rcvinfo; struct sctp_nxtinfo nxtinfo; @@ -3718,7 +3725,13 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall, } else { return STATUS_ERR; } - infolen_expr = get_arg(args, 6, error); + infolen_list_expr = get_arg(args, 6, error); + if (infolen_list_expr->type == EXPR_LIST) { + if (check_arg_count(infolen_list_expr->value.list, 1, error)) { + return STATUS_ERR; + } + } + infolen_expr = get_arg(infolen_list_expr->value.list, 0, error); if (get_u32(infolen_expr, &infolen, error)) return STATUS_ERR; infotype = 0; @@ -3747,8 +3760,12 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall, } } free(from); - infotype_expr = get_arg(args, 7, error); - if (infotype_expr->type != EXPR_ELLIPSIS) { + infotype_list_expr = get_arg(args, 7, error); + if (infotype_list_expr->type != EXPR_ELLIPSIS) { + if (check_arg_count(infotype_list_expr->value.list, 1, error)) { + return STATUS_ERR; + } + infotype_expr = get_arg(infotype_list_expr->value.list, 0, error); s32 script_infotype; if (get_s32(infotype_expr, &script_infotype, error)) { @@ -3760,7 +3777,6 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall, return STATUS_ERR; } } -//check info switch(infotype){ case SCTP_RECVV_NOINFO: if (infolen != 0){ @@ -3796,8 +3812,11 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall, result = STATUS_ERR; break; } - flags_expr = get_arg(args, 8, error); - if (flags_expr->type != EXPR_ELLIPSIS) { + flags_list_expr = get_arg(args, 8, error); + if (flags_list_expr->type != EXPR_ELLIPSIS) { + if (check_arg_count(flags_list_expr->value.list, 1, error)) + return STATUS_ERR; + flags_expr = get_arg(flags_list_expr->value.list, 0, error); s32 script_flags; if (get_s32(flags_expr, &script_flags, error)) { asprintf(error, "sctp_recvv flags bad return value. expected %d, actual %d", diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index 21d3a1c9cc11974cca260a261ae28a7d0d640ef3..82f724aefceb861dd490a4473d45191149bdbcd2 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -1260,6 +1260,10 @@ static int evaluate_sctp_recvv_rn_expression(struct expression *in, &out_rn->recvv_rcvinfo, error)) return STATUS_ERR; + if (evaluate(in_rn->recvv_nxtinfo, + &out_rn->recvv_nxtinfo, + error)) + return STATUS_ERR; return STATUS_OK; } diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt index 7b17761734e38b082a11ece74fcf8e55ae1dfeea..f454604c19823a6143483b9fde65f1593ae5af23 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt @@ -16,45 +16,60 @@ //base test +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0] * > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]] -+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 20, NULL, 0, SCTP_RECVV_NOINFO, 0) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000 //base test with sockaddr +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0] * > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]] +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, -16, NULL, 0, SCTP_RECVV_NOINFO, 0) = 1000 +16, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000 //base test with NULL sockaddr +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=0] * > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]] -+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, NULL, 0, NULL, 0, SCTP_RECVV_NOINFO, 0) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, NULL, 0, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000 //base SCTP_RECVV_RCVINFO +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=4, sid=0, ssn=3, ppid=0] * > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]] -+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {rcv_sid=0, rcv_ssn=3, rcv_flags=0, rcv_ppid=0, rcv_tsn=4, rcv_cumtsn=4, rcv_context=0}, -28, SCTP_RECVV_RCVINFO, 0) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {rcv_sid=0, rcv_ssn=3, rcv_flags=0, rcv_ppid=htonl(0), rcv_tsn=4, rcv_cumtsn=4, rcv_context=0}, +[28], [SCTP_RECVV_RCVINFO], [0]) = 1000 //base SCTP_RECVV_NXTINFO +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=5, sid=0, ssn=4, ppid=0] * > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]] -+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, -{nxt_sid=0, nxt_flags=0, nxt_ppid=0, nxt_length=0}, 16, SCTP_RECVV_NXTINFO, 0) = 1000 ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=6, sid=0, ssn=5, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000}, [16], [SCTP_RECVV_NXTINFO], [0]) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [0], [0]) = 1000 //base SCTP_RECVV_RN +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 -+0.0 < sctp: DATA[flgs=BE, len=1016, tsn=6, sid=0, ssn=5, ppid=0] -* > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=7, sid=0, ssn=6, ppid=0] +* > sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=..., gaps=[], dups=[]] ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=8, sid=0, ssn=7, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, { +recvv_rcvinfo={rcv_sid=0, rcv_ssn=6, rcv_flags=0, rcv_ppid=htonl(0), rcv_tsn=7, rcv_cumtsn=8, rcv_context=0}, +recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000}}, [44], [SCTP_RECVV_RN], [0]) = 1000 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=9, sid=0, ssn=8, ppid=11] +* > sctp: SACK[flgs=0, cum_tsn=9, a_rwnd=..., gaps=[], dups=[]] ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, { +recvv_rcvinfo={rcv_sid=0, rcv_ssn=7, rcv_flags=0, rcv_ppid=htonl(10), rcv_tsn=8, rcv_cumtsn=9, rcv_context=0}, recvv_nxtinfo=...}, [44], [SCTP_RECVV_RN], [0]) = 1000 + ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=10, sid=0, ssn=9, ppid=10] +* > sctp: SACK[flgs=0, cum_tsn=10, a_rwnd=..., gaps=[], dups=[]] +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, { -recvv_rcvinfo={rcv_sid=0, rcv_ssn=0, rcv_flags=0, rcv_ppid=0, rcv_tsn=0, rcv_cumtsn=0, rcv_context=0}, -recvv_nxtinfo={nxt_sid=0, nxt_flags=0, nxt_ppid=0, nxt_length=0}}, 44, SCTP_RECVV_RN, 0) = 1000 +recvv_rcvinfo=..., recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000}}, [44], [SCTP_RECVV_RN], [0]) = 1000 ++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000 +0.0 close(3) = 0 -+0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=6] ++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=10] +0.1 < sctp: SHUTDOWN_ACK[flgs=0] +0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]