diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index 87dd50c284d2033ef24d506375f07636781d43af..235e8f460328744de398a84e68f88856f2ebf051 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -2425,9 +2425,7 @@ sctp_sackinfo ; sstat_state -: SSTAT_STATE '=' expression { - $$ = $3; -} +: SSTAT_STATE '=' expression { $$ = $3; } ; sstat_rwnd @@ -2502,6 +2500,10 @@ spinfo_state } $$ = new_integer_expression($3, "%d"); } +| SPINFO_STATE '=' WORD { + $$ = new_expression(EXPR_WORD); + $$->value.string = $3; +} | SPINFO_STATE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); } ; diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index f5d21c2f893a39681a98fd368ab9ca910692a823..b359a85ae910daaa8c6f9f4912bde70f7afea350 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -559,6 +559,21 @@ static int evaluate_sctp_status_expression(struct expression *in, &out_status->sstat_primary, error)) return STATUS_ERR; + if (in_status->sstat_primary->type == EXPR_SCTP_PADDRINFO) { + struct sctp_paddrinfo_expr *paddrinfo = in_status->sstat_primary->value.sctp_paddrinfo; + if (paddrinfo->spinfo_state->type == EXPR_WORD) { + s64 val_state = 0; + if (symbol_to_int(paddrinfo->spinfo_state->value.string, + &val_state, error) == STATUS_OK) { + paddrinfo->spinfo_state->type = EXPR_INTEGER; + paddrinfo->spinfo_state->value.num = val_state; + } else { + asprintf(error, "bad expression unknown symbol for spinfo_state %s", + paddrinfo->spinfo_state->value.string); + return STATUS_ERR; + } + } + } return STATUS_OK; } #endif diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c index 4edf8e0b05ce18cf453a8ff64a125f16f290b746..aed53ffe01e68831c69cc82fcc50dba5e769e2a2 100644 --- a/gtests/net/packetdrill/symbols_freebsd.c +++ b/gtests/net/packetdrill/symbols_freebsd.c @@ -98,6 +98,11 @@ struct int_symbol platform_symbols_table[] = { { SCTP_SHUTDOWN_ACK_SENT, "SCTP_SHUTDOWN_ACK_SENT" }, { SCTP_SHUTDOWN_PENDING, "SCTP_SHUTDOWN_PENDING" }, + /* /usr/include/netinet/sctp_uio.h */ + { SCTP_UNCONFIRMED, "SCTP_UNCONFIRMED" }, + { SCTP_ACTIVE, "SCTP_ACTIVE" }, + { SCTP_INACTIVE, "SCTP_INACTIVE" }, + /* /usr/include/netinet/tcp.h */ { TCP_NODELAY, "TCP_NODELAY" }, { TCP_MAXSEG, "TCP_MAXSEG" }, diff --git a/gtests/net/packetdrill/symbols_linux.c b/gtests/net/packetdrill/symbols_linux.c index 2601c3588752c4ee4a5bc5a7eee58abb16d24ed7..b5f6247c357609e7b7401798623c036f22cb5903 100644 --- a/gtests/net/packetdrill/symbols_linux.c +++ b/gtests/net/packetdrill/symbols_linux.c @@ -136,6 +136,9 @@ struct int_symbol platform_symbols_table[] = { { SCTP_SHUTDOWN_RECEIVED, "SCTP_SHUTDOWN_RECEIVED" }, { SCTP_SHUTDOWN_ACK_SENT, "SCTP_SHUTDOWN_ACK_SENT" }, { SCTP_SHUTDOWN_PENDING, "SCTP_SHUTDOWN_PENDING" }, + { SCTP_UNCONFIRMED, "SCTP_UNCONFIRMED" }, + { SCTP_ACTIVE, "SCTP_ACTIVE" }, + { SCTP_INACTIVE, "SCTP_INACTIVE" }, { TCP_NODELAY, "TCP_NODELAY" }, { TCP_MAXSEG, "TCP_MAXSEG" }, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt index 7bc70cd2c4032bbb195be1f79f968739ecc24271..6ce974d7dfb9bb33ef7f03c5b79f615aa51b0e93 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt @@ -35,9 +35,9 @@ sstat_penddata=0, sstat_instrms=1, sstat_outstrms=..., sstat_fragmentation_point +0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary=...}, [176])= 0 -+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=8, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, sstat_instrms=1, -sstat_outstrms=1, sstat_fragmentation_point=..., -sstat_primary={ spinfo_state=1, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468} }, [176])= 0 ++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, +sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., +sstat_primary={ spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468} }, [176])= 0 +0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},