diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y index eafcb3291376bf5de6efc486bd7edf25ee6821cb..6e594b90cf57c8276101cbd1b2e126f83fd62982 100644 --- a/gtests/net/packetdrill/parser.y +++ b/gtests/net/packetdrill/parser.y @@ -3489,7 +3489,7 @@ serinfo_next_stream ; serinfo_next_flags -: SERINFO_NEXT_FLAGS'=' WORD { +: SERINFO_NEXT_FLAGS '=' WORD { $$ = new_expression(EXPR_WORD); $$->value.string = $3; } @@ -3533,7 +3533,7 @@ serinfo_next_ppid sctp_extrcvinfo : '{' sinfo_stream ',' sinfo_ssn ',' sinfo_flags ',' sinfo_ppid ',' sinfo_context ',' sinfo_pr_value ',' sinfo_tsn ',' sinfo_cumtsn ',' -serinfo_next_stream ',' serinfo_next_flags ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid ',' sinfo_assoc_id '}' { +serinfo_next_flags ',' serinfo_next_stream ',' serinfo_next_aid ',' serinfo_next_length ',' serinfo_next_ppid ',' sinfo_assoc_id '}' { $$ = new_expression(EXPR_SCTP_EXTRCVINFO); $$->value.sctp_extrcvinfo = calloc(1, sizeof(struct sctp_extrcvinfo_expr)); $$->value.sctp_extrcvinfo->sinfo_stream = $2; diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 8f45e53cc2457ed7d4e3422c83f4e54687e2aab9..4500a33b2a27d1153c6676ae9255c23cd916b89e 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -64,6 +64,8 @@ static int parse_expression_to_sctp_sndrcvinfo(struct expression *expr, struct s char **error); #endif #if defined(__FreeBSD__) +static int parse_expression_to_sctp_extrcvinfo(struct expression *expr, struct sctp_extrcvinfo *info, + char **error); static int parse_expression_to_sctp_sndinfo(struct expression *expr, struct sctp_sndinfo *info, char **error); static int parse_expression_to_sctp_prinfo(struct expression *expr, struct sctp_prinfo *info, @@ -79,6 +81,10 @@ static int check_sctp_sndinfo(struct sctp_sndinfo_expr *expr, struct sctp_sndinf static int check_sctp_initmsg(struct sctp_initmsg_expr *expr, struct sctp_initmsg *sctp_initmsg, char **error); #endif +#if defined(__FreeBSD__) +static int check_sctp_extrcvinfo(struct sctp_extrcvinfo_expr *expr, struct sctp_extrcvinfo *sctp_info, + char **error); +#endif #if defined(linux) || defined(__FreeBSD__) static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr, struct sctp_rcvinfo *sctp_rcvinfo, char** error); @@ -564,6 +570,22 @@ int check_s32_expr(struct expression *expr, s16 value, char *val_name, char **er return STATUS_OK; } +int check_u32_hton_expr(struct expression *expr, u32 value, char *val_name, char **error) { + if (expr->type != EXPR_ELLIPSIS) { + u32 script_val; + + if (get_u32(expr, &script_val, error)) { + return STATUS_ERR; + } + if (htonl(value) != htonl(script_val)) { + asprintf(error, "%s: expected: %u actual: %u", val_name, + htonl(script_val), htonl(value)); + return STATUS_ERR; + } + } + return STATUS_OK; +} + int check_u32_expr(struct expression *expr, u32 value, char *val_name, char **error) { if (expr->type != EXPR_ELLIPSIS) { u32 script_val; @@ -731,6 +753,12 @@ static int cmsg_new(struct expression *expression, cmsg_size += CMSG_SPACE(sizeof(struct sctp_sndrcvinfo)); break; #endif +#if defined(SCTP_EXTRCV) + case EXPR_SCTP_EXTRCVINFO: + printf("EXT SIZE %zu\n", CMSG_SPACE(sizeof(struct sctp_extrcvinfo))); + cmsg_size += CMSG_SPACE(sizeof(struct sctp_extrcvinfo)); + break; +#endif #if defined(SCTP_SNDINFO) case EXPR_SCTP_SNDINFO: cmsg_size += CMSG_SPACE(sizeof(struct sctp_sndinfo)); @@ -774,7 +802,7 @@ static int cmsg_new(struct expression *expression, *cmsg_len_ptr = cmsg_size; cmsg = calloc(1, cmsg_size); *cmsg_ptr = (void *)cmsg; - + printf("total size %u\n", cmsg_size); for (i = 0; i < list_len; i++) { struct expression *expr; struct cmsghdr_expr *cmsg_expr; @@ -813,6 +841,17 @@ static int cmsg_new(struct expression *expression, break; } #endif +#if defined(SCTP_EXTRCV) + case EXPR_SCTP_EXTRCVINFO: { + struct sctp_extrcvinfo info; + if (parse_expression_to_sctp_extrcvinfo(cmsg_expr->cmsg_data, &info, error)) { + goto error_out; + } + memcpy(CMSG_DATA(cmsg), &info, sizeof(struct sctp_extrcvinfo)); + cmsg = (struct cmsghdr *) ((caddr_t)cmsg + CMSG_SPACE(sizeof(struct sctp_extrcvinfo))); + break; + } +#endif #if defined(SCTP_SNDINFO) case EXPR_SCTP_SNDINFO: { struct sctp_sndinfo info; @@ -881,29 +920,32 @@ error_out: *cmsg_len_ptr = 0; return STATUS_ERR; } + static int check_cmsghdr(struct expression *expr_list, struct msghdr *msg, char **error) { struct expression_list *list; struct expression *cmsg_expr; struct cmsghdr *cmsg_ptr; int cnt = 0; + int list_len = 0; assert(expr_list->type == EXPR_LIST); list = expr_list->value.list; + list_len = expression_list_length(list); for (cmsg_ptr = CMSG_FIRSTHDR(msg); cmsg_ptr != NULL; cmsg_ptr = CMSG_NXTHDR(msg, cmsg_ptr)) { cmsg_expr = get_arg(list, cnt, error); if (cmsg_expr->type != EXPR_ELLIPSIS) { struct cmsghdr_expr *expr; expr = cmsg_expr->value.cmsghdr; + if (check_s32_expr(expr->cmsg_type, cmsg_ptr->cmsg_type, + "cmsghdr.cmsg_type", error)) + return STATUS_ERR; if (check_u32_expr(expr->cmsg_len, cmsg_ptr->cmsg_len, "cmsghdr.cmsg_len", error)) return STATUS_ERR; if (check_s32_expr(expr->cmsg_level, cmsg_ptr->cmsg_level, "cmsghdr.cmsg_level", error)) return STATUS_ERR; - if (check_s32_expr(expr->cmsg_type, cmsg_ptr->cmsg_type, - "cmsghdr.cmsg_type", error)) - return STATUS_ERR; if (expr->cmsg_data->type == EXPR_ELLIPSIS) { continue; @@ -927,6 +969,16 @@ static int check_cmsghdr(struct expression *expr_list, struct msghdr *msg, char } break; #endif +#ifdef SCTP_EXTRCV + case SCTP_EXTRCV: + printf("check extrcv\n"); + if (check_sctp_extrcvinfo(expr->cmsg_data->value.sctp_extrcvinfo, + (struct sctp_extrcvinfo *) CMSG_DATA(cmsg_ptr), + error)) { + return STATUS_ERR; + } + break; +#endif #ifdef SCTP_SNDINFO case SCTP_SNDINFO: if (check_sctp_sndinfo(expr->cmsg_data->value.sctp_sndinfo, @@ -1015,6 +1067,10 @@ static int check_cmsghdr(struct expression *expr_list, struct msghdr *msg, char } cnt++; } + if (cnt != list_len) { + asprintf(error, "Return cmsg count is unqual to expected list len. actual %u, expected %u", cnt, list_len); + return STATUS_ERR; + } return STATUS_OK; } @@ -3389,18 +3445,9 @@ static int check_sctp_sndrcvinfo(struct sctp_sndrcvinfo_expr *expr, if (check_u16_expr(expr->sinfo_flags, sctp_sndrcvinfo->sinfo_flags, "sctp_sndrcvinfo.sinfo_flags", error)) return STATUS_ERR; - if (expr->sinfo_ppid->type != EXPR_ELLIPSIS) { - u32 sinfo_ppid; - - if (get_u32(expr->sinfo_ppid, &sinfo_ppid, error)) { - return STATUS_ERR; - } - if (ntohl(sctp_sndrcvinfo->sinfo_ppid) != ntohl(sinfo_ppid)) { - asprintf(error, "sctp_sndrcvinfo.sinfo_ppid: expected: %u actual: %u", - ntohl(sinfo_ppid), ntohl(sctp_sndrcvinfo->sinfo_ppid)); - return STATUS_ERR; - } - } + if (check_u32_hton_expr(expr->sinfo_ppid, sctp_sndrcvinfo->sinfo_ppid, + "sctp_sndrcvinfo.sinfo_ppid", error)) + return STATUS_ERR; if (check_u32_expr(expr->sinfo_context, sctp_sndrcvinfo->sinfo_context, "sctp_sndrcvinfo.sinfo_context", error)) return STATUS_ERR; @@ -3421,6 +3468,58 @@ static int check_sctp_sndrcvinfo(struct sctp_sndrcvinfo_expr *expr, } #endif +#if defined(__FreeBSD__) +static int check_sctp_extrcvinfo(struct sctp_extrcvinfo_expr *expr, + struct sctp_extrcvinfo *sctp_extrcvinfo, + char** error) { + if (check_u16_expr(expr->sinfo_stream, sctp_extrcvinfo->sinfo_stream, + "sctp_extrcvinfo.sinfo_stream", error)) + return STATUS_ERR; + if (check_u16_expr(expr->sinfo_ssn, sctp_extrcvinfo->sinfo_ssn, + "sctp_extrcvinfo.sinfo_ssn", error)) + return STATUS_ERR; + if (check_u16_expr(expr->sinfo_flags, sctp_extrcvinfo->sinfo_flags, + "sctp_extrcvinfo.sinfo_flags", error)) + return STATUS_ERR; + if (check_u32_hton_expr(expr->sinfo_ppid, sctp_extrcvinfo->sinfo_ppid, + "sctp_extrcvinfo.sinfo_ppid", error)) + return STATUS_ERR; + if (check_u32_expr(expr->sinfo_context, sctp_extrcvinfo->sinfo_context, + "sctp_extrcvinfo.sinfo_context", error)) + return STATUS_ERR; + //Name not like RFC + if (check_u32_expr(expr->sinfo_pr_value, sctp_extrcvinfo->sinfo_timetolive, + "sctp_extrcvinfo.sinfo_pr_value", error)) + return STATUS_ERR; + if (check_u32_expr(expr->sinfo_tsn, sctp_extrcvinfo->sinfo_tsn, + "sctp_extrcvinfo.sinfo_tsn", error)) + return STATUS_ERR; + if (check_u32_expr(expr->sinfo_cumtsn, sctp_extrcvinfo->sinfo_cumtsn, + "sctp_extrcvinfo.sinfo_cumtsn", error)) + return STATUS_ERR; + if (check_u16_expr(expr->serinfo_next_flags, sctp_extrcvinfo->sreinfo_next_flags, + "sctp_extrcvinfo.serinfo_next_flags", error)) + return STATUS_ERR; + if (check_u16_expr(expr->serinfo_next_stream, sctp_extrcvinfo->sreinfo_next_stream, + "sctp_extrcvinfo.serinfo_next_stream", error)) + return STATUS_ERR; + if (check_u32_expr(expr->serinfo_next_aid, sctp_extrcvinfo->sreinfo_next_aid, + "sctp_extrcvinfo.serinfo_next_aid", error)) + return STATUS_ERR; + if (check_u32_expr(expr->serinfo_next_length, sctp_extrcvinfo->sreinfo_next_length, + "sctp_extrcvinfo.serinfo_next_length", error)) + return STATUS_ERR; + if (check_u32_hton_expr(expr->serinfo_next_ppid, sctp_extrcvinfo->sreinfo_next_ppid, + "sctp_extrcvinfo.serinfo_next_ppid", error)) + return STATUS_ERR; + if (check_u32_expr(expr->sinfo_assoc_id, sctp_extrcvinfo->sinfo_assoc_id, + "sctp_extrcvinfo.sinfo_assoc_id", error)) + return STATUS_ERR; + + return STATUS_OK; +} +#endif + static int syscall_sctp_recvmsg(struct state *state, struct syscall_spec *syscall, struct expression_list *args, char **error) @@ -3558,6 +3657,44 @@ static int parse_expression_to_sctp_sndrcvinfo(struct expression *expr, struct s } #endif +#if defined(__FreeBSD__) +static int parse_expression_to_sctp_extrcvinfo(struct expression *expr, struct sctp_extrcvinfo *info, char **error) { + if (expr->type == EXPR_SCTP_EXTRCVINFO) { + struct sctp_extrcvinfo_expr *extrcvinfo_expr = expr->value.sctp_extrcvinfo; + if (get_u16(extrcvinfo_expr->sinfo_stream, &info->sinfo_stream, error)) { + return STATUS_ERR; + } + if (get_u16(extrcvinfo_expr->sinfo_ssn, &info->sinfo_ssn, error)) { + return STATUS_ERR; + } + if (get_u16(extrcvinfo_expr->sinfo_flags, &info->sinfo_flags, error)) { + return STATUS_ERR; + } + if (get_u32(extrcvinfo_expr->sinfo_ppid, &info->sinfo_ppid, error)) { + return STATUS_ERR; + } + if (get_u32(extrcvinfo_expr->sinfo_context, &info->sinfo_context, error)) { + return STATUS_ERR; + } + if (get_u32(extrcvinfo_expr->sinfo_pr_value, &info->sinfo_timetolive, error)) { + return STATUS_ERR; + } + if (get_u32(extrcvinfo_expr->sinfo_tsn, &info->sinfo_tsn, error)) { + return STATUS_ERR; + } + if (get_u32(extrcvinfo_expr->sinfo_cumtsn, &info->sinfo_cumtsn, error)) { + return STATUS_ERR; + } + if (get_u32(extrcvinfo_expr->sinfo_assoc_id, (u32 *)&info->sinfo_assoc_id, error)) { + return STATUS_ERR; + } + } else { + return STATUS_ERR; + } + return STATUS_OK; +} +#endif + #if defined(__FreeBSD__) static int parse_expression_to_sctp_sndinfo(struct expression *expr, struct sctp_sndinfo *info, char **error) { if (expr->type == EXPR_SCTP_SNDINFO) { @@ -3776,18 +3913,8 @@ static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr, return STATUS_ERR; if (check_u16_expr(expr->rcv_flags, sctp_rcvinfo->rcv_flags, "sctp_rcvinfo.rcv_flags", error)) return STATUS_ERR; - if (expr->rcv_ppid->type != EXPR_ELLIPSIS) { - u32 rcv_ppid; - - if (get_u32(expr->rcv_ppid, &rcv_ppid, error)) { - return STATUS_ERR; - } - if (sctp_rcvinfo->rcv_ppid != rcv_ppid) { - asprintf(error, "sctp_rcvinfo.rcv_ppid: expected: %u actual: %u", - htonl(rcv_ppid), htonl(sctp_rcvinfo->rcv_ppid)); - return STATUS_ERR; - } - } + if (check_u32_hton_expr(expr->rcv_ppid, sctp_rcvinfo->rcv_ppid, "sctp_rcvinfo.rcv_ppid", error)) + return STATUS_ERR; if (check_u32_expr(expr->rcv_tsn, sctp_rcvinfo->rcv_tsn, "sctp_rcvinfo.rcv_tsn", error)) return STATUS_ERR; @@ -3814,18 +3941,8 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr, return STATUS_ERR; if (check_u16_expr(expr->nxt_flags, sctp_nxtinfo->nxt_flags, "sctp_nxtinfo.nxt_flags", error)) return STATUS_ERR; - if (expr->nxt_ppid->type != EXPR_ELLIPSIS) { - u32 nxt_ppid; - - if (get_u32(expr->nxt_ppid, &nxt_ppid, error)) { - return STATUS_ERR; - } - if (sctp_nxtinfo->nxt_ppid != nxt_ppid) { - asprintf(error, "sctp_nxtinfo.nxt_ppid: expected: %u actual: %u", - htonl(nxt_ppid), htonl(sctp_nxtinfo->nxt_ppid)); - return STATUS_ERR; - } - } + if (check_u32_hton_expr(expr->nxt_ppid, sctp_nxtinfo->nxt_ppid, "sctp_nxtinfo.nxt_ppid", error)) + return STATUS_ERR; if (check_u32_expr(expr->nxt_length, sctp_nxtinfo->nxt_length, "sctp_nxtinfo.nxt_length", error)) return STATUS_ERR; if (check_u32_expr(expr->nxt_assoc_id, sctp_nxtinfo->nxt_assoc_id, "sctp_nxtinfo.nxt_assoc_id", error)) diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c index d4907b7f9997e57991ca4449fc5fa88e8d64f51b..39ca41cf794f3f8ec6205eef06c78d9ab9991083 100644 --- a/gtests/net/packetdrill/symbols_freebsd.c +++ b/gtests/net/packetdrill/symbols_freebsd.c @@ -231,6 +231,8 @@ struct int_symbol platform_symbols_table[] = { { SCTP_AUTHINFO, "SCTP_AUTHINFO" }, { SCTP_DSTADDRV4, "SCTP_DSTADDRV4" }, { SCTP_DSTADDRV6, "SCTP_DSTADDRV6" }, + { SCTP_EXTRCV, "SCTP_EXTRCV" }, + { SCTP_USE_EXT_RCVINFO, "SCTP_USE_EXT_RCVINFO" }, /* /usr/include/netinet/tcp.h */ { TCP_NODELAY, "TCP_NODELAY" }, { TCP_MAXSEG, "TCP_MAXSEG" }, diff --git a/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt index e2d136004a719689073f1d9836abe3b0c0234854..bc8f6de938ab1a2668c28d2008a90113c80fe858 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/recvmsg.pkt @@ -53,3 +53,14 @@ spp_hbinterval=0, spp_pathmaxrxt=8, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, {nxt_sid=0, nxt_flags=SCTP_COMPLETE, nxt_ppid=htonl(9876), nxt_length=1000, nxt_assoc_id=3} }] ,msg_flags=MSG_EOR}, 0) = 1000 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0 ++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0 ++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], [4]) = 0 ++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=6, sid=0, ssn=5, ppid=123] +* > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]] ++0.0 recvmsg(3, {msg_name(...)=..., msg_iov(1)=[{iov_base=..., iov_len=1000}],msg_control(140)= + [{cmsg_len=140, cmsg_level=IPPROTO_SCTP, cmsg_type=SCTP_EXTRCV, cmsg_data= + {sinfo_stream=0, sinfo_ssn=4, sinfo_flags=0, sinfo_ppid=htonl(9876), sinfo_context=0, sinfo_pr_value=0, sinfo_tsn=4, sinfo_cumtsn=5, serinfo_next_flags=0, + serinfo_next_stream=0, serinfo_next_aid=0, serinfo_next_length=0, serinfo_next_ppid=htonl(123), sinfo_assoc_id=4} + }] ,msg_flags=MSG_EOR}, 0) = 1000 diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt index b7c6f9283a2f454add5f1f9e64bb9d31420e7b0f..17f94900394fa8e5d1e1fc44c00d53120dcdc19f 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt @@ -34,7 +34,8 @@ +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=htonl(0), rcv_tsn=4, rcv_cumtsn=4, rcv_context=0}, ++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, +rcv_assoc_id=...}, [28], [SCTP_RECVV_RCVINFO], [MSG_EOR]) = 1000 //base SCTP_RECVV_NXTINFO @@ -44,7 +45,7 @@ * > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]] +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}, ++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, nxt_assoc_id=3}, [16], [SCTP_RECVV_NXTINFO], [MSG_EOR]) = 1000 +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [0], [MSG_EOR]) = 1000 @@ -56,19 +57,19 @@ +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], [MSG_EOR]) = 1000 +recvv_rcvinfo={rcv_sid=0, rcv_ssn=6, rcv_flags=0, rcv_ppid=htonl(0), rcv_tsn=7, rcv_cumtsn=8, rcv_context=0, rcv_assoc_id=3}, +recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000, nxt_assoc_id=4}}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 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=...}, +recvv_rcvinfo={rcv_sid=0, rcv_ssn=7, rcv_flags=0, rcv_ppid=htonl(10), rcv_tsn=8, rcv_cumtsn=9, rcv_context=0, rcv_assoc_id=...}, recvv_nxtinfo=...}, [44], [SCTP_RECVV_RN], [MSG_EOR]) = 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=..., recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000}}, [44], [SCTP_RECVV_RN], [8]) = 1000 +recvv_rcvinfo=..., recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000, nxt_assoc_id=3}}, [44], [SCTP_RECVV_RN], [8]) = 1000 +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_EOR]) = 1000 +0.0 close(3) = 0