summaryrefslogtreecommitdiffstats
path: root/sys/netinet/sctp_sysctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/sctp_sysctl.c')
-rw-r--r--sys/netinet/sctp_sysctl.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/sys/netinet/sctp_sysctl.c b/sys/netinet/sctp_sysctl.c
index 89e348a..1d97e34 100644
--- a/sys/netinet/sctp_sysctl.c
+++ b/sys/netinet/sctp_sysctl.c
@@ -636,17 +636,26 @@ sctp_sysctl_handle_stats(SYSCTL_HANDLER_ARGS)
int error;
#if defined(SMP) && defined(SCTP_USE_PERCPU_STAT)
+ struct sctpstat sb_temp;
+ struct sctpstat *sarry;
+ struct sctpstat sb;
int cpu;
- struct sctpstat sb, *sarry;
-
#endif
if ((req->newptr != NULL) &&
(req->newlen != sizeof(struct sctpstat))) {
return (EINVAL);
}
+
#if defined(SMP) && defined(SCTP_USE_PERCPU_STAT)
- memset(&sb, 0, sizeof(struct sctpstat));
+ memset(&sb, 0, sizeof(sb));
+ memset(&sb_temp, 0, sizeof(sb_temp));
+
+ if (req->newptr != NULL) {
+ error = SYSCTL_IN(req, &sb_temp, sizeof(sb_temp));
+ if (error != 0)
+ return (error);
+ }
for (cpu = 0; cpu < mp_maxid; cpu++) {
sarry = &SCTP_BASE_STATS[cpu];
if (sarry->sctps_discontinuitytime.tv_sec > sb.sctps_discontinuitytime.tv_sec) {
@@ -774,12 +783,14 @@ sctp_sysctl_handle_stats(SYSCTL_HANDLER_ARGS)
sb.sctps_send_burst_avoid += sarry->sctps_send_burst_avoid;
sb.sctps_send_cwnd_avoid += sarry->sctps_send_cwnd_avoid;
sb.sctps_fwdtsn_map_over += sarry->sctps_fwdtsn_map_over;
- if (req->newptr != NULL) {
- memcpy(sarry, req->newptr, sizeof(struct sctpstat));
- }
+ if (req->newptr != NULL)
+ memcpy(sarry, &sb_temp, sizeof(struct sctpstat));
}
error = SYSCTL_OUT(req, &sb, sizeof(struct sctpstat));
#else
+ error = SYSCTL_IN(req, &SCTP_BASE_STATS, sizeof(struct sctpstat));
+ if (error)
+ return (error);
error = SYSCTL_OUT(req, &SCTP_BASE_STATS, sizeof(struct sctpstat));
#endif
return (error);
OpenPOWER on IntegriCloud