From 9025661751aaf75e7d9bb0e1b8887506e5632d73 Mon Sep 17 00:00:00 2001 From: Jens Hoelsch <jens.hoelscher@fh-muenster.de> Date: Mon, 21 Dec 2015 20:27:18 +0100 Subject: [PATCH] add sockot SCTP_AUTH_KEY --- gtests/net/packetdrill/run_system_call.c | 43 +++++++++++++++++++++++- gtests/net/packetdrill/script.c | 2 +- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 65b80f65..3aca6257 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -3891,6 +3891,47 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, optval = &authchunk; break; #endif +#ifdef SCTP_AUTH_KEY + case EXPR_SCTP_AUTHKEY: { + struct sctp_authkey *key; + int i = 0, len = 0; + struct expression *key_expr; + struct expression_list *list; + + if (check_type(val_expression->value.sctp_authkey->sca_key, EXPR_LIST, error)) { + return STATUS_ERR; + } + list = val_expression->value.sctp_authkey->sca_key->value.list; + len = expression_list_length(list); + key = malloc(sizeof(sctp_assoc_t) + sizeof(u16) + sizeof(u16) + (sizeof(u8) * len)); + + if (get_sctp_assoc_t(val_expression->value.sctp_authkey->sca_assoc_id, + &key->sca_assoc_id, error)) { + free(key); + return STATUS_ERR; + } + if (get_u16(val_expression->value.sctp_authkey->sca_keynumber, + &key->sca_keynumber, error)) { + free(key); + return STATUS_ERR; + } + if (get_u16(val_expression->value.sctp_authkey->sca_keylength, + &key->sca_keylength, error)) { + free(key); + return STATUS_ERR; + } + for (i = 0; i < len; i++) { + key_expr = get_arg(list, i, error); + if (get_u8(key_expr, &(key->sca_key[i]), error)) { + free(key); + return STATUS_ERR; + } + } + key->sca_keylength = len; + optval = key; + break; + } +#endif #ifdef SCTP_PEER_ADDR_PARAMS case EXPR_SCTP_PEER_ADDR_PARAMS: if (get_sctp_assoc_t(val_expression->value.sctp_paddrparams->spp_assoc_id, @@ -3959,7 +4000,7 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, result = setsockopt(live_fd, level, optname, optval, optlen); return end_syscall(state, syscall, CHECK_EXACT, result, error); -#ifdef SCTP_HMAC_IDENT +#if defined(SCTP_HMAC_IDENT) || defined(SCTP_AUTH_KEY) free(optval); #endif } diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c index b77b9404..1b78fccf 100644 --- a/gtests/net/packetdrill/script.c +++ b/gtests/net/packetdrill/script.c @@ -2393,7 +2393,7 @@ static int evaluate_sctp_authkey_expression(struct expression *in, assert(in->value.sctp_authkey); assert(out->type == EXPR_SCTP_AUTHKEY); - out->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr)); + out->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr)); in_authkey = in->value.sctp_authkey; out_authkey = out->value.sctp_authkey; -- GitLab