* [PATCH v3 net-next 1/8] sctp: setsockopt, rename some locals. @ 2020-05-26 16:39 ` David Laight 0 siblings, 0 replies; 11+ messages in thread From: David Laight @ 2020-05-26 16:39 UTC (permalink / raw) To: 'Vlad Yasevich', 'Neil Horman', 'David S. Miller', 'Jakub Kicinski', 'linux-sctp@vger.kernel.org', 'netdev@vger.kernel.org', 'Christoph Hellwig', 'Marcelo Ricardo Leitner' Rename locals to avoid clash with structure fields in next patch. Signed-off-by: David Laight <david.laight@aculab.com> --- net/sctp/socket.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 1b56fc4..c1c8215 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -3088,7 +3088,7 @@ static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval, */ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen) { - struct sctp_rtoinfo rtoinfo; + struct sctp_rtoinfo params; struct sctp_association *asoc; unsigned long rto_min, rto_max; struct sctp_sock *sp = sctp_sk(sk); @@ -3096,18 +3096,18 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne if (optlen != sizeof (struct sctp_rtoinfo)) return -EINVAL; - if (copy_from_user(&rtoinfo, optval, optlen)) + if (copy_from_user(¶ms, optval, optlen)) return -EFAULT; - asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); + asoc = sctp_id2assoc(sk, params.srto_assoc_id); /* Set the values to the specific association */ - if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params.srto_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; - rto_max = rtoinfo.srto_max; - rto_min = rtoinfo.srto_min; + rto_max = params.srto_max; + rto_min = params.srto_min; if (rto_max) rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; @@ -3123,17 +3123,17 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne return -EINVAL; if (asoc) { - if (rtoinfo.srto_initial != 0) + if (params.srto_initial != 0) asoc->rto_initial - msecs_to_jiffies(rtoinfo.srto_initial); + msecs_to_jiffies(params.srto_initial); asoc->rto_max = rto_max; asoc->rto_min = rto_min; } else { /* If there is no association or the association-id = 0 * set the values to the endpoint. */ - if (rtoinfo.srto_initial != 0) - sp->rtoinfo.srto_initial = rtoinfo.srto_initial; + if (params.srto_initial != 0) + sp->rtoinfo.srto_initial = params.srto_initial; sp->rtoinfo.srto_max = rto_max; sp->rtoinfo.srto_min = rto_min; } @@ -3155,23 +3155,23 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen) { - struct sctp_assocparams assocparams; + struct sctp_assocparams params; struct sctp_association *asoc; if (optlen != sizeof(struct sctp_assocparams)) return -EINVAL; - if (copy_from_user(&assocparams, optval, optlen)) + if (copy_from_user(¶ms, optval, optlen)) return -EFAULT; - asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); + asoc = sctp_id2assoc(sk, params.sasoc_assoc_id); - if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params.sasoc_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; /* Set the values to the specific association */ if (asoc) { - if (assocparams.sasoc_asocmaxrxt != 0) { + if (params.sasoc_asocmaxrxt != 0) { __u32 path_sum = 0; int paths = 0; struct sctp_transport *peer_addr; @@ -3188,24 +3188,24 @@ static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsig * then one path. */ if (paths > 1 && - assocparams.sasoc_asocmaxrxt > path_sum) + params.sasoc_asocmaxrxt > path_sum) return -EINVAL; - asoc->max_retrans = assocparams.sasoc_asocmaxrxt; + asoc->max_retrans = params.sasoc_asocmaxrxt; } - if (assocparams.sasoc_cookie_life != 0) - asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life); + if (params.sasoc_cookie_life != 0) + asoc->cookie_life = ms_to_ktime(params.sasoc_cookie_life); } else { /* Set the values to the endpoint */ struct sctp_sock *sp = sctp_sk(sk); - if (assocparams.sasoc_asocmaxrxt != 0) + if (params.sasoc_asocmaxrxt != 0) sp->assocparams.sasoc_asocmaxrxt - assocparams.sasoc_asocmaxrxt; - if (assocparams.sasoc_cookie_life != 0) + params.sasoc_asocmaxrxt; + if (params.sasoc_cookie_life != 0) sp->assocparams.sasoc_cookie_life - assocparams.sasoc_cookie_life; + params.sasoc_cookie_life; } return 0; } -- 1.8.1.2 - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 net-next 1/8] sctp: setsockopt, rename some locals. @ 2020-05-26 16:39 ` David Laight 0 siblings, 0 replies; 11+ messages in thread From: David Laight @ 2020-05-26 16:39 UTC (permalink / raw) To: 'Vlad Yasevich', 'Neil Horman', 'David S. Miller', 'Jakub Kicinski', 'linux-sctp@vger.kernel.org', 'netdev@vger.kernel.org', 'Christoph Hellwig', 'Marcelo Ricardo Leitner' Rename locals to avoid clash with structure fields in next patch. Signed-off-by: David Laight <david.laight@aculab.com> --- net/sctp/socket.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 1b56fc4..c1c8215 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -3088,7 +3088,7 @@ static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval, */ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen) { - struct sctp_rtoinfo rtoinfo; + struct sctp_rtoinfo params; struct sctp_association *asoc; unsigned long rto_min, rto_max; struct sctp_sock *sp = sctp_sk(sk); @@ -3096,18 +3096,18 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne if (optlen != sizeof (struct sctp_rtoinfo)) return -EINVAL; - if (copy_from_user(&rtoinfo, optval, optlen)) + if (copy_from_user(¶ms, optval, optlen)) return -EFAULT; - asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); + asoc = sctp_id2assoc(sk, params.srto_assoc_id); /* Set the values to the specific association */ - if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params.srto_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; - rto_max = rtoinfo.srto_max; - rto_min = rtoinfo.srto_min; + rto_max = params.srto_max; + rto_min = params.srto_min; if (rto_max) rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; @@ -3123,17 +3123,17 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne return -EINVAL; if (asoc) { - if (rtoinfo.srto_initial != 0) + if (params.srto_initial != 0) asoc->rto_initial = - msecs_to_jiffies(rtoinfo.srto_initial); + msecs_to_jiffies(params.srto_initial); asoc->rto_max = rto_max; asoc->rto_min = rto_min; } else { /* If there is no association or the association-id = 0 * set the values to the endpoint. */ - if (rtoinfo.srto_initial != 0) - sp->rtoinfo.srto_initial = rtoinfo.srto_initial; + if (params.srto_initial != 0) + sp->rtoinfo.srto_initial = params.srto_initial; sp->rtoinfo.srto_max = rto_max; sp->rtoinfo.srto_min = rto_min; } @@ -3155,23 +3155,23 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen) { - struct sctp_assocparams assocparams; + struct sctp_assocparams params; struct sctp_association *asoc; if (optlen != sizeof(struct sctp_assocparams)) return -EINVAL; - if (copy_from_user(&assocparams, optval, optlen)) + if (copy_from_user(¶ms, optval, optlen)) return -EFAULT; - asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); + asoc = sctp_id2assoc(sk, params.sasoc_assoc_id); - if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params.sasoc_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; /* Set the values to the specific association */ if (asoc) { - if (assocparams.sasoc_asocmaxrxt != 0) { + if (params.sasoc_asocmaxrxt != 0) { __u32 path_sum = 0; int paths = 0; struct sctp_transport *peer_addr; @@ -3188,24 +3188,24 @@ static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsig * then one path. */ if (paths > 1 && - assocparams.sasoc_asocmaxrxt > path_sum) + params.sasoc_asocmaxrxt > path_sum) return -EINVAL; - asoc->max_retrans = assocparams.sasoc_asocmaxrxt; + asoc->max_retrans = params.sasoc_asocmaxrxt; } - if (assocparams.sasoc_cookie_life != 0) - asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life); + if (params.sasoc_cookie_life != 0) + asoc->cookie_life = ms_to_ktime(params.sasoc_cookie_life); } else { /* Set the values to the endpoint */ struct sctp_sock *sp = sctp_sk(sk); - if (assocparams.sasoc_asocmaxrxt != 0) + if (params.sasoc_asocmaxrxt != 0) sp->assocparams.sasoc_asocmaxrxt = - assocparams.sasoc_asocmaxrxt; - if (assocparams.sasoc_cookie_life != 0) + params.sasoc_asocmaxrxt; + if (params.sasoc_cookie_life != 0) sp->assocparams.sasoc_cookie_life = - assocparams.sasoc_cookie_life; + params.sasoc_cookie_life; } return 0; } -- 1.8.1.2 - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines @ 2020-05-26 16:40 ` David Laight 0 siblings, 0 replies; 11+ messages in thread From: David Laight @ 2020-05-26 16:40 UTC (permalink / raw) To: 'Vlad Yasevich', 'Neil Horman', 'David S. Miller', 'Jakub Kicinski', 'linux-sctp@vger.kernel.org', 'netdev@vger.kernel.org', 'Christoph Hellwig', 'Marcelo Ricardo Leitner' Expand the #define foo (*foo) used to simplify the previous patch. Doesn't change the generated code. Signed-off-by: David Laight <david.laight@aculab.com> --- net/sctp/socket.c | 687 ++++++++++++++++++++++++++---------------------------- 1 file changed, 331 insertions(+), 356 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 639d7da..b8068da 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -2585,9 +2585,8 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, return 0; } -#define params (*params) static int sctp_setsockopt_peer_addr_params(struct sock *sk, - struct sctp_paddrparams params, + struct sctp_paddrparams *params, unsigned int optlen) { struct sctp_transport *trans = NULL; @@ -2596,33 +2595,33 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, int error; int hb_change, pmtud_change, sackdelay_change; - if (optlen != sizeof(params)) { + if (optlen != sizeof(*params)) { if (optlen != ALIGN(offsetof(struct sctp_paddrparams, spp_ipv6_flowlabel), 4)) return -EINVAL; - if (params.spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) + if (params->spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) return -EINVAL; } /* Validate flags and value parameters. */ - hb_change = params.spp_flags & SPP_HB; - pmtud_change = params.spp_flags & SPP_PMTUD; - sackdelay_change = params.spp_flags & SPP_SACKDELAY; + hb_change = params->spp_flags & SPP_HB; + pmtud_change = params->spp_flags & SPP_PMTUD; + sackdelay_change = params->spp_flags & SPP_SACKDELAY; if (hb_change = SPP_HB || pmtud_change = SPP_PMTUD || sackdelay_change = SPP_SACKDELAY || - params.spp_sackdelay > 500 || - (params.spp_pathmtu && - params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) + params->spp_sackdelay > 500 || + (params->spp_pathmtu && + params->spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) return -EINVAL; /* If an address other than INADDR_ANY is specified, and * no transport is found, then the request is invalid. */ - if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) { - trans = sctp_addr_id2transport(sk, ¶ms.spp_address, - params.spp_assoc_id); + if (!sctp_is_any(sk, (union sctp_addr *)¶ms->spp_address)) { + trans = sctp_addr_id2transport(sk, ¶ms->spp_address, + params->spp_assoc_id); if (!trans) return -EINVAL; } @@ -2631,19 +2630,19 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, * socket is a one to many style socket, and an association * was not found, then the id was invalid. */ - asoc = sctp_id2assoc(sk, params.spp_assoc_id); - if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->spp_assoc_id); + if (!asoc && params->spp_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; /* Heartbeat demand can only be sent on a transport or * association, but not a socket. */ - if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc) + if (params->spp_flags & SPP_HB_DEMAND && !trans && !asoc) return -EINVAL; /* Process parameters. */ - error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, + error = sctp_apply_peer_addr_params(params, trans, asoc, sp, hb_change, pmtud_change, sackdelay_change); @@ -2656,7 +2655,7 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, if (!trans && asoc) { list_for_each_entry(trans, &asoc->peer.transport_addr_list, transports) { - sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, + sctp_apply_peer_addr_params(params, trans, asoc, sp, hb_change, pmtud_change, sackdelay_change); } @@ -2664,7 +2663,6 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, return 0; } -#undef params static inline __u32 sctp_spp_sackdelay_enable(__u32 param_flags) { @@ -2749,16 +2747,15 @@ static void sctp_apply_asoc_delayed_ack(struct sctp_sack_info *params, * value to 1 will disable the delayed sack algorithm. */ -#define params (*params) static int sctp_setsockopt_delayed_ack(struct sock *sk, - struct sctp_sack_info params, + struct sctp_sack_info *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; if (optlen = sizeof(struct sctp_sack_info)) { - if (params.sack_delay = 0 && params.sack_freq = 0) + if (params->sack_delay = 0 && params->sack_freq = 0) return 0; } else if (optlen = sizeof(struct sctp_assoc_value)) { pr_warn_ratelimited(DEPRECATED @@ -2766,56 +2763,56 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk, "Use of struct sctp_assoc_value in delayed_ack socket option.\n" "Use struct sctp_sack_info instead\n", current->comm, task_pid_nr(current)); - if (params.sack_delay = 0) - params.sack_freq = 1; + if (params->sack_delay = 0) + params->sack_freq = 1; else - params.sack_freq = 0; + params->sack_freq = 0; } else return -EINVAL; /* Validate value parameter. */ - if (params.sack_delay > 500) + if (params->sack_delay > 500) return -EINVAL; /* Get association, if sack_assoc_id != SCTP_FUTURE_ASSOC and the * socket is a one to many style socket, and an association * was not found, then the id was invalid. */ - asoc = sctp_id2assoc(sk, params.sack_assoc_id); - if (!asoc && params.sack_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->sack_assoc_id); + if (!asoc && params->sack_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - sctp_apply_asoc_delayed_ack(¶ms, asoc); + sctp_apply_asoc_delayed_ack(params, asoc); return 0; } if (sctp_style(sk, TCP)) - params.sack_assoc_id = SCTP_FUTURE_ASSOC; + params->sack_assoc_id = SCTP_FUTURE_ASSOC; - if (params.sack_assoc_id = SCTP_FUTURE_ASSOC || - params.sack_assoc_id = SCTP_ALL_ASSOC) { - if (params.sack_delay) { - sp->sackdelay = params.sack_delay; + if (params->sack_assoc_id = SCTP_FUTURE_ASSOC || + params->sack_assoc_id = SCTP_ALL_ASSOC) { + if (params->sack_delay) { + sp->sackdelay = params->sack_delay; sp->param_flags sctp_spp_sackdelay_enable(sp->param_flags); } - if (params.sack_freq = 1) { + if (params->sack_freq = 1) { sp->param_flags sctp_spp_sackdelay_disable(sp->param_flags); - } else if (params.sack_freq > 1) { - sp->sackfreq = params.sack_freq; + } else if (params->sack_freq > 1) { + sp->sackfreq = params->sack_freq; sp->param_flags sctp_spp_sackdelay_enable(sp->param_flags); } } - if (params.sack_assoc_id = SCTP_CURRENT_ASSOC || - params.sack_assoc_id = SCTP_ALL_ASSOC) + if (params->sack_assoc_id = SCTP_CURRENT_ASSOC || + params->sack_assoc_id = SCTP_ALL_ASSOC) list_for_each_entry(asoc, &sp->ep->asocs, asocs) - sctp_apply_asoc_delayed_ack(¶ms, asoc); + sctp_apply_asoc_delayed_ack(params, asoc); return 0; } @@ -2831,8 +2828,7 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk, * by the change). With TCP-style sockets, this option is inherited by * sockets derived from a listener socket. */ -#define sinit (*sinit) -static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, +static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg *sinit, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -2840,18 +2836,17 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, if (optlen != sizeof(struct sctp_initmsg)) return -EINVAL; - if (sinit.sinit_num_ostreams) - sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams; - if (sinit.sinit_max_instreams) - sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams; - if (sinit.sinit_max_attempts) - sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts; - if (sinit.sinit_max_init_timeo) - sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo; + if (sinit->sinit_num_ostreams) + sp->initmsg.sinit_num_ostreams = sinit->sinit_num_ostreams; + if (sinit->sinit_max_instreams) + sp->initmsg.sinit_max_instreams = sinit->sinit_max_instreams; + if (sinit->sinit_max_attempts) + sp->initmsg.sinit_max_attempts = sinit->sinit_max_attempts; + if (sinit->sinit_max_init_timeo) + sp->initmsg.sinit_max_init_timeo = sinit->sinit_max_init_timeo; return 0; } -#undef sinit /* * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM) @@ -2867,56 +2862,55 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, * sinfo_timetolive. The user must provide the sinfo_assoc_id field in * to this call if the caller is using the UDP model. */ -#define info (*info) static int sctp_setsockopt_default_send_param(struct sock *sk, - struct sctp_sndrcvinfo info, + struct sctp_sndrcvinfo *info, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; - if (optlen != sizeof(info)) + if (optlen != sizeof(*info)) return -EINVAL; - if (info.sinfo_flags & + if (info->sinfo_flags & ~(SCTP_UNORDERED | SCTP_ADDR_OVER | SCTP_ABORT | SCTP_EOF)) return -EINVAL; - asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); - if (!asoc && info.sinfo_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, info->sinfo_assoc_id); + if (!asoc && info->sinfo_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->default_stream = info.sinfo_stream; - asoc->default_flags = info.sinfo_flags; - asoc->default_ppid = info.sinfo_ppid; - asoc->default_context = info.sinfo_context; - asoc->default_timetolive = info.sinfo_timetolive; + asoc->default_stream = info->sinfo_stream; + asoc->default_flags = info->sinfo_flags; + asoc->default_ppid = info->sinfo_ppid; + asoc->default_context = info->sinfo_context; + asoc->default_timetolive = info->sinfo_timetolive; return 0; } if (sctp_style(sk, TCP)) - info.sinfo_assoc_id = SCTP_FUTURE_ASSOC; + info->sinfo_assoc_id = SCTP_FUTURE_ASSOC; - if (info.sinfo_assoc_id = SCTP_FUTURE_ASSOC || - info.sinfo_assoc_id = SCTP_ALL_ASSOC) { - sp->default_stream = info.sinfo_stream; - sp->default_flags = info.sinfo_flags; - sp->default_ppid = info.sinfo_ppid; - sp->default_context = info.sinfo_context; - sp->default_timetolive = info.sinfo_timetolive; + if (info->sinfo_assoc_id = SCTP_FUTURE_ASSOC || + info->sinfo_assoc_id = SCTP_ALL_ASSOC) { + sp->default_stream = info->sinfo_stream; + sp->default_flags = info->sinfo_flags; + sp->default_ppid = info->sinfo_ppid; + sp->default_context = info->sinfo_context; + sp->default_timetolive = info->sinfo_timetolive; } - if (info.sinfo_assoc_id = SCTP_CURRENT_ASSOC || - info.sinfo_assoc_id = SCTP_ALL_ASSOC) { + if (info->sinfo_assoc_id = SCTP_CURRENT_ASSOC || + info->sinfo_assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - asoc->default_stream = info.sinfo_stream; - asoc->default_flags = info.sinfo_flags; - asoc->default_ppid = info.sinfo_ppid; - asoc->default_context = info.sinfo_context; - asoc->default_timetolive = info.sinfo_timetolive; + asoc->default_stream = info->sinfo_stream; + asoc->default_flags = info->sinfo_flags; + asoc->default_ppid = info->sinfo_ppid; + asoc->default_context = info->sinfo_context; + asoc->default_timetolive = info->sinfo_timetolive; } } @@ -2927,51 +2921,51 @@ static int sctp_setsockopt_default_send_param(struct sock *sk, * (SCTP_DEFAULT_SNDINFO) */ static int sctp_setsockopt_default_sndinfo(struct sock *sk, - struct sctp_sndinfo info, + struct sctp_sndinfo *info, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; - if (optlen != sizeof(info)) + if (optlen != sizeof(*info)) return -EINVAL; - if (info.snd_flags & + if (info->snd_flags & ~(SCTP_UNORDERED | SCTP_ADDR_OVER | SCTP_ABORT | SCTP_EOF)) return -EINVAL; - asoc = sctp_id2assoc(sk, info.snd_assoc_id); - if (!asoc && info.snd_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, info->snd_assoc_id); + if (!asoc && info->snd_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->default_stream = info.snd_sid; - asoc->default_flags = info.snd_flags; - asoc->default_ppid = info.snd_ppid; - asoc->default_context = info.snd_context; + asoc->default_stream = info->snd_sid; + asoc->default_flags = info->snd_flags; + asoc->default_ppid = info->snd_ppid; + asoc->default_context = info->snd_context; return 0; } if (sctp_style(sk, TCP)) - info.snd_assoc_id = SCTP_FUTURE_ASSOC; + info->snd_assoc_id = SCTP_FUTURE_ASSOC; - if (info.snd_assoc_id = SCTP_FUTURE_ASSOC || - info.snd_assoc_id = SCTP_ALL_ASSOC) { - sp->default_stream = info.snd_sid; - sp->default_flags = info.snd_flags; - sp->default_ppid = info.snd_ppid; - sp->default_context = info.snd_context; + if (info->snd_assoc_id = SCTP_FUTURE_ASSOC || + info->snd_assoc_id = SCTP_ALL_ASSOC) { + sp->default_stream = info->snd_sid; + sp->default_flags = info->snd_flags; + sp->default_ppid = info->snd_ppid; + sp->default_context = info->snd_context; } - if (info.snd_assoc_id = SCTP_CURRENT_ASSOC || - info.snd_assoc_id = SCTP_ALL_ASSOC) { + if (info->snd_assoc_id = SCTP_CURRENT_ASSOC || + info->snd_assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - asoc->default_stream = info.snd_sid; - asoc->default_flags = info.snd_flags; - asoc->default_ppid = info.snd_ppid; - asoc->default_context = info.snd_context; + asoc->default_stream = info->snd_sid; + asoc->default_flags = info->snd_flags; + asoc->default_ppid = info->snd_ppid; + asoc->default_context = info->snd_context; } } @@ -2984,8 +2978,7 @@ static int sctp_setsockopt_default_sndinfo(struct sock *sk, * the association primary. The enclosed address must be one of the * association peer's addresses. */ -#define prim (*prim) -static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, +static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim *prim, unsigned int optlen) { struct sctp_transport *trans; @@ -2996,17 +2989,17 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, return -EINVAL; /* Allow security module to validate address but need address len. */ - af = sctp_get_af_specific(prim.ssp_addr.ss_family); + af = sctp_get_af_specific(prim->ssp_addr.ss_family); if (!af) return -EINVAL; err = security_sctp_bind_connect(sk, SCTP_PRIMARY_ADDR, - (struct sockaddr *)&prim.ssp_addr, + (struct sockaddr *)&prim->ssp_addr, af->sockaddr_len); if (err) return err; - trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id); + trans = sctp_addr_id2transport(sk, &prim->ssp_addr, prim->ssp_assoc_id); if (!trans) return -EINVAL; @@ -3014,7 +3007,6 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, return 0; } -#undef prim /* * 7.1.5 SCTP_NODELAY @@ -3047,7 +3039,7 @@ static int sctp_setsockopt_nodelay(struct sock *sk, int *optval, * */ static int sctp_setsockopt_rtoinfo(struct sock *sk, - struct sctp_rtoinfo params, + struct sctp_rtoinfo *params, unsigned int optlen) { struct sctp_association *asoc; @@ -3057,15 +3049,15 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, if (optlen != sizeof (struct sctp_rtoinfo)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.srto_assoc_id); + asoc = sctp_id2assoc(sk, params->srto_assoc_id); /* Set the values to the specific association */ - if (!asoc && params.srto_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params->srto_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; - rto_max = params.srto_max; - rto_min = params.srto_min; + rto_max = params->srto_max; + rto_min = params->srto_min; if (rto_max) rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; @@ -3081,17 +3073,17 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, return -EINVAL; if (asoc) { - if (params.srto_initial != 0) + if (params->srto_initial != 0) asoc->rto_initial - msecs_to_jiffies(params.srto_initial); + msecs_to_jiffies(params->srto_initial); asoc->rto_max = rto_max; asoc->rto_min = rto_min; } else { /* If there is no association or the association-id = 0 * set the values to the endpoint. */ - if (params.srto_initial != 0) - sp->rtoinfo.srto_initial = params.srto_initial; + if (params->srto_initial != 0) + sp->rtoinfo.srto_initial = params->srto_initial; sp->rtoinfo.srto_max = rto_max; sp->rtoinfo.srto_min = rto_min; } @@ -3111,7 +3103,7 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, * */ static int sctp_setsockopt_associnfo(struct sock *sk, - struct sctp_assocparams params, + struct sctp_assocparams *params, unsigned int optlen) { @@ -3120,15 +3112,15 @@ static int sctp_setsockopt_associnfo(struct sock *sk, if (optlen != sizeof(struct sctp_assocparams)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.sasoc_assoc_id); + asoc = sctp_id2assoc(sk, params->sasoc_assoc_id); - if (!asoc && params.sasoc_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params->sasoc_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; /* Set the values to the specific association */ if (asoc) { - if (params.sasoc_asocmaxrxt != 0) { + if (params->sasoc_asocmaxrxt != 0) { __u32 path_sum = 0; int paths = 0; struct sctp_transport *peer_addr; @@ -3145,24 +3137,24 @@ static int sctp_setsockopt_associnfo(struct sock *sk, * then one path. */ if (paths > 1 && - params.sasoc_asocmaxrxt > path_sum) + params->sasoc_asocmaxrxt > path_sum) return -EINVAL; - asoc->max_retrans = params.sasoc_asocmaxrxt; + asoc->max_retrans = params->sasoc_asocmaxrxt; } - if (params.sasoc_cookie_life != 0) - asoc->cookie_life = ms_to_ktime(params.sasoc_cookie_life); + if (params->sasoc_cookie_life != 0) + asoc->cookie_life = ms_to_ktime(params->sasoc_cookie_life); } else { /* Set the values to the endpoint */ struct sctp_sock *sp = sctp_sk(sk); - if (params.sasoc_asocmaxrxt != 0) + if (params->sasoc_asocmaxrxt != 0) sp->assocparams.sasoc_asocmaxrxt - params.sasoc_asocmaxrxt; - if (params.sasoc_cookie_life != 0) + params->sasoc_asocmaxrxt; + if (params->sasoc_cookie_life != 0) sp->assocparams.sasoc_cookie_life - params.sasoc_cookie_life; + params->sasoc_cookie_life; } return 0; } @@ -3220,7 +3212,7 @@ static int sctp_setsockopt_mappedv4(struct sock *sk, int *optval, * assoc_value: This parameter specifies the maximum size in bytes. */ static int sctp_setsockopt_maxseg(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -3233,16 +3225,16 @@ static int sctp_setsockopt_maxseg(struct sock *sk, "Use of int in maxseg socket option.\n" "Use struct sctp_assoc_value instead\n", current->comm, task_pid_nr(current)); - val = *(int *)¶ms; - params.assoc_id = SCTP_FUTURE_ASSOC; + val = *(int *)params; + params->assoc_id = SCTP_FUTURE_ASSOC; } else if (optlen != sizeof(struct sctp_assoc_value)) { - val = params.assoc_value; + val = params->assoc_value; } else { return -EINVAL; } - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; @@ -3277,9 +3269,8 @@ static int sctp_setsockopt_maxseg(struct sock *sk, * locally bound addresses. The following structure is used to make a * set primary request: */ -#define prim (*prim) static int sctp_setsockopt_peer_primary_addr(struct sock *sk, - struct sctp_setpeerprim prim, + struct sctp_setpeerprim *prim, unsigned int optlen) { struct sctp_sock *sp; @@ -3296,7 +3287,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, if (optlen != sizeof(struct sctp_setpeerprim)) return -EINVAL; - asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); + asoc = sctp_id2assoc(sk, prim->sspp_assoc_id); if (!asoc) return -EINVAL; @@ -3309,26 +3300,26 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, if (!sctp_state(asoc, ESTABLISHED)) return -ENOTCONN; - af = sctp_get_af_specific(prim.sspp_addr.ss_family); + af = sctp_get_af_specific(prim->sspp_addr.ss_family); if (!af) return -EINVAL; - if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL)) + if (!af->addr_valid((union sctp_addr *)&prim->sspp_addr, sp, NULL)) return -EADDRNOTAVAIL; - if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) + if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim->sspp_addr)) return -EADDRNOTAVAIL; /* Allow security module to validate address. */ err = security_sctp_bind_connect(sk, SCTP_SET_PEER_PRIMARY_ADDR, - (struct sockaddr *)&prim.sspp_addr, + (struct sockaddr *)&prim->sspp_addr, af->sockaddr_len); if (err) return err; /* Create an ASCONF chunk with SET_PRIMARY parameter */ chunk = sctp_make_asconf_set_prim(asoc, - (union sctp_addr *)&prim.sspp_addr); + (union sctp_addr *)&prim->sspp_addr); if (!chunk) return -ENOMEM; @@ -3338,7 +3329,6 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, return err; } -#undef prim static int sctp_setsockopt_adaptation_layer(struct sock *sk, struct sctp_setadaptation *adaptation, @@ -3367,7 +3357,7 @@ static int sctp_setsockopt_adaptation_layer(struct sock *sk, * saved with outbound messages. */ static int sctp_setsockopt_context(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -3376,28 +3366,28 @@ static int sctp_setsockopt_context(struct sock *sk, if (optlen != sizeof(struct sctp_assoc_value)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->default_rcv_context = params.assoc_value; + asoc->default_rcv_context = params->assoc_value; return 0; } if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id = SCTP_FUTURE_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) - sp->default_rcv_context = params.assoc_value; + if (params->assoc_id = SCTP_FUTURE_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) + sp->default_rcv_context = params->assoc_value; - if (params.assoc_id = SCTP_CURRENT_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) + if (params->assoc_id = SCTP_CURRENT_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) list_for_each_entry(asoc, &sp->ep->asocs, asocs) - asoc->default_rcv_context = params.assoc_value; + asoc->default_rcv_context = params->assoc_value; return 0; } @@ -3488,7 +3478,7 @@ static int sctp_setsockopt_partial_delivery_point(struct sock *sk, * future associations inheriting the socket value. */ static int sctp_setsockopt_maxburst(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -3500,34 +3490,34 @@ static int sctp_setsockopt_maxburst(struct sock *sk, "Use of int in max_burst socket option deprecated.\n" "Use struct sctp_assoc_value instead\n", current->comm, task_pid_nr(current)); - params.assoc_value = *(int *)¶ms; - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_value = *(int *)params; + params->assoc_id = SCTP_FUTURE_ASSOC; } else if (optlen != sizeof(struct sctp_assoc_value)) { return -EINVAL; } - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->max_burst = params.assoc_value; + asoc->max_burst = params->assoc_value; return 0; } if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id = SCTP_FUTURE_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) - sp->max_burst = params.assoc_value; + if (params->assoc_id = SCTP_FUTURE_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) + sp->max_burst = params->assoc_value; - if (params.assoc_id = SCTP_CURRENT_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) + if (params->assoc_id = SCTP_CURRENT_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) list_for_each_entry(asoc, &sp->ep->asocs, asocs) - asoc->max_burst = params.assoc_value; + asoc->max_burst = params->assoc_value; return 0; } @@ -3539,9 +3529,8 @@ static int sctp_setsockopt_maxburst(struct sock *sk, * received only in an authenticated way. Changes to the list of chunks * will only effect future associations on the socket. */ -#define val (*val) static int sctp_setsockopt_auth_chunk(struct sock *sk, - struct sctp_authchunk val, + struct sctp_authchunk *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3552,7 +3541,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk, if (optlen != sizeof(struct sctp_authchunk)) return -EINVAL; - switch (val.sauth_chunk) { + switch (val->sauth_chunk) { case SCTP_CID_INIT: case SCTP_CID_INIT_ACK: case SCTP_CID_SHUTDOWN_COMPLETE: @@ -3561,7 +3550,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk, } /* add this chunk id to the endpoint */ - return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk); + return sctp_auth_ep_add_chunkid(ep, val->sauth_chunk); } /* @@ -3666,7 +3655,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk, * the association shared key. */ static int sctp_setsockopt_active_key(struct sock *sk, - struct sctp_authkeyid val, + struct sctp_authkeyid *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3676,29 +3665,29 @@ static int sctp_setsockopt_active_key(struct sock *sk, if (optlen != sizeof(struct sctp_authkeyid)) return -EINVAL; - asoc = sctp_id2assoc(sk, val.scact_assoc_id); - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, val->scact_assoc_id); + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); + return sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); if (sctp_style(sk, TCP)) - val.scact_assoc_id = SCTP_FUTURE_ASSOC; + val->scact_assoc_id = SCTP_FUTURE_ASSOC; - if (val.scact_assoc_id = SCTP_FUTURE_ASSOC || - val.scact_assoc_id = SCTP_ALL_ASSOC) { - ret = sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); + if (val->scact_assoc_id = SCTP_FUTURE_ASSOC || + val->scact_assoc_id = SCTP_ALL_ASSOC) { + ret = sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); if (ret) return ret; } - if (val.scact_assoc_id = SCTP_CURRENT_ASSOC || - val.scact_assoc_id = SCTP_ALL_ASSOC) { + if (val->scact_assoc_id = SCTP_CURRENT_ASSOC || + val->scact_assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &ep->asocs, asocs) { int res = sctp_auth_set_active_key(ep, asoc, - val.scact_keynumber); + val->scact_keynumber); if (res && !ret) ret = res; @@ -3714,7 +3703,7 @@ static int sctp_setsockopt_active_key(struct sock *sk, * This set option will delete a shared secret key from use. */ static int sctp_setsockopt_del_key(struct sock *sk, - struct sctp_authkeyid val, + struct sctp_authkeyid *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3724,29 +3713,29 @@ static int sctp_setsockopt_del_key(struct sock *sk, if (optlen != sizeof(struct sctp_authkeyid)) return -EINVAL; - asoc = sctp_id2assoc(sk, val.scact_assoc_id); - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, val->scact_assoc_id); + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); + return sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); if (sctp_style(sk, TCP)) - val.scact_assoc_id = SCTP_FUTURE_ASSOC; + val->scact_assoc_id = SCTP_FUTURE_ASSOC; - if (val.scact_assoc_id = SCTP_FUTURE_ASSOC || - val.scact_assoc_id = SCTP_ALL_ASSOC) { - ret = sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); + if (val->scact_assoc_id = SCTP_FUTURE_ASSOC || + val->scact_assoc_id = SCTP_ALL_ASSOC) { + ret = sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); if (ret) return ret; } - if (val.scact_assoc_id = SCTP_CURRENT_ASSOC || - val.scact_assoc_id = SCTP_ALL_ASSOC) { + if (val->scact_assoc_id = SCTP_CURRENT_ASSOC || + val->scact_assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &ep->asocs, asocs) { int res = sctp_auth_del_key_id(ep, asoc, - val.scact_keynumber); + val->scact_keynumber); if (res && !ret) ret = res; @@ -3762,7 +3751,7 @@ static int sctp_setsockopt_del_key(struct sock *sk, * This set option will deactivate a shared secret key. */ static int sctp_setsockopt_deactivate_key(struct sock *sk, - struct sctp_authkeyid val, + struct sctp_authkeyid *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3772,29 +3761,29 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, if (optlen != sizeof(struct sctp_authkeyid)) return -EINVAL; - asoc = sctp_id2assoc(sk, val.scact_assoc_id); - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, val->scact_assoc_id); + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); + return sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); if (sctp_style(sk, TCP)) - val.scact_assoc_id = SCTP_FUTURE_ASSOC; + val->scact_assoc_id = SCTP_FUTURE_ASSOC; - if (val.scact_assoc_id = SCTP_FUTURE_ASSOC || - val.scact_assoc_id = SCTP_ALL_ASSOC) { - ret = sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); + if (val->scact_assoc_id = SCTP_FUTURE_ASSOC || + val->scact_assoc_id = SCTP_ALL_ASSOC) { + ret = sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); if (ret) return ret; } - if (val.scact_assoc_id = SCTP_CURRENT_ASSOC || - val.scact_assoc_id = SCTP_ALL_ASSOC) { + if (val->scact_assoc_id = SCTP_CURRENT_ASSOC || + val->scact_assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &ep->asocs, asocs) { int res = sctp_auth_deact_key_id(ep, asoc, - val.scact_keynumber); + val->scact_keynumber); if (res && !ret) ret = res; @@ -3803,7 +3792,6 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, return ret; } -#undef val /* * 8.1.23 SCTP_AUTO_ASCONF @@ -3819,24 +3807,23 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, * Note. In this implementation, socket operation overrides default parameter * being set by sysctl as well as FreeBSD implementation */ -#define val (*optval) -static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, +static int sctp_setsockopt_auto_asconf(struct sock *sk, int *optval, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); if (optlen < sizeof(int)) return -EINVAL; - if (!sctp_is_ep_boundall(sk) && val) + if (!sctp_is_ep_boundall(sk) && (*optval)) return -EINVAL; - if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf)) + if (((*optval) && sp->do_auto_asconf) || (!(*optval) && !sp->do_auto_asconf)) return 0; spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); - if (val = 0 && sp->do_auto_asconf) { + if ((*optval) = 0 && sp->do_auto_asconf) { list_del(&sp->auto_asconf_list); sp->do_auto_asconf = 0; - } else if (val && !sp->do_auto_asconf) { + } else if ((*optval) && !sp->do_auto_asconf) { list_add_tail(&sp->auto_asconf_list, &sock_net(sk)->sctp.auto_asconf_splist); sp->do_auto_asconf = 1; @@ -3844,7 +3831,6 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); return 0; } -#undef val /* * SCTP_PEER_ADDR_THLDS @@ -3853,70 +3839,68 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, * transports in an association. See Section 6.1 of: * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt */ -#define val (*val) static int sctp_setsockopt_paddr_thresholds(struct sock *sk, - struct sctp_paddrthlds_v2 val, + struct sctp_paddrthlds_v2 *val, unsigned int optlen, bool v2) { struct sctp_transport *trans; struct sctp_association *asoc; int len; - len = v2 ? sizeof(val) : sizeof(struct sctp_paddrthlds); + len = v2 ? sizeof(*val) : sizeof(struct sctp_paddrthlds); if (optlen < len) return -EINVAL; - if (v2 && val.spt_pathpfthld > val.spt_pathcpthld) + if (v2 && val->spt_pathpfthld > val->spt_pathcpthld) return -EINVAL; - if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { - trans = sctp_addr_id2transport(sk, &val.spt_address, - val.spt_assoc_id); + if (!sctp_is_any(sk, (const union sctp_addr *)&val->spt_address)) { + trans = sctp_addr_id2transport(sk, &val->spt_address, + val->spt_assoc_id); if (!trans) return -ENOENT; - if (val.spt_pathmaxrxt) - trans->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + trans->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - trans->ps_retrans = val.spt_pathcpthld; - trans->pf_retrans = val.spt_pathpfthld; + trans->ps_retrans = val->spt_pathcpthld; + trans->pf_retrans = val->spt_pathpfthld; return 0; } - asoc = sctp_id2assoc(sk, val.spt_assoc_id); - if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, val->spt_assoc_id); + if (!asoc && val->spt_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { list_for_each_entry(trans, &asoc->peer.transport_addr_list, transports) { - if (val.spt_pathmaxrxt) - trans->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + trans->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - trans->ps_retrans = val.spt_pathcpthld; - trans->pf_retrans = val.spt_pathpfthld; + trans->ps_retrans = val->spt_pathcpthld; + trans->pf_retrans = val->spt_pathpfthld; } - if (val.spt_pathmaxrxt) - asoc->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + asoc->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - asoc->ps_retrans = val.spt_pathcpthld; - asoc->pf_retrans = val.spt_pathpfthld; + asoc->ps_retrans = val->spt_pathcpthld; + asoc->pf_retrans = val->spt_pathpfthld; } else { struct sctp_sock *sp = sctp_sk(sk); - if (val.spt_pathmaxrxt) - sp->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + sp->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - sp->ps_retrans = val.spt_pathcpthld; - sp->pf_retrans = val.spt_pathpfthld; + sp->ps_retrans = val->spt_pathcpthld; + sp->pf_retrans = val->spt_pathpfthld; } return 0; } -#undef val static int sctp_setsockopt_recvrcvinfo(struct sock *sk, int *optval, unsigned int optlen) @@ -3941,92 +3925,91 @@ static int sctp_setsockopt_recvnxtinfo(struct sock *sk, int *optval, } static int sctp_setsockopt_pr_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; - sctp_sk(sk)->ep->prsctp_enable = !!params.assoc_value; + sctp_sk(sk)->ep->prsctp_enable = !!params->assoc_value; return 0; } static int sctp_setsockopt_default_prinfo(struct sock *sk, - struct sctp_default_prinfo info, + struct sctp_default_prinfo *info, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(info)) + if (optlen != sizeof(*info)) goto out; - if (info.pr_policy & ~SCTP_PR_SCTP_MASK) + if (info->pr_policy & ~SCTP_PR_SCTP_MASK) goto out; - if (info.pr_policy = SCTP_PR_SCTP_NONE) - info.pr_value = 0; + if (info->pr_policy = SCTP_PR_SCTP_NONE) + info->pr_value = 0; - asoc = sctp_id2assoc(sk, info.pr_assoc_id); - if (!asoc && info.pr_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, info->pr_assoc_id); + if (!asoc && info->pr_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) goto out; retval = 0; if (asoc) { - SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); - asoc->default_timetolive = info.pr_value; + SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); + asoc->default_timetolive = info->pr_value; goto out; } if (sctp_style(sk, TCP)) - info.pr_assoc_id = SCTP_FUTURE_ASSOC; + info->pr_assoc_id = SCTP_FUTURE_ASSOC; - if (info.pr_assoc_id = SCTP_FUTURE_ASSOC || - info.pr_assoc_id = SCTP_ALL_ASSOC) { - SCTP_PR_SET_POLICY(sp->default_flags, info.pr_policy); - sp->default_timetolive = info.pr_value; + if (info->pr_assoc_id = SCTP_FUTURE_ASSOC || + info->pr_assoc_id = SCTP_ALL_ASSOC) { + SCTP_PR_SET_POLICY(sp->default_flags, info->pr_policy); + sp->default_timetolive = info->pr_value; } - if (info.pr_assoc_id = SCTP_CURRENT_ASSOC || - info.pr_assoc_id = SCTP_ALL_ASSOC) { + if (info->pr_assoc_id = SCTP_CURRENT_ASSOC || + info->pr_assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); - asoc->default_timetolive = info.pr_value; + SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); + asoc->default_timetolive = info->pr_value; } } out: return retval; } -#undef info static int sctp_setsockopt_reconfig_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; - sctp_sk(sk)->ep->reconf_enable = !!params.assoc_value; + sctp_sk(sk)->ep->reconf_enable = !!params->assoc_value; retval = 0; @@ -4035,48 +4018,47 @@ static int sctp_setsockopt_reconfig_supported(struct sock *sk, } static int sctp_setsockopt_enable_strreset(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - if (params.assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) + if (params->assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) goto out; retval = 0; if (asoc) { - asoc->strreset_enable = params.assoc_value; + asoc->strreset_enable = params->assoc_value; goto out; } if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id = SCTP_FUTURE_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) - ep->strreset_enable = params.assoc_value; + if (params->assoc_id = SCTP_FUTURE_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) + ep->strreset_enable = params->assoc_value; - if (params.assoc_id = SCTP_CURRENT_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) + if (params->assoc_id = SCTP_CURRENT_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) list_for_each_entry(asoc, &ep->asocs, asocs) - asoc->strreset_enable = params.assoc_value; + asoc->strreset_enable = params->assoc_value; out: return retval; } -#undef params static int sctp_setsockopt_reset_streams(struct sock *sk, struct sctp_reset_streams *params, unsigned int optlen) @@ -4103,20 +4085,17 @@ static int sctp_setsockopt_reset_streams(struct sock *sk, out: return retval; } -#define params (*params) - -#define associd (*associd) -static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd, +static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t *associd, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(associd)) + if (optlen != sizeof(*associd)) goto out; - asoc = sctp_id2assoc(sk, associd); + asoc = sctp_id2assoc(sk, (*associd)); if (!asoc) goto out; @@ -4125,62 +4104,61 @@ static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd, out: return retval; } -#undef associd static int sctp_setsockopt_add_streams(struct sock *sk, - struct sctp_add_streams params, + struct sctp_add_streams *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.sas_assoc_id); + asoc = sctp_id2assoc(sk, params->sas_assoc_id); if (!asoc) goto out; - retval = sctp_send_add_streams(asoc, ¶ms); + retval = sctp_send_add_streams(asoc, params); out: return retval; } static int sctp_setsockopt_scheduler(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = 0; - if (optlen < sizeof(params)) + if (optlen < sizeof(*params)) return -EINVAL; - if (params.assoc_value > SCTP_SS_MAX) + if (params->assoc_value > SCTP_SS_MAX) return -EINVAL; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_sched_set_sched(asoc, params.assoc_value); + return sctp_sched_set_sched(asoc, params->assoc_value); if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id = SCTP_FUTURE_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) - sp->default_ss = params.assoc_value; + if (params->assoc_id = SCTP_FUTURE_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) + sp->default_ss = params->assoc_value; - if (params.assoc_id = SCTP_CURRENT_ASSOC || - params.assoc_id = SCTP_ALL_ASSOC) { + if (params->assoc_id = SCTP_CURRENT_ASSOC || + params->assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { int ret = sctp_sched_set_sched(asoc, - params.assoc_value); + params->assoc_value); if (ret && !retval) retval = ret; @@ -4191,31 +4169,31 @@ static int sctp_setsockopt_scheduler(struct sock *sk, } static int sctp_setsockopt_scheduler_value(struct sock *sk, - struct sctp_stream_value params, + struct sctp_stream_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen < sizeof(params)) + if (optlen < sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_CURRENT_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_CURRENT_ASSOC && sctp_style(sk, UDP)) goto out; if (asoc) { - retval = sctp_sched_set_value(asoc, params.stream_id, - params.stream_value, GFP_KERNEL); + retval = sctp_sched_set_value(asoc, params->stream_id, + params->stream_value, GFP_KERNEL); goto out; } retval = 0; list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) { - int ret = sctp_sched_set_value(asoc, params.stream_id, - params.stream_value, GFP_KERNEL); + int ret = sctp_sched_set_value(asoc, params->stream_id, + params->stream_value, GFP_KERNEL); if (ret && !retval) /* try to return the 1st error. */ retval = ret; } @@ -4225,18 +4203,18 @@ static int sctp_setsockopt_scheduler_value(struct sock *sk, } static int sctp_setsockopt_interleaving_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = -EINVAL; - if (optlen < sizeof(params)) + if (optlen < sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; @@ -4245,7 +4223,7 @@ static int sctp_setsockopt_interleaving_supported(struct sock *sk, goto out; } - sp->ep->intl_enable = !!params.assoc_value; + sp->ep->intl_enable = !!params->assoc_value; retval = 0; @@ -4291,41 +4269,40 @@ static int sctp_assoc_ulpevent_type_set(struct sctp_event *param, return 0; } -#define param (*param) -static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param, +static int sctp_setsockopt_event(struct sock *sk, struct sctp_event *param, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = 0; - if (optlen < sizeof(param)) + if (optlen < sizeof(*param)) return -EINVAL; - if (param.se_type < SCTP_SN_TYPE_BASE || - param.se_type > SCTP_SN_TYPE_MAX) + if (param->se_type < SCTP_SN_TYPE_BASE || + param->se_type > SCTP_SN_TYPE_MAX) return -EINVAL; - asoc = sctp_id2assoc(sk, param.se_assoc_id); - if (!asoc && param.se_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, param->se_assoc_id); + if (!asoc && param->se_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_assoc_ulpevent_type_set(¶m, asoc); + return sctp_assoc_ulpevent_type_set(param, asoc); if (sctp_style(sk, TCP)) - param.se_assoc_id = SCTP_FUTURE_ASSOC; + param->se_assoc_id = SCTP_FUTURE_ASSOC; - if (param.se_assoc_id = SCTP_FUTURE_ASSOC || - param.se_assoc_id = SCTP_ALL_ASSOC) + if (param->se_assoc_id = SCTP_FUTURE_ASSOC || + param->se_assoc_id = SCTP_ALL_ASSOC) sctp_ulpevent_type_set(&sp->subscribe, - param.se_type, param.se_on); + param->se_type, param->se_on); - if (param.se_assoc_id = SCTP_CURRENT_ASSOC || - param.se_assoc_id = SCTP_ALL_ASSOC) { + if (param->se_assoc_id = SCTP_CURRENT_ASSOC || + param->se_assoc_id = SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - int ret = sctp_assoc_ulpevent_type_set(¶m, asoc); + int ret = sctp_assoc_ulpevent_type_set(param, asoc); if (ret && !retval) retval = ret; @@ -4334,26 +4311,25 @@ static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param, return retval; } -#undef param static int sctp_setsockopt_asconf_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; struct sctp_endpoint *ep; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; ep = sctp_sk(sk)->ep; - ep->asconf_enable = !!params.assoc_value; + ep->asconf_enable = !!params->assoc_value; if (ep->asconf_enable && ep->auth_enable) { sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF); @@ -4367,23 +4343,23 @@ static int sctp_setsockopt_asconf_supported(struct sock *sk, } static int sctp_setsockopt_auth_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; struct sctp_endpoint *ep; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; ep = sctp_sk(sk)->ep; - if (params.assoc_value) { + if (params->assoc_value) { retval = sctp_auth_init(ep, GFP_KERNEL); if (retval) goto out; @@ -4393,7 +4369,7 @@ static int sctp_setsockopt_auth_supported(struct sock *sk, } } - ep->auth_enable = !!params.assoc_value; + ep->auth_enable = !!params->assoc_value; retval = 0; out: @@ -4401,21 +4377,21 @@ static int sctp_setsockopt_auth_supported(struct sock *sk, } static int sctp_setsockopt_ecn_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; - sctp_sk(sk)->ep->ecn_enable = !!params.assoc_value; + sctp_sk(sk)->ep->ecn_enable = !!params->assoc_value; retval = 0; out: @@ -4423,33 +4399,32 @@ static int sctp_setsockopt_ecn_supported(struct sock *sk, } static int sctp_setsockopt_pf_expose(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - if (params.assoc_value > SCTP_PF_EXPOSE_MAX) + if (params->assoc_value > SCTP_PF_EXPOSE_MAX) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; if (asoc) - asoc->pf_expose = params.assoc_value; + asoc->pf_expose = params->assoc_value; else - sctp_sk(sk)->pf_expose = params.assoc_value; + sctp_sk(sk)->pf_expose = params->assoc_value; retval = 0; out: return retval; } -#undef params static int kernel_sctp_setsockopt(struct sock *sk, int optname, void *optval, int optlen) -- 1.8.1.2 - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines @ 2020-05-26 16:40 ` David Laight 0 siblings, 0 replies; 11+ messages in thread From: David Laight @ 2020-05-26 16:40 UTC (permalink / raw) To: 'Vlad Yasevich', 'Neil Horman', 'David S. Miller', 'Jakub Kicinski', 'linux-sctp@vger.kernel.org', 'netdev@vger.kernel.org', 'Christoph Hellwig', 'Marcelo Ricardo Leitner' Expand the #define foo (*foo) used to simplify the previous patch. Doesn't change the generated code. Signed-off-by: David Laight <david.laight@aculab.com> --- net/sctp/socket.c | 687 ++++++++++++++++++++++++++---------------------------- 1 file changed, 331 insertions(+), 356 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 639d7da..b8068da 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -2585,9 +2585,8 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, return 0; } -#define params (*params) static int sctp_setsockopt_peer_addr_params(struct sock *sk, - struct sctp_paddrparams params, + struct sctp_paddrparams *params, unsigned int optlen) { struct sctp_transport *trans = NULL; @@ -2596,33 +2595,33 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, int error; int hb_change, pmtud_change, sackdelay_change; - if (optlen != sizeof(params)) { + if (optlen != sizeof(*params)) { if (optlen != ALIGN(offsetof(struct sctp_paddrparams, spp_ipv6_flowlabel), 4)) return -EINVAL; - if (params.spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) + if (params->spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) return -EINVAL; } /* Validate flags and value parameters. */ - hb_change = params.spp_flags & SPP_HB; - pmtud_change = params.spp_flags & SPP_PMTUD; - sackdelay_change = params.spp_flags & SPP_SACKDELAY; + hb_change = params->spp_flags & SPP_HB; + pmtud_change = params->spp_flags & SPP_PMTUD; + sackdelay_change = params->spp_flags & SPP_SACKDELAY; if (hb_change == SPP_HB || pmtud_change == SPP_PMTUD || sackdelay_change == SPP_SACKDELAY || - params.spp_sackdelay > 500 || - (params.spp_pathmtu && - params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) + params->spp_sackdelay > 500 || + (params->spp_pathmtu && + params->spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) return -EINVAL; /* If an address other than INADDR_ANY is specified, and * no transport is found, then the request is invalid. */ - if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) { - trans = sctp_addr_id2transport(sk, ¶ms.spp_address, - params.spp_assoc_id); + if (!sctp_is_any(sk, (union sctp_addr *)¶ms->spp_address)) { + trans = sctp_addr_id2transport(sk, ¶ms->spp_address, + params->spp_assoc_id); if (!trans) return -EINVAL; } @@ -2631,19 +2630,19 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, * socket is a one to many style socket, and an association * was not found, then the id was invalid. */ - asoc = sctp_id2assoc(sk, params.spp_assoc_id); - if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->spp_assoc_id); + if (!asoc && params->spp_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; /* Heartbeat demand can only be sent on a transport or * association, but not a socket. */ - if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc) + if (params->spp_flags & SPP_HB_DEMAND && !trans && !asoc) return -EINVAL; /* Process parameters. */ - error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, + error = sctp_apply_peer_addr_params(params, trans, asoc, sp, hb_change, pmtud_change, sackdelay_change); @@ -2656,7 +2655,7 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, if (!trans && asoc) { list_for_each_entry(trans, &asoc->peer.transport_addr_list, transports) { - sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, + sctp_apply_peer_addr_params(params, trans, asoc, sp, hb_change, pmtud_change, sackdelay_change); } @@ -2664,7 +2663,6 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, return 0; } -#undef params static inline __u32 sctp_spp_sackdelay_enable(__u32 param_flags) { @@ -2749,16 +2747,15 @@ static void sctp_apply_asoc_delayed_ack(struct sctp_sack_info *params, * value to 1 will disable the delayed sack algorithm. */ -#define params (*params) static int sctp_setsockopt_delayed_ack(struct sock *sk, - struct sctp_sack_info params, + struct sctp_sack_info *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; if (optlen == sizeof(struct sctp_sack_info)) { - if (params.sack_delay == 0 && params.sack_freq == 0) + if (params->sack_delay == 0 && params->sack_freq == 0) return 0; } else if (optlen == sizeof(struct sctp_assoc_value)) { pr_warn_ratelimited(DEPRECATED @@ -2766,56 +2763,56 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk, "Use of struct sctp_assoc_value in delayed_ack socket option.\n" "Use struct sctp_sack_info instead\n", current->comm, task_pid_nr(current)); - if (params.sack_delay == 0) - params.sack_freq = 1; + if (params->sack_delay == 0) + params->sack_freq = 1; else - params.sack_freq = 0; + params->sack_freq = 0; } else return -EINVAL; /* Validate value parameter. */ - if (params.sack_delay > 500) + if (params->sack_delay > 500) return -EINVAL; /* Get association, if sack_assoc_id != SCTP_FUTURE_ASSOC and the * socket is a one to many style socket, and an association * was not found, then the id was invalid. */ - asoc = sctp_id2assoc(sk, params.sack_assoc_id); - if (!asoc && params.sack_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->sack_assoc_id); + if (!asoc && params->sack_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - sctp_apply_asoc_delayed_ack(¶ms, asoc); + sctp_apply_asoc_delayed_ack(params, asoc); return 0; } if (sctp_style(sk, TCP)) - params.sack_assoc_id = SCTP_FUTURE_ASSOC; + params->sack_assoc_id = SCTP_FUTURE_ASSOC; - if (params.sack_assoc_id == SCTP_FUTURE_ASSOC || - params.sack_assoc_id == SCTP_ALL_ASSOC) { - if (params.sack_delay) { - sp->sackdelay = params.sack_delay; + if (params->sack_assoc_id == SCTP_FUTURE_ASSOC || + params->sack_assoc_id == SCTP_ALL_ASSOC) { + if (params->sack_delay) { + sp->sackdelay = params->sack_delay; sp->param_flags = sctp_spp_sackdelay_enable(sp->param_flags); } - if (params.sack_freq == 1) { + if (params->sack_freq == 1) { sp->param_flags = sctp_spp_sackdelay_disable(sp->param_flags); - } else if (params.sack_freq > 1) { - sp->sackfreq = params.sack_freq; + } else if (params->sack_freq > 1) { + sp->sackfreq = params->sack_freq; sp->param_flags = sctp_spp_sackdelay_enable(sp->param_flags); } } - if (params.sack_assoc_id == SCTP_CURRENT_ASSOC || - params.sack_assoc_id == SCTP_ALL_ASSOC) + if (params->sack_assoc_id == SCTP_CURRENT_ASSOC || + params->sack_assoc_id == SCTP_ALL_ASSOC) list_for_each_entry(asoc, &sp->ep->asocs, asocs) - sctp_apply_asoc_delayed_ack(¶ms, asoc); + sctp_apply_asoc_delayed_ack(params, asoc); return 0; } @@ -2831,8 +2828,7 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk, * by the change). With TCP-style sockets, this option is inherited by * sockets derived from a listener socket. */ -#define sinit (*sinit) -static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, +static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg *sinit, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -2840,18 +2836,17 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, if (optlen != sizeof(struct sctp_initmsg)) return -EINVAL; - if (sinit.sinit_num_ostreams) - sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams; - if (sinit.sinit_max_instreams) - sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams; - if (sinit.sinit_max_attempts) - sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts; - if (sinit.sinit_max_init_timeo) - sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo; + if (sinit->sinit_num_ostreams) + sp->initmsg.sinit_num_ostreams = sinit->sinit_num_ostreams; + if (sinit->sinit_max_instreams) + sp->initmsg.sinit_max_instreams = sinit->sinit_max_instreams; + if (sinit->sinit_max_attempts) + sp->initmsg.sinit_max_attempts = sinit->sinit_max_attempts; + if (sinit->sinit_max_init_timeo) + sp->initmsg.sinit_max_init_timeo = sinit->sinit_max_init_timeo; return 0; } -#undef sinit /* * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM) @@ -2867,56 +2862,55 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, * sinfo_timetolive. The user must provide the sinfo_assoc_id field in * to this call if the caller is using the UDP model. */ -#define info (*info) static int sctp_setsockopt_default_send_param(struct sock *sk, - struct sctp_sndrcvinfo info, + struct sctp_sndrcvinfo *info, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; - if (optlen != sizeof(info)) + if (optlen != sizeof(*info)) return -EINVAL; - if (info.sinfo_flags & + if (info->sinfo_flags & ~(SCTP_UNORDERED | SCTP_ADDR_OVER | SCTP_ABORT | SCTP_EOF)) return -EINVAL; - asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); - if (!asoc && info.sinfo_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, info->sinfo_assoc_id); + if (!asoc && info->sinfo_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->default_stream = info.sinfo_stream; - asoc->default_flags = info.sinfo_flags; - asoc->default_ppid = info.sinfo_ppid; - asoc->default_context = info.sinfo_context; - asoc->default_timetolive = info.sinfo_timetolive; + asoc->default_stream = info->sinfo_stream; + asoc->default_flags = info->sinfo_flags; + asoc->default_ppid = info->sinfo_ppid; + asoc->default_context = info->sinfo_context; + asoc->default_timetolive = info->sinfo_timetolive; return 0; } if (sctp_style(sk, TCP)) - info.sinfo_assoc_id = SCTP_FUTURE_ASSOC; + info->sinfo_assoc_id = SCTP_FUTURE_ASSOC; - if (info.sinfo_assoc_id == SCTP_FUTURE_ASSOC || - info.sinfo_assoc_id == SCTP_ALL_ASSOC) { - sp->default_stream = info.sinfo_stream; - sp->default_flags = info.sinfo_flags; - sp->default_ppid = info.sinfo_ppid; - sp->default_context = info.sinfo_context; - sp->default_timetolive = info.sinfo_timetolive; + if (info->sinfo_assoc_id == SCTP_FUTURE_ASSOC || + info->sinfo_assoc_id == SCTP_ALL_ASSOC) { + sp->default_stream = info->sinfo_stream; + sp->default_flags = info->sinfo_flags; + sp->default_ppid = info->sinfo_ppid; + sp->default_context = info->sinfo_context; + sp->default_timetolive = info->sinfo_timetolive; } - if (info.sinfo_assoc_id == SCTP_CURRENT_ASSOC || - info.sinfo_assoc_id == SCTP_ALL_ASSOC) { + if (info->sinfo_assoc_id == SCTP_CURRENT_ASSOC || + info->sinfo_assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - asoc->default_stream = info.sinfo_stream; - asoc->default_flags = info.sinfo_flags; - asoc->default_ppid = info.sinfo_ppid; - asoc->default_context = info.sinfo_context; - asoc->default_timetolive = info.sinfo_timetolive; + asoc->default_stream = info->sinfo_stream; + asoc->default_flags = info->sinfo_flags; + asoc->default_ppid = info->sinfo_ppid; + asoc->default_context = info->sinfo_context; + asoc->default_timetolive = info->sinfo_timetolive; } } @@ -2927,51 +2921,51 @@ static int sctp_setsockopt_default_send_param(struct sock *sk, * (SCTP_DEFAULT_SNDINFO) */ static int sctp_setsockopt_default_sndinfo(struct sock *sk, - struct sctp_sndinfo info, + struct sctp_sndinfo *info, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; - if (optlen != sizeof(info)) + if (optlen != sizeof(*info)) return -EINVAL; - if (info.snd_flags & + if (info->snd_flags & ~(SCTP_UNORDERED | SCTP_ADDR_OVER | SCTP_ABORT | SCTP_EOF)) return -EINVAL; - asoc = sctp_id2assoc(sk, info.snd_assoc_id); - if (!asoc && info.snd_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, info->snd_assoc_id); + if (!asoc && info->snd_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->default_stream = info.snd_sid; - asoc->default_flags = info.snd_flags; - asoc->default_ppid = info.snd_ppid; - asoc->default_context = info.snd_context; + asoc->default_stream = info->snd_sid; + asoc->default_flags = info->snd_flags; + asoc->default_ppid = info->snd_ppid; + asoc->default_context = info->snd_context; return 0; } if (sctp_style(sk, TCP)) - info.snd_assoc_id = SCTP_FUTURE_ASSOC; + info->snd_assoc_id = SCTP_FUTURE_ASSOC; - if (info.snd_assoc_id == SCTP_FUTURE_ASSOC || - info.snd_assoc_id == SCTP_ALL_ASSOC) { - sp->default_stream = info.snd_sid; - sp->default_flags = info.snd_flags; - sp->default_ppid = info.snd_ppid; - sp->default_context = info.snd_context; + if (info->snd_assoc_id == SCTP_FUTURE_ASSOC || + info->snd_assoc_id == SCTP_ALL_ASSOC) { + sp->default_stream = info->snd_sid; + sp->default_flags = info->snd_flags; + sp->default_ppid = info->snd_ppid; + sp->default_context = info->snd_context; } - if (info.snd_assoc_id == SCTP_CURRENT_ASSOC || - info.snd_assoc_id == SCTP_ALL_ASSOC) { + if (info->snd_assoc_id == SCTP_CURRENT_ASSOC || + info->snd_assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - asoc->default_stream = info.snd_sid; - asoc->default_flags = info.snd_flags; - asoc->default_ppid = info.snd_ppid; - asoc->default_context = info.snd_context; + asoc->default_stream = info->snd_sid; + asoc->default_flags = info->snd_flags; + asoc->default_ppid = info->snd_ppid; + asoc->default_context = info->snd_context; } } @@ -2984,8 +2978,7 @@ static int sctp_setsockopt_default_sndinfo(struct sock *sk, * the association primary. The enclosed address must be one of the * association peer's addresses. */ -#define prim (*prim) -static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, +static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim *prim, unsigned int optlen) { struct sctp_transport *trans; @@ -2996,17 +2989,17 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, return -EINVAL; /* Allow security module to validate address but need address len. */ - af = sctp_get_af_specific(prim.ssp_addr.ss_family); + af = sctp_get_af_specific(prim->ssp_addr.ss_family); if (!af) return -EINVAL; err = security_sctp_bind_connect(sk, SCTP_PRIMARY_ADDR, - (struct sockaddr *)&prim.ssp_addr, + (struct sockaddr *)&prim->ssp_addr, af->sockaddr_len); if (err) return err; - trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id); + trans = sctp_addr_id2transport(sk, &prim->ssp_addr, prim->ssp_assoc_id); if (!trans) return -EINVAL; @@ -3014,7 +3007,6 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, return 0; } -#undef prim /* * 7.1.5 SCTP_NODELAY @@ -3047,7 +3039,7 @@ static int sctp_setsockopt_nodelay(struct sock *sk, int *optval, * */ static int sctp_setsockopt_rtoinfo(struct sock *sk, - struct sctp_rtoinfo params, + struct sctp_rtoinfo *params, unsigned int optlen) { struct sctp_association *asoc; @@ -3057,15 +3049,15 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, if (optlen != sizeof (struct sctp_rtoinfo)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.srto_assoc_id); + asoc = sctp_id2assoc(sk, params->srto_assoc_id); /* Set the values to the specific association */ - if (!asoc && params.srto_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params->srto_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; - rto_max = params.srto_max; - rto_min = params.srto_min; + rto_max = params->srto_max; + rto_min = params->srto_min; if (rto_max) rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; @@ -3081,17 +3073,17 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, return -EINVAL; if (asoc) { - if (params.srto_initial != 0) + if (params->srto_initial != 0) asoc->rto_initial = - msecs_to_jiffies(params.srto_initial); + msecs_to_jiffies(params->srto_initial); asoc->rto_max = rto_max; asoc->rto_min = rto_min; } else { /* If there is no association or the association-id = 0 * set the values to the endpoint. */ - if (params.srto_initial != 0) - sp->rtoinfo.srto_initial = params.srto_initial; + if (params->srto_initial != 0) + sp->rtoinfo.srto_initial = params->srto_initial; sp->rtoinfo.srto_max = rto_max; sp->rtoinfo.srto_min = rto_min; } @@ -3111,7 +3103,7 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, * */ static int sctp_setsockopt_associnfo(struct sock *sk, - struct sctp_assocparams params, + struct sctp_assocparams *params, unsigned int optlen) { @@ -3120,15 +3112,15 @@ static int sctp_setsockopt_associnfo(struct sock *sk, if (optlen != sizeof(struct sctp_assocparams)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.sasoc_assoc_id); + asoc = sctp_id2assoc(sk, params->sasoc_assoc_id); - if (!asoc && params.sasoc_assoc_id != SCTP_FUTURE_ASSOC && + if (!asoc && params->sasoc_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; /* Set the values to the specific association */ if (asoc) { - if (params.sasoc_asocmaxrxt != 0) { + if (params->sasoc_asocmaxrxt != 0) { __u32 path_sum = 0; int paths = 0; struct sctp_transport *peer_addr; @@ -3145,24 +3137,24 @@ static int sctp_setsockopt_associnfo(struct sock *sk, * then one path. */ if (paths > 1 && - params.sasoc_asocmaxrxt > path_sum) + params->sasoc_asocmaxrxt > path_sum) return -EINVAL; - asoc->max_retrans = params.sasoc_asocmaxrxt; + asoc->max_retrans = params->sasoc_asocmaxrxt; } - if (params.sasoc_cookie_life != 0) - asoc->cookie_life = ms_to_ktime(params.sasoc_cookie_life); + if (params->sasoc_cookie_life != 0) + asoc->cookie_life = ms_to_ktime(params->sasoc_cookie_life); } else { /* Set the values to the endpoint */ struct sctp_sock *sp = sctp_sk(sk); - if (params.sasoc_asocmaxrxt != 0) + if (params->sasoc_asocmaxrxt != 0) sp->assocparams.sasoc_asocmaxrxt = - params.sasoc_asocmaxrxt; - if (params.sasoc_cookie_life != 0) + params->sasoc_asocmaxrxt; + if (params->sasoc_cookie_life != 0) sp->assocparams.sasoc_cookie_life = - params.sasoc_cookie_life; + params->sasoc_cookie_life; } return 0; } @@ -3220,7 +3212,7 @@ static int sctp_setsockopt_mappedv4(struct sock *sk, int *optval, * assoc_value: This parameter specifies the maximum size in bytes. */ static int sctp_setsockopt_maxseg(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -3233,16 +3225,16 @@ static int sctp_setsockopt_maxseg(struct sock *sk, "Use of int in maxseg socket option.\n" "Use struct sctp_assoc_value instead\n", current->comm, task_pid_nr(current)); - val = *(int *)¶ms; - params.assoc_id = SCTP_FUTURE_ASSOC; + val = *(int *)params; + params->assoc_id = SCTP_FUTURE_ASSOC; } else if (optlen != sizeof(struct sctp_assoc_value)) { - val = params.assoc_value; + val = params->assoc_value; } else { return -EINVAL; } - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; @@ -3277,9 +3269,8 @@ static int sctp_setsockopt_maxseg(struct sock *sk, * locally bound addresses. The following structure is used to make a * set primary request: */ -#define prim (*prim) static int sctp_setsockopt_peer_primary_addr(struct sock *sk, - struct sctp_setpeerprim prim, + struct sctp_setpeerprim *prim, unsigned int optlen) { struct sctp_sock *sp; @@ -3296,7 +3287,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, if (optlen != sizeof(struct sctp_setpeerprim)) return -EINVAL; - asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); + asoc = sctp_id2assoc(sk, prim->sspp_assoc_id); if (!asoc) return -EINVAL; @@ -3309,26 +3300,26 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, if (!sctp_state(asoc, ESTABLISHED)) return -ENOTCONN; - af = sctp_get_af_specific(prim.sspp_addr.ss_family); + af = sctp_get_af_specific(prim->sspp_addr.ss_family); if (!af) return -EINVAL; - if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL)) + if (!af->addr_valid((union sctp_addr *)&prim->sspp_addr, sp, NULL)) return -EADDRNOTAVAIL; - if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) + if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim->sspp_addr)) return -EADDRNOTAVAIL; /* Allow security module to validate address. */ err = security_sctp_bind_connect(sk, SCTP_SET_PEER_PRIMARY_ADDR, - (struct sockaddr *)&prim.sspp_addr, + (struct sockaddr *)&prim->sspp_addr, af->sockaddr_len); if (err) return err; /* Create an ASCONF chunk with SET_PRIMARY parameter */ chunk = sctp_make_asconf_set_prim(asoc, - (union sctp_addr *)&prim.sspp_addr); + (union sctp_addr *)&prim->sspp_addr); if (!chunk) return -ENOMEM; @@ -3338,7 +3329,6 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, return err; } -#undef prim static int sctp_setsockopt_adaptation_layer(struct sock *sk, struct sctp_setadaptation *adaptation, @@ -3367,7 +3357,7 @@ static int sctp_setsockopt_adaptation_layer(struct sock *sk, * saved with outbound messages. */ static int sctp_setsockopt_context(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -3376,28 +3366,28 @@ static int sctp_setsockopt_context(struct sock *sk, if (optlen != sizeof(struct sctp_assoc_value)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->default_rcv_context = params.assoc_value; + asoc->default_rcv_context = params->assoc_value; return 0; } if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id == SCTP_FUTURE_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) - sp->default_rcv_context = params.assoc_value; + if (params->assoc_id == SCTP_FUTURE_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) + sp->default_rcv_context = params->assoc_value; - if (params.assoc_id == SCTP_CURRENT_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) + if (params->assoc_id == SCTP_CURRENT_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) list_for_each_entry(asoc, &sp->ep->asocs, asocs) - asoc->default_rcv_context = params.assoc_value; + asoc->default_rcv_context = params->assoc_value; return 0; } @@ -3488,7 +3478,7 @@ static int sctp_setsockopt_partial_delivery_point(struct sock *sk, * future associations inheriting the socket value. */ static int sctp_setsockopt_maxburst(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); @@ -3500,34 +3490,34 @@ static int sctp_setsockopt_maxburst(struct sock *sk, "Use of int in max_burst socket option deprecated.\n" "Use struct sctp_assoc_value instead\n", current->comm, task_pid_nr(current)); - params.assoc_value = *(int *)¶ms; - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_value = *(int *)params; + params->assoc_id = SCTP_FUTURE_ASSOC; } else if (optlen != sizeof(struct sctp_assoc_value)) { return -EINVAL; } - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { - asoc->max_burst = params.assoc_value; + asoc->max_burst = params->assoc_value; return 0; } if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id == SCTP_FUTURE_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) - sp->max_burst = params.assoc_value; + if (params->assoc_id == SCTP_FUTURE_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) + sp->max_burst = params->assoc_value; - if (params.assoc_id == SCTP_CURRENT_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) + if (params->assoc_id == SCTP_CURRENT_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) list_for_each_entry(asoc, &sp->ep->asocs, asocs) - asoc->max_burst = params.assoc_value; + asoc->max_burst = params->assoc_value; return 0; } @@ -3539,9 +3529,8 @@ static int sctp_setsockopt_maxburst(struct sock *sk, * received only in an authenticated way. Changes to the list of chunks * will only effect future associations on the socket. */ -#define val (*val) static int sctp_setsockopt_auth_chunk(struct sock *sk, - struct sctp_authchunk val, + struct sctp_authchunk *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3552,7 +3541,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk, if (optlen != sizeof(struct sctp_authchunk)) return -EINVAL; - switch (val.sauth_chunk) { + switch (val->sauth_chunk) { case SCTP_CID_INIT: case SCTP_CID_INIT_ACK: case SCTP_CID_SHUTDOWN_COMPLETE: @@ -3561,7 +3550,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk, } /* add this chunk id to the endpoint */ - return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk); + return sctp_auth_ep_add_chunkid(ep, val->sauth_chunk); } /* @@ -3666,7 +3655,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk, * the association shared key. */ static int sctp_setsockopt_active_key(struct sock *sk, - struct sctp_authkeyid val, + struct sctp_authkeyid *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3676,29 +3665,29 @@ static int sctp_setsockopt_active_key(struct sock *sk, if (optlen != sizeof(struct sctp_authkeyid)) return -EINVAL; - asoc = sctp_id2assoc(sk, val.scact_assoc_id); - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, val->scact_assoc_id); + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); + return sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); if (sctp_style(sk, TCP)) - val.scact_assoc_id = SCTP_FUTURE_ASSOC; + val->scact_assoc_id = SCTP_FUTURE_ASSOC; - if (val.scact_assoc_id == SCTP_FUTURE_ASSOC || - val.scact_assoc_id == SCTP_ALL_ASSOC) { - ret = sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); + if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || + val->scact_assoc_id == SCTP_ALL_ASSOC) { + ret = sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); if (ret) return ret; } - if (val.scact_assoc_id == SCTP_CURRENT_ASSOC || - val.scact_assoc_id == SCTP_ALL_ASSOC) { + if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || + val->scact_assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &ep->asocs, asocs) { int res = sctp_auth_set_active_key(ep, asoc, - val.scact_keynumber); + val->scact_keynumber); if (res && !ret) ret = res; @@ -3714,7 +3703,7 @@ static int sctp_setsockopt_active_key(struct sock *sk, * This set option will delete a shared secret key from use. */ static int sctp_setsockopt_del_key(struct sock *sk, - struct sctp_authkeyid val, + struct sctp_authkeyid *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3724,29 +3713,29 @@ static int sctp_setsockopt_del_key(struct sock *sk, if (optlen != sizeof(struct sctp_authkeyid)) return -EINVAL; - asoc = sctp_id2assoc(sk, val.scact_assoc_id); - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, val->scact_assoc_id); + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); + return sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); if (sctp_style(sk, TCP)) - val.scact_assoc_id = SCTP_FUTURE_ASSOC; + val->scact_assoc_id = SCTP_FUTURE_ASSOC; - if (val.scact_assoc_id == SCTP_FUTURE_ASSOC || - val.scact_assoc_id == SCTP_ALL_ASSOC) { - ret = sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); + if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || + val->scact_assoc_id == SCTP_ALL_ASSOC) { + ret = sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); if (ret) return ret; } - if (val.scact_assoc_id == SCTP_CURRENT_ASSOC || - val.scact_assoc_id == SCTP_ALL_ASSOC) { + if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || + val->scact_assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &ep->asocs, asocs) { int res = sctp_auth_del_key_id(ep, asoc, - val.scact_keynumber); + val->scact_keynumber); if (res && !ret) ret = res; @@ -3762,7 +3751,7 @@ static int sctp_setsockopt_del_key(struct sock *sk, * This set option will deactivate a shared secret key. */ static int sctp_setsockopt_deactivate_key(struct sock *sk, - struct sctp_authkeyid val, + struct sctp_authkeyid *val, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -3772,29 +3761,29 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, if (optlen != sizeof(struct sctp_authkeyid)) return -EINVAL; - asoc = sctp_id2assoc(sk, val.scact_assoc_id); - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, val->scact_assoc_id); + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); + return sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); if (sctp_style(sk, TCP)) - val.scact_assoc_id = SCTP_FUTURE_ASSOC; + val->scact_assoc_id = SCTP_FUTURE_ASSOC; - if (val.scact_assoc_id == SCTP_FUTURE_ASSOC || - val.scact_assoc_id == SCTP_ALL_ASSOC) { - ret = sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); + if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || + val->scact_assoc_id == SCTP_ALL_ASSOC) { + ret = sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); if (ret) return ret; } - if (val.scact_assoc_id == SCTP_CURRENT_ASSOC || - val.scact_assoc_id == SCTP_ALL_ASSOC) { + if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || + val->scact_assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &ep->asocs, asocs) { int res = sctp_auth_deact_key_id(ep, asoc, - val.scact_keynumber); + val->scact_keynumber); if (res && !ret) ret = res; @@ -3803,7 +3792,6 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, return ret; } -#undef val /* * 8.1.23 SCTP_AUTO_ASCONF @@ -3819,24 +3807,23 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, * Note. In this implementation, socket operation overrides default parameter * being set by sysctl as well as FreeBSD implementation */ -#define val (*optval) -static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, +static int sctp_setsockopt_auto_asconf(struct sock *sk, int *optval, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); if (optlen < sizeof(int)) return -EINVAL; - if (!sctp_is_ep_boundall(sk) && val) + if (!sctp_is_ep_boundall(sk) && (*optval)) return -EINVAL; - if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf)) + if (((*optval) && sp->do_auto_asconf) || (!(*optval) && !sp->do_auto_asconf)) return 0; spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); - if (val == 0 && sp->do_auto_asconf) { + if ((*optval) == 0 && sp->do_auto_asconf) { list_del(&sp->auto_asconf_list); sp->do_auto_asconf = 0; - } else if (val && !sp->do_auto_asconf) { + } else if ((*optval) && !sp->do_auto_asconf) { list_add_tail(&sp->auto_asconf_list, &sock_net(sk)->sctp.auto_asconf_splist); sp->do_auto_asconf = 1; @@ -3844,7 +3831,6 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); return 0; } -#undef val /* * SCTP_PEER_ADDR_THLDS @@ -3853,70 +3839,68 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, * transports in an association. See Section 6.1 of: * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt */ -#define val (*val) static int sctp_setsockopt_paddr_thresholds(struct sock *sk, - struct sctp_paddrthlds_v2 val, + struct sctp_paddrthlds_v2 *val, unsigned int optlen, bool v2) { struct sctp_transport *trans; struct sctp_association *asoc; int len; - len = v2 ? sizeof(val) : sizeof(struct sctp_paddrthlds); + len = v2 ? sizeof(*val) : sizeof(struct sctp_paddrthlds); if (optlen < len) return -EINVAL; - if (v2 && val.spt_pathpfthld > val.spt_pathcpthld) + if (v2 && val->spt_pathpfthld > val->spt_pathcpthld) return -EINVAL; - if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { - trans = sctp_addr_id2transport(sk, &val.spt_address, - val.spt_assoc_id); + if (!sctp_is_any(sk, (const union sctp_addr *)&val->spt_address)) { + trans = sctp_addr_id2transport(sk, &val->spt_address, + val->spt_assoc_id); if (!trans) return -ENOENT; - if (val.spt_pathmaxrxt) - trans->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + trans->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - trans->ps_retrans = val.spt_pathcpthld; - trans->pf_retrans = val.spt_pathpfthld; + trans->ps_retrans = val->spt_pathcpthld; + trans->pf_retrans = val->spt_pathpfthld; return 0; } - asoc = sctp_id2assoc(sk, val.spt_assoc_id); - if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, val->spt_assoc_id); + if (!asoc && val->spt_assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) { list_for_each_entry(trans, &asoc->peer.transport_addr_list, transports) { - if (val.spt_pathmaxrxt) - trans->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + trans->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - trans->ps_retrans = val.spt_pathcpthld; - trans->pf_retrans = val.spt_pathpfthld; + trans->ps_retrans = val->spt_pathcpthld; + trans->pf_retrans = val->spt_pathpfthld; } - if (val.spt_pathmaxrxt) - asoc->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + asoc->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - asoc->ps_retrans = val.spt_pathcpthld; - asoc->pf_retrans = val.spt_pathpfthld; + asoc->ps_retrans = val->spt_pathcpthld; + asoc->pf_retrans = val->spt_pathpfthld; } else { struct sctp_sock *sp = sctp_sk(sk); - if (val.spt_pathmaxrxt) - sp->pathmaxrxt = val.spt_pathmaxrxt; + if (val->spt_pathmaxrxt) + sp->pathmaxrxt = val->spt_pathmaxrxt; if (v2) - sp->ps_retrans = val.spt_pathcpthld; - sp->pf_retrans = val.spt_pathpfthld; + sp->ps_retrans = val->spt_pathcpthld; + sp->pf_retrans = val->spt_pathpfthld; } return 0; } -#undef val static int sctp_setsockopt_recvrcvinfo(struct sock *sk, int *optval, unsigned int optlen) @@ -3941,92 +3925,91 @@ static int sctp_setsockopt_recvnxtinfo(struct sock *sk, int *optval, } static int sctp_setsockopt_pr_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) return -EINVAL; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) return -EINVAL; - sctp_sk(sk)->ep->prsctp_enable = !!params.assoc_value; + sctp_sk(sk)->ep->prsctp_enable = !!params->assoc_value; return 0; } static int sctp_setsockopt_default_prinfo(struct sock *sk, - struct sctp_default_prinfo info, + struct sctp_default_prinfo *info, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(info)) + if (optlen != sizeof(*info)) goto out; - if (info.pr_policy & ~SCTP_PR_SCTP_MASK) + if (info->pr_policy & ~SCTP_PR_SCTP_MASK) goto out; - if (info.pr_policy == SCTP_PR_SCTP_NONE) - info.pr_value = 0; + if (info->pr_policy == SCTP_PR_SCTP_NONE) + info->pr_value = 0; - asoc = sctp_id2assoc(sk, info.pr_assoc_id); - if (!asoc && info.pr_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, info->pr_assoc_id); + if (!asoc && info->pr_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) goto out; retval = 0; if (asoc) { - SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); - asoc->default_timetolive = info.pr_value; + SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); + asoc->default_timetolive = info->pr_value; goto out; } if (sctp_style(sk, TCP)) - info.pr_assoc_id = SCTP_FUTURE_ASSOC; + info->pr_assoc_id = SCTP_FUTURE_ASSOC; - if (info.pr_assoc_id == SCTP_FUTURE_ASSOC || - info.pr_assoc_id == SCTP_ALL_ASSOC) { - SCTP_PR_SET_POLICY(sp->default_flags, info.pr_policy); - sp->default_timetolive = info.pr_value; + if (info->pr_assoc_id == SCTP_FUTURE_ASSOC || + info->pr_assoc_id == SCTP_ALL_ASSOC) { + SCTP_PR_SET_POLICY(sp->default_flags, info->pr_policy); + sp->default_timetolive = info->pr_value; } - if (info.pr_assoc_id == SCTP_CURRENT_ASSOC || - info.pr_assoc_id == SCTP_ALL_ASSOC) { + if (info->pr_assoc_id == SCTP_CURRENT_ASSOC || + info->pr_assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); - asoc->default_timetolive = info.pr_value; + SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); + asoc->default_timetolive = info->pr_value; } } out: return retval; } -#undef info static int sctp_setsockopt_reconfig_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; - sctp_sk(sk)->ep->reconf_enable = !!params.assoc_value; + sctp_sk(sk)->ep->reconf_enable = !!params->assoc_value; retval = 0; @@ -4035,48 +4018,47 @@ static int sctp_setsockopt_reconfig_supported(struct sock *sk, } static int sctp_setsockopt_enable_strreset(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - if (params.assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) + if (params->assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) goto out; retval = 0; if (asoc) { - asoc->strreset_enable = params.assoc_value; + asoc->strreset_enable = params->assoc_value; goto out; } if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id == SCTP_FUTURE_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) - ep->strreset_enable = params.assoc_value; + if (params->assoc_id == SCTP_FUTURE_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) + ep->strreset_enable = params->assoc_value; - if (params.assoc_id == SCTP_CURRENT_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) + if (params->assoc_id == SCTP_CURRENT_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) list_for_each_entry(asoc, &ep->asocs, asocs) - asoc->strreset_enable = params.assoc_value; + asoc->strreset_enable = params->assoc_value; out: return retval; } -#undef params static int sctp_setsockopt_reset_streams(struct sock *sk, struct sctp_reset_streams *params, unsigned int optlen) @@ -4103,20 +4085,17 @@ static int sctp_setsockopt_reset_streams(struct sock *sk, out: return retval; } -#define params (*params) - -#define associd (*associd) -static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd, +static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t *associd, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(associd)) + if (optlen != sizeof(*associd)) goto out; - asoc = sctp_id2assoc(sk, associd); + asoc = sctp_id2assoc(sk, (*associd)); if (!asoc) goto out; @@ -4125,62 +4104,61 @@ static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd, out: return retval; } -#undef associd static int sctp_setsockopt_add_streams(struct sock *sk, - struct sctp_add_streams params, + struct sctp_add_streams *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.sas_assoc_id); + asoc = sctp_id2assoc(sk, params->sas_assoc_id); if (!asoc) goto out; - retval = sctp_send_add_streams(asoc, ¶ms); + retval = sctp_send_add_streams(asoc, params); out: return retval; } static int sctp_setsockopt_scheduler(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = 0; - if (optlen < sizeof(params)) + if (optlen < sizeof(*params)) return -EINVAL; - if (params.assoc_value > SCTP_SS_MAX) + if (params->assoc_value > SCTP_SS_MAX) return -EINVAL; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_sched_set_sched(asoc, params.assoc_value); + return sctp_sched_set_sched(asoc, params->assoc_value); if (sctp_style(sk, TCP)) - params.assoc_id = SCTP_FUTURE_ASSOC; + params->assoc_id = SCTP_FUTURE_ASSOC; - if (params.assoc_id == SCTP_FUTURE_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) - sp->default_ss = params.assoc_value; + if (params->assoc_id == SCTP_FUTURE_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) + sp->default_ss = params->assoc_value; - if (params.assoc_id == SCTP_CURRENT_ASSOC || - params.assoc_id == SCTP_ALL_ASSOC) { + if (params->assoc_id == SCTP_CURRENT_ASSOC || + params->assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { int ret = sctp_sched_set_sched(asoc, - params.assoc_value); + params->assoc_value); if (ret && !retval) retval = ret; @@ -4191,31 +4169,31 @@ static int sctp_setsockopt_scheduler(struct sock *sk, } static int sctp_setsockopt_scheduler_value(struct sock *sk, - struct sctp_stream_value params, + struct sctp_stream_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen < sizeof(params)) + if (optlen < sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_CURRENT_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_CURRENT_ASSOC && sctp_style(sk, UDP)) goto out; if (asoc) { - retval = sctp_sched_set_value(asoc, params.stream_id, - params.stream_value, GFP_KERNEL); + retval = sctp_sched_set_value(asoc, params->stream_id, + params->stream_value, GFP_KERNEL); goto out; } retval = 0; list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) { - int ret = sctp_sched_set_value(asoc, params.stream_id, - params.stream_value, GFP_KERNEL); + int ret = sctp_sched_set_value(asoc, params->stream_id, + params->stream_value, GFP_KERNEL); if (ret && !retval) /* try to return the 1st error. */ retval = ret; } @@ -4225,18 +4203,18 @@ static int sctp_setsockopt_scheduler_value(struct sock *sk, } static int sctp_setsockopt_interleaving_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = -EINVAL; - if (optlen < sizeof(params)) + if (optlen < sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; @@ -4245,7 +4223,7 @@ static int sctp_setsockopt_interleaving_supported(struct sock *sk, goto out; } - sp->ep->intl_enable = !!params.assoc_value; + sp->ep->intl_enable = !!params->assoc_value; retval = 0; @@ -4291,41 +4269,40 @@ static int sctp_assoc_ulpevent_type_set(struct sctp_event *param, return 0; } -#define param (*param) -static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param, +static int sctp_setsockopt_event(struct sock *sk, struct sctp_event *param, unsigned int optlen) { struct sctp_sock *sp = sctp_sk(sk); struct sctp_association *asoc; int retval = 0; - if (optlen < sizeof(param)) + if (optlen < sizeof(*param)) return -EINVAL; - if (param.se_type < SCTP_SN_TYPE_BASE || - param.se_type > SCTP_SN_TYPE_MAX) + if (param->se_type < SCTP_SN_TYPE_BASE || + param->se_type > SCTP_SN_TYPE_MAX) return -EINVAL; - asoc = sctp_id2assoc(sk, param.se_assoc_id); - if (!asoc && param.se_assoc_id > SCTP_ALL_ASSOC && + asoc = sctp_id2assoc(sk, param->se_assoc_id); + if (!asoc && param->se_assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP)) return -EINVAL; if (asoc) - return sctp_assoc_ulpevent_type_set(¶m, asoc); + return sctp_assoc_ulpevent_type_set(param, asoc); if (sctp_style(sk, TCP)) - param.se_assoc_id = SCTP_FUTURE_ASSOC; + param->se_assoc_id = SCTP_FUTURE_ASSOC; - if (param.se_assoc_id == SCTP_FUTURE_ASSOC || - param.se_assoc_id == SCTP_ALL_ASSOC) + if (param->se_assoc_id == SCTP_FUTURE_ASSOC || + param->se_assoc_id == SCTP_ALL_ASSOC) sctp_ulpevent_type_set(&sp->subscribe, - param.se_type, param.se_on); + param->se_type, param->se_on); - if (param.se_assoc_id == SCTP_CURRENT_ASSOC || - param.se_assoc_id == SCTP_ALL_ASSOC) { + if (param->se_assoc_id == SCTP_CURRENT_ASSOC || + param->se_assoc_id == SCTP_ALL_ASSOC) { list_for_each_entry(asoc, &sp->ep->asocs, asocs) { - int ret = sctp_assoc_ulpevent_type_set(¶m, asoc); + int ret = sctp_assoc_ulpevent_type_set(param, asoc); if (ret && !retval) retval = ret; @@ -4334,26 +4311,25 @@ static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param, return retval; } -#undef param static int sctp_setsockopt_asconf_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; struct sctp_endpoint *ep; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; ep = sctp_sk(sk)->ep; - ep->asconf_enable = !!params.assoc_value; + ep->asconf_enable = !!params->assoc_value; if (ep->asconf_enable && ep->auth_enable) { sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF); @@ -4367,23 +4343,23 @@ static int sctp_setsockopt_asconf_supported(struct sock *sk, } static int sctp_setsockopt_auth_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; struct sctp_endpoint *ep; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; ep = sctp_sk(sk)->ep; - if (params.assoc_value) { + if (params->assoc_value) { retval = sctp_auth_init(ep, GFP_KERNEL); if (retval) goto out; @@ -4393,7 +4369,7 @@ static int sctp_setsockopt_auth_supported(struct sock *sk, } } - ep->auth_enable = !!params.assoc_value; + ep->auth_enable = !!params->assoc_value; retval = 0; out: @@ -4401,21 +4377,21 @@ static int sctp_setsockopt_auth_supported(struct sock *sk, } static int sctp_setsockopt_ecn_supported(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; - sctp_sk(sk)->ep->ecn_enable = !!params.assoc_value; + sctp_sk(sk)->ep->ecn_enable = !!params->assoc_value; retval = 0; out: @@ -4423,33 +4399,32 @@ static int sctp_setsockopt_ecn_supported(struct sock *sk, } static int sctp_setsockopt_pf_expose(struct sock *sk, - struct sctp_assoc_value params, + struct sctp_assoc_value *params, unsigned int optlen) { struct sctp_association *asoc; int retval = -EINVAL; - if (optlen != sizeof(params)) + if (optlen != sizeof(*params)) goto out; - if (params.assoc_value > SCTP_PF_EXPOSE_MAX) + if (params->assoc_value > SCTP_PF_EXPOSE_MAX) goto out; - asoc = sctp_id2assoc(sk, params.assoc_id); - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + asoc = sctp_id2assoc(sk, params->assoc_id); + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) goto out; if (asoc) - asoc->pf_expose = params.assoc_value; + asoc->pf_expose = params->assoc_value; else - sctp_sk(sk)->pf_expose = params.assoc_value; + sctp_sk(sk)->pf_expose = params->assoc_value; retval = 0; out: return retval; } -#undef params static int kernel_sctp_setsockopt(struct sock *sk, int optname, void *optval, int optlen) -- 1.8.1.2 - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* RE: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines 2020-05-26 16:40 ` David Laight @ 2020-05-26 16:44 ` David Laight -1 siblings, 0 replies; 11+ messages in thread From: David Laight @ 2020-05-26 16:44 UTC (permalink / raw) To: David Laight, 'Vlad Yasevich', 'Neil Horman', 'David S. Miller', 'Jakub Kicinski', 'linux-sctp@vger.kernel.org', 'netdev@vger.kernel.org', 'Christoph Hellwig', 'Marcelo Ricardo Leitner' VGhpcyBzaG91bGQgYmUgMy84Lg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZy b206IG5ldGRldi1vd25lckB2Z2VyLmtlcm5lbC5vcmcgPG5ldGRldi1vd25lckB2Z2VyLmtlcm5l bC5vcmc+IE9uIEJlaGFsZiBPZiBEYXZpZCBMYWlnaHQNCj4gU2VudDogMjYgTWF5IDIwMjAgMTc6 NDANCj4gVG86ICdWbGFkIFlhc2V2aWNoJyA8dnlhc2V2aWNoQGdtYWlsLmNvbT47ICdOZWlsIEhv cm1hbicgPG5ob3JtYW5AdHV4ZHJpdmVyLmNvbT47ICdEYXZpZCBTLiBNaWxsZXInDQo+IDxkYXZl bUBkYXZlbWxvZnQubmV0PjsgJ0pha3ViIEtpY2luc2tpJyA8a3ViYUBrZXJuZWwub3JnPjsgJ2xp bnV4LXNjdHBAdmdlci5rZXJuZWwub3JnJyA8bGludXgtDQo+IHNjdHBAdmdlci5rZXJuZWwub3Jn PjsgJ25ldGRldkB2Z2VyLmtlcm5lbC5vcmcnIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPjsgJ0No cmlzdG9waCBIZWxsd2lnJw0KPiA8aGNoQGxzdC5kZT47ICdNYXJjZWxvIFJpY2FyZG8gTGVpdG5l cicgPG1hcmNlbG8ubGVpdG5lckBnbWFpbC5jb20+DQo+IFN1YmplY3Q6IFtQQVRDSCB2MyBuZXQt bmV4dCAxLzhdIHNjdHA6IHNldHNvY2tvcHQsIGV4cGFuZCBzb21lICNkZWZpbmVzDQo+IA0KPiBF eHBhbmQgdGhlICNkZWZpbmUgZm9vICgqZm9vKSB1c2VkIHRvIHNpbXBsaWZ5IHRoZSBwcmV2aW91 cyBwYXRjaC4NCj4gRG9lc24ndCBjaGFuZ2UgdGhlIGdlbmVyYXRlZCBjb2RlLg0KPiANCj4gU2ln bmVkLW9mZi1ieTogRGF2aWQgTGFpZ2h0IDxkYXZpZC5sYWlnaHRAYWN1bGFiLmNvbT4NCj4gDQo+ IC0tLQ0KPiAgbmV0L3NjdHAvc29ja2V0LmMgfCA2ODcgKysrKysrKysrKysrKysrKysrKysrKysr KystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+ICAxIGZpbGUgY2hhbmdlZCwgMzMxIGlu c2VydGlvbnMoKyksIDM1NiBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9uZXQvc2N0 cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jDQo+IGluZGV4IDYzOWQ3ZGEuLmI4MDY4ZGEg MTAwNjQ0DQo+IC0tLSBhL25ldC9zY3RwL3NvY2tldC5jDQo+ICsrKyBiL25ldC9zY3RwL3NvY2tl dC5jDQo+IEBAIC0yNTg1LDkgKzI1ODUsOCBAQCBzdGF0aWMgaW50IHNjdHBfYXBwbHlfcGVlcl9h ZGRyX3BhcmFtcyhzdHJ1Y3Qgc2N0cF9wYWRkcnBhcmFtcyAqcGFyYW1zLA0KPiAgCXJldHVybiAw Ow0KPiAgfQ0KPiANCj4gLSNkZWZpbmUgcGFyYW1zICgqcGFyYW1zKQ0KPiAgc3RhdGljIGludCBz Y3RwX3NldHNvY2tvcHRfcGVlcl9hZGRyX3BhcmFtcyhzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJ CSAgICBzdHJ1Y3Qgc2N0cF9wYWRkcnBhcmFtcyBwYXJhbXMsDQo+ICsJCQkJCSAgICBzdHJ1Y3Qg c2N0cF9wYWRkcnBhcmFtcyAqcGFyYW1zLA0KPiAgCQkJCQkgICAgdW5zaWduZWQgaW50IG9wdGxl bikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgICAqdHJhbnMgPSBOVUxMOw0KPiBA QCAtMjU5NiwzMyArMjU5NSwzMyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVyX2Fk ZHJfcGFyYW1zKHN0cnVjdCBzb2NrICpzaywNCj4gIAlpbnQgZXJyb3I7DQo+ICAJaW50IGhiX2No YW5nZSwgcG10dWRfY2hhbmdlLCBzYWNrZGVsYXlfY2hhbmdlOw0KPiANCj4gLQlpZiAob3B0bGVu ICE9IHNpemVvZihwYXJhbXMpKSB7DQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKnBhcmFtcykp IHsNCj4gIAkJaWYgKG9wdGxlbiAhPSBBTElHTihvZmZzZXRvZihzdHJ1Y3Qgc2N0cF9wYWRkcnBh cmFtcywNCj4gIAkJCQkJCSAgICBzcHBfaXB2Nl9mbG93bGFiZWwpLCA0KSkNCj4gIAkJCXJldHVy biAtRUlOVkFMOw0KPiAtCQlpZiAocGFyYW1zLnNwcF9mbGFncyAmIChTUFBfRFNDUCB8IFNQUF9J UFY2X0ZMT1dMQUJFTCkpDQo+ICsJCWlmIChwYXJhbXMtPnNwcF9mbGFncyAmIChTUFBfRFNDUCB8 IFNQUF9JUFY2X0ZMT1dMQUJFTCkpDQo+ICAJCQlyZXR1cm4gLUVJTlZBTDsNCj4gIAl9DQo+IA0K PiAgCS8qIFZhbGlkYXRlIGZsYWdzIGFuZCB2YWx1ZSBwYXJhbWV0ZXJzLiAqLw0KPiAtCWhiX2No YW5nZSAgICAgICAgPSBwYXJhbXMuc3BwX2ZsYWdzICYgU1BQX0hCOw0KPiAtCXBtdHVkX2NoYW5n ZSAgICAgPSBwYXJhbXMuc3BwX2ZsYWdzICYgU1BQX1BNVFVEOw0KPiAtCXNhY2tkZWxheV9jaGFu Z2UgPSBwYXJhbXMuc3BwX2ZsYWdzICYgU1BQX1NBQ0tERUxBWTsNCj4gKwloYl9jaGFuZ2UgICAg ICAgID0gcGFyYW1zLT5zcHBfZmxhZ3MgJiBTUFBfSEI7DQo+ICsJcG10dWRfY2hhbmdlICAgICA9 IHBhcmFtcy0+c3BwX2ZsYWdzICYgU1BQX1BNVFVEOw0KPiArCXNhY2tkZWxheV9jaGFuZ2UgPSBw YXJhbXMtPnNwcF9mbGFncyAmIFNQUF9TQUNLREVMQVk7DQo+IA0KPiAgCWlmIChoYl9jaGFuZ2Ug ICAgICAgID09IFNQUF9IQiB8fA0KPiAgCSAgICBwbXR1ZF9jaGFuZ2UgICAgID09IFNQUF9QTVRV RCB8fA0KPiAgCSAgICBzYWNrZGVsYXlfY2hhbmdlID09IFNQUF9TQUNLREVMQVkgfHwNCj4gLQkg ICAgcGFyYW1zLnNwcF9zYWNrZGVsYXkgPiA1MDAgfHwNCj4gLQkgICAgKHBhcmFtcy5zcHBfcGF0 aG10dSAmJg0KPiAtCSAgICAgcGFyYW1zLnNwcF9wYXRobXR1IDwgU0NUUF9ERUZBVUxUX01JTlNF R01FTlQpKQ0KPiArCSAgICBwYXJhbXMtPnNwcF9zYWNrZGVsYXkgPiA1MDAgfHwNCj4gKwkgICAg KHBhcmFtcy0+c3BwX3BhdGhtdHUgJiYNCj4gKwkgICAgIHBhcmFtcy0+c3BwX3BhdGhtdHUgPCBT Q1RQX0RFRkFVTFRfTUlOU0VHTUVOVCkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAkv KiBJZiBhbiBhZGRyZXNzIG90aGVyIHRoYW4gSU5BRERSX0FOWSBpcyBzcGVjaWZpZWQsIGFuZA0K PiAgCSAqIG5vIHRyYW5zcG9ydCBpcyBmb3VuZCwgdGhlbiB0aGUgcmVxdWVzdCBpcyBpbnZhbGlk Lg0KPiAgCSAqLw0KPiAtCWlmICghc2N0cF9pc19hbnkoc2ssICh1bmlvbiBzY3RwX2FkZHIgKikm cGFyYW1zLnNwcF9hZGRyZXNzKSkgew0KPiAtCQl0cmFucyA9IHNjdHBfYWRkcl9pZDJ0cmFuc3Bv cnQoc2ssICZwYXJhbXMuc3BwX2FkZHJlc3MsDQo+IC0JCQkJCSAgICAgICBwYXJhbXMuc3BwX2Fz c29jX2lkKTsNCj4gKwlpZiAoIXNjdHBfaXNfYW55KHNrLCAodW5pb24gc2N0cF9hZGRyICopJnBh cmFtcy0+c3BwX2FkZHJlc3MpKSB7DQo+ICsJCXRyYW5zID0gc2N0cF9hZGRyX2lkMnRyYW5zcG9y dChzaywgJnBhcmFtcy0+c3BwX2FkZHJlc3MsDQo+ICsJCQkJCSAgICAgICBwYXJhbXMtPnNwcF9h c3NvY19pZCk7DQo+ICAJCWlmICghdHJhbnMpDQo+ICAJCQlyZXR1cm4gLUVJTlZBTDsNCj4gIAl9 DQo+IEBAIC0yNjMxLDE5ICsyNjMwLDE5IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3Bl ZXJfYWRkcl9wYXJhbXMoc3RydWN0IHNvY2sgKnNrLA0KPiAgCSAqIHNvY2tldCBpcyBhIG9uZSB0 byBtYW55IHN0eWxlIHNvY2tldCwgYW5kIGFuIGFzc29jaWF0aW9uDQo+ICAJICogd2FzIG5vdCBm b3VuZCwgdGhlbiB0aGUgaWQgd2FzIGludmFsaWQuDQo+ICAJICovDQo+IC0JYXNvYyA9IHNjdHBf aWQyYXNzb2Moc2ssIHBhcmFtcy5zcHBfYXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJh bXMuc3BwX2Fzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBf aWQyYXNzb2Moc2ssIHBhcmFtcy0+c3BwX2Fzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgcGFy YW1zLT5zcHBfYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0MgJiYNCj4gIAkgICAgc2N0cF9z dHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCS8qIEhlYXJ0YmVh dCBkZW1hbmQgY2FuIG9ubHkgYmUgc2VudCBvbiBhIHRyYW5zcG9ydCBvcg0KPiAgCSAqIGFzc29j aWF0aW9uLCBidXQgbm90IGEgc29ja2V0Lg0KPiAgCSAqLw0KPiAtCWlmIChwYXJhbXMuc3BwX2Zs YWdzICYgU1BQX0hCX0RFTUFORCAmJiAhdHJhbnMgJiYgIWFzb2MpDQo+ICsJaWYgKHBhcmFtcy0+ c3BwX2ZsYWdzICYgU1BQX0hCX0RFTUFORCAmJiAhdHJhbnMgJiYgIWFzb2MpDQo+ICAJCXJldHVy biAtRUlOVkFMOw0KPiANCj4gIAkvKiBQcm9jZXNzIHBhcmFtZXRlcnMuICovDQo+IC0JZXJyb3Ig PSBzY3RwX2FwcGx5X3BlZXJfYWRkcl9wYXJhbXMoJnBhcmFtcywgdHJhbnMsIGFzb2MsIHNwLA0K PiArCWVycm9yID0gc2N0cF9hcHBseV9wZWVyX2FkZHJfcGFyYW1zKHBhcmFtcywgdHJhbnMsIGFz b2MsIHNwLA0KPiAgCQkJCQkgICAgaGJfY2hhbmdlLCBwbXR1ZF9jaGFuZ2UsDQo+ICAJCQkJCSAg ICBzYWNrZGVsYXlfY2hhbmdlKTsNCj4gDQo+IEBAIC0yNjU2LDcgKzI2NTUsNyBAQCBzdGF0aWMg aW50IHNjdHBfc2V0c29ja29wdF9wZWVyX2FkZHJfcGFyYW1zKHN0cnVjdCBzb2NrICpzaywNCj4g IAlpZiAoIXRyYW5zICYmIGFzb2MpIHsNCj4gIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywg JmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCwNCj4gIAkJCQl0cmFuc3BvcnRzKSB7DQo+ IC0JCQlzY3RwX2FwcGx5X3BlZXJfYWRkcl9wYXJhbXMoJnBhcmFtcywgdHJhbnMsIGFzb2MsIHNw LA0KPiArCQkJc2N0cF9hcHBseV9wZWVyX2FkZHJfcGFyYW1zKHBhcmFtcywgdHJhbnMsIGFzb2Ms IHNwLA0KPiAgCQkJCQkJICAgIGhiX2NoYW5nZSwgcG10dWRfY2hhbmdlLA0KPiAgCQkJCQkJICAg IHNhY2tkZWxheV9jaGFuZ2UpOw0KPiAgCQl9DQo+IEBAIC0yNjY0LDcgKzI2NjMsNiBAQCBzdGF0 aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVyX2FkZHJfcGFyYW1zKHN0cnVjdCBzb2NrICpzaywN Cj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9DQo+IC0jdW5kZWYgcGFyYW1zDQo+IA0KPiAgc3RhdGlj IGlubGluZSBfX3UzMiBzY3RwX3NwcF9zYWNrZGVsYXlfZW5hYmxlKF9fdTMyIHBhcmFtX2ZsYWdz KQ0KPiAgew0KPiBAQCAtMjc0OSwxNiArMjc0NywxNSBAQCBzdGF0aWMgdm9pZCBzY3RwX2FwcGx5 X2Fzb2NfZGVsYXllZF9hY2soc3RydWN0IHNjdHBfc2Fja19pbmZvICpwYXJhbXMsDQo+ICAgKiAg ICB2YWx1ZSB0byAxIHdpbGwgZGlzYWJsZSB0aGUgZGVsYXllZCBzYWNrIGFsZ29yaXRobS4NCj4g ICAqLw0KPiANCj4gLSNkZWZpbmUgcGFyYW1zICgqcGFyYW1zKQ0KPiAgc3RhdGljIGludCBzY3Rw X3NldHNvY2tvcHRfZGVsYXllZF9hY2soc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAgICAgICBz dHJ1Y3Qgc2N0cF9zYWNrX2luZm8gcGFyYW1zLA0KPiArCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9z YWNrX2luZm8gKnBhcmFtcywNCj4gIAkJCQkgICAgICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4g IHsNCj4gIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAgCXN0cnVjdCBz Y3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiANCj4gIAlpZiAob3B0bGVuID09IHNpemVvZihzdHJ1 Y3Qgc2N0cF9zYWNrX2luZm8pKSB7DQo+IC0JCWlmIChwYXJhbXMuc2Fja19kZWxheSA9PSAwICYm IHBhcmFtcy5zYWNrX2ZyZXEgPT0gMCkNCj4gKwkJaWYgKHBhcmFtcy0+c2Fja19kZWxheSA9PSAw ICYmIHBhcmFtcy0+c2Fja19mcmVxID09IDApDQo+ICAJCQlyZXR1cm4gMDsNCj4gIAl9IGVsc2Ug aWYgKG9wdGxlbiA9PSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUpKSB7DQo+ICAJCXBy X3dhcm5fcmF0ZWxpbWl0ZWQoREVQUkVDQVRFRA0KPiBAQCAtMjc2Niw1NiArMjc2Myw1NiBAQCBz dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2ssDQo+ ICAJCQkJICAgICJVc2Ugb2Ygc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgaW4gZGVsYXllZF9hY2sg c29ja2V0IG9wdGlvbi5cbiINCj4gIAkJCQkgICAgIlVzZSBzdHJ1Y3Qgc2N0cF9zYWNrX2luZm8g aW5zdGVhZFxuIiwNCj4gIAkJCQkgICAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVu dCkpOw0KPiAtCQlpZiAocGFyYW1zLnNhY2tfZGVsYXkgPT0gMCkNCj4gLQkJCXBhcmFtcy5zYWNr X2ZyZXEgPSAxOw0KPiArCQlpZiAocGFyYW1zLT5zYWNrX2RlbGF5ID09IDApDQo+ICsJCQlwYXJh bXMtPnNhY2tfZnJlcSA9IDE7DQo+ICAJCWVsc2UNCj4gLQkJCXBhcmFtcy5zYWNrX2ZyZXEgPSAw Ow0KPiArCQkJcGFyYW1zLT5zYWNrX2ZyZXEgPSAwOw0KPiAgCX0gZWxzZQ0KPiAgCQlyZXR1cm4g LUVJTlZBTDsNCj4gDQo+ICAJLyogVmFsaWRhdGUgdmFsdWUgcGFyYW1ldGVyLiAqLw0KPiAtCWlm IChwYXJhbXMuc2Fja19kZWxheSA+IDUwMCkNCj4gKwlpZiAocGFyYW1zLT5zYWNrX2RlbGF5ID4g NTAwKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAJLyogR2V0IGFzc29jaWF0aW9uLCBp ZiBzYWNrX2Fzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DIGFuZCB0aGUNCj4gIAkgKiBzb2Nr ZXQgaXMgYSBvbmUgdG8gbWFueSBzdHlsZSBzb2NrZXQsIGFuZCBhbiBhc3NvY2lhdGlvbg0KPiAg CSAqIHdhcyBub3QgZm91bmQsIHRoZW4gdGhlIGlkIHdhcyBpbnZhbGlkLg0KPiAgCSAqLw0KPiAt CWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMuc2Fja19hc3NvY19pZCk7DQo+IC0JaWYg KCFhc29jICYmIHBhcmFtcy5zYWNrX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4gKwlh c29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5zYWNrX2Fzc29jX2lkKTsNCj4gKwlpZiAo IWFzb2MgJiYgcGFyYW1zLT5zYWNrX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4gIAkg ICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlm IChhc29jKSB7DQo+IC0JCXNjdHBfYXBwbHlfYXNvY19kZWxheWVkX2FjaygmcGFyYW1zLCBhc29j KTsNCj4gKwkJc2N0cF9hcHBseV9hc29jX2RlbGF5ZWRfYWNrKHBhcmFtcywgYXNvYyk7DQo+IA0K PiAgCQlyZXR1cm4gMDsNCj4gIAl9DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0K PiAtCQlwYXJhbXMuc2Fja19hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlwYXJh bXMtPnNhY2tfYXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gDQo+IC0JaWYgKHBhcmFt cy5zYWNrX2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtcy5z YWNrX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+IC0JCWlmIChwYXJhbXMuc2Fja19k ZWxheSkgew0KPiAtCQkJc3AtPnNhY2tkZWxheSA9IHBhcmFtcy5zYWNrX2RlbGF5Ow0KPiArCWlm IChwYXJhbXMtPnNhY2tfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAg cGFyYW1zLT5zYWNrX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJCWlmIChwYXJh bXMtPnNhY2tfZGVsYXkpIHsNCj4gKwkJCXNwLT5zYWNrZGVsYXkgPSBwYXJhbXMtPnNhY2tfZGVs YXk7DQo+ICAJCQlzcC0+cGFyYW1fZmxhZ3MgPQ0KPiAgCQkJCXNjdHBfc3BwX3NhY2tkZWxheV9l bmFibGUoc3AtPnBhcmFtX2ZsYWdzKTsNCj4gIAkJfQ0KPiAtCQlpZiAocGFyYW1zLnNhY2tfZnJl cSA9PSAxKSB7DQo+ICsJCWlmIChwYXJhbXMtPnNhY2tfZnJlcSA9PSAxKSB7DQo+ICAJCQlzcC0+ cGFyYW1fZmxhZ3MgPQ0KPiAgCQkJCXNjdHBfc3BwX3NhY2tkZWxheV9kaXNhYmxlKHNwLT5wYXJh bV9mbGFncyk7DQo+IC0JCX0gZWxzZSBpZiAocGFyYW1zLnNhY2tfZnJlcSA+IDEpIHsNCj4gLQkJ CXNwLT5zYWNrZnJlcSA9IHBhcmFtcy5zYWNrX2ZyZXE7DQo+ICsJCX0gZWxzZSBpZiAocGFyYW1z LT5zYWNrX2ZyZXEgPiAxKSB7DQo+ICsJCQlzcC0+c2Fja2ZyZXEgPSBwYXJhbXMtPnNhY2tfZnJl cTsNCj4gIAkJCXNwLT5wYXJhbV9mbGFncyA9DQo+ICAJCQkJc2N0cF9zcHBfc2Fja2RlbGF5X2Vu YWJsZShzcC0+cGFyYW1fZmxhZ3MpOw0KPiAgCQl9DQo+ICAJfQ0KPiANCj4gLQlpZiAocGFyYW1z LnNhY2tfYXNzb2NfaWQgPT0gU0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtcy5z YWNrX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCWlmIChwYXJhbXMtPnNhY2tfYXNz b2NfaWQgPT0gU0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+ICsJICAgIHBhcmFtcy0+c2Fja19hc3Nv Y19pZCA9PSBTQ1RQX0FMTF9BU1NPQykNCj4gIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShhc29jLCAm c3AtPmVwLT5hc29jcywgYXNvY3MpDQo+IC0JCQlzY3RwX2FwcGx5X2Fzb2NfZGVsYXllZF9hY2so JnBhcmFtcywgYXNvYyk7DQo+ICsJCQlzY3RwX2FwcGx5X2Fzb2NfZGVsYXllZF9hY2socGFyYW1z LCBhc29jKTsNCj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9DQo+IEBAIC0yODMxLDggKzI4MjgsNyBA QCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2ss DQo+ICAgKiBieSB0aGUgY2hhbmdlKS4gIFdpdGggVENQLXN0eWxlIHNvY2tldHMsIHRoaXMgb3B0 aW9uIGlzIGluaGVyaXRlZCBieQ0KPiAgICogc29ja2V0cyBkZXJpdmVkIGZyb20gYSBsaXN0ZW5l ciBzb2NrZXQuDQo+ICAgKi8NCj4gLSNkZWZpbmUgc2luaXQgKCpzaW5pdCkNCj4gLXN0YXRpYyBp bnQgc2N0cF9zZXRzb2Nrb3B0X2luaXRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2N0cF9p bml0bXNnIHNpbml0LA0KPiArc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfaW5pdG1zZyhzdHJ1 Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2luaXRtc2cgKnNpbml0LA0KPiAgCQkJCSAgIHVuc2ln bmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3Nr KHNrKTsNCj4gQEAgLTI4NDAsMTggKzI4MzYsMTcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tv cHRfaW5pdG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2luaXRtc2cgc2luaXQsDQo+ ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfaW5pdG1zZykpDQo+ICAJCXJldHVy biAtRUlOVkFMOw0KPiANCj4gLQlpZiAoc2luaXQuc2luaXRfbnVtX29zdHJlYW1zKQ0KPiAtCQlz cC0+aW5pdG1zZy5zaW5pdF9udW1fb3N0cmVhbXMgPSBzaW5pdC5zaW5pdF9udW1fb3N0cmVhbXM7 DQo+IC0JaWYgKHNpbml0LnNpbml0X21heF9pbnN0cmVhbXMpDQo+IC0JCXNwLT5pbml0bXNnLnNp bml0X21heF9pbnN0cmVhbXMgPSBzaW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zOw0KPiAtCWlmIChz aW5pdC5zaW5pdF9tYXhfYXR0ZW1wdHMpDQo+IC0JCXNwLT5pbml0bXNnLnNpbml0X21heF9hdHRl bXB0cyA9IHNpbml0LnNpbml0X21heF9hdHRlbXB0czsNCj4gLQlpZiAoc2luaXQuc2luaXRfbWF4 X2luaXRfdGltZW8pDQo+IC0JCXNwLT5pbml0bXNnLnNpbml0X21heF9pbml0X3RpbWVvID0gc2lu aXQuc2luaXRfbWF4X2luaXRfdGltZW87DQo+ICsJaWYgKHNpbml0LT5zaW5pdF9udW1fb3N0cmVh bXMpDQo+ICsJCXNwLT5pbml0bXNnLnNpbml0X251bV9vc3RyZWFtcyA9IHNpbml0LT5zaW5pdF9u dW1fb3N0cmVhbXM7DQo+ICsJaWYgKHNpbml0LT5zaW5pdF9tYXhfaW5zdHJlYW1zKQ0KPiArCQlz cC0+aW5pdG1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zID0gc2luaXQtPnNpbml0X21heF9pbnN0cmVh bXM7DQo+ICsJaWYgKHNpbml0LT5zaW5pdF9tYXhfYXR0ZW1wdHMpDQo+ICsJCXNwLT5pbml0bXNn LnNpbml0X21heF9hdHRlbXB0cyA9IHNpbml0LT5zaW5pdF9tYXhfYXR0ZW1wdHM7DQo+ICsJaWYg KHNpbml0LT5zaW5pdF9tYXhfaW5pdF90aW1lbykNCj4gKwkJc3AtPmluaXRtc2cuc2luaXRfbWF4 X2luaXRfdGltZW8gPSBzaW5pdC0+c2luaXRfbWF4X2luaXRfdGltZW87DQo+IA0KPiAgCXJldHVy biAwOw0KPiAgfQ0KPiAtI3VuZGVmIHNpbml0DQo+IA0KPiAgLyoNCj4gICAqIDcuMS4xNCBTZXQg ZGVmYXVsdCBzZW5kIHBhcmFtZXRlcnMgKFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKQ0KPiBAQCAt Mjg2Nyw1NiArMjg2Miw1NSBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9pbml0bXNnKHN0 cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfaW5pdG1zZyBzaW5pdCwNCj4gICAqICAgc2luZm9f dGltZXRvbGl2ZS4gIFRoZSB1c2VyIG11c3QgcHJvdmlkZSB0aGUgc2luZm9fYXNzb2NfaWQgZmll bGQgaW4NCj4gICAqICAgdG8gdGhpcyBjYWxsIGlmIHRoZSBjYWxsZXIgaXMgdXNpbmcgdGhlIFVE UCBtb2RlbC4NCj4gICAqLw0KPiAtI2RlZmluZSBpbmZvICgqaW5mbykNCj4gIHN0YXRpYyBpbnQg c2N0cF9zZXRzb2Nrb3B0X2RlZmF1bHRfc2VuZF9wYXJhbShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0J CQkJCSAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gaW5mbywNCj4gKwkJCQkJICAgICAgc3Ry dWN0IHNjdHBfc25kcmN2aW5mbyAqaW5mbywNCj4gIAkJCQkJICAgICAgdW5zaWduZWQgaW50IG9w dGxlbikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAg CXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiANCj4gLQlpZiAob3B0bGVuICE9IHNp emVvZihpbmZvKSkNCj4gKwlpZiAob3B0bGVuICE9IHNpemVvZigqaW5mbykpDQo+ICAJCXJldHVy biAtRUlOVkFMOw0KPiAtCWlmIChpbmZvLnNpbmZvX2ZsYWdzICYNCj4gKwlpZiAoaW5mby0+c2lu Zm9fZmxhZ3MgJg0KPiAgCSAgICB+KFNDVFBfVU5PUkRFUkVEIHwgU0NUUF9BRERSX09WRVIgfA0K PiAgCSAgICAgIFNDVFBfQUJPUlQgfCBTQ1RQX0VPRikpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0K PiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgaW5mby5zaW5mb19hc3NvY19pZCk7DQo+ IC0JaWYgKCFhc29jICYmIGluZm8uc2luZm9fYXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0K PiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBpbmZvLT5zaW5mb19hc3NvY19pZCk7DQo+ICsJ aWYgKCFhc29jICYmIGluZm8tPnNpbmZvX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4g IAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAg CWlmIChhc29jKSB7DQo+IC0JCWFzb2MtPmRlZmF1bHRfc3RyZWFtID0gaW5mby5zaW5mb19zdHJl YW07DQo+IC0JCWFzb2MtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLnNpbmZvX2ZsYWdzOw0KPiAtCQlh c29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLnNpbmZvX3BwaWQ7DQo+IC0JCWFzb2MtPmRlZmF1bHRf Y29udGV4dCA9IGluZm8uc2luZm9fY29udGV4dDsNCj4gLQkJYXNvYy0+ZGVmYXVsdF90aW1ldG9s aXZlID0gaW5mby5zaW5mb190aW1ldG9saXZlOw0KPiArCQlhc29jLT5kZWZhdWx0X3N0cmVhbSA9 IGluZm8tPnNpbmZvX3N0cmVhbTsNCj4gKwkJYXNvYy0+ZGVmYXVsdF9mbGFncyA9IGluZm8tPnNp bmZvX2ZsYWdzOw0KPiArCQlhc29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLT5zaW5mb19wcGlkOw0K PiArCQlhc29jLT5kZWZhdWx0X2NvbnRleHQgPSBpbmZvLT5zaW5mb19jb250ZXh0Ow0KPiArCQlh c29jLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSBpbmZvLT5zaW5mb190aW1ldG9saXZlOw0KPiANCj4g IAkJcmV0dXJuIDA7DQo+ICAJfQ0KPiANCj4gIAlpZiAoc2N0cF9zdHlsZShzaywgVENQKSkNCj4g LQkJaW5mby5zaW5mb19hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlpbmZvLT5z aW5mb19hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlpZiAoaW5mby5zaW5m b19hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiAtCSAgICBpbmZvLnNpbmZvX2Fz c29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+IC0JCXNwLT5kZWZhdWx0X3N0cmVhbSA9IGlu Zm8uc2luZm9fc3RyZWFtOw0KPiAtCQlzcC0+ZGVmYXVsdF9mbGFncyA9IGluZm8uc2luZm9fZmxh Z3M7DQo+IC0JCXNwLT5kZWZhdWx0X3BwaWQgPSBpbmZvLnNpbmZvX3BwaWQ7DQo+IC0JCXNwLT5k ZWZhdWx0X2NvbnRleHQgPSBpbmZvLnNpbmZvX2NvbnRleHQ7DQo+IC0JCXNwLT5kZWZhdWx0X3Rp bWV0b2xpdmUgPSBpbmZvLnNpbmZvX3RpbWV0b2xpdmU7DQo+ICsJaWYgKGluZm8tPnNpbmZvX2Fz c29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+ICsJICAgIGluZm8tPnNpbmZvX2Fzc29j X2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJCXNwLT5kZWZhdWx0X3N0cmVhbSA9IGluZm8t PnNpbmZvX3N0cmVhbTsNCj4gKwkJc3AtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLT5zaW5mb19mbGFn czsNCj4gKwkJc3AtPmRlZmF1bHRfcHBpZCA9IGluZm8tPnNpbmZvX3BwaWQ7DQo+ICsJCXNwLT5k ZWZhdWx0X2NvbnRleHQgPSBpbmZvLT5zaW5mb19jb250ZXh0Ow0KPiArCQlzcC0+ZGVmYXVsdF90 aW1ldG9saXZlID0gaW5mby0+c2luZm9fdGltZXRvbGl2ZTsNCj4gIAl9DQo+IA0KPiAtCWlmIChp bmZvLnNpbmZvX2Fzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBpbmZv LnNpbmZvX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJaWYgKGluZm8tPnNpbmZv X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5zaW5mb19h c3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFz b2MsICZzcC0+ZXAtPmFzb2NzLCBhc29jcykgew0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9zdHJlYW0g PSBpbmZvLnNpbmZvX3N0cmVhbTsNCj4gLQkJCWFzb2MtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLnNp bmZvX2ZsYWdzOw0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9wcGlkID0gaW5mby5zaW5mb19wcGlkOw0K PiAtCQkJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0gaW5mby5zaW5mb19jb250ZXh0Ow0KPiAtCQkJ YXNvYy0+ZGVmYXVsdF90aW1ldG9saXZlID0gaW5mby5zaW5mb190aW1ldG9saXZlOw0KPiArCQkJ YXNvYy0+ZGVmYXVsdF9zdHJlYW0gPSBpbmZvLT5zaW5mb19zdHJlYW07DQo+ICsJCQlhc29jLT5k ZWZhdWx0X2ZsYWdzID0gaW5mby0+c2luZm9fZmxhZ3M7DQo+ICsJCQlhc29jLT5kZWZhdWx0X3Bw aWQgPSBpbmZvLT5zaW5mb19wcGlkOw0KPiArCQkJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0gaW5m by0+c2luZm9fY29udGV4dDsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8t PnNpbmZvX3RpbWV0b2xpdmU7DQo+ICAJCX0NCj4gIAl9DQo+IA0KPiBAQCAtMjkyNyw1MSArMjky MSw1MSBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWZhdWx0X3NlbmRfcGFyYW0oc3Ry dWN0IHNvY2sgKnNrLA0KPiAgICogKFNDVFBfREVGQVVMVF9TTkRJTkZPKQ0KPiAgICovDQo+ICBz dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWZhdWx0X3NuZGluZm8oc3RydWN0IHNvY2sgKnNr LA0KPiAtCQkJCQkgICBzdHJ1Y3Qgc2N0cF9zbmRpbmZvIGluZm8sDQo+ICsJCQkJCSAgIHN0cnVj dCBzY3RwX3NuZGluZm8gKmluZm8sDQo+ICAJCQkJCSAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gIAlzdHJ1Y3Qg c2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsNCj4gDQo+IC0JaWYgKG9wdGxlbiAhPSBzaXplb2YoaW5m bykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKmluZm8pKQ0KPiAgCQlyZXR1cm4gLUVJTlZB TDsNCj4gLQlpZiAoaW5mby5zbmRfZmxhZ3MgJg0KPiArCWlmIChpbmZvLT5zbmRfZmxhZ3MgJg0K PiAgCSAgICB+KFNDVFBfVU5PUkRFUkVEIHwgU0NUUF9BRERSX09WRVIgfA0KPiAgCSAgICAgIFND VFBfQUJPUlQgfCBTQ1RQX0VPRikpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlhc29j ID0gc2N0cF9pZDJhc3NvYyhzaywgaW5mby5zbmRfYXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAm JiBpbmZvLnNuZF9hc3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBf aWQyYXNzb2Moc2ssIGluZm8tPnNuZF9hc3NvY19pZCk7DQo+ICsJaWYgKCFhc29jICYmIGluZm8t PnNuZF9hc3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ss IFVEUCkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAlpZiAoYXNvYykgew0KPiAtCQlh c29jLT5kZWZhdWx0X3N0cmVhbSA9IGluZm8uc25kX3NpZDsNCj4gLQkJYXNvYy0+ZGVmYXVsdF9m bGFncyA9IGluZm8uc25kX2ZsYWdzOw0KPiAtCQlhc29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLnNu ZF9wcGlkOw0KPiAtCQlhc29jLT5kZWZhdWx0X2NvbnRleHQgPSBpbmZvLnNuZF9jb250ZXh0Ow0K PiArCQlhc29jLT5kZWZhdWx0X3N0cmVhbSA9IGluZm8tPnNuZF9zaWQ7DQo+ICsJCWFzb2MtPmRl ZmF1bHRfZmxhZ3MgPSBpbmZvLT5zbmRfZmxhZ3M7DQo+ICsJCWFzb2MtPmRlZmF1bHRfcHBpZCA9 IGluZm8tPnNuZF9wcGlkOw0KPiArCQlhc29jLT5kZWZhdWx0X2NvbnRleHQgPSBpbmZvLT5zbmRf Y29udGV4dDsNCj4gDQo+ICAJCXJldHVybiAwOw0KPiAgCX0NCj4gDQo+ICAJaWYgKHNjdHBfc3R5 bGUoc2ssIFRDUCkpDQo+IC0JCWluZm8uc25kX2Fzc29jX2lkID0gU0NUUF9GVVRVUkVfQVNTT0M7 DQo+ICsJCWluZm8tPnNuZF9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlp ZiAoaW5mby5zbmRfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gLQkgICAgaW5m by5zbmRfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4gLQkJc3AtPmRlZmF1bHRfc3Ry ZWFtID0gaW5mby5zbmRfc2lkOw0KPiAtCQlzcC0+ZGVmYXVsdF9mbGFncyA9IGluZm8uc25kX2Zs YWdzOw0KPiAtCQlzcC0+ZGVmYXVsdF9wcGlkID0gaW5mby5zbmRfcHBpZDsNCj4gLQkJc3AtPmRl ZmF1bHRfY29udGV4dCA9IGluZm8uc25kX2NvbnRleHQ7DQo+ICsJaWYgKGluZm8tPnNuZF9hc3Nv Y19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5zbmRfYXNzb2NfaWQg PT0gU0NUUF9BTExfQVNTT0MpIHsNCj4gKwkJc3AtPmRlZmF1bHRfc3RyZWFtID0gaW5mby0+c25k X3NpZDsNCj4gKwkJc3AtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLT5zbmRfZmxhZ3M7DQo+ICsJCXNw LT5kZWZhdWx0X3BwaWQgPSBpbmZvLT5zbmRfcHBpZDsNCj4gKwkJc3AtPmRlZmF1bHRfY29udGV4 dCA9IGluZm8tPnNuZF9jb250ZXh0Ow0KPiAgCX0NCj4gDQo+IC0JaWYgKGluZm8uc25kX2Fzc29j X2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBpbmZvLnNuZF9hc3NvY19pZCA9 PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCWlmIChpbmZvLT5zbmRfYXNzb2NfaWQgPT0gU0NUUF9D VVJSRU5UX0FTU09DIHx8DQo+ICsJICAgIGluZm8tPnNuZF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9B U1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBh c29jcykgew0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9zdHJlYW0gPSBpbmZvLnNuZF9zaWQ7DQo+IC0J CQlhc29jLT5kZWZhdWx0X2ZsYWdzID0gaW5mby5zbmRfZmxhZ3M7DQo+IC0JCQlhc29jLT5kZWZh dWx0X3BwaWQgPSBpbmZvLnNuZF9wcGlkOw0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0g aW5mby5zbmRfY29udGV4dDsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfc3RyZWFtID0gaW5mby0+c25k X3NpZDsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLT5zbmRfZmxhZ3M7DQo+ICsJ CQlhc29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLT5zbmRfcHBpZDsNCj4gKwkJCWFzb2MtPmRlZmF1 bHRfY29udGV4dCA9IGluZm8tPnNuZF9jb250ZXh0Ow0KPiAgCQl9DQo+ICAJfQ0KPiANCj4gQEAg LTI5ODQsOCArMjk3OCw3IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2RlZmF1bHRfc25k aW5mbyhzdHJ1Y3Qgc29jayAqc2ssDQo+ICAgKiB0aGUgYXNzb2NpYXRpb24gcHJpbWFyeS4gIFRo ZSBlbmNsb3NlZCBhZGRyZXNzIG11c3QgYmUgb25lIG9mIHRoZQ0KPiAgICogYXNzb2NpYXRpb24g cGVlcidzIGFkZHJlc3Nlcy4NCj4gICAqLw0KPiAtI2RlZmluZSBwcmltICgqcHJpbSkNCj4gLXN0 YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssIHN0 cnVjdCBzY3RwX3ByaW0gcHJpbSwNCj4gK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3ByaW1h cnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX3ByaW0gKnByaW0sDQo+ICAJCQkJ CXVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0 cmFuczsNCj4gQEAgLTI5OTYsMTcgKzI5ODksMTcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tv cHRfcHJpbWFyeV9hZGRyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfcHJpbQ0KPiBwcmlt LA0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAJLyogQWxsb3cgc2VjdXJpdHkgbW9kdWxl IHRvIHZhbGlkYXRlIGFkZHJlc3MgYnV0IG5lZWQgYWRkcmVzcyBsZW4uICovDQo+IC0JYWYgPSBz Y3RwX2dldF9hZl9zcGVjaWZpYyhwcmltLnNzcF9hZGRyLnNzX2ZhbWlseSk7DQo+ICsJYWYgPSBz Y3RwX2dldF9hZl9zcGVjaWZpYyhwcmltLT5zc3BfYWRkci5zc19mYW1pbHkpOw0KPiAgCWlmICgh YWYpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAllcnIgPSBzZWN1cml0eV9zY3RwX2Jp bmRfY29ubmVjdChzaywgU0NUUF9QUklNQVJZX0FERFIsDQo+IC0JCQkJCSAoc3RydWN0IHNvY2th ZGRyICopJnByaW0uc3NwX2FkZHIsDQo+ICsJCQkJCSAoc3RydWN0IHNvY2thZGRyICopJnByaW0t PnNzcF9hZGRyLA0KPiAgCQkJCQkgYWYtPnNvY2thZGRyX2xlbik7DQo+ICAJaWYgKGVycikNCj4g IAkJcmV0dXJuIGVycjsNCj4gDQo+IC0JdHJhbnMgPSBzY3RwX2FkZHJfaWQydHJhbnNwb3J0KHNr LCAmcHJpbS5zc3BfYWRkciwgcHJpbS5zc3BfYXNzb2NfaWQpOw0KPiArCXRyYW5zID0gc2N0cF9h ZGRyX2lkMnRyYW5zcG9ydChzaywgJnByaW0tPnNzcF9hZGRyLCBwcmltLT5zc3BfYXNzb2NfaWQp Ow0KPiAgCWlmICghdHJhbnMpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gQEAgLTMwMTQs NyArMzAwNyw2IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3ByaW1hcnlfYWRkcihzdHJ1 Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX3ByaW0gcHJpbSwNCj4gDQo+ICAJcmV0dXJuIDA7DQo+ ICB9DQo+IC0jdW5kZWYgcHJpbQ0KPiANCj4gIC8qDQo+ICAgKiA3LjEuNSBTQ1RQX05PREVMQVkN Cj4gQEAgLTMwNDcsNyArMzAzOSw3IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X25vZGVs YXkoc3RydWN0IHNvY2sgKnNrLCBpbnQgKm9wdHZhbCwNCj4gICAqDQo+ICAgKi8NCj4gIHN0YXRp YyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3J0b2luZm8oc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAg IHN0cnVjdCBzY3RwX3J0b2luZm8gcGFyYW1zLA0KPiArCQkJCSAgIHN0cnVjdCBzY3RwX3J0b2lu Zm8gKnBhcmFtcywNCj4gIAkJCQkgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0 cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiBAQCAtMzA1NywxNSArMzA0OSwxNSBAQCBz dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ydG9pbmZvKHN0cnVjdCBzb2NrICpzaywNCj4gIAlp ZiAob3B0bGVuICE9IHNpemVvZiAoc3RydWN0IHNjdHBfcnRvaW5mbykpDQo+ICAJCXJldHVybiAt RUlOVkFMOw0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLnNydG9fYXNz b2NfaWQpOw0KPiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMtPnNydG9fYXNzb2Nf aWQpOw0KPiANCj4gIAkvKiBTZXQgdGhlIHZhbHVlcyB0byB0aGUgc3BlY2lmaWMgYXNzb2NpYXRp b24gKi8NCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLnNydG9fYXNzb2NfaWQgIT0gU0NUUF9GVVRV UkVfQVNTT0MgJiYNCj4gKwlpZiAoIWFzb2MgJiYgcGFyYW1zLT5zcnRvX2Fzc29jX2lkICE9IFND VFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCXJl dHVybiAtRUlOVkFMOw0KPiANCj4gLQlydG9fbWF4ID0gcGFyYW1zLnNydG9fbWF4Ow0KPiAtCXJ0 b19taW4gPSBwYXJhbXMuc3J0b19taW47DQo+ICsJcnRvX21heCA9IHBhcmFtcy0+c3J0b19tYXg7 DQo+ICsJcnRvX21pbiA9IHBhcmFtcy0+c3J0b19taW47DQo+IA0KPiAgCWlmIChydG9fbWF4KQ0K PiAgCQlydG9fbWF4ID0gYXNvYyA/IG1zZWNzX3RvX2ppZmZpZXMocnRvX21heCkgOiBydG9fbWF4 Ow0KPiBAQCAtMzA4MSwxNyArMzA3MywxNyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9y dG9pbmZvKHN0cnVjdCBzb2NrICpzaywNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlm IChhc29jKSB7DQo+IC0JCWlmIChwYXJhbXMuc3J0b19pbml0aWFsICE9IDApDQo+ICsJCWlmIChw YXJhbXMtPnNydG9faW5pdGlhbCAhPSAwKQ0KPiAgCQkJYXNvYy0+cnRvX2luaXRpYWwgPQ0KPiAt CQkJCW1zZWNzX3RvX2ppZmZpZXMocGFyYW1zLnNydG9faW5pdGlhbCk7DQo+ICsJCQkJbXNlY3Nf dG9famlmZmllcyhwYXJhbXMtPnNydG9faW5pdGlhbCk7DQo+ICAJCWFzb2MtPnJ0b19tYXggPSBy dG9fbWF4Ow0KPiAgCQlhc29jLT5ydG9fbWluID0gcnRvX21pbjsNCj4gIAl9IGVsc2Ugew0KPiAg CQkvKiBJZiB0aGVyZSBpcyBubyBhc3NvY2lhdGlvbiBvciB0aGUgYXNzb2NpYXRpb24taWQgPSAw DQo+ICAJCSAqIHNldCB0aGUgdmFsdWVzIHRvIHRoZSBlbmRwb2ludC4NCj4gIAkJICovDQo+IC0J CWlmIChwYXJhbXMuc3J0b19pbml0aWFsICE9IDApDQo+IC0JCQlzcC0+cnRvaW5mby5zcnRvX2lu aXRpYWwgPSBwYXJhbXMuc3J0b19pbml0aWFsOw0KPiArCQlpZiAocGFyYW1zLT5zcnRvX2luaXRp YWwgIT0gMCkNCj4gKwkJCXNwLT5ydG9pbmZvLnNydG9faW5pdGlhbCA9IHBhcmFtcy0+c3J0b19p bml0aWFsOw0KPiAgCQlzcC0+cnRvaW5mby5zcnRvX21heCA9IHJ0b19tYXg7DQo+ICAJCXNwLT5y dG9pbmZvLnNydG9fbWluID0gcnRvX21pbjsNCj4gIAl9DQo+IEBAIC0zMTExLDcgKzMxMDMsNyBA QCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ydG9pbmZvKHN0cnVjdCBzb2NrICpzaywNCj4g ICAqDQo+ICAgKi8NCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Fzc29jaW5mbyhzdHJ1 Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcyBwYXJhbXMs DQo+ICsJCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcyAqcGFyYW1zLA0KPiAgCQkJCSAg ICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gDQo+IEBAIC0zMTIwLDE1ICszMTEyLDE1 IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Fzc29jaW5mbyhzdHJ1Y3Qgc29jayAqc2ss DQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NwYXJhbXMpKQ0KPiAg CQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFt cy5zYXNvY19hc3NvY19pZCk7DQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+ c2Fzb2NfYXNzb2NfaWQpOw0KPiANCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLnNhc29jX2Fzc29j X2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJaWYgKCFhc29jICYmIHBhcmFtcy0+c2Fz b2NfYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShz aywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCS8qIFNldCB0aGUgdmFsdWVz IHRvIHRoZSBzcGVjaWZpYyBhc3NvY2lhdGlvbiAqLw0KPiAgCWlmIChhc29jKSB7DQo+IC0JCWlm IChwYXJhbXMuc2Fzb2NfYXNvY21heHJ4dCAhPSAwKSB7DQo+ICsJCWlmIChwYXJhbXMtPnNhc29j X2Fzb2NtYXhyeHQgIT0gMCkgew0KPiAgCQkJX191MzIgcGF0aF9zdW0gPSAwOw0KPiAgCQkJaW50 ICAgcGF0aHMgPSAwOw0KPiAgCQkJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwZWVyX2FkZHI7DQo+ IEBAIC0zMTQ1LDI0ICszMTM3LDI0IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Fzc29j aW5mbyhzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJCQkgKiB0aGVuIG9uZSBwYXRoLg0KPiAgCQkJICov DQo+ICAJCQlpZiAocGF0aHMgPiAxICYmDQo+IC0JCQkgICAgcGFyYW1zLnNhc29jX2Fzb2NtYXhy eHQgPiBwYXRoX3N1bSkNCj4gKwkJCSAgICBwYXJhbXMtPnNhc29jX2Fzb2NtYXhyeHQgPiBwYXRo X3N1bSkNCj4gIAkJCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JCQlhc29jLT5tYXhfcmV0cmFu cyA9IHBhcmFtcy5zYXNvY19hc29jbWF4cnh0Ow0KPiArCQkJYXNvYy0+bWF4X3JldHJhbnMgPSBw YXJhbXMtPnNhc29jX2Fzb2NtYXhyeHQ7DQo+ICAJCX0NCj4gDQo+IC0JCWlmIChwYXJhbXMuc2Fz b2NfY29va2llX2xpZmUgIT0gMCkNCj4gLQkJCWFzb2MtPmNvb2tpZV9saWZlID0gbXNfdG9fa3Rp bWUocGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlKTsNCj4gKwkJaWYgKHBhcmFtcy0+c2Fzb2NfY29v a2llX2xpZmUgIT0gMCkNCj4gKwkJCWFzb2MtPmNvb2tpZV9saWZlID0gbXNfdG9fa3RpbWUocGFy YW1zLT5zYXNvY19jb29raWVfbGlmZSk7DQo+ICAJfSBlbHNlIHsNCj4gIAkJLyogU2V0IHRoZSB2 YWx1ZXMgdG8gdGhlIGVuZHBvaW50ICovDQo+ICAJCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0 cF9zayhzayk7DQo+IA0KPiAtCQlpZiAocGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQgIT0gMCkNCj4g KwkJaWYgKHBhcmFtcy0+c2Fzb2NfYXNvY21heHJ4dCAhPSAwKQ0KPiAgCQkJc3AtPmFzc29jcGFy YW1zLnNhc29jX2Fzb2NtYXhyeHQgPQ0KPiAtCQkJCQkJcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQ7 DQo+IC0JCWlmIChwYXJhbXMuc2Fzb2NfY29va2llX2xpZmUgIT0gMCkNCj4gKwkJCQkJCXBhcmFt cy0+c2Fzb2NfYXNvY21heHJ4dDsNCj4gKwkJaWYgKHBhcmFtcy0+c2Fzb2NfY29va2llX2xpZmUg IT0gMCkNCj4gIAkJCXNwLT5hc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSA9DQo+IC0JCQkJ CQlwYXJhbXMuc2Fzb2NfY29va2llX2xpZmU7DQo+ICsJCQkJCQlwYXJhbXMtPnNhc29jX2Nvb2tp ZV9saWZlOw0KPiAgCX0NCj4gIAlyZXR1cm4gMDsNCj4gIH0NCj4gQEAgLTMyMjAsNyArMzIxMiw3 IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X21hcHBlZHY0KHN0cnVjdCBzb2NrICpzaywg aW50ICpvcHR2YWwsDQo+ICAgKiBhc3NvY192YWx1ZTogIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmll cyB0aGUgbWF4aW11bSBzaXplIGluIGJ5dGVzLg0KPiAgICovDQo+ICBzdGF0aWMgaW50IHNjdHBf c2V0c29ja29wdF9tYXhzZWcoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAgc3RydWN0IHNjdHBf YXNzb2NfdmFsdWUgcGFyYW1zLA0KPiArCQkJCSAgc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgKnBh cmFtcywNCj4gIAkJCQkgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNj dHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gQEAgLTMyMzMsMTYgKzMyMjUsMTYgQEAgc3Rh dGljIGludCBzY3RwX3NldHNvY2tvcHRfbWF4c2VnKHN0cnVjdCBzb2NrICpzaywNCj4gIAkJCQkg ICAgIlVzZSBvZiBpbnQgaW4gbWF4c2VnIHNvY2tldCBvcHRpb24uXG4iDQo+ICAJCQkJICAgICJV c2Ugc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgaW5zdGVhZFxuIiwNCj4gIAkJCQkgICAgY3VycmVu dC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOw0KPiAtCQl2YWwgPSAqKGludCAqKSZwYXJh bXM7DQo+IC0JCXBhcmFtcy5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQl2YWwg PSAqKGludCAqKXBhcmFtczsNCj4gKwkJcGFyYW1zLT5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FT U09DOw0KPiAgCX0gZWxzZSBpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY192 YWx1ZSkpIHsNCj4gLQkJdmFsID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCQl2YWwgPSBwYXJh bXMtPmFzc29jX3ZhbHVlOw0KPiAgCX0gZWxzZSB7DQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiAg CX0NCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+ IC0JaWYgKCFhc29jICYmIHBhcmFtcy5hc3NvY19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0K PiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMtPmFzc29jX2lkKTsNCj4gKwlpZiAo IWFzb2MgJiYgcGFyYW1zLT5hc3NvY19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0KPiAgCSAg ICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IEBAIC0z Mjc3LDkgKzMyNjksOCBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhzZWcoc3RydWN0 IHNvY2sgKnNrLA0KPiAgICogICBsb2NhbGx5IGJvdW5kIGFkZHJlc3Nlcy4gVGhlIGZvbGxvd2lu ZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYWtlIGENCj4gICAqICAgc2V0IHByaW1hcnkgcmVxdWVz dDoNCj4gICAqLw0KPiAtI2RlZmluZSBwcmltICgqcHJpbSkNCj4gIHN0YXRpYyBpbnQgc2N0cF9z ZXRzb2Nrb3B0X3BlZXJfcHJpbWFyeV9hZGRyKHN0cnVjdCBzb2NrICpzaywNCj4gLQkJCQkJICAg ICBzdHJ1Y3Qgc2N0cF9zZXRwZWVycHJpbSBwcmltLA0KPiArCQkJCQkgICAgIHN0cnVjdCBzY3Rw X3NldHBlZXJwcmltICpwcmltLA0KPiAgCQkJCQkgICAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jawkqc3A7DQo+IEBAIC0zMjk2LDcgKzMyODcsNyBAQCBz dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVyX3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAq c2ssDQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfc2V0cGVlcnByaW0pKQ0K PiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBy aW0uc3NwcF9hc3NvY19pZCk7DQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHByaW0tPnNz cHBfYXNzb2NfaWQpOw0KPiAgCWlmICghYXNvYykNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0K PiBAQCAtMzMwOSwyNiArMzMwMCwyNiBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVy X3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJaWYgKCFzY3RwX3N0YXRlKGFzb2Ms IEVTVEFCTElTSEVEKSkNCj4gIAkJcmV0dXJuIC1FTk9UQ09OTjsNCj4gDQo+IC0JYWYgPSBzY3Rw X2dldF9hZl9zcGVjaWZpYyhwcmltLnNzcHBfYWRkci5zc19mYW1pbHkpOw0KPiArCWFmID0gc2N0 cF9nZXRfYWZfc3BlY2lmaWMocHJpbS0+c3NwcF9hZGRyLnNzX2ZhbWlseSk7DQo+ICAJaWYgKCFh ZikNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAtCWlmICghYWYtPmFkZHJfdmFsaWQoKHVu aW9uIHNjdHBfYWRkciAqKSZwcmltLnNzcHBfYWRkciwgc3AsIE5VTEwpKQ0KPiArCWlmICghYWYt PmFkZHJfdmFsaWQoKHVuaW9uIHNjdHBfYWRkciAqKSZwcmltLT5zc3BwX2FkZHIsIHNwLCBOVUxM KSkNCj4gIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOw0KPiANCj4gLQlpZiAoIXNjdHBfYXNzb2Nf bG9va3VwX2xhZGRyKGFzb2MsICh1bmlvbiBzY3RwX2FkZHIgKikmcHJpbS5zc3BwX2FkZHIpKQ0K PiArCWlmICghc2N0cF9hc3NvY19sb29rdXBfbGFkZHIoYXNvYywgKHVuaW9uIHNjdHBfYWRkciAq KSZwcmltLT5zc3BwX2FkZHIpKQ0KPiAgCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7DQo+IA0KPiAg CS8qIEFsbG93IHNlY3VyaXR5IG1vZHVsZSB0byB2YWxpZGF0ZSBhZGRyZXNzLiAqLw0KPiAgCWVy ciA9IHNlY3VyaXR5X3NjdHBfYmluZF9jb25uZWN0KHNrLCBTQ1RQX1NFVF9QRUVSX1BSSU1BUllf QUREUiwNCj4gLQkJCQkJIChzdHJ1Y3Qgc29ja2FkZHIgKikmcHJpbS5zc3BwX2FkZHIsDQo+ICsJ CQkJCSAoc3RydWN0IHNvY2thZGRyICopJnByaW0tPnNzcHBfYWRkciwNCj4gIAkJCQkJIGFmLT5z b2NrYWRkcl9sZW4pOw0KPiAgCWlmIChlcnIpDQo+ICAJCXJldHVybiBlcnI7DQo+IA0KPiAgCS8q IENyZWF0ZSBhbiBBU0NPTkYgY2h1bmsgd2l0aCBTRVRfUFJJTUFSWSBwYXJhbWV0ZXIJKi8NCj4g IAljaHVuayA9IHNjdHBfbWFrZV9hc2NvbmZfc2V0X3ByaW0oYXNvYywNCj4gLQkJCQkJICAodW5p b24gc2N0cF9hZGRyICopJnByaW0uc3NwcF9hZGRyKTsNCj4gKwkJCQkJICAodW5pb24gc2N0cF9h ZGRyICopJnByaW0tPnNzcHBfYWRkcik7DQo+ICAJaWYgKCFjaHVuaykNCj4gIAkJcmV0dXJuIC1F Tk9NRU07DQo+IA0KPiBAQCAtMzMzOCw3ICszMzI5LDYgQEAgc3RhdGljIGludCBzY3RwX3NldHNv Y2tvcHRfcGVlcl9wcmltYXJ5X2FkZHIoc3RydWN0IHNvY2sgKnNrLA0KPiANCj4gIAlyZXR1cm4g ZXJyOw0KPiAgfQ0KPiAtI3VuZGVmIHByaW0NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0c29j a29wdF9hZGFwdGF0aW9uX2xheWVyKHN0cnVjdCBzb2NrICpzaywNCj4gIAkJCQkJICAgIHN0cnVj dCBzY3RwX3NldGFkYXB0YXRpb24gKmFkYXB0YXRpb24sDQo+IEBAIC0zMzY3LDcgKzMzNTcsNyBA QCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hZGFwdGF0aW9uX2xheWVyKHN0cnVjdCBzb2Nr ICpzaywNCj4gICAqIHNhdmVkIHdpdGggb3V0Ym91bmQgbWVzc2FnZXMuDQo+ICAgKi8NCj4gIHN0 YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2NvbnRleHQoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJ CSAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkgICBzdHJ1Y3Qgc2N0 cF9hc3NvY192YWx1ZSAqcGFyYW1zLA0KPiAgCQkJCSAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gQEAgLTMzNzYs MjggKzMzNjYsMjggQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfY29udGV4dChzdHJ1Y3Qg c29jayAqc2ssDQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfdmFs dWUpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Mo c2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFtcy5hc3NvY19pZCA+ IFNDVFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+ YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkID4gU0NUUF9BTExf QVNTT0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5W QUw7DQo+IA0KPiAgCWlmIChhc29jKSB7DQo+IC0JCWFzb2MtPmRlZmF1bHRfcmN2X2NvbnRleHQg PSBwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJCWFzb2MtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSBw YXJhbXMtPmFzc29jX3ZhbHVlOw0KPiANCj4gIAkJcmV0dXJuIDA7DQo+ICAJfQ0KPiANCj4gIAlp ZiAoc2N0cF9zdHlsZShzaywgVENQKSkNCj4gLQkJcGFyYW1zLmFzc29jX2lkID0gU0NUUF9GVVRV UkVfQVNTT0M7DQo+ICsJCXBhcmFtcy0+YXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4g DQo+IC0JaWYgKHBhcmFtcy5hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiAtCSAg ICBwYXJhbXMuYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpDQo+IC0JCXNwLT5kZWZhdWx0X3Jj dl9jb250ZXh0ID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCWlmIChwYXJhbXMtPmFzc29jX2lk ID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+ICsJICAgIHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NU UF9BTExfQVNTT0MpDQo+ICsJCXNwLT5kZWZhdWx0X3Jjdl9jb250ZXh0ID0gcGFyYW1zLT5hc3Nv Y192YWx1ZTsNCj4gDQo+IC0JaWYgKHBhcmFtcy5hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNT T0MgfHwNCj4gLQkgICAgcGFyYW1zLmFzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCWlm IChwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBwYXJh bXMtPmFzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5 KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBhc29jcykNCj4gLQkJCWFzb2MtPmRlZmF1bHRfcmN2X2Nv bnRleHQgPSBwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJCQlhc29jLT5kZWZhdWx0X3Jjdl9jb250 ZXh0ID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9DQo+IEBA IC0zNDg4LDcgKzM0NzgsNyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wYXJ0aWFsX2Rl bGl2ZXJ5X3BvaW50KHN0cnVjdCBzb2NrICpzaywNCj4gICAqIGZ1dHVyZSBhc3NvY2lhdGlvbnMg aW5oZXJpdGluZyB0aGUgc29ja2V0IHZhbHVlLg0KPiAgICovDQo+ICBzdGF0aWMgaW50IHNjdHBf c2V0c29ja29wdF9tYXhidXJzdChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgIHN0cnVjdCBz Y3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkgICAgc3RydWN0IHNjdHBfYXNzb2NfdmFs dWUgKnBhcmFtcywNCj4gIAkJCQkgICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlz dHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiBAQCAtMzUwMCwzNCArMzQ5MCwz NCBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhidXJzdChzdHJ1Y3Qgc29jayAqc2ss DQo+ICAJCQkJICAgICJVc2Ugb2YgaW50IGluIG1heF9idXJzdCBzb2NrZXQgb3B0aW9uIGRlcHJl Y2F0ZWQuXG4iDQo+ICAJCQkJICAgICJVc2Ugc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgaW5zdGVh ZFxuIiwNCj4gIAkJCQkgICAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOw0K PiAtCQlwYXJhbXMuYXNzb2NfdmFsdWUgPSAqKGludCAqKSZwYXJhbXM7DQo+IC0JCXBhcmFtcy5h c3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlwYXJhbXMtPmFzc29jX3ZhbHVlID0g KihpbnQgKilwYXJhbXM7DQo+ICsJCXBhcmFtcy0+YXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NP QzsNCj4gIAl9IGVsc2UgaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfdmFs dWUpKSB7DQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiAgCX0NCj4gDQo+IC0JYXNvYyA9IHNjdHBf aWQyYXNzb2Moc2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFtcy5h c3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ss IHBhcmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkID4g U0NUUF9BTExfQVNTT0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0 dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlmIChhc29jKSB7DQo+IC0JCWFzb2MtPm1heF9idXJzdCA9 IHBhcmFtcy5hc3NvY192YWx1ZTsNCj4gKwkJYXNvYy0+bWF4X2J1cnN0ID0gcGFyYW1zLT5hc3Nv Y192YWx1ZTsNCj4gDQo+ICAJCXJldHVybiAwOw0KPiAgCX0NCj4gDQo+ICAJaWYgKHNjdHBfc3R5 bGUoc2ssIFRDUCkpDQo+IC0JCXBhcmFtcy5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0K PiArCQlwYXJhbXMtPmFzc29jX2lkID0gU0NUUF9GVVRVUkVfQVNTT0M7DQo+IA0KPiAtCWlmIChw YXJhbXMuYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gLQkgICAgcGFyYW1zLmFz c29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiAtCQlzcC0+bWF4X2J1cnN0ID0gcGFyYW1zLmFz c29jX3ZhbHVlOw0KPiArCWlmIChwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09D IHx8DQo+ICsJICAgIHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpDQo+ICsJCXNw LT5tYXhfYnVyc3QgPSBwYXJhbXMtPmFzc29jX3ZhbHVlOw0KPiANCj4gLQlpZiAocGFyYW1zLmFz c29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBwYXJhbXMuYXNzb2NfaWQg PT0gU0NUUF9BTExfQVNTT0MpDQo+ICsJaWYgKHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NUUF9DVVJS RU5UX0FTU09DIHx8DQo+ICsJICAgIHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0Mp DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnkoYXNvYywgJnNwLT5lcC0+YXNvY3MsIGFzb2NzKQ0K PiAtCQkJYXNvYy0+bWF4X2J1cnN0ID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCQkJYXNvYy0+ bWF4X2J1cnN0ID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9 DQo+IEBAIC0zNTM5LDkgKzM1MjksOCBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhi dXJzdChzdHJ1Y3Qgc29jayAqc2ssDQo+ICAgKiByZWNlaXZlZCBvbmx5IGluIGFuIGF1dGhlbnRp Y2F0ZWQgd2F5LiAgQ2hhbmdlcyB0byB0aGUgbGlzdCBvZiBjaHVua3MNCj4gICAqIHdpbGwgb25s eSBlZmZlY3QgZnV0dXJlIGFzc29jaWF0aW9ucyBvbiB0aGUgc29ja2V0Lg0KPiAgICovDQo+IC0j ZGVmaW5lIHZhbCAoKnZhbCkNCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2F1dGhfY2h1 bmsoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAgICAgIHN0cnVjdCBzY3RwX2F1dGhjaHVuayB2 YWwsDQo+ICsJCQkJICAgICAgc3RydWN0IHNjdHBfYXV0aGNodW5rICp2YWwsDQo+ICAJCQkJICAg ICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAq ZXAgPSBzY3RwX3NrKHNrKS0+ZXA7DQo+IEBAIC0zNTUyLDcgKzM1NDEsNyBAQCBzdGF0aWMgaW50 IHNjdHBfc2V0c29ja29wdF9hdXRoX2NodW5rKHN0cnVjdCBzb2NrICpzaywNCj4gIAlpZiAob3B0 bGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9hdXRoY2h1bmspKQ0KPiAgCQlyZXR1cm4gLUVJTlZB TDsNCj4gDQo+IC0Jc3dpdGNoICh2YWwuc2F1dGhfY2h1bmspIHsNCj4gKwlzd2l0Y2ggKHZhbC0+ c2F1dGhfY2h1bmspIHsNCj4gIAljYXNlIFNDVFBfQ0lEX0lOSVQ6DQo+ICAJY2FzZSBTQ1RQX0NJ RF9JTklUX0FDSzoNCj4gIAljYXNlIFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFOg0KPiBAQCAt MzU2MSw3ICszNTUwLDcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXV0aF9jaHVuayhz dHJ1Y3Qgc29jayAqc2ssDQo+ICAJfQ0KPiANCj4gIAkvKiBhZGQgdGhpcyBjaHVuayBpZCB0byB0 aGUgZW5kcG9pbnQgKi8NCj4gLQlyZXR1cm4gc2N0cF9hdXRoX2VwX2FkZF9jaHVua2lkKGVwLCB2 YWwuc2F1dGhfY2h1bmspOw0KPiArCXJldHVybiBzY3RwX2F1dGhfZXBfYWRkX2NodW5raWQoZXAs IHZhbC0+c2F1dGhfY2h1bmspOw0KPiAgfQ0KPiANCj4gIC8qDQo+IEBAIC0zNjY2LDcgKzM2NTUs NyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hdXRoX2tleShzdHJ1Y3Qgc29jayAqc2ss DQo+ICAgKiB0aGUgYXNzb2NpYXRpb24gc2hhcmVkIGtleS4NCj4gICAqLw0KPiAgc3RhdGljIGlu dCBzY3RwX3NldHNvY2tvcHRfYWN0aXZlX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAg ICAgc3RydWN0IHNjdHBfYXV0aGtleWlkIHZhbCwNCj4gKwkJCQkgICAgICBzdHJ1Y3Qgc2N0cF9h dXRoa2V5aWQgKnZhbCwNCj4gIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0K PiAgCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IHNjdHBfc2soc2spLT5lcDsNCj4gQEAgLTM2 NzYsMjkgKzM2NjUsMjkgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWN0aXZlX2tleShz dHJ1Y3Qgc29jayAqc2ssDQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXV0 aGtleWlkKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFz c29jKHNrLCB2YWwuc2NhY3RfYXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiB2YWwuc2NhY3Rf YXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0KPiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNr LCB2YWwtPnNjYWN0X2Fzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgdmFsLT5zY2FjdF9hc3Nv Y19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAlpZiAoYXNvYykNCj4gLQkJcmV0dXJuIHNjdHBf YXV0aF9zZXRfYWN0aXZlX2tleShlcCwgYXNvYywgdmFsLnNjYWN0X2tleW51bWJlcik7DQo+ICsJ CXJldHVybiBzY3RwX2F1dGhfc2V0X2FjdGl2ZV9rZXkoZXAsIGFzb2MsIHZhbC0+c2NhY3Rfa2V5 bnVtYmVyKTsNCj4gDQo+ICAJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkpDQo+IC0JCXZhbC5zY2Fj dF9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQl2YWwtPnNjYWN0X2Fzc29jX2lk ID0gU0NUUF9GVVRVUkVfQVNTT0M7DQo+IA0KPiAtCWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0g U0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gLQkgICAgdmFsLnNjYWN0X2Fzc29jX2lkID09IFNDVFBf QUxMX0FTU09DKSB7DQo+IC0JCXJldCA9IHNjdHBfYXV0aF9zZXRfYWN0aXZlX2tleShlcCwgYXNv YywgdmFsLnNjYWN0X2tleW51bWJlcik7DQo+ICsJaWYgKHZhbC0+c2NhY3RfYXNzb2NfaWQgPT0g U0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAgdmFsLT5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQ X0FMTF9BU1NPQykgew0KPiArCQlyZXQgPSBzY3RwX2F1dGhfc2V0X2FjdGl2ZV9rZXkoZXAsIGFz b2MsIHZhbC0+c2NhY3Rfa2V5bnVtYmVyKTsNCj4gIAkJaWYgKHJldCkNCj4gIAkJCXJldHVybiBy ZXQ7DQo+ICAJfQ0KPiANCj4gLQlpZiAodmFsLnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVO VF9BU1NPQyB8fA0KPiAtCSAgICB2YWwuc2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0Mp IHsNCj4gKwlpZiAodmFsLT5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwN Cj4gKwkgICAgdmFsLT5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAgCQls aXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZlcC0+YXNvY3MsIGFzb2NzKSB7DQo+ICAJCQlpbnQg cmVzID0gc2N0cF9hdXRoX3NldF9hY3RpdmVfa2V5KGVwLCBhc29jLA0KPiAtCQkJCQkJCSAgIHZh bC5zY2FjdF9rZXludW1iZXIpOw0KPiArCQkJCQkJCSAgIHZhbC0+c2NhY3Rfa2V5bnVtYmVyKTsN Cj4gDQo+ICAJCQlpZiAocmVzICYmICFyZXQpDQo+ICAJCQkJcmV0ID0gcmVzOw0KPiBAQCAtMzcx NCw3ICszNzAzLDcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWN0aXZlX2tleShzdHJ1 Y3Qgc29jayAqc2ssDQo+ICAgKiBUaGlzIHNldCBvcHRpb24gd2lsbCBkZWxldGUgYSBzaGFyZWQg c2VjcmV0IGtleSBmcm9tIHVzZS4NCj4gICAqLw0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tv cHRfZGVsX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgc3RydWN0IHNjdHBfYXV0aGtl eWlkIHZhbCwNCj4gKwkJCQkgICBzdHJ1Y3Qgc2N0cF9hdXRoa2V5aWQgKnZhbCwNCj4gIAkJCQkg ICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX2VuZHBvaW50ICpl cCA9IHNjdHBfc2soc2spLT5lcDsNCj4gQEAgLTM3MjQsMjkgKzM3MTMsMjkgQEAgc3RhdGljIGlu dCBzY3RwX3NldHNvY2tvcHRfZGVsX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJaWYgKG9wdGxl biAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXV0aGtleWlkKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7 DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCB2YWwuc2NhY3RfYXNzb2NfaWQpOw0K PiAtCWlmICghYXNvYyAmJiB2YWwuc2NhY3RfYXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0K PiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCB2YWwtPnNjYWN0X2Fzc29jX2lkKTsNCj4gKwlp ZiAoIWFzb2MgJiYgdmFsLT5zY2FjdF9hc3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICAJ ICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAlp ZiAoYXNvYykNCj4gLQkJcmV0dXJuIHNjdHBfYXV0aF9kZWxfa2V5X2lkKGVwLCBhc29jLCB2YWwu c2NhY3Rfa2V5bnVtYmVyKTsNCj4gKwkJcmV0dXJuIHNjdHBfYXV0aF9kZWxfa2V5X2lkKGVwLCBh c29jLCB2YWwtPnNjYWN0X2tleW51bWJlcik7DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBU Q1ApKQ0KPiAtCQl2YWwuc2NhY3RfYXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gKwkJ dmFsLT5zY2FjdF9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlpZiAodmFs LnNjYWN0X2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHZhbC5zY2Fj dF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAtCQlyZXQgPSBzY3RwX2F1dGhfZGVs X2tleV9pZChlcCwgYXNvYywgdmFsLnNjYWN0X2tleW51bWJlcik7DQo+ICsJaWYgKHZhbC0+c2Nh Y3RfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAgdmFsLT5zY2FjdF9h c3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCQlyZXQgPSBzY3RwX2F1dGhfZGVsX2tl eV9pZChlcCwgYXNvYywgdmFsLT5zY2FjdF9rZXludW1iZXIpOw0KPiAgCQlpZiAocmV0KQ0KPiAg CQkJcmV0dXJuIHJldDsNCj4gIAl9DQo+IA0KPiAtCWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0g U0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+IC0JICAgIHZhbC5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQ X0FMTF9BU1NPQykgew0KPiArCWlmICh2YWwtPnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVO VF9BU1NPQyB8fA0KPiArCSAgICB2YWwtPnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09D KSB7DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnkoYXNvYywgJmVwLT5hc29jcywgYXNvY3MpIHsN Cj4gIAkJCWludCByZXMgPSBzY3RwX2F1dGhfZGVsX2tleV9pZChlcCwgYXNvYywNCj4gLQkJCQkJ CSAgICAgICB2YWwuc2NhY3Rfa2V5bnVtYmVyKTsNCj4gKwkJCQkJCSAgICAgICB2YWwtPnNjYWN0 X2tleW51bWJlcik7DQo+IA0KPiAgCQkJaWYgKHJlcyAmJiAhcmV0KQ0KPiAgCQkJCXJldCA9IHJl czsNCj4gQEAgLTM3NjIsNyArMzc1MSw3IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Rl bF9rZXkoc3RydWN0IHNvY2sgKnNrLA0KPiAgICogVGhpcyBzZXQgb3B0aW9uIHdpbGwgZGVhY3Rp dmF0ZSBhIHNoYXJlZCBzZWNyZXQga2V5Lg0KPiAgICovDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0 c29ja29wdF9kZWFjdGl2YXRlX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAgc3RydWN0 IHNjdHBfYXV0aGtleWlkIHZhbCwNCj4gKwkJCQkJICBzdHJ1Y3Qgc2N0cF9hdXRoa2V5aWQgKnZh bCwNCj4gIAkJCQkJICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3Rw X2VuZHBvaW50ICplcCA9IHNjdHBfc2soc2spLT5lcDsNCj4gQEAgLTM3NzIsMjkgKzM3NjEsMjkg QEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfZGVhY3RpdmF0ZV9rZXkoc3RydWN0IHNvY2sg KnNrLA0KPiAgCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzY3RwX2F1dGhrZXlpZCkpDQo+ ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgdmFs LnNjYWN0X2Fzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgdmFsLnNjYWN0X2Fzc29jX2lkID4g U0NUUF9BTExfQVNTT0MgJiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgdmFsLT5zY2Fj dF9hc3NvY19pZCk7DQo+ICsJaWYgKCFhc29jICYmIHZhbC0+c2NhY3RfYXNzb2NfaWQgPiBTQ1RQ X0FMTF9BU1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlyZXR1cm4g LUVJTlZBTDsNCj4gDQo+ICAJaWYgKGFzb2MpDQo+IC0JCXJldHVybiBzY3RwX2F1dGhfZGVhY3Rf a2V5X2lkKGVwLCBhc29jLCB2YWwuc2NhY3Rfa2V5bnVtYmVyKTsNCj4gKwkJcmV0dXJuIHNjdHBf YXV0aF9kZWFjdF9rZXlfaWQoZXAsIGFzb2MsIHZhbC0+c2NhY3Rfa2V5bnVtYmVyKTsNCj4gDQo+ ICAJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkpDQo+IC0JCXZhbC5zY2FjdF9hc3NvY19pZCA9IFND VFBfRlVUVVJFX0FTU09DOw0KPiArCQl2YWwtPnNjYWN0X2Fzc29jX2lkID0gU0NUUF9GVVRVUkVf QVNTT0M7DQo+IA0KPiAtCWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNT T0MgfHwNCj4gLQkgICAgdmFsLnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ IC0JCXJldCA9IHNjdHBfYXV0aF9kZWFjdF9rZXlfaWQoZXAsIGFzb2MsIHZhbC5zY2FjdF9rZXlu dW1iZXIpOw0KPiArCWlmICh2YWwtPnNjYWN0X2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09D IHx8DQo+ICsJICAgIHZhbC0+c2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4g KwkJcmV0ID0gc2N0cF9hdXRoX2RlYWN0X2tleV9pZChlcCwgYXNvYywgdmFsLT5zY2FjdF9rZXlu dW1iZXIpOw0KPiAgCQlpZiAocmV0KQ0KPiAgCQkJcmV0dXJuIHJldDsNCj4gIAl9DQo+IA0KPiAt CWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+IC0JICAg IHZhbC5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCWlmICh2YWwtPnNj YWN0X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICB2YWwtPnNjYWN0 X2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnko YXNvYywgJmVwLT5hc29jcywgYXNvY3MpIHsNCj4gIAkJCWludCByZXMgPSBzY3RwX2F1dGhfZGVh Y3Rfa2V5X2lkKGVwLCBhc29jLA0KPiAtCQkJCQkJCSB2YWwuc2NhY3Rfa2V5bnVtYmVyKTsNCj4g KwkJCQkJCQkgdmFsLT5zY2FjdF9rZXludW1iZXIpOw0KPiANCj4gIAkJCWlmIChyZXMgJiYgIXJl dCkNCj4gIAkJCQlyZXQgPSByZXM7DQo+IEBAIC0zODAzLDcgKzM3OTIsNiBAQCBzdGF0aWMgaW50 IHNjdHBfc2V0c29ja29wdF9kZWFjdGl2YXRlX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IA0KPiAg CXJldHVybiByZXQ7DQo+ICB9DQo+IC0jdW5kZWYgdmFsDQo+IA0KPiAgLyoNCj4gICAqIDguMS4y MyBTQ1RQX0FVVE9fQVNDT05GDQo+IEBAIC0zODE5LDI0ICszODA3LDIzIEBAIHN0YXRpYyBpbnQg c2N0cF9zZXRzb2Nrb3B0X2RlYWN0aXZhdGVfa2V5KHN0cnVjdCBzb2NrICpzaywNCj4gICAqIE5v dGUuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHNvY2tldCBvcGVyYXRpb24gb3ZlcnJpZGVzIGRl ZmF1bHQgcGFyYW1ldGVyDQo+ICAgKiBiZWluZyBzZXQgYnkgc3lzY3RsIGFzIHdlbGwgYXMgRnJl ZUJTRCBpbXBsZW1lbnRhdGlvbg0KPiAgICovDQo+IC0jZGVmaW5lIHZhbCAoKm9wdHZhbCkNCj4g LXN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2F1dG9fYXNjb25mKHN0cnVjdCBzb2NrICpzaywg aW50IHZhbCwNCj4gK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2F1dG9fYXNjb25mKHN0cnVj dCBzb2NrICpzaywgaW50ICpvcHR2YWwsDQo+ICAJCQkJICAgICAgIHVuc2lnbmVkIGludCBvcHRs ZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gDQo+ ICAJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQlp ZiAoIXNjdHBfaXNfZXBfYm91bmRhbGwoc2spICYmIHZhbCkNCj4gKwlpZiAoIXNjdHBfaXNfZXBf Ym91bmRhbGwoc2spICYmICgqb3B0dmFsKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IC0JaWYg KCh2YWwgJiYgc3AtPmRvX2F1dG9fYXNjb25mKSB8fCAoIXZhbCAmJiAhc3AtPmRvX2F1dG9fYXNj b25mKSkNCj4gKwlpZiAoKCgqb3B0dmFsKSAmJiBzcC0+ZG9fYXV0b19hc2NvbmYpIHx8ICghKCpv cHR2YWwpICYmICFzcC0+ZG9fYXV0b19hc2NvbmYpKQ0KPiAgCQlyZXR1cm4gMDsNCj4gDQo+ICAJ c3Bpbl9sb2NrX2JoKCZzb2NrX25ldChzayktPnNjdHAuYWRkcl93cV9sb2NrKTsNCj4gLQlpZiAo dmFsID09IDAgJiYgc3AtPmRvX2F1dG9fYXNjb25mKSB7DQo+ICsJaWYgKCgqb3B0dmFsKSA9PSAw ICYmIHNwLT5kb19hdXRvX2FzY29uZikgew0KPiAgCQlsaXN0X2RlbCgmc3AtPmF1dG9fYXNjb25m X2xpc3QpOw0KPiAgCQlzcC0+ZG9fYXV0b19hc2NvbmYgPSAwOw0KPiAtCX0gZWxzZSBpZiAodmFs ICYmICFzcC0+ZG9fYXV0b19hc2NvbmYpIHsNCj4gKwl9IGVsc2UgaWYgKCgqb3B0dmFsKSAmJiAh c3AtPmRvX2F1dG9fYXNjb25mKSB7DQo+ICAJCWxpc3RfYWRkX3RhaWwoJnNwLT5hdXRvX2FzY29u Zl9saXN0LA0KPiAgCQkgICAgJnNvY2tfbmV0KHNrKS0+c2N0cC5hdXRvX2FzY29uZl9zcGxpc3Qp Ow0KPiAgCQlzcC0+ZG9fYXV0b19hc2NvbmYgPSAxOw0KPiBAQCAtMzg0NCw3ICszODMxLDYgQEAg c3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXV0b19hc2NvbmYoc3RydWN0IHNvY2sgKnNrLCBp bnQgdmFsLA0KPiAgCXNwaW5fdW5sb2NrX2JoKCZzb2NrX25ldChzayktPnNjdHAuYWRkcl93cV9s b2NrKTsNCj4gIAlyZXR1cm4gMDsNCj4gIH0NCj4gLSN1bmRlZiB2YWwNCj4gDQo+ICAvKg0KPiAg ICogU0NUUF9QRUVSX0FERFJfVEhMRFMNCj4gQEAgLTM4NTMsNzAgKzM4MzksNjggQEAgc3RhdGlj IGludCBzY3RwX3NldHNvY2tvcHRfYXV0b19hc2NvbmYoc3RydWN0IHNvY2sgKnNrLCBpbnQgdmFs LA0KPiAgICogdHJhbnNwb3J0cyBpbiBhbiBhc3NvY2lhdGlvbi4gIFNlZSBTZWN0aW9uIDYuMSBv ZjoNCj4gICAqIGh0dHA6Ly93d3cuaWV0Zi5vcmcvaWQvZHJhZnQtbmlzaGlkYS10c3Z3Zy1zY3Rw LWZhaWxvdmVyLTA1LnR4dA0KPiAgICovDQo+IC0jZGVmaW5lIHZhbCAoKnZhbCkNCj4gIHN0YXRp YyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BhZGRyX3RocmVzaG9sZHMoc3RydWN0IHNvY2sgKnNrLA0K PiAtCQkJCQkgICAgc3RydWN0IHNjdHBfcGFkZHJ0aGxkc192MiB2YWwsDQo+ICsJCQkJCSAgICBz dHJ1Y3Qgc2N0cF9wYWRkcnRobGRzX3YyICp2YWwsDQo+ICAJCQkJCSAgICB1bnNpZ25lZCBpbnQg b3B0bGVuLCBib29sIHYyKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnM7 DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IGxlbjsNCj4gDQo+ IC0JbGVuID0gdjIgPyBzaXplb2YodmFsKSA6IHNpemVvZihzdHJ1Y3Qgc2N0cF9wYWRkcnRobGRz KTsNCj4gKwlsZW4gPSB2MiA/IHNpemVvZigqdmFsKSA6IHNpemVvZihzdHJ1Y3Qgc2N0cF9wYWRk cnRobGRzKTsNCj4gIAlpZiAob3B0bGVuIDwgbGVuKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4g DQo+IC0JaWYgKHYyICYmIHZhbC5zcHRfcGF0aHBmdGhsZCA+IHZhbC5zcHRfcGF0aGNwdGhsZCkN Cj4gKwlpZiAodjIgJiYgdmFsLT5zcHRfcGF0aHBmdGhsZCA+IHZhbC0+c3B0X3BhdGhjcHRobGQp DQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlpZiAoIXNjdHBfaXNfYW55KHNrLCAoY29u c3QgdW5pb24gc2N0cF9hZGRyICopJnZhbC5zcHRfYWRkcmVzcykpIHsNCj4gLQkJdHJhbnMgPSBz Y3RwX2FkZHJfaWQydHJhbnNwb3J0KHNrLCAmdmFsLnNwdF9hZGRyZXNzLA0KPiAtCQkJCQkgICAg ICAgdmFsLnNwdF9hc3NvY19pZCk7DQo+ICsJaWYgKCFzY3RwX2lzX2FueShzaywgKGNvbnN0IHVu aW9uIHNjdHBfYWRkciAqKSZ2YWwtPnNwdF9hZGRyZXNzKSkgew0KPiArCQl0cmFucyA9IHNjdHBf YWRkcl9pZDJ0cmFuc3BvcnQoc2ssICZ2YWwtPnNwdF9hZGRyZXNzLA0KPiArCQkJCQkgICAgICAg dmFsLT5zcHRfYXNzb2NfaWQpOw0KPiAgCQlpZiAoIXRyYW5zKQ0KPiAgCQkJcmV0dXJuIC1FTk9F TlQ7DQo+IA0KPiAtCQlpZiAodmFsLnNwdF9wYXRobWF4cnh0KQ0KPiAtCQkJdHJhbnMtPnBhdGht YXhyeHQgPSB2YWwuc3B0X3BhdGhtYXhyeHQ7DQo+ICsJCWlmICh2YWwtPnNwdF9wYXRobWF4cnh0 KQ0KPiArCQkJdHJhbnMtPnBhdGhtYXhyeHQgPSB2YWwtPnNwdF9wYXRobWF4cnh0Ow0KPiAgCQlp ZiAodjIpDQo+IC0JCQl0cmFucy0+cHNfcmV0cmFucyA9IHZhbC5zcHRfcGF0aGNwdGhsZDsNCj4g LQkJdHJhbnMtPnBmX3JldHJhbnMgPSB2YWwuc3B0X3BhdGhwZnRobGQ7DQo+ICsJCQl0cmFucy0+ cHNfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhjcHRobGQ7DQo+ICsJCXRyYW5zLT5wZl9yZXRyYW5z ID0gdmFsLT5zcHRfcGF0aHBmdGhsZDsNCj4gDQo+ICAJCXJldHVybiAwOw0KPiAgCX0NCj4gDQo+ IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHZhbC5zcHRfYXNzb2NfaWQpOw0KPiAtCWlmICgh YXNvYyAmJiB2YWwuc3B0X2Fzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNv YyA9IHNjdHBfaWQyYXNzb2Moc2ssIHZhbC0+c3B0X2Fzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2Mg JiYgdmFsLT5zcHRfYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0MgJiYNCj4gIAkgICAgc2N0 cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlmIChhc29j KSB7DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZhc29jLT5wZWVyLnRyYW5zcG9y dF9hZGRyX2xpc3QsDQo+ICAJCQkJICAgIHRyYW5zcG9ydHMpIHsNCj4gLQkJCWlmICh2YWwuc3B0 X3BhdGhtYXhyeHQpDQo+IC0JCQkJdHJhbnMtPnBhdGhtYXhyeHQgPSB2YWwuc3B0X3BhdGhtYXhy eHQ7DQo+ICsJCQlpZiAodmFsLT5zcHRfcGF0aG1heHJ4dCkNCj4gKwkJCQl0cmFucy0+cGF0aG1h eHJ4dCA9IHZhbC0+c3B0X3BhdGhtYXhyeHQ7DQo+ICAJCQlpZiAodjIpDQo+IC0JCQkJdHJhbnMt PnBzX3JldHJhbnMgPSB2YWwuc3B0X3BhdGhjcHRobGQ7DQo+IC0JCQl0cmFucy0+cGZfcmV0cmFu cyA9IHZhbC5zcHRfcGF0aHBmdGhsZDsNCj4gKwkJCQl0cmFucy0+cHNfcmV0cmFucyA9IHZhbC0+ c3B0X3BhdGhjcHRobGQ7DQo+ICsJCQl0cmFucy0+cGZfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhw ZnRobGQ7DQo+ICAJCX0NCj4gDQo+IC0JCWlmICh2YWwuc3B0X3BhdGhtYXhyeHQpDQo+IC0JCQlh c29jLT5wYXRobWF4cnh0ID0gdmFsLnNwdF9wYXRobWF4cnh0Ow0KPiArCQlpZiAodmFsLT5zcHRf cGF0aG1heHJ4dCkNCj4gKwkJCWFzb2MtPnBhdGhtYXhyeHQgPSB2YWwtPnNwdF9wYXRobWF4cnh0 Ow0KPiAgCQlpZiAodjIpDQo+IC0JCQlhc29jLT5wc19yZXRyYW5zID0gdmFsLnNwdF9wYXRoY3B0 aGxkOw0KPiAtCQlhc29jLT5wZl9yZXRyYW5zID0gdmFsLnNwdF9wYXRocGZ0aGxkOw0KPiArCQkJ YXNvYy0+cHNfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhjcHRobGQ7DQo+ICsJCWFzb2MtPnBmX3Jl dHJhbnMgPSB2YWwtPnNwdF9wYXRocGZ0aGxkOw0KPiAgCX0gZWxzZSB7DQo+ICAJCXN0cnVjdCBz Y3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7DQo+IA0KPiAtCQlpZiAodmFsLnNwdF9wYXRobWF4 cnh0KQ0KPiAtCQkJc3AtPnBhdGhtYXhyeHQgPSB2YWwuc3B0X3BhdGhtYXhyeHQ7DQo+ICsJCWlm ICh2YWwtPnNwdF9wYXRobWF4cnh0KQ0KPiArCQkJc3AtPnBhdGhtYXhyeHQgPSB2YWwtPnNwdF9w YXRobWF4cnh0Ow0KPiAgCQlpZiAodjIpDQo+IC0JCQlzcC0+cHNfcmV0cmFucyA9IHZhbC5zcHRf cGF0aGNwdGhsZDsNCj4gLQkJc3AtPnBmX3JldHJhbnMgPSB2YWwuc3B0X3BhdGhwZnRobGQ7DQo+ ICsJCQlzcC0+cHNfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhjcHRobGQ7DQo+ICsJCXNwLT5wZl9y ZXRyYW5zID0gdmFsLT5zcHRfcGF0aHBmdGhsZDsNCj4gIAl9DQo+IA0KPiAgCXJldHVybiAwOw0K PiAgfQ0KPiAtI3VuZGVmIHZhbA0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3Jl Y3ZyY3ZpbmZvKHN0cnVjdCBzb2NrICpzaywgaW50ICpvcHR2YWwsDQo+ICAJCQkJICAgICAgIHVu c2lnbmVkIGludCBvcHRsZW4pDQo+IEBAIC0zOTQxLDkyICszOTI1LDkxIEBAIHN0YXRpYyBpbnQg c2N0cF9zZXRzb2Nrb3B0X3JlY3ZueHRpbmZvKHN0cnVjdCBzb2NrICpzaywgaW50ICpvcHR2YWws DQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfcHJfc3VwcG9ydGVkKHN0 cnVjdCBzb2NrICpzaywNCj4gLQkJCQkJc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgcGFyYW1zLA0K PiArCQkJCQlzdHJ1Y3Qgc2N0cF9hc3NvY192YWx1ZSAqcGFyYW1zLA0KPiAgCQkJCQl1bnNpZ25l ZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0K PiANCj4gLQlpZiAob3B0bGVuICE9IHNpemVvZihwYXJhbXMpKQ0KPiArCWlmIChvcHRsZW4gIT0g c2l6ZW9mKCpwYXJhbXMpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNj dHBfaWQyYXNzb2Moc2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFt cy5hc3NvY19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0KPiArCWFzb2MgPSBzY3RwX2lkMmFz c29jKHNrLCBwYXJhbXMtPmFzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgcGFyYW1zLT5hc3Nv Y19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFAp KQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0Jc2N0cF9zayhzayktPmVwLT5wcnNjdHBf ZW5hYmxlID0gISFwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJc2N0cF9zayhzayktPmVwLT5wcnNj dHBfZW5hYmxlID0gISFwYXJhbXMtPmFzc29jX3ZhbHVlOw0KPiANCj4gIAlyZXR1cm4gMDsNCj4g IH0NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWZhdWx0X3ByaW5mbyhzdHJ1 Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAgc3RydWN0IHNjdHBfZGVmYXVsdF9wcmluZm8gaW5mbywN Cj4gKwkJCQkJICBzdHJ1Y3Qgc2N0cF9kZWZhdWx0X3ByaW5mbyAqaW5mbywNCj4gIAkJCQkJICB1 bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0 cF9zayhzayk7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJl dHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGluZm8pKQ0KPiAr CWlmIChvcHRsZW4gIT0gc2l6ZW9mKCppbmZvKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWlm IChpbmZvLnByX3BvbGljeSAmIH5TQ1RQX1BSX1NDVFBfTUFTSykNCj4gKwlpZiAoaW5mby0+cHJf cG9saWN5ICYgflNDVFBfUFJfU0NUUF9NQVNLKQ0KPiAgCQlnb3RvIG91dDsNCj4gDQo+IC0JaWYg KGluZm8ucHJfcG9saWN5ID09IFNDVFBfUFJfU0NUUF9OT05FKQ0KPiAtCQlpbmZvLnByX3ZhbHVl ID0gMDsNCj4gKwlpZiAoaW5mby0+cHJfcG9saWN5ID09IFNDVFBfUFJfU0NUUF9OT05FKQ0KPiAr CQlpbmZvLT5wcl92YWx1ZSA9IDA7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBp bmZvLnByX2Fzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgaW5mby5wcl9hc3NvY19pZCA+IFND VFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIGluZm8tPnByX2Fz c29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgaW5mby0+cHJfYXNzb2NfaWQgPiBTQ1RQX0FMTF9B U1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlnb3RvIG91dDsNCj4g DQo+ICAJcmV0dmFsID0gMDsNCj4gDQo+ICAJaWYgKGFzb2MpIHsNCj4gLQkJU0NUUF9QUl9TRVRf UE9MSUNZKGFzb2MtPmRlZmF1bHRfZmxhZ3MsIGluZm8ucHJfcG9saWN5KTsNCj4gLQkJYXNvYy0+ ZGVmYXVsdF90aW1ldG9saXZlID0gaW5mby5wcl92YWx1ZTsNCj4gKwkJU0NUUF9QUl9TRVRfUE9M SUNZKGFzb2MtPmRlZmF1bHRfZmxhZ3MsIGluZm8tPnByX3BvbGljeSk7DQo+ICsJCWFzb2MtPmRl ZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8tPnByX3ZhbHVlOw0KPiAgCQlnb3RvIG91dDsNCj4gIAl9 DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0KPiAtCQlpbmZvLnByX2Fzc29jX2lk ID0gU0NUUF9GVVRVUkVfQVNTT0M7DQo+ICsJCWluZm8tPnByX2Fzc29jX2lkID0gU0NUUF9GVVRV UkVfQVNTT0M7DQo+IA0KPiAtCWlmIChpbmZvLnByX2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FT U09DIHx8DQo+IC0JICAgIGluZm8ucHJfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4g LQkJU0NUUF9QUl9TRVRfUE9MSUNZKHNwLT5kZWZhdWx0X2ZsYWdzLCBpbmZvLnByX3BvbGljeSk7 DQo+IC0JCXNwLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSBpbmZvLnByX3ZhbHVlOw0KPiArCWlmIChp bmZvLT5wcl9hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5w cl9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCQlTQ1RQX1BSX1NFVF9QT0xJQ1ko c3AtPmRlZmF1bHRfZmxhZ3MsIGluZm8tPnByX3BvbGljeSk7DQo+ICsJCXNwLT5kZWZhdWx0X3Rp bWV0b2xpdmUgPSBpbmZvLT5wcl92YWx1ZTsNCj4gIAl9DQo+IA0KPiAtCWlmIChpbmZvLnByX2Fz c29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBpbmZvLnByX2Fzc29jX2lk ID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJaWYgKGluZm8tPnByX2Fzc29jX2lkID09IFNDVFBf Q1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5wcl9hc3NvY19pZCA9PSBTQ1RQX0FMTF9B U1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBh c29jcykgew0KPiAtCQkJU0NUUF9QUl9TRVRfUE9MSUNZKGFzb2MtPmRlZmF1bHRfZmxhZ3MsIGlu Zm8ucHJfcG9saWN5KTsNCj4gLQkJCWFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8ucHJf dmFsdWU7DQo+ICsJCQlTQ1RQX1BSX1NFVF9QT0xJQ1koYXNvYy0+ZGVmYXVsdF9mbGFncywgaW5m by0+cHJfcG9saWN5KTsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8tPnBy X3ZhbHVlOw0KPiAgCQl9DQo+ICAJfQ0KPiANCj4gIG91dDoNCj4gIAlyZXR1cm4gcmV0dmFsOw0K PiAgfQ0KPiAtI3VuZGVmIGluZm8NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9y ZWNvbmZpZ19zdXBwb3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCQkgICAgICBzdHJ1Y3Qg c2N0cF9hc3NvY192YWx1ZSBwYXJhbXMsDQo+ICsJCQkJCSAgICAgIHN0cnVjdCBzY3RwX2Fzc29j X3ZhbHVlICpwYXJhbXMsDQo+ICAJCQkJCSAgICAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7 DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1F SU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9w dGxlbiAhPSBzaXplb2YoKnBhcmFtcykpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0g c2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFy YW1zLmFzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQy YXNzb2Moc2ssIHBhcmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFz c29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVE UCkpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlzY3RwX3NrKHNrKS0+ZXAtPnJlY29uZl9lbmFi bGUgPSAhIXBhcmFtcy5hc3NvY192YWx1ZTsNCj4gKwlzY3RwX3NrKHNrKS0+ZXAtPnJlY29uZl9l bmFibGUgPSAhIXBhcmFtcy0+YXNzb2NfdmFsdWU7DQo+IA0KPiAgCXJldHZhbCA9IDA7DQo+IA0K PiBAQCAtNDAzNSw0OCArNDAxOCw0NyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9yZWNv bmZpZ19zdXBwb3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQg c2N0cF9zZXRzb2Nrb3B0X2VuYWJsZV9zdHJyZXNldChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJ CSAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkJICAgc3RydWN0IHNj dHBfYXNzb2NfdmFsdWUgKnBhcmFtcywNCj4gIAkJCQkJICAgdW5zaWduZWQgaW50IG9wdGxlbikN Cj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAgPSBzY3RwX3NrKHNrKS0+ZXA7DQo+ ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5W QUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxl biAhPSBzaXplb2YoKnBhcmFtcykpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlpZiAocGFyYW1z LmFzc29jX3ZhbHVlICYgKH5TQ1RQX0VOQUJMRV9TVFJSRVNFVF9NQVNLKSkNCj4gKwlpZiAocGFy YW1zLT5hc3NvY192YWx1ZSAmICh+U0NUUF9FTkFCTEVfU1RSUkVTRVRfTUFTSykpDQo+ICAJCWdv dG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lk KTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYN Cj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19pZCk7DQo+ICsJaWYg KCFhc29jICYmIHBhcmFtcy0+YXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0KPiAgCSAgICBz Y3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlnb3RvIG91dDsNCj4gDQo+ICAJcmV0dmFsID0gMDsN Cj4gDQo+ICAJaWYgKGFzb2MpIHsNCj4gLQkJYXNvYy0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1z LmFzc29jX3ZhbHVlOw0KPiArCQlhc29jLT5zdHJyZXNldF9lbmFibGUgPSBwYXJhbXMtPmFzc29j X3ZhbHVlOw0KPiAgCQlnb3RvIG91dDsNCj4gIAl9DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNr LCBUQ1ApKQ0KPiAtCQlwYXJhbXMuYXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gKwkJ cGFyYW1zLT5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlpZiAocGFyYW1z LmFzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtcy5hc3NvY19p ZCA9PSBTQ1RQX0FMTF9BU1NPQykNCj4gLQkJZXAtPnN0cnJlc2V0X2VuYWJsZSA9IHBhcmFtcy5h c3NvY192YWx1ZTsNCj4gKwlpZiAocGFyYW1zLT5hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NP QyB8fA0KPiArCSAgICBwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCQll cC0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+IC0JaWYgKHBh cmFtcy5hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwNCj4gLQkgICAgcGFyYW1zLmFz c29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCWlmIChwYXJhbXMtPmFzc29jX2lkID09IFND VFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfQUxM X0FTU09DKQ0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZlcC0+YXNvY3MsIGFzb2Nz KQ0KPiAtCQkJYXNvYy0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiAr CQkJYXNvYy0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+ICBv dXQ6DQo+ICAJcmV0dXJuIHJldHZhbDsNCj4gIH0NCj4gDQo+IC0jdW5kZWYgcGFyYW1zDQo+ICBz dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9yZXNldF9zdHJlYW1zKHN0cnVjdCBzb2NrICpzaywN Cj4gIAkJCQkJIHN0cnVjdCBzY3RwX3Jlc2V0X3N0cmVhbXMgKnBhcmFtcywNCj4gIAkJCQkJIHVu c2lnbmVkIGludCBvcHRsZW4pDQo+IEBAIC00MTAzLDIwICs0MDg1LDE3IEBAIHN0YXRpYyBpbnQg c2N0cF9zZXRzb2Nrb3B0X3Jlc2V0X3N0cmVhbXMoc3RydWN0IHNvY2sgKnNrLA0KPiAgb3V0Og0K PiAgCXJldHVybiByZXR2YWw7DQo+ICB9DQo+IC0jZGVmaW5lIHBhcmFtcyAoKnBhcmFtcykNCj4g DQo+IC0NCj4gLSNkZWZpbmUgYXNzb2NpZCAoKmFzc29jaWQpDQo+IC1zdGF0aWMgaW50IHNjdHBf c2V0c29ja29wdF9yZXNldF9hc3NvYyhzdHJ1Y3Qgc29jayAqc2ssIHNjdHBfYXNzb2NfdCBhc3Nv Y2lkLA0KPiArc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfcmVzZXRfYXNzb2Moc3RydWN0IHNv Y2sgKnNrLCBzY3RwX2Fzc29jX3QgKmFzc29jaWQsDQo+ICAJCQkJICAgICAgIHVuc2lnbmVkIGlu dCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJ aW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGFzc29j aWQpKQ0KPiArCWlmIChvcHRsZW4gIT0gc2l6ZW9mKCphc3NvY2lkKSkNCj4gIAkJZ290byBvdXQ7 DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBhc3NvY2lkKTsNCj4gKwlhc29jID0g c2N0cF9pZDJhc3NvYyhzaywgKCphc3NvY2lkKSk7DQo+ICAJaWYgKCFhc29jKQ0KPiAgCQlnb3Rv IG91dDsNCj4gDQo+IEBAIC00MTI1LDYyICs0MTA0LDYxIEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRz b2Nrb3B0X3Jlc2V0X2Fzc29jKHN0cnVjdCBzb2NrICpzaywgc2N0cF9hc3NvY190IGFzc29jaWQs DQo+ICBvdXQ6DQo+ICAJcmV0dXJuIHJldHZhbDsNCj4gIH0NCj4gLSN1bmRlZiBhc3NvY2lkDQo+ IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWRkX3N0cmVhbXMoc3RydWN0IHNvY2sg KnNrLA0KPiAtCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9hZGRfc3RyZWFtcyBwYXJhbXMsDQo+ICsJ CQkJICAgICAgIHN0cnVjdCBzY3RwX2FkZF9zdHJlYW1zICpwYXJhbXMsDQo+ICAJCQkJICAgICAg IHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24g KmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0g c2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKnBhcmFtcykpDQo+ICAJ CWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLnNhc19h c3NvY19pZCk7DQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+c2FzX2Fzc29j X2lkKTsNCj4gIAlpZiAoIWFzb2MpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlyZXR2YWwgPSBz Y3RwX3NlbmRfYWRkX3N0cmVhbXMoYXNvYywgJnBhcmFtcyk7DQo+ICsJcmV0dmFsID0gc2N0cF9z ZW5kX2FkZF9zdHJlYW1zKGFzb2MsIHBhcmFtcyk7DQo+IA0KPiAgb3V0Og0KPiAgCXJldHVybiBy ZXR2YWw7DQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfc2NoZWR1bGVy KHN0cnVjdCBzb2NrICpzaywNCj4gLQkJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBh cmFtcywNCj4gKwkJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlICpwYXJhbXMsDQo+ICAJ CQkJICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX3NvY2sg KnNwID0gc2N0cF9zayhzayk7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ ICAJaW50IHJldHZhbCA9IDA7DQo+IA0KPiAtCWlmIChvcHRsZW4gPCBzaXplb2YocGFyYW1zKSkN Cj4gKwlpZiAob3B0bGVuIDwgc2l6ZW9mKCpwYXJhbXMpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsN Cj4gDQo+IC0JaWYgKHBhcmFtcy5hc3NvY192YWx1ZSA+IFNDVFBfU1NfTUFYKQ0KPiArCWlmIChw YXJhbXMtPmFzc29jX3ZhbHVlID4gU0NUUF9TU19NQVgpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0K PiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlp ZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4gKwlhc29j ID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19pZCk7DQo+ICsJaWYgKCFhc29jICYm IHBhcmFtcy0+YXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxl KHNrLCBVRFApKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAJaWYgKGFzb2MpDQo+IC0J CXJldHVybiBzY3RwX3NjaGVkX3NldF9zY2hlZChhc29jLCBwYXJhbXMuYXNzb2NfdmFsdWUpOw0K PiArCQlyZXR1cm4gc2N0cF9zY2hlZF9zZXRfc2NoZWQoYXNvYywgcGFyYW1zLT5hc3NvY192YWx1 ZSk7DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0KPiAtCQlwYXJhbXMuYXNzb2Nf aWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gKwkJcGFyYW1zLT5hc3NvY19pZCA9IFNDVFBfRlVU VVJFX0FTU09DOw0KPiANCj4gLQlpZiAocGFyYW1zLmFzc29jX2lkID09IFNDVFBfRlVUVVJFX0FT U09DIHx8DQo+IC0JICAgIHBhcmFtcy5hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykNCj4gLQkJ c3AtPmRlZmF1bHRfc3MgPSBwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJaWYgKHBhcmFtcy0+YXNz b2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAgcGFyYW1zLT5hc3NvY19pZCA9 PSBTQ1RQX0FMTF9BU1NPQykNCj4gKwkJc3AtPmRlZmF1bHRfc3MgPSBwYXJhbXMtPmFzc29jX3Zh bHVlOw0KPiANCj4gLQlpZiAocGFyYW1zLmFzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8 fA0KPiAtCSAgICBwYXJhbXMuYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4gKwlpZiAo cGFyYW1zLT5hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwNCj4gKwkgICAgcGFyYW1z LT5hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5 KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBhc29jcykgew0KPiAgCQkJaW50IHJldCA9IHNjdHBfc2No ZWRfc2V0X3NjaGVkKGFzb2MsDQo+IC0JCQkJCQkgICAgICAgcGFyYW1zLmFzc29jX3ZhbHVlKTsN Cj4gKwkJCQkJCSAgICAgICBwYXJhbXMtPmFzc29jX3ZhbHVlKTsNCj4gDQo+ICAJCQlpZiAocmV0 ICYmICFyZXR2YWwpDQo+ICAJCQkJcmV0dmFsID0gcmV0Ow0KPiBAQCAtNDE5MSwzMSArNDE2OSwz MSBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9zY2hlZHVsZXIoc3RydWN0IHNvY2sgKnNr LA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3NjaGVkdWxlcl92YWx1 ZShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAgIHN0cnVjdCBzY3RwX3N0cmVhbV92YWx1ZSBw YXJhbXMsDQo+ICsJCQkJCSAgIHN0cnVjdCBzY3RwX3N0cmVhbV92YWx1ZSAqcGFyYW1zLA0KPiAg CQkJCQkgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX2Fzc29j aWF0aW9uICphc29jOw0KPiAgCWludCByZXR2YWwgPSAtRUlOVkFMOw0KPiANCj4gLQlpZiAob3B0 bGVuIDwgc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiA8IHNpemVvZigqcGFyYW1zKSkN Cj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMu YXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJhbXMuYXNzb2NfaWQgIT0gU0NUUF9DVVJS RU5UX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+YXNzb2Nf aWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9IFNDVFBfQ1VSUkVOVF9B U1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlnb3RvIG91dDsNCj4g DQo+ICAJaWYgKGFzb2MpIHsNCj4gLQkJcmV0dmFsID0gc2N0cF9zY2hlZF9zZXRfdmFsdWUoYXNv YywgcGFyYW1zLnN0cmVhbV9pZCwNCj4gLQkJCQkJICAgICAgcGFyYW1zLnN0cmVhbV92YWx1ZSwg R0ZQX0tFUk5FTCk7DQo+ICsJCXJldHZhbCA9IHNjdHBfc2NoZWRfc2V0X3ZhbHVlKGFzb2MsIHBh cmFtcy0+c3RyZWFtX2lkLA0KPiArCQkJCQkgICAgICBwYXJhbXMtPnN0cmVhbV92YWx1ZSwgR0ZQ X0tFUk5FTCk7DQo+ICAJCWdvdG8gb3V0Ow0KPiAgCX0NCj4gDQo+ICAJcmV0dmFsID0gMDsNCj4g DQo+ICAJbGlzdF9mb3JfZWFjaF9lbnRyeShhc29jLCAmc2N0cF9zayhzayktPmVwLT5hc29jcywg YXNvY3MpIHsNCj4gLQkJaW50IHJldCA9IHNjdHBfc2NoZWRfc2V0X3ZhbHVlKGFzb2MsIHBhcmFt cy5zdHJlYW1faWQsDQo+IC0JCQkJCSAgICAgICBwYXJhbXMuc3RyZWFtX3ZhbHVlLCBHRlBfS0VS TkVMKTsNCj4gKwkJaW50IHJldCA9IHNjdHBfc2NoZWRfc2V0X3ZhbHVlKGFzb2MsIHBhcmFtcy0+ c3RyZWFtX2lkLA0KPiArCQkJCQkgICAgICAgcGFyYW1zLT5zdHJlYW1fdmFsdWUsIEdGUF9LRVJO RUwpOw0KPiAgCQlpZiAocmV0ICYmICFyZXR2YWwpIC8qIHRyeSB0byByZXR1cm4gdGhlIDFzdCBl cnJvci4gKi8NCj4gIAkJCXJldHZhbCA9IHJldDsNCj4gIAl9DQo+IEBAIC00MjI1LDE4ICs0MjAz LDE4IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3NjaGVkdWxlcl92YWx1ZShzdHJ1Y3Qg c29jayAqc2ssDQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfaW50ZXJs ZWF2aW5nX3N1cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCQkgIHN0cnVjdCBzY3Rw X2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkJCSAgc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUg KnBhcmFtcywNCj4gIAkJCQkJCSAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlzdHJ1 Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAgCXN0cnVjdCBzY3RwX2Fzc29jaWF0 aW9uICphc29jOw0KPiAgCWludCByZXR2YWwgPSAtRUlOVkFMOw0KPiANCj4gLQlpZiAob3B0bGVu IDwgc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiA8IHNpemVvZigqcGFyYW1zKSkNCj4g IAkJZ290byBvdXQ7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMuYXNz b2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJhbXMuYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVf QVNTT0MgJiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19pZCk7 DQo+ICsJaWYgKCFhc29jICYmIHBhcmFtcy0+YXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0Mg JiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0KPiBA QCAtNDI0NSw3ICs0MjIzLDcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfaW50ZXJsZWF2 aW5nX3N1cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJCWdvdG8gb3V0Ow0KPiAgCX0NCj4g DQo+IC0Jc3AtPmVwLT5pbnRsX2VuYWJsZSA9ICEhcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCXNw LT5lcC0+aW50bF9lbmFibGUgPSAhIXBhcmFtcy0+YXNzb2NfdmFsdWU7DQo+IA0KPiAgCXJldHZh bCA9IDA7DQo+IA0KPiBAQCAtNDI5MSw0MSArNDI2OSw0MCBAQCBzdGF0aWMgaW50IHNjdHBfYXNz b2NfdWxwZXZlbnRfdHlwZV9zZXQoc3RydWN0IHNjdHBfZXZlbnQgKnBhcmFtLA0KPiAgCXJldHVy biAwOw0KPiAgfQ0KPiANCj4gLSNkZWZpbmUgcGFyYW0gKCpwYXJhbSkNCj4gLXN0YXRpYyBpbnQg c2N0cF9zZXRzb2Nrb3B0X2V2ZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfZXZlbnQg cGFyYW0sDQo+ICtzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ldmVudChzdHJ1Y3Qgc29jayAq c2ssIHN0cnVjdCBzY3RwX2V2ZW50ICpwYXJhbSwNCj4gIAkJCQkgdW5zaWduZWQgaW50IG9wdGxl bikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAgCXN0 cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiAgCWludCByZXR2YWwgPSAwOw0KPiANCj4g LQlpZiAob3B0bGVuIDwgc2l6ZW9mKHBhcmFtKSkNCj4gKwlpZiAob3B0bGVuIDwgc2l6ZW9mKCpw YXJhbSkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlpZiAocGFyYW0uc2VfdHlwZSA8 IFNDVFBfU05fVFlQRV9CQVNFIHx8DQo+IC0JICAgIHBhcmFtLnNlX3R5cGUgPiBTQ1RQX1NOX1RZ UEVfTUFYKQ0KPiArCWlmIChwYXJhbS0+c2VfdHlwZSA8IFNDVFBfU05fVFlQRV9CQVNFIHx8DQo+ ICsJICAgIHBhcmFtLT5zZV90eXBlID4gU0NUUF9TTl9UWVBFX01BWCkNCj4gIAkJcmV0dXJuIC1F SU5WQUw7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbS5zZV9hc3NvY19p ZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFtLnNlX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0Mg JiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW0tPnNlX2Fzc29jX2lkKTsNCj4g KwlpZiAoIWFzb2MgJiYgcGFyYW0tPnNlX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4g IAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAg CWlmIChhc29jKQ0KPiAtCQlyZXR1cm4gc2N0cF9hc3NvY191bHBldmVudF90eXBlX3NldCgmcGFy YW0sIGFzb2MpOw0KPiArCQlyZXR1cm4gc2N0cF9hc3NvY191bHBldmVudF90eXBlX3NldChwYXJh bSwgYXNvYyk7DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0KPiAtCQlwYXJhbS5z ZV9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlwYXJhbS0+c2VfYXNzb2NfaWQg PSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gDQo+IC0JaWYgKHBhcmFtLnNlX2Fzc29jX2lkID09IFND VFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtLnNlX2Fzc29jX2lkID09IFNDVFBfQUxM X0FTU09DKQ0KPiArCWlmIChwYXJhbS0+c2VfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0Mg fHwNCj4gKwkgICAgcGFyYW0tPnNlX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiAgCQlz Y3RwX3VscGV2ZW50X3R5cGVfc2V0KCZzcC0+c3Vic2NyaWJlLA0KPiAtCQkJCSAgICAgICBwYXJh bS5zZV90eXBlLCBwYXJhbS5zZV9vbik7DQo+ICsJCQkJICAgICAgIHBhcmFtLT5zZV90eXBlLCBw YXJhbS0+c2Vfb24pOw0KPiANCj4gLQlpZiAocGFyYW0uc2VfYXNzb2NfaWQgPT0gU0NUUF9DVVJS RU5UX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtLnNlX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09D KSB7DQo+ICsJaWYgKHBhcmFtLT5zZV9hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwN Cj4gKwkgICAgcGFyYW0tPnNlX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICAJCWxp c3RfZm9yX2VhY2hfZW50cnkoYXNvYywgJnNwLT5lcC0+YXNvY3MsIGFzb2NzKSB7DQo+IC0JCQlp bnQgcmV0ID0gc2N0cF9hc3NvY191bHBldmVudF90eXBlX3NldCgmcGFyYW0sIGFzb2MpOw0KPiAr CQkJaW50IHJldCA9IHNjdHBfYXNzb2NfdWxwZXZlbnRfdHlwZV9zZXQocGFyYW0sIGFzb2MpOw0K PiANCj4gIAkJCWlmIChyZXQgJiYgIXJldHZhbCkNCj4gIAkJCQlyZXR2YWwgPSByZXQ7DQo+IEBA IC00MzM0LDI2ICs0MzExLDI1IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2V2ZW50KHN0 cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfZXZlbnQgcGFyYW0sDQo+IA0KPiAgCXJldHVybiBy ZXR2YWw7DQo+ICB9DQo+IC0jdW5kZWYgcGFyYW0NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0 c29ja29wdF9hc2NvbmZfc3VwcG9ydGVkKHN0cnVjdCBzb2NrICpzaywNCj4gLQkJCQkJICAgIHN0 cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkJICAgIHN0cnVjdCBzY3RwX2Fz c29jX3ZhbHVlICpwYXJhbXMsDQo+ICAJCQkJCSAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAg ew0KPiAgCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiAgCXN0cnVjdCBzY3RwX2Vu ZHBvaW50ICplcDsNCj4gIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsNCj4gDQo+IC0JaWYgKG9wdGxl biAhPSBzaXplb2YocGFyYW1zKSkNCj4gKwlpZiAob3B0bGVuICE9IHNpemVvZigqcGFyYW1zKSkN Cj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMu YXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJhbXMuYXNzb2NfaWQgIT0gU0NUUF9GVVRV UkVfQVNTT0MgJiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19p ZCk7DQo+ICsJaWYgKCFhc29jICYmIHBhcmFtcy0+YXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNT T0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0K PiAgCWVwID0gc2N0cF9zayhzayktPmVwOw0KPiAtCWVwLT5hc2NvbmZfZW5hYmxlID0gISFwYXJh bXMuYXNzb2NfdmFsdWU7DQo+ICsJZXAtPmFzY29uZl9lbmFibGUgPSAhIXBhcmFtcy0+YXNzb2Nf dmFsdWU7DQo+IA0KPiAgCWlmIChlcC0+YXNjb25mX2VuYWJsZSAmJiBlcC0+YXV0aF9lbmFibGUp IHsNCj4gIAkJc2N0cF9hdXRoX2VwX2FkZF9jaHVua2lkKGVwLCBTQ1RQX0NJRF9BU0NPTkYpOw0K PiBAQCAtNDM2NywyMyArNDM0MywyMyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hc2Nv bmZfc3VwcG9ydGVkKHN0cnVjdCBzb2NrICpzaywNCj4gIH0NCj4gDQo+ICBzdGF0aWMgaW50IHNj dHBfc2V0c29ja29wdF9hdXRoX3N1cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAg c3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgcGFyYW1zLA0KPiArCQkJCQkgIHN0cnVjdCBzY3RwX2Fz c29jX3ZhbHVlICpwYXJhbXMsDQo+ICAJCQkJCSAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsN Cj4gIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsNCj4gIAlzdHJ1Y3Qgc2N0cF9lbmRw b2ludCAqZXA7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4g IT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKnBhcmFtcykpDQo+ ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFz c29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lkICE9IFNDVFBfRlVUVVJF X0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+YXNzb2NfaWQp Ow0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09D ICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4g IAllcCA9IHNjdHBfc2soc2spLT5lcDsNCj4gLQlpZiAocGFyYW1zLmFzc29jX3ZhbHVlKSB7DQo+ ICsJaWYgKHBhcmFtcy0+YXNzb2NfdmFsdWUpIHsNCj4gIAkJcmV0dmFsID0gc2N0cF9hdXRoX2lu aXQoZXAsIEdGUF9LRVJORUwpOw0KPiAgCQlpZiAocmV0dmFsKQ0KPiAgCQkJZ290byBvdXQ7DQo+ IEBAIC00MzkzLDcgKzQzNjksNyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hdXRoX3N1 cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJCX0NCj4gIAl9DQo+IA0KPiAtCWVwLT5hdXRo X2VuYWJsZSA9ICEhcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCWVwLT5hdXRoX2VuYWJsZSA9ICEh cGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gIAlyZXR2YWwgPSAwOw0KPiANCj4gIG91dDoNCj4gQEAg LTQ0MDEsMjEgKzQzNzcsMjEgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXV0aF9zdXBw b3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRz b2Nrb3B0X2Vjbl9zdXBwb3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCQkgc3RydWN0IHNj dHBfYXNzb2NfdmFsdWUgcGFyYW1zLA0KPiArCQkJCQkgc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUg KnBhcmFtcywNCj4gIAkJCQkJIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0 IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0K PiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXpl b2YoKnBhcmFtcykpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3Nv YyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lk ICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBh cmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9IFND VFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCWdv dG8gb3V0Ow0KPiANCj4gLQlzY3RwX3NrKHNrKS0+ZXAtPmVjbl9lbmFibGUgPSAhIXBhcmFtcy5h c3NvY192YWx1ZTsNCj4gKwlzY3RwX3NrKHNrKS0+ZXAtPmVjbl9lbmFibGUgPSAhIXBhcmFtcy0+ YXNzb2NfdmFsdWU7DQo+ICAJcmV0dmFsID0gMDsNCj4gDQo+ICBvdXQ6DQo+IEBAIC00NDIzLDMz ICs0Mzk5LDMyIEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Vjbl9zdXBwb3J0ZWQoc3Ry dWN0IHNvY2sgKnNrLA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3Bm X2V4cG9zZShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY192 YWx1ZSBwYXJhbXMsDQo+ICsJCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY192YWx1ZSAqcGFyYW1z LA0KPiAgCQkJCSAgICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0 cF9hc3NvY2lhdGlvbiAqYXNvYzsNCj4gIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsNCj4gDQo+IC0J aWYgKG9wdGxlbiAhPSBzaXplb2YocGFyYW1zKSkNCj4gKwlpZiAob3B0bGVuICE9IHNpemVvZigq cGFyYW1zKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWlmIChwYXJhbXMuYXNzb2NfdmFsdWUg PiBTQ1RQX1BGX0VYUE9TRV9NQVgpDQo+ICsJaWYgKHBhcmFtcy0+YXNzb2NfdmFsdWUgPiBTQ1RQ X1BGX0VYUE9TRV9NQVgpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJh c3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29j X2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ss IHBhcmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9 IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJ CWdvdG8gb3V0Ow0KPiANCj4gIAlpZiAoYXNvYykNCj4gLQkJYXNvYy0+cGZfZXhwb3NlID0gcGFy YW1zLmFzc29jX3ZhbHVlOw0KPiArCQlhc29jLT5wZl9leHBvc2UgPSBwYXJhbXMtPmFzc29jX3Zh bHVlOw0KPiAgCWVsc2UNCj4gLQkJc2N0cF9zayhzayktPnBmX2V4cG9zZSA9IHBhcmFtcy5hc3Nv Y192YWx1ZTsNCj4gKwkJc2N0cF9zayhzayktPnBmX2V4cG9zZSA9IHBhcmFtcy0+YXNzb2NfdmFs dWU7DQo+ICAJcmV0dmFsID0gMDsNCj4gDQo+ICBvdXQ6DQo+ICAJcmV0dXJuIHJldHZhbDsNCj4g IH0NCj4gLSN1bmRlZiBwYXJhbXMNCj4gDQo+ICBzdGF0aWMgaW50IGtlcm5lbF9zY3RwX3NldHNv Y2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgdm9pZCAqb3B0dmFsLA0KPiAgCQkJ ICAgaW50IG9wdGxlbikNCj4gLS0NCj4gMS44LjEuMg0KPiANCj4gLQ0KPiBSZWdpc3RlcmVkIEFk ZHJlc3MgTGFrZXNpZGUsIEJyYW1sZXkgUm9hZCwgTW91bnQgRmFybSwgTWlsdG9uIEtleW5lcywg TUsxIDFQVCwgVUsNCj4gUmVnaXN0cmF0aW9uIE5vOiAxMzk3Mzg2IChXYWxlcykNCg0KLQ0KUmVn aXN0ZXJlZCBBZGRyZXNzIExha2VzaWRlLCBCcmFtbGV5IFJvYWQsIE1vdW50IEZhcm0sIE1pbHRv biBLZXluZXMsIE1LMSAxUFQsIFVLDQpSZWdpc3RyYXRpb24gTm86IDEzOTczODYgKFdhbGVzKQ0K ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines @ 2020-05-26 16:44 ` David Laight 0 siblings, 0 replies; 11+ messages in thread From: David Laight @ 2020-05-26 16:44 UTC (permalink / raw) To: David Laight, 'Vlad Yasevich', 'Neil Horman', 'David S. Miller', 'Jakub Kicinski', 'linux-sctp@vger.kernel.org', 'netdev@vger.kernel.org', 'Christoph Hellwig', 'Marcelo Ricardo Leitner' This should be 3/8. > -----Original Message----- > From: netdev-owner@vger.kernel.org <netdev-owner@vger.kernel.org> On Behalf Of David Laight > Sent: 26 May 2020 17:40 > To: 'Vlad Yasevich' <vyasevich@gmail.com>; 'Neil Horman' <nhorman@tuxdriver.com>; 'David S. Miller' > <davem@davemloft.net>; 'Jakub Kicinski' <kuba@kernel.org>; 'linux-sctp@vger.kernel.org' <linux- > sctp@vger.kernel.org>; 'netdev@vger.kernel.org' <netdev@vger.kernel.org>; 'Christoph Hellwig' > <hch@lst.de>; 'Marcelo Ricardo Leitner' <marcelo.leitner@gmail.com> > Subject: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines > > Expand the #define foo (*foo) used to simplify the previous patch. > Doesn't change the generated code. > > Signed-off-by: David Laight <david.laight@aculab.com> > > --- > net/sctp/socket.c | 687 ++++++++++++++++++++++++++---------------------------- > 1 file changed, 331 insertions(+), 356 deletions(-) > > diff --git a/net/sctp/socket.c b/net/sctp/socket.c > index 639d7da..b8068da 100644 > --- a/net/sctp/socket.c > +++ b/net/sctp/socket.c > @@ -2585,9 +2585,8 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, > return 0; > } > > -#define params (*params) > static int sctp_setsockopt_peer_addr_params(struct sock *sk, > - struct sctp_paddrparams params, > + struct sctp_paddrparams *params, > unsigned int optlen) > { > struct sctp_transport *trans = NULL; > @@ -2596,33 +2595,33 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, > int error; > int hb_change, pmtud_change, sackdelay_change; > > - if (optlen != sizeof(params)) { > + if (optlen != sizeof(*params)) { > if (optlen != ALIGN(offsetof(struct sctp_paddrparams, > spp_ipv6_flowlabel), 4)) > return -EINVAL; > - if (params.spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) > + if (params->spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) > return -EINVAL; > } > > /* Validate flags and value parameters. */ > - hb_change = params.spp_flags & SPP_HB; > - pmtud_change = params.spp_flags & SPP_PMTUD; > - sackdelay_change = params.spp_flags & SPP_SACKDELAY; > + hb_change = params->spp_flags & SPP_HB; > + pmtud_change = params->spp_flags & SPP_PMTUD; > + sackdelay_change = params->spp_flags & SPP_SACKDELAY; > > if (hb_change == SPP_HB || > pmtud_change == SPP_PMTUD || > sackdelay_change == SPP_SACKDELAY || > - params.spp_sackdelay > 500 || > - (params.spp_pathmtu && > - params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) > + params->spp_sackdelay > 500 || > + (params->spp_pathmtu && > + params->spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) > return -EINVAL; > > /* If an address other than INADDR_ANY is specified, and > * no transport is found, then the request is invalid. > */ > - if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) { > - trans = sctp_addr_id2transport(sk, ¶ms.spp_address, > - params.spp_assoc_id); > + if (!sctp_is_any(sk, (union sctp_addr *)¶ms->spp_address)) { > + trans = sctp_addr_id2transport(sk, ¶ms->spp_address, > + params->spp_assoc_id); > if (!trans) > return -EINVAL; > } > @@ -2631,19 +2630,19 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, > * socket is a one to many style socket, and an association > * was not found, then the id was invalid. > */ > - asoc = sctp_id2assoc(sk, params.spp_assoc_id); > - if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->spp_assoc_id); > + if (!asoc && params->spp_assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > /* Heartbeat demand can only be sent on a transport or > * association, but not a socket. > */ > - if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc) > + if (params->spp_flags & SPP_HB_DEMAND && !trans && !asoc) > return -EINVAL; > > /* Process parameters. */ > - error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, > + error = sctp_apply_peer_addr_params(params, trans, asoc, sp, > hb_change, pmtud_change, > sackdelay_change); > > @@ -2656,7 +2655,7 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, > if (!trans && asoc) { > list_for_each_entry(trans, &asoc->peer.transport_addr_list, > transports) { > - sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, > + sctp_apply_peer_addr_params(params, trans, asoc, sp, > hb_change, pmtud_change, > sackdelay_change); > } > @@ -2664,7 +2663,6 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk, > > return 0; > } > -#undef params > > static inline __u32 sctp_spp_sackdelay_enable(__u32 param_flags) > { > @@ -2749,16 +2747,15 @@ static void sctp_apply_asoc_delayed_ack(struct sctp_sack_info *params, > * value to 1 will disable the delayed sack algorithm. > */ > > -#define params (*params) > static int sctp_setsockopt_delayed_ack(struct sock *sk, > - struct sctp_sack_info params, > + struct sctp_sack_info *params, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > struct sctp_association *asoc; > > if (optlen == sizeof(struct sctp_sack_info)) { > - if (params.sack_delay == 0 && params.sack_freq == 0) > + if (params->sack_delay == 0 && params->sack_freq == 0) > return 0; > } else if (optlen == sizeof(struct sctp_assoc_value)) { > pr_warn_ratelimited(DEPRECATED > @@ -2766,56 +2763,56 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk, > "Use of struct sctp_assoc_value in delayed_ack socket option.\n" > "Use struct sctp_sack_info instead\n", > current->comm, task_pid_nr(current)); > - if (params.sack_delay == 0) > - params.sack_freq = 1; > + if (params->sack_delay == 0) > + params->sack_freq = 1; > else > - params.sack_freq = 0; > + params->sack_freq = 0; > } else > return -EINVAL; > > /* Validate value parameter. */ > - if (params.sack_delay > 500) > + if (params->sack_delay > 500) > return -EINVAL; > > /* Get association, if sack_assoc_id != SCTP_FUTURE_ASSOC and the > * socket is a one to many style socket, and an association > * was not found, then the id was invalid. > */ > - asoc = sctp_id2assoc(sk, params.sack_assoc_id); > - if (!asoc && params.sack_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, params->sack_assoc_id); > + if (!asoc && params->sack_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) { > - sctp_apply_asoc_delayed_ack(¶ms, asoc); > + sctp_apply_asoc_delayed_ack(params, asoc); > > return 0; > } > > if (sctp_style(sk, TCP)) > - params.sack_assoc_id = SCTP_FUTURE_ASSOC; > + params->sack_assoc_id = SCTP_FUTURE_ASSOC; > > - if (params.sack_assoc_id == SCTP_FUTURE_ASSOC || > - params.sack_assoc_id == SCTP_ALL_ASSOC) { > - if (params.sack_delay) { > - sp->sackdelay = params.sack_delay; > + if (params->sack_assoc_id == SCTP_FUTURE_ASSOC || > + params->sack_assoc_id == SCTP_ALL_ASSOC) { > + if (params->sack_delay) { > + sp->sackdelay = params->sack_delay; > sp->param_flags = > sctp_spp_sackdelay_enable(sp->param_flags); > } > - if (params.sack_freq == 1) { > + if (params->sack_freq == 1) { > sp->param_flags = > sctp_spp_sackdelay_disable(sp->param_flags); > - } else if (params.sack_freq > 1) { > - sp->sackfreq = params.sack_freq; > + } else if (params->sack_freq > 1) { > + sp->sackfreq = params->sack_freq; > sp->param_flags = > sctp_spp_sackdelay_enable(sp->param_flags); > } > } > > - if (params.sack_assoc_id == SCTP_CURRENT_ASSOC || > - params.sack_assoc_id == SCTP_ALL_ASSOC) > + if (params->sack_assoc_id == SCTP_CURRENT_ASSOC || > + params->sack_assoc_id == SCTP_ALL_ASSOC) > list_for_each_entry(asoc, &sp->ep->asocs, asocs) > - sctp_apply_asoc_delayed_ack(¶ms, asoc); > + sctp_apply_asoc_delayed_ack(params, asoc); > > return 0; > } > @@ -2831,8 +2828,7 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk, > * by the change). With TCP-style sockets, this option is inherited by > * sockets derived from a listener socket. > */ > -#define sinit (*sinit) > -static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, > +static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg *sinit, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > @@ -2840,18 +2836,17 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, > if (optlen != sizeof(struct sctp_initmsg)) > return -EINVAL; > > - if (sinit.sinit_num_ostreams) > - sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams; > - if (sinit.sinit_max_instreams) > - sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams; > - if (sinit.sinit_max_attempts) > - sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts; > - if (sinit.sinit_max_init_timeo) > - sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo; > + if (sinit->sinit_num_ostreams) > + sp->initmsg.sinit_num_ostreams = sinit->sinit_num_ostreams; > + if (sinit->sinit_max_instreams) > + sp->initmsg.sinit_max_instreams = sinit->sinit_max_instreams; > + if (sinit->sinit_max_attempts) > + sp->initmsg.sinit_max_attempts = sinit->sinit_max_attempts; > + if (sinit->sinit_max_init_timeo) > + sp->initmsg.sinit_max_init_timeo = sinit->sinit_max_init_timeo; > > return 0; > } > -#undef sinit > > /* > * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM) > @@ -2867,56 +2862,55 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit, > * sinfo_timetolive. The user must provide the sinfo_assoc_id field in > * to this call if the caller is using the UDP model. > */ > -#define info (*info) > static int sctp_setsockopt_default_send_param(struct sock *sk, > - struct sctp_sndrcvinfo info, > + struct sctp_sndrcvinfo *info, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > struct sctp_association *asoc; > > - if (optlen != sizeof(info)) > + if (optlen != sizeof(*info)) > return -EINVAL; > - if (info.sinfo_flags & > + if (info->sinfo_flags & > ~(SCTP_UNORDERED | SCTP_ADDR_OVER | > SCTP_ABORT | SCTP_EOF)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); > - if (!asoc && info.sinfo_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, info->sinfo_assoc_id); > + if (!asoc && info->sinfo_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) { > - asoc->default_stream = info.sinfo_stream; > - asoc->default_flags = info.sinfo_flags; > - asoc->default_ppid = info.sinfo_ppid; > - asoc->default_context = info.sinfo_context; > - asoc->default_timetolive = info.sinfo_timetolive; > + asoc->default_stream = info->sinfo_stream; > + asoc->default_flags = info->sinfo_flags; > + asoc->default_ppid = info->sinfo_ppid; > + asoc->default_context = info->sinfo_context; > + asoc->default_timetolive = info->sinfo_timetolive; > > return 0; > } > > if (sctp_style(sk, TCP)) > - info.sinfo_assoc_id = SCTP_FUTURE_ASSOC; > + info->sinfo_assoc_id = SCTP_FUTURE_ASSOC; > > - if (info.sinfo_assoc_id == SCTP_FUTURE_ASSOC || > - info.sinfo_assoc_id == SCTP_ALL_ASSOC) { > - sp->default_stream = info.sinfo_stream; > - sp->default_flags = info.sinfo_flags; > - sp->default_ppid = info.sinfo_ppid; > - sp->default_context = info.sinfo_context; > - sp->default_timetolive = info.sinfo_timetolive; > + if (info->sinfo_assoc_id == SCTP_FUTURE_ASSOC || > + info->sinfo_assoc_id == SCTP_ALL_ASSOC) { > + sp->default_stream = info->sinfo_stream; > + sp->default_flags = info->sinfo_flags; > + sp->default_ppid = info->sinfo_ppid; > + sp->default_context = info->sinfo_context; > + sp->default_timetolive = info->sinfo_timetolive; > } > > - if (info.sinfo_assoc_id == SCTP_CURRENT_ASSOC || > - info.sinfo_assoc_id == SCTP_ALL_ASSOC) { > + if (info->sinfo_assoc_id == SCTP_CURRENT_ASSOC || > + info->sinfo_assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &sp->ep->asocs, asocs) { > - asoc->default_stream = info.sinfo_stream; > - asoc->default_flags = info.sinfo_flags; > - asoc->default_ppid = info.sinfo_ppid; > - asoc->default_context = info.sinfo_context; > - asoc->default_timetolive = info.sinfo_timetolive; > + asoc->default_stream = info->sinfo_stream; > + asoc->default_flags = info->sinfo_flags; > + asoc->default_ppid = info->sinfo_ppid; > + asoc->default_context = info->sinfo_context; > + asoc->default_timetolive = info->sinfo_timetolive; > } > } > > @@ -2927,51 +2921,51 @@ static int sctp_setsockopt_default_send_param(struct sock *sk, > * (SCTP_DEFAULT_SNDINFO) > */ > static int sctp_setsockopt_default_sndinfo(struct sock *sk, > - struct sctp_sndinfo info, > + struct sctp_sndinfo *info, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > struct sctp_association *asoc; > > - if (optlen != sizeof(info)) > + if (optlen != sizeof(*info)) > return -EINVAL; > - if (info.snd_flags & > + if (info->snd_flags & > ~(SCTP_UNORDERED | SCTP_ADDR_OVER | > SCTP_ABORT | SCTP_EOF)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, info.snd_assoc_id); > - if (!asoc && info.snd_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, info->snd_assoc_id); > + if (!asoc && info->snd_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) { > - asoc->default_stream = info.snd_sid; > - asoc->default_flags = info.snd_flags; > - asoc->default_ppid = info.snd_ppid; > - asoc->default_context = info.snd_context; > + asoc->default_stream = info->snd_sid; > + asoc->default_flags = info->snd_flags; > + asoc->default_ppid = info->snd_ppid; > + asoc->default_context = info->snd_context; > > return 0; > } > > if (sctp_style(sk, TCP)) > - info.snd_assoc_id = SCTP_FUTURE_ASSOC; > + info->snd_assoc_id = SCTP_FUTURE_ASSOC; > > - if (info.snd_assoc_id == SCTP_FUTURE_ASSOC || > - info.snd_assoc_id == SCTP_ALL_ASSOC) { > - sp->default_stream = info.snd_sid; > - sp->default_flags = info.snd_flags; > - sp->default_ppid = info.snd_ppid; > - sp->default_context = info.snd_context; > + if (info->snd_assoc_id == SCTP_FUTURE_ASSOC || > + info->snd_assoc_id == SCTP_ALL_ASSOC) { > + sp->default_stream = info->snd_sid; > + sp->default_flags = info->snd_flags; > + sp->default_ppid = info->snd_ppid; > + sp->default_context = info->snd_context; > } > > - if (info.snd_assoc_id == SCTP_CURRENT_ASSOC || > - info.snd_assoc_id == SCTP_ALL_ASSOC) { > + if (info->snd_assoc_id == SCTP_CURRENT_ASSOC || > + info->snd_assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &sp->ep->asocs, asocs) { > - asoc->default_stream = info.snd_sid; > - asoc->default_flags = info.snd_flags; > - asoc->default_ppid = info.snd_ppid; > - asoc->default_context = info.snd_context; > + asoc->default_stream = info->snd_sid; > + asoc->default_flags = info->snd_flags; > + asoc->default_ppid = info->snd_ppid; > + asoc->default_context = info->snd_context; > } > } > > @@ -2984,8 +2978,7 @@ static int sctp_setsockopt_default_sndinfo(struct sock *sk, > * the association primary. The enclosed address must be one of the > * association peer's addresses. > */ > -#define prim (*prim) > -static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, > +static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim *prim, > unsigned int optlen) > { > struct sctp_transport *trans; > @@ -2996,17 +2989,17 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim > prim, > return -EINVAL; > > /* Allow security module to validate address but need address len. */ > - af = sctp_get_af_specific(prim.ssp_addr.ss_family); > + af = sctp_get_af_specific(prim->ssp_addr.ss_family); > if (!af) > return -EINVAL; > > err = security_sctp_bind_connect(sk, SCTP_PRIMARY_ADDR, > - (struct sockaddr *)&prim.ssp_addr, > + (struct sockaddr *)&prim->ssp_addr, > af->sockaddr_len); > if (err) > return err; > > - trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id); > + trans = sctp_addr_id2transport(sk, &prim->ssp_addr, prim->ssp_assoc_id); > if (!trans) > return -EINVAL; > > @@ -3014,7 +3007,6 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim, > > return 0; > } > -#undef prim > > /* > * 7.1.5 SCTP_NODELAY > @@ -3047,7 +3039,7 @@ static int sctp_setsockopt_nodelay(struct sock *sk, int *optval, > * > */ > static int sctp_setsockopt_rtoinfo(struct sock *sk, > - struct sctp_rtoinfo params, > + struct sctp_rtoinfo *params, > unsigned int optlen) > { > struct sctp_association *asoc; > @@ -3057,15 +3049,15 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, > if (optlen != sizeof (struct sctp_rtoinfo)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, params.srto_assoc_id); > + asoc = sctp_id2assoc(sk, params->srto_assoc_id); > > /* Set the values to the specific association */ > - if (!asoc && params.srto_assoc_id != SCTP_FUTURE_ASSOC && > + if (!asoc && params->srto_assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > - rto_max = params.srto_max; > - rto_min = params.srto_min; > + rto_max = params->srto_max; > + rto_min = params->srto_min; > > if (rto_max) > rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; > @@ -3081,17 +3073,17 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, > return -EINVAL; > > if (asoc) { > - if (params.srto_initial != 0) > + if (params->srto_initial != 0) > asoc->rto_initial = > - msecs_to_jiffies(params.srto_initial); > + msecs_to_jiffies(params->srto_initial); > asoc->rto_max = rto_max; > asoc->rto_min = rto_min; > } else { > /* If there is no association or the association-id = 0 > * set the values to the endpoint. > */ > - if (params.srto_initial != 0) > - sp->rtoinfo.srto_initial = params.srto_initial; > + if (params->srto_initial != 0) > + sp->rtoinfo.srto_initial = params->srto_initial; > sp->rtoinfo.srto_max = rto_max; > sp->rtoinfo.srto_min = rto_min; > } > @@ -3111,7 +3103,7 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, > * > */ > static int sctp_setsockopt_associnfo(struct sock *sk, > - struct sctp_assocparams params, > + struct sctp_assocparams *params, > unsigned int optlen) > { > > @@ -3120,15 +3112,15 @@ static int sctp_setsockopt_associnfo(struct sock *sk, > if (optlen != sizeof(struct sctp_assocparams)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, params.sasoc_assoc_id); > + asoc = sctp_id2assoc(sk, params->sasoc_assoc_id); > > - if (!asoc && params.sasoc_assoc_id != SCTP_FUTURE_ASSOC && > + if (!asoc && params->sasoc_assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > /* Set the values to the specific association */ > if (asoc) { > - if (params.sasoc_asocmaxrxt != 0) { > + if (params->sasoc_asocmaxrxt != 0) { > __u32 path_sum = 0; > int paths = 0; > struct sctp_transport *peer_addr; > @@ -3145,24 +3137,24 @@ static int sctp_setsockopt_associnfo(struct sock *sk, > * then one path. > */ > if (paths > 1 && > - params.sasoc_asocmaxrxt > path_sum) > + params->sasoc_asocmaxrxt > path_sum) > return -EINVAL; > > - asoc->max_retrans = params.sasoc_asocmaxrxt; > + asoc->max_retrans = params->sasoc_asocmaxrxt; > } > > - if (params.sasoc_cookie_life != 0) > - asoc->cookie_life = ms_to_ktime(params.sasoc_cookie_life); > + if (params->sasoc_cookie_life != 0) > + asoc->cookie_life = ms_to_ktime(params->sasoc_cookie_life); > } else { > /* Set the values to the endpoint */ > struct sctp_sock *sp = sctp_sk(sk); > > - if (params.sasoc_asocmaxrxt != 0) > + if (params->sasoc_asocmaxrxt != 0) > sp->assocparams.sasoc_asocmaxrxt = > - params.sasoc_asocmaxrxt; > - if (params.sasoc_cookie_life != 0) > + params->sasoc_asocmaxrxt; > + if (params->sasoc_cookie_life != 0) > sp->assocparams.sasoc_cookie_life = > - params.sasoc_cookie_life; > + params->sasoc_cookie_life; > } > return 0; > } > @@ -3220,7 +3212,7 @@ static int sctp_setsockopt_mappedv4(struct sock *sk, int *optval, > * assoc_value: This parameter specifies the maximum size in bytes. > */ > static int sctp_setsockopt_maxseg(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > @@ -3233,16 +3225,16 @@ static int sctp_setsockopt_maxseg(struct sock *sk, > "Use of int in maxseg socket option.\n" > "Use struct sctp_assoc_value instead\n", > current->comm, task_pid_nr(current)); > - val = *(int *)¶ms; > - params.assoc_id = SCTP_FUTURE_ASSOC; > + val = *(int *)params; > + params->assoc_id = SCTP_FUTURE_ASSOC; > } else if (optlen != sizeof(struct sctp_assoc_value)) { > - val = params.assoc_value; > + val = params->assoc_value; > } else { > return -EINVAL; > } > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > @@ -3277,9 +3269,8 @@ static int sctp_setsockopt_maxseg(struct sock *sk, > * locally bound addresses. The following structure is used to make a > * set primary request: > */ > -#define prim (*prim) > static int sctp_setsockopt_peer_primary_addr(struct sock *sk, > - struct sctp_setpeerprim prim, > + struct sctp_setpeerprim *prim, > unsigned int optlen) > { > struct sctp_sock *sp; > @@ -3296,7 +3287,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, > if (optlen != sizeof(struct sctp_setpeerprim)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); > + asoc = sctp_id2assoc(sk, prim->sspp_assoc_id); > if (!asoc) > return -EINVAL; > > @@ -3309,26 +3300,26 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, > if (!sctp_state(asoc, ESTABLISHED)) > return -ENOTCONN; > > - af = sctp_get_af_specific(prim.sspp_addr.ss_family); > + af = sctp_get_af_specific(prim->sspp_addr.ss_family); > if (!af) > return -EINVAL; > > - if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL)) > + if (!af->addr_valid((union sctp_addr *)&prim->sspp_addr, sp, NULL)) > return -EADDRNOTAVAIL; > > - if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) > + if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim->sspp_addr)) > return -EADDRNOTAVAIL; > > /* Allow security module to validate address. */ > err = security_sctp_bind_connect(sk, SCTP_SET_PEER_PRIMARY_ADDR, > - (struct sockaddr *)&prim.sspp_addr, > + (struct sockaddr *)&prim->sspp_addr, > af->sockaddr_len); > if (err) > return err; > > /* Create an ASCONF chunk with SET_PRIMARY parameter */ > chunk = sctp_make_asconf_set_prim(asoc, > - (union sctp_addr *)&prim.sspp_addr); > + (union sctp_addr *)&prim->sspp_addr); > if (!chunk) > return -ENOMEM; > > @@ -3338,7 +3329,6 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, > > return err; > } > -#undef prim > > static int sctp_setsockopt_adaptation_layer(struct sock *sk, > struct sctp_setadaptation *adaptation, > @@ -3367,7 +3357,7 @@ static int sctp_setsockopt_adaptation_layer(struct sock *sk, > * saved with outbound messages. > */ > static int sctp_setsockopt_context(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > @@ -3376,28 +3366,28 @@ static int sctp_setsockopt_context(struct sock *sk, > if (optlen != sizeof(struct sctp_assoc_value)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) { > - asoc->default_rcv_context = params.assoc_value; > + asoc->default_rcv_context = params->assoc_value; > > return 0; > } > > if (sctp_style(sk, TCP)) > - params.assoc_id = SCTP_FUTURE_ASSOC; > + params->assoc_id = SCTP_FUTURE_ASSOC; > > - if (params.assoc_id == SCTP_FUTURE_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) > - sp->default_rcv_context = params.assoc_value; > + if (params->assoc_id == SCTP_FUTURE_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) > + sp->default_rcv_context = params->assoc_value; > > - if (params.assoc_id == SCTP_CURRENT_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) > + if (params->assoc_id == SCTP_CURRENT_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) > list_for_each_entry(asoc, &sp->ep->asocs, asocs) > - asoc->default_rcv_context = params.assoc_value; > + asoc->default_rcv_context = params->assoc_value; > > return 0; > } > @@ -3488,7 +3478,7 @@ static int sctp_setsockopt_partial_delivery_point(struct sock *sk, > * future associations inheriting the socket value. > */ > static int sctp_setsockopt_maxburst(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > @@ -3500,34 +3490,34 @@ static int sctp_setsockopt_maxburst(struct sock *sk, > "Use of int in max_burst socket option deprecated.\n" > "Use struct sctp_assoc_value instead\n", > current->comm, task_pid_nr(current)); > - params.assoc_value = *(int *)¶ms; > - params.assoc_id = SCTP_FUTURE_ASSOC; > + params->assoc_value = *(int *)params; > + params->assoc_id = SCTP_FUTURE_ASSOC; > } else if (optlen != sizeof(struct sctp_assoc_value)) { > return -EINVAL; > } > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) { > - asoc->max_burst = params.assoc_value; > + asoc->max_burst = params->assoc_value; > > return 0; > } > > if (sctp_style(sk, TCP)) > - params.assoc_id = SCTP_FUTURE_ASSOC; > + params->assoc_id = SCTP_FUTURE_ASSOC; > > - if (params.assoc_id == SCTP_FUTURE_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) > - sp->max_burst = params.assoc_value; > + if (params->assoc_id == SCTP_FUTURE_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) > + sp->max_burst = params->assoc_value; > > - if (params.assoc_id == SCTP_CURRENT_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) > + if (params->assoc_id == SCTP_CURRENT_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) > list_for_each_entry(asoc, &sp->ep->asocs, asocs) > - asoc->max_burst = params.assoc_value; > + asoc->max_burst = params->assoc_value; > > return 0; > } > @@ -3539,9 +3529,8 @@ static int sctp_setsockopt_maxburst(struct sock *sk, > * received only in an authenticated way. Changes to the list of chunks > * will only effect future associations on the socket. > */ > -#define val (*val) > static int sctp_setsockopt_auth_chunk(struct sock *sk, > - struct sctp_authchunk val, > + struct sctp_authchunk *val, > unsigned int optlen) > { > struct sctp_endpoint *ep = sctp_sk(sk)->ep; > @@ -3552,7 +3541,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk, > if (optlen != sizeof(struct sctp_authchunk)) > return -EINVAL; > > - switch (val.sauth_chunk) { > + switch (val->sauth_chunk) { > case SCTP_CID_INIT: > case SCTP_CID_INIT_ACK: > case SCTP_CID_SHUTDOWN_COMPLETE: > @@ -3561,7 +3550,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk, > } > > /* add this chunk id to the endpoint */ > - return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk); > + return sctp_auth_ep_add_chunkid(ep, val->sauth_chunk); > } > > /* > @@ -3666,7 +3655,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk, > * the association shared key. > */ > static int sctp_setsockopt_active_key(struct sock *sk, > - struct sctp_authkeyid val, > + struct sctp_authkeyid *val, > unsigned int optlen) > { > struct sctp_endpoint *ep = sctp_sk(sk)->ep; > @@ -3676,29 +3665,29 @@ static int sctp_setsockopt_active_key(struct sock *sk, > if (optlen != sizeof(struct sctp_authkeyid)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, val.scact_assoc_id); > - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, val->scact_assoc_id); > + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) > - return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); > + return sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); > > if (sctp_style(sk, TCP)) > - val.scact_assoc_id = SCTP_FUTURE_ASSOC; > + val->scact_assoc_id = SCTP_FUTURE_ASSOC; > > - if (val.scact_assoc_id == SCTP_FUTURE_ASSOC || > - val.scact_assoc_id == SCTP_ALL_ASSOC) { > - ret = sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); > + if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || > + val->scact_assoc_id == SCTP_ALL_ASSOC) { > + ret = sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); > if (ret) > return ret; > } > > - if (val.scact_assoc_id == SCTP_CURRENT_ASSOC || > - val.scact_assoc_id == SCTP_ALL_ASSOC) { > + if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || > + val->scact_assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &ep->asocs, asocs) { > int res = sctp_auth_set_active_key(ep, asoc, > - val.scact_keynumber); > + val->scact_keynumber); > > if (res && !ret) > ret = res; > @@ -3714,7 +3703,7 @@ static int sctp_setsockopt_active_key(struct sock *sk, > * This set option will delete a shared secret key from use. > */ > static int sctp_setsockopt_del_key(struct sock *sk, > - struct sctp_authkeyid val, > + struct sctp_authkeyid *val, > unsigned int optlen) > { > struct sctp_endpoint *ep = sctp_sk(sk)->ep; > @@ -3724,29 +3713,29 @@ static int sctp_setsockopt_del_key(struct sock *sk, > if (optlen != sizeof(struct sctp_authkeyid)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, val.scact_assoc_id); > - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, val->scact_assoc_id); > + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) > - return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); > + return sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); > > if (sctp_style(sk, TCP)) > - val.scact_assoc_id = SCTP_FUTURE_ASSOC; > + val->scact_assoc_id = SCTP_FUTURE_ASSOC; > > - if (val.scact_assoc_id == SCTP_FUTURE_ASSOC || > - val.scact_assoc_id == SCTP_ALL_ASSOC) { > - ret = sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); > + if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || > + val->scact_assoc_id == SCTP_ALL_ASSOC) { > + ret = sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); > if (ret) > return ret; > } > > - if (val.scact_assoc_id == SCTP_CURRENT_ASSOC || > - val.scact_assoc_id == SCTP_ALL_ASSOC) { > + if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || > + val->scact_assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &ep->asocs, asocs) { > int res = sctp_auth_del_key_id(ep, asoc, > - val.scact_keynumber); > + val->scact_keynumber); > > if (res && !ret) > ret = res; > @@ -3762,7 +3751,7 @@ static int sctp_setsockopt_del_key(struct sock *sk, > * This set option will deactivate a shared secret key. > */ > static int sctp_setsockopt_deactivate_key(struct sock *sk, > - struct sctp_authkeyid val, > + struct sctp_authkeyid *val, > unsigned int optlen) > { > struct sctp_endpoint *ep = sctp_sk(sk)->ep; > @@ -3772,29 +3761,29 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, > if (optlen != sizeof(struct sctp_authkeyid)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, val.scact_assoc_id); > - if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, val->scact_assoc_id); > + if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) > - return sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); > + return sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); > > if (sctp_style(sk, TCP)) > - val.scact_assoc_id = SCTP_FUTURE_ASSOC; > + val->scact_assoc_id = SCTP_FUTURE_ASSOC; > > - if (val.scact_assoc_id == SCTP_FUTURE_ASSOC || > - val.scact_assoc_id == SCTP_ALL_ASSOC) { > - ret = sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); > + if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || > + val->scact_assoc_id == SCTP_ALL_ASSOC) { > + ret = sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); > if (ret) > return ret; > } > > - if (val.scact_assoc_id == SCTP_CURRENT_ASSOC || > - val.scact_assoc_id == SCTP_ALL_ASSOC) { > + if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || > + val->scact_assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &ep->asocs, asocs) { > int res = sctp_auth_deact_key_id(ep, asoc, > - val.scact_keynumber); > + val->scact_keynumber); > > if (res && !ret) > ret = res; > @@ -3803,7 +3792,6 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, > > return ret; > } > -#undef val > > /* > * 8.1.23 SCTP_AUTO_ASCONF > @@ -3819,24 +3807,23 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk, > * Note. In this implementation, socket operation overrides default parameter > * being set by sysctl as well as FreeBSD implementation > */ > -#define val (*optval) > -static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, > +static int sctp_setsockopt_auto_asconf(struct sock *sk, int *optval, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > > if (optlen < sizeof(int)) > return -EINVAL; > - if (!sctp_is_ep_boundall(sk) && val) > + if (!sctp_is_ep_boundall(sk) && (*optval)) > return -EINVAL; > - if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf)) > + if (((*optval) && sp->do_auto_asconf) || (!(*optval) && !sp->do_auto_asconf)) > return 0; > > spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); > - if (val == 0 && sp->do_auto_asconf) { > + if ((*optval) == 0 && sp->do_auto_asconf) { > list_del(&sp->auto_asconf_list); > sp->do_auto_asconf = 0; > - } else if (val && !sp->do_auto_asconf) { > + } else if ((*optval) && !sp->do_auto_asconf) { > list_add_tail(&sp->auto_asconf_list, > &sock_net(sk)->sctp.auto_asconf_splist); > sp->do_auto_asconf = 1; > @@ -3844,7 +3831,6 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, > spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); > return 0; > } > -#undef val > > /* > * SCTP_PEER_ADDR_THLDS > @@ -3853,70 +3839,68 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val, > * transports in an association. See Section 6.1 of: > * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt > */ > -#define val (*val) > static int sctp_setsockopt_paddr_thresholds(struct sock *sk, > - struct sctp_paddrthlds_v2 val, > + struct sctp_paddrthlds_v2 *val, > unsigned int optlen, bool v2) > { > struct sctp_transport *trans; > struct sctp_association *asoc; > int len; > > - len = v2 ? sizeof(val) : sizeof(struct sctp_paddrthlds); > + len = v2 ? sizeof(*val) : sizeof(struct sctp_paddrthlds); > if (optlen < len) > return -EINVAL; > > - if (v2 && val.spt_pathpfthld > val.spt_pathcpthld) > + if (v2 && val->spt_pathpfthld > val->spt_pathcpthld) > return -EINVAL; > > - if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { > - trans = sctp_addr_id2transport(sk, &val.spt_address, > - val.spt_assoc_id); > + if (!sctp_is_any(sk, (const union sctp_addr *)&val->spt_address)) { > + trans = sctp_addr_id2transport(sk, &val->spt_address, > + val->spt_assoc_id); > if (!trans) > return -ENOENT; > > - if (val.spt_pathmaxrxt) > - trans->pathmaxrxt = val.spt_pathmaxrxt; > + if (val->spt_pathmaxrxt) > + trans->pathmaxrxt = val->spt_pathmaxrxt; > if (v2) > - trans->ps_retrans = val.spt_pathcpthld; > - trans->pf_retrans = val.spt_pathpfthld; > + trans->ps_retrans = val->spt_pathcpthld; > + trans->pf_retrans = val->spt_pathpfthld; > > return 0; > } > > - asoc = sctp_id2assoc(sk, val.spt_assoc_id); > - if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, val->spt_assoc_id); > + if (!asoc && val->spt_assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) { > list_for_each_entry(trans, &asoc->peer.transport_addr_list, > transports) { > - if (val.spt_pathmaxrxt) > - trans->pathmaxrxt = val.spt_pathmaxrxt; > + if (val->spt_pathmaxrxt) > + trans->pathmaxrxt = val->spt_pathmaxrxt; > if (v2) > - trans->ps_retrans = val.spt_pathcpthld; > - trans->pf_retrans = val.spt_pathpfthld; > + trans->ps_retrans = val->spt_pathcpthld; > + trans->pf_retrans = val->spt_pathpfthld; > } > > - if (val.spt_pathmaxrxt) > - asoc->pathmaxrxt = val.spt_pathmaxrxt; > + if (val->spt_pathmaxrxt) > + asoc->pathmaxrxt = val->spt_pathmaxrxt; > if (v2) > - asoc->ps_retrans = val.spt_pathcpthld; > - asoc->pf_retrans = val.spt_pathpfthld; > + asoc->ps_retrans = val->spt_pathcpthld; > + asoc->pf_retrans = val->spt_pathpfthld; > } else { > struct sctp_sock *sp = sctp_sk(sk); > > - if (val.spt_pathmaxrxt) > - sp->pathmaxrxt = val.spt_pathmaxrxt; > + if (val->spt_pathmaxrxt) > + sp->pathmaxrxt = val->spt_pathmaxrxt; > if (v2) > - sp->ps_retrans = val.spt_pathcpthld; > - sp->pf_retrans = val.spt_pathpfthld; > + sp->ps_retrans = val->spt_pathcpthld; > + sp->pf_retrans = val->spt_pathpfthld; > } > > return 0; > } > -#undef val > > static int sctp_setsockopt_recvrcvinfo(struct sock *sk, int *optval, > unsigned int optlen) > @@ -3941,92 +3925,91 @@ static int sctp_setsockopt_recvnxtinfo(struct sock *sk, int *optval, > } > > static int sctp_setsockopt_pr_supported(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_association *asoc; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > - sctp_sk(sk)->ep->prsctp_enable = !!params.assoc_value; > + sctp_sk(sk)->ep->prsctp_enable = !!params->assoc_value; > > return 0; > } > > static int sctp_setsockopt_default_prinfo(struct sock *sk, > - struct sctp_default_prinfo info, > + struct sctp_default_prinfo *info, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen != sizeof(info)) > + if (optlen != sizeof(*info)) > goto out; > > - if (info.pr_policy & ~SCTP_PR_SCTP_MASK) > + if (info->pr_policy & ~SCTP_PR_SCTP_MASK) > goto out; > > - if (info.pr_policy == SCTP_PR_SCTP_NONE) > - info.pr_value = 0; > + if (info->pr_policy == SCTP_PR_SCTP_NONE) > + info->pr_value = 0; > > - asoc = sctp_id2assoc(sk, info.pr_assoc_id); > - if (!asoc && info.pr_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, info->pr_assoc_id); > + if (!asoc && info->pr_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > goto out; > > retval = 0; > > if (asoc) { > - SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); > - asoc->default_timetolive = info.pr_value; > + SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); > + asoc->default_timetolive = info->pr_value; > goto out; > } > > if (sctp_style(sk, TCP)) > - info.pr_assoc_id = SCTP_FUTURE_ASSOC; > + info->pr_assoc_id = SCTP_FUTURE_ASSOC; > > - if (info.pr_assoc_id == SCTP_FUTURE_ASSOC || > - info.pr_assoc_id == SCTP_ALL_ASSOC) { > - SCTP_PR_SET_POLICY(sp->default_flags, info.pr_policy); > - sp->default_timetolive = info.pr_value; > + if (info->pr_assoc_id == SCTP_FUTURE_ASSOC || > + info->pr_assoc_id == SCTP_ALL_ASSOC) { > + SCTP_PR_SET_POLICY(sp->default_flags, info->pr_policy); > + sp->default_timetolive = info->pr_value; > } > > - if (info.pr_assoc_id == SCTP_CURRENT_ASSOC || > - info.pr_assoc_id == SCTP_ALL_ASSOC) { > + if (info->pr_assoc_id == SCTP_CURRENT_ASSOC || > + info->pr_assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &sp->ep->asocs, asocs) { > - SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); > - asoc->default_timetolive = info.pr_value; > + SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); > + asoc->default_timetolive = info->pr_value; > } > } > > out: > return retval; > } > -#undef info > > static int sctp_setsockopt_reconfig_supported(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > goto out; > > - sctp_sk(sk)->ep->reconf_enable = !!params.assoc_value; > + sctp_sk(sk)->ep->reconf_enable = !!params->assoc_value; > > retval = 0; > > @@ -4035,48 +4018,47 @@ static int sctp_setsockopt_reconfig_supported(struct sock *sk, > } > > static int sctp_setsockopt_enable_strreset(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_endpoint *ep = sctp_sk(sk)->ep; > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > goto out; > > - if (params.assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) > + if (params->assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > goto out; > > retval = 0; > > if (asoc) { > - asoc->strreset_enable = params.assoc_value; > + asoc->strreset_enable = params->assoc_value; > goto out; > } > > if (sctp_style(sk, TCP)) > - params.assoc_id = SCTP_FUTURE_ASSOC; > + params->assoc_id = SCTP_FUTURE_ASSOC; > > - if (params.assoc_id == SCTP_FUTURE_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) > - ep->strreset_enable = params.assoc_value; > + if (params->assoc_id == SCTP_FUTURE_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) > + ep->strreset_enable = params->assoc_value; > > - if (params.assoc_id == SCTP_CURRENT_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) > + if (params->assoc_id == SCTP_CURRENT_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) > list_for_each_entry(asoc, &ep->asocs, asocs) > - asoc->strreset_enable = params.assoc_value; > + asoc->strreset_enable = params->assoc_value; > > out: > return retval; > } > > -#undef params > static int sctp_setsockopt_reset_streams(struct sock *sk, > struct sctp_reset_streams *params, > unsigned int optlen) > @@ -4103,20 +4085,17 @@ static int sctp_setsockopt_reset_streams(struct sock *sk, > out: > return retval; > } > -#define params (*params) > > - > -#define associd (*associd) > -static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd, > +static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t *associd, > unsigned int optlen) > { > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen != sizeof(associd)) > + if (optlen != sizeof(*associd)) > goto out; > > - asoc = sctp_id2assoc(sk, associd); > + asoc = sctp_id2assoc(sk, (*associd)); > if (!asoc) > goto out; > > @@ -4125,62 +4104,61 @@ static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd, > out: > return retval; > } > -#undef associd > > static int sctp_setsockopt_add_streams(struct sock *sk, > - struct sctp_add_streams params, > + struct sctp_add_streams *params, > unsigned int optlen) > { > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > goto out; > > - asoc = sctp_id2assoc(sk, params.sas_assoc_id); > + asoc = sctp_id2assoc(sk, params->sas_assoc_id); > if (!asoc) > goto out; > > - retval = sctp_send_add_streams(asoc, ¶ms); > + retval = sctp_send_add_streams(asoc, params); > > out: > return retval; > } > > static int sctp_setsockopt_scheduler(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > struct sctp_association *asoc; > int retval = 0; > > - if (optlen < sizeof(params)) > + if (optlen < sizeof(*params)) > return -EINVAL; > > - if (params.assoc_value > SCTP_SS_MAX) > + if (params->assoc_value > SCTP_SS_MAX) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) > - return sctp_sched_set_sched(asoc, params.assoc_value); > + return sctp_sched_set_sched(asoc, params->assoc_value); > > if (sctp_style(sk, TCP)) > - params.assoc_id = SCTP_FUTURE_ASSOC; > + params->assoc_id = SCTP_FUTURE_ASSOC; > > - if (params.assoc_id == SCTP_FUTURE_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) > - sp->default_ss = params.assoc_value; > + if (params->assoc_id == SCTP_FUTURE_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) > + sp->default_ss = params->assoc_value; > > - if (params.assoc_id == SCTP_CURRENT_ASSOC || > - params.assoc_id == SCTP_ALL_ASSOC) { > + if (params->assoc_id == SCTP_CURRENT_ASSOC || > + params->assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &sp->ep->asocs, asocs) { > int ret = sctp_sched_set_sched(asoc, > - params.assoc_value); > + params->assoc_value); > > if (ret && !retval) > retval = ret; > @@ -4191,31 +4169,31 @@ static int sctp_setsockopt_scheduler(struct sock *sk, > } > > static int sctp_setsockopt_scheduler_value(struct sock *sk, > - struct sctp_stream_value params, > + struct sctp_stream_value *params, > unsigned int optlen) > { > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen < sizeof(params)) > + if (optlen < sizeof(*params)) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_CURRENT_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_CURRENT_ASSOC && > sctp_style(sk, UDP)) > goto out; > > if (asoc) { > - retval = sctp_sched_set_value(asoc, params.stream_id, > - params.stream_value, GFP_KERNEL); > + retval = sctp_sched_set_value(asoc, params->stream_id, > + params->stream_value, GFP_KERNEL); > goto out; > } > > retval = 0; > > list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) { > - int ret = sctp_sched_set_value(asoc, params.stream_id, > - params.stream_value, GFP_KERNEL); > + int ret = sctp_sched_set_value(asoc, params->stream_id, > + params->stream_value, GFP_KERNEL); > if (ret && !retval) /* try to return the 1st error. */ > retval = ret; > } > @@ -4225,18 +4203,18 @@ static int sctp_setsockopt_scheduler_value(struct sock *sk, > } > > static int sctp_setsockopt_interleaving_supported(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen < sizeof(params)) > + if (optlen < sizeof(*params)) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > goto out; > > @@ -4245,7 +4223,7 @@ static int sctp_setsockopt_interleaving_supported(struct sock *sk, > goto out; > } > > - sp->ep->intl_enable = !!params.assoc_value; > + sp->ep->intl_enable = !!params->assoc_value; > > retval = 0; > > @@ -4291,41 +4269,40 @@ static int sctp_assoc_ulpevent_type_set(struct sctp_event *param, > return 0; > } > > -#define param (*param) > -static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param, > +static int sctp_setsockopt_event(struct sock *sk, struct sctp_event *param, > unsigned int optlen) > { > struct sctp_sock *sp = sctp_sk(sk); > struct sctp_association *asoc; > int retval = 0; > > - if (optlen < sizeof(param)) > + if (optlen < sizeof(*param)) > return -EINVAL; > > - if (param.se_type < SCTP_SN_TYPE_BASE || > - param.se_type > SCTP_SN_TYPE_MAX) > + if (param->se_type < SCTP_SN_TYPE_BASE || > + param->se_type > SCTP_SN_TYPE_MAX) > return -EINVAL; > > - asoc = sctp_id2assoc(sk, param.se_assoc_id); > - if (!asoc && param.se_assoc_id > SCTP_ALL_ASSOC && > + asoc = sctp_id2assoc(sk, param->se_assoc_id); > + if (!asoc && param->se_assoc_id > SCTP_ALL_ASSOC && > sctp_style(sk, UDP)) > return -EINVAL; > > if (asoc) > - return sctp_assoc_ulpevent_type_set(¶m, asoc); > + return sctp_assoc_ulpevent_type_set(param, asoc); > > if (sctp_style(sk, TCP)) > - param.se_assoc_id = SCTP_FUTURE_ASSOC; > + param->se_assoc_id = SCTP_FUTURE_ASSOC; > > - if (param.se_assoc_id == SCTP_FUTURE_ASSOC || > - param.se_assoc_id == SCTP_ALL_ASSOC) > + if (param->se_assoc_id == SCTP_FUTURE_ASSOC || > + param->se_assoc_id == SCTP_ALL_ASSOC) > sctp_ulpevent_type_set(&sp->subscribe, > - param.se_type, param.se_on); > + param->se_type, param->se_on); > > - if (param.se_assoc_id == SCTP_CURRENT_ASSOC || > - param.se_assoc_id == SCTP_ALL_ASSOC) { > + if (param->se_assoc_id == SCTP_CURRENT_ASSOC || > + param->se_assoc_id == SCTP_ALL_ASSOC) { > list_for_each_entry(asoc, &sp->ep->asocs, asocs) { > - int ret = sctp_assoc_ulpevent_type_set(¶m, asoc); > + int ret = sctp_assoc_ulpevent_type_set(param, asoc); > > if (ret && !retval) > retval = ret; > @@ -4334,26 +4311,25 @@ static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param, > > return retval; > } > -#undef param > > static int sctp_setsockopt_asconf_supported(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_association *asoc; > struct sctp_endpoint *ep; > int retval = -EINVAL; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > goto out; > > ep = sctp_sk(sk)->ep; > - ep->asconf_enable = !!params.assoc_value; > + ep->asconf_enable = !!params->assoc_value; > > if (ep->asconf_enable && ep->auth_enable) { > sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF); > @@ -4367,23 +4343,23 @@ static int sctp_setsockopt_asconf_supported(struct sock *sk, > } > > static int sctp_setsockopt_auth_supported(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_association *asoc; > struct sctp_endpoint *ep; > int retval = -EINVAL; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > goto out; > > ep = sctp_sk(sk)->ep; > - if (params.assoc_value) { > + if (params->assoc_value) { > retval = sctp_auth_init(ep, GFP_KERNEL); > if (retval) > goto out; > @@ -4393,7 +4369,7 @@ static int sctp_setsockopt_auth_supported(struct sock *sk, > } > } > > - ep->auth_enable = !!params.assoc_value; > + ep->auth_enable = !!params->assoc_value; > retval = 0; > > out: > @@ -4401,21 +4377,21 @@ static int sctp_setsockopt_auth_supported(struct sock *sk, > } > > static int sctp_setsockopt_ecn_supported(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > goto out; > > - sctp_sk(sk)->ep->ecn_enable = !!params.assoc_value; > + sctp_sk(sk)->ep->ecn_enable = !!params->assoc_value; > retval = 0; > > out: > @@ -4423,33 +4399,32 @@ static int sctp_setsockopt_ecn_supported(struct sock *sk, > } > > static int sctp_setsockopt_pf_expose(struct sock *sk, > - struct sctp_assoc_value params, > + struct sctp_assoc_value *params, > unsigned int optlen) > { > struct sctp_association *asoc; > int retval = -EINVAL; > > - if (optlen != sizeof(params)) > + if (optlen != sizeof(*params)) > goto out; > > - if (params.assoc_value > SCTP_PF_EXPOSE_MAX) > + if (params->assoc_value > SCTP_PF_EXPOSE_MAX) > goto out; > > - asoc = sctp_id2assoc(sk, params.assoc_id); > - if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && > + asoc = sctp_id2assoc(sk, params->assoc_id); > + if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && > sctp_style(sk, UDP)) > goto out; > > if (asoc) > - asoc->pf_expose = params.assoc_value; > + asoc->pf_expose = params->assoc_value; > else > - sctp_sk(sk)->pf_expose = params.assoc_value; > + sctp_sk(sk)->pf_expose = params->assoc_value; > retval = 0; > > out: > return retval; > } > -#undef params > > static int kernel_sctp_setsockopt(struct sock *sk, int optname, void *optval, > int optlen) > -- > 1.8.1.2 > > - > Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK > Registration No: 1397386 (Wales) - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines 2020-05-26 16:44 ` David Laight @ 2020-05-26 22:36 ` David Miller -1 siblings, 0 replies; 11+ messages in thread From: David Miller @ 2020-05-26 22:36 UTC (permalink / raw) To: David.Laight Cc: vyasevich, nhorman, kuba, linux-sctp, netdev, hch, marcelo.leitner From: David Laight <David.Laight@ACULAB.COM> Date: Tue, 26 May 2020 16:44:07 +0000 > This should be 3/8. David just respin this at some point and with this fixed and also the header posting saying "0/8" properly instead of "0/1", this is really messy. Thanks. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines @ 2020-05-26 22:36 ` David Miller 0 siblings, 0 replies; 11+ messages in thread From: David Miller @ 2020-05-26 22:36 UTC (permalink / raw) To: David.Laight Cc: vyasevich, nhorman, kuba, linux-sctp, netdev, hch, marcelo.leitner From: David Laight <David.Laight@ACULAB.COM> Date: Tue, 26 May 2020 16:44:07 +0000 > This should be 3/8. David just respin this at some point and with this fixed and also the header posting saying "0/8" properly instead of "0/1", this is really messy. Thanks. ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines 2020-05-26 22:36 ` David Miller (?) @ 2020-05-27 8:31 ` David Laight -1 siblings, 0 replies; 11+ messages in thread From: David Laight @ 2020-05-27 8:31 UTC (permalink / raw) To: 'David Miller'; +Cc: netdev@vger.kernel.org From: David Miller > Sent: 26 May 2020 23:37 > > This should be 3/8. > > David just respin this at some point and with this fixed and also the > header posting saying "0/8" properly instead of "0/1", this is really > messy. I have to copy patches onto a windows box. Then open them in wordpad so I can cut&paste the tabs into outlook. Then find the correct 'to' address list. It is somewhat too manual and error prone. But I'll fix the masters for the next respin (bound to be one). David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines 2020-05-26 22:36 ` David Miller @ 2020-05-29 16:12 ` Marcelo Ricardo Leitner -1 siblings, 0 replies; 11+ messages in thread From: Marcelo Ricardo Leitner @ 2020-05-29 16:12 UTC (permalink / raw) To: David Miller Cc: David.Laight, vyasevich, nhorman, kuba, linux-sctp, netdev, hch On Tue, May 26, 2020 at 03:36:31PM -0700, David Miller wrote: > From: David Laight <David.Laight@ACULAB.COM> > Date: Tue, 26 May 2020 16:44:07 +0000 > > > This should be 3/8. > > David just respin this at some point and with this fixed and also the > header posting saying "0/8" properly instead of "0/1", this is really > messy. > > Thanks. I don't know why David's workflow is that cumbersome. I'll try to respin this myself, on top of Christoph's latest changes. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines @ 2020-05-29 16:12 ` Marcelo Ricardo Leitner 0 siblings, 0 replies; 11+ messages in thread From: Marcelo Ricardo Leitner @ 2020-05-29 16:12 UTC (permalink / raw) To: David Miller Cc: David.Laight, vyasevich, nhorman, kuba, linux-sctp, netdev, hch On Tue, May 26, 2020 at 03:36:31PM -0700, David Miller wrote: > From: David Laight <David.Laight@ACULAB.COM> > Date: Tue, 26 May 2020 16:44:07 +0000 > > > This should be 3/8. > > David just respin this at some point and with this fixed and also the > header posting saying "0/8" properly instead of "0/1", this is really > messy. > > Thanks. I don't know why David's workflow is that cumbersome. I'll try to respin this myself, on top of Christoph's latest changes. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2020-05-29 16:12 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-05-26 16:39 [PATCH v3 net-next 1/8] sctp: setsockopt, rename some locals David Laight 2020-05-26 16:39 ` David Laight 2020-05-26 16:40 ` [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines David Laight 2020-05-26 16:40 ` David Laight 2020-05-26 16:44 ` David Laight 2020-05-26 16:44 ` David Laight 2020-05-26 22:36 ` David Miller 2020-05-26 22:36 ` David Miller 2020-05-27 8:31 ` David Laight 2020-05-29 16:12 ` Marcelo Ricardo Leitner 2020-05-29 16:12 ` Marcelo Ricardo Leitner
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.