From 0f39542159849aeb8a55412f8d9c5393143e110b Mon Sep 17 00:00:00 2001 From: hoelscher <jens.hoelscher@fh-muenster.de> Date: Thu, 26 Nov 2015 16:09:59 +0100 Subject: [PATCH] add support for sctp_freepaddrs and sctp_getpaddrs --- gtests/net/packetdrill/run_system_call.c | 103 +++++++++++++++++- .../tests/bsd/sctp/sctp_active_x.pkt | 18 ++- 2 files changed, 110 insertions(+), 11 deletions(-) diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index e124b035..f87dd2c1 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -4996,10 +4996,14 @@ static int syscall_sctp_peeloff(struct state *state, struct syscall_spec *syscal begin_syscall(state, syscall); result = sctp_peeloff(live_fd, assoc_id); - - if (end_syscall(state, syscall, CHECK_NON_NEGATIVE, result, error)) - return STATUS_ERR; - + if (result < 0) { + if (end_syscall(state, syscall, CHECK_EXACT, result, error)) + return STATUS_ERR; + return STATUS_OK; + } else { + if (end_syscall(state, syscall, CHECK_NON_NEGATIVE, result, error)) + return STATUS_ERR; + } if (get_s32(syscall->result, &script_new_fd, error)) return STATUS_ERR; if (run_syscall_sctp_peeloff(state, script_fd, script_new_fd, result, error)) { @@ -5014,6 +5018,93 @@ static int syscall_sctp_peeloff(struct state *state, struct syscall_spec *syscal #endif } +static int syscall_sctp_getpaddrs(struct state *state, struct syscall_spec *syscall, + struct expression_list *args, + char **error) +{ +#if defined(__FreeBSD__) || defined(linux) + int live_fd, script_fd, result; + sctp_assoc_t assoc_id; + struct expression *assoc_expr, *addrs_list_expr; + struct sockaddr *live_addrs; + + if (check_arg_count(args, 3, error)) + return STATUS_ERR; + if (s32_arg(args, 0, &script_fd, error)) + return STATUS_ERR; + if (to_live_fd(state, script_fd, &live_fd, error)) + return STATUS_ERR; + assoc_expr = get_arg(args, 1, error); + if (get_u32(assoc_expr, (u32 *)&assoc_id, error)) + return STATUS_ERR; + + begin_syscall(state, syscall); + + result = sctp_getpaddrs(live_fd, assoc_id, &live_addrs); + + if (end_syscall(state, syscall, CHECK_EXACT, result, error)) + goto error_out; + addrs_list_expr = get_arg(args, 2, error); + if (addrs_list_expr->type != EXPR_ELLIPSIS) { + int list_length = 0, i = 0; + struct sockaddr *live_addr = live_addrs; + if (check_type(addrs_list_expr, EXPR_LIST, error)) { + goto error_out; + } + list_length = get_arg_count(addrs_list_expr->value.list); + if (list_length != result) { + asprintf(error, "Bad length of struct sockaddr array. expected: %d, actual %d", list_length, result); + goto error_out; + } + for (i = 0; i < result; i++) { + struct expression *script_addr_expr; + script_addr_expr = get_arg(addrs_list_expr->value.list, i, error); + if (check_sockaddr(script_addr_expr, live_addr, error)) { + goto error_out; + } + if (live_addr->sa_family == AF_INET) { + live_addr = (struct sockaddr *)((caddr_t*)live_addr) + sizeof(struct sockaddr_in); + } else if (live_addr->sa_family == AF_INET6) { + live_addr = (struct sockaddr *)((caddr_t*)live_addr) + sizeof(struct sockaddr_in6); + } else { + asprintf(error, "Bad Type of addrs[%d]", i); + goto error_out; + } + } + } + return STATUS_OK; +error_out: + sctp_freepaddrs(live_addrs); + return STATUS_ERR; +#else + asprintf(error, "sctp_getpaddrs is not supported"); + return STATUS_ERR; +#endif +} + +static int syscall_sctp_freepaddrs(struct state *state, struct syscall_spec *syscall, + struct expression_list *args, + char **error) +{ +#if defined(__FreeBSD__) || defined(linux) + struct expression *addrs_expr; + if (check_arg_count(args, 1, error)) + return STATUS_ERR; + addrs_expr = get_arg(args, 0, error); + if (check_type(addrs_expr, EXPR_LIST, error)) + return STATUS_ERR; + if (ellipsis_arg(addrs_expr->value.list, 0, error)) + return STATUS_ERR; + + return STATUS_OK; +#else + asprintf(error, "sctp_freepaddrs is not supported"); + return STATUS_ERR; +#endif +} + + + /* A dispatch table with all the system calls that we support... */ struct system_call_entry { const char *name; @@ -5054,7 +5145,9 @@ struct system_call_entry system_call_table[] = { {"sctp_recvv", syscall_sctp_recvv}, {"sctp_bindx", syscall_sctp_bindx}, {"sctp_connectx", syscall_sctp_connectx}, - {"sctp_peeloff", syscall_sctp_peeloff} + {"sctp_peeloff", syscall_sctp_peeloff}, + {"sctp_freepaddrs",syscall_sctp_freepaddrs}, + {"sctp_getpaddrs",syscall_sctp_getpaddrs} }; /* Evaluate the system call arguments and invoke the system call. */ diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt index 44c1d95e..93595426 100644 --- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt +++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt @@ -12,19 +12,25 @@ +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...] +0.1 < sctp: COOKIE_ACK[flgs=0] ++0.0 sctp_getpaddrs(3, 3, [...]) = 1 ++0.0 sctp_freepaddrs([...]) = 0 + ++0.0 sctp_getpaddrs(3, 3, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}]) = 1 ++0.0 sctp_freepaddrs([...]) = 0 + +0.0 sctp_sendmsg(3, ..., 1000, ..., ..., htonl(1234), SCTP_UNORDERED, 1, 0, 0) = 1000 * > sctp: DATA[flgs=UBE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234] +0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] -+0.0 sctp_peeloff(3, 4) = 4 ++0.0 sctp_peeloff(3, 4) = -1 +0.0 sctp_sendmsg(3, ..., 1000, ..., ..., htonl(1234), SCTP_UNORDERED, 1, 0, 0) = 1000 -* > sctp: DATA[flgs=UBE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234] -+0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] +* > sctp: DATA[flgs=UBE, len=1016, tsn=2, sid=1, ssn=0, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]] -+0.0 sctp_sendmsg(4, ..., 1000, ..., ..., htonl(1234), SCTP_UNORDERED, 1, 0, 0) = 1000 -* > sctp: DATA[flgs=UBE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234] -+0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]] ++0.0 sctp_sendmsg(3, ..., 1000, ..., ..., htonl(1234), SCTP_UNORDERED, 1, 0, 0) = 1000 +* > sctp: DATA[flgs=UBE, len=1016, tsn=3, sid=1, ssn=0, ppid=1234] ++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]] +0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0] * > sctp: SHUTDOWN_ACK[flgs=0] -- GitLab