+ case TCP_MEASURE_SND_BW:
+ error = sooptcopyin(sopt, &optval, sizeof optval,
+ sizeof optval);
+ if (error)
+ break;
+ opt = TF_MEASURESNDBW;
+ if (optval) {
+ if (tp->t_bwmeas == NULL) {
+ tp->t_bwmeas = tcp_bwmeas_alloc(tp);
+ if (tp->t_bwmeas == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ }
+ tp->t_flagsext |= opt;
+ } else {
+ tp->t_flagsext &= ~opt;
+ /* Reset snd bw measurement state */
+ tp->t_flagsext &= ~(TF_BWMEAS_INPROGRESS);
+ if (tp->t_bwmeas != NULL) {
+ tcp_bwmeas_free(tp);
+ }
+ }
+ break;
+ case TCP_MEASURE_BW_BURST: {
+ struct tcp_measure_bw_burst in;
+ uint32_t minpkts, maxpkts;
+ bzero(&in, sizeof(in));
+
+ error = sooptcopyin(sopt, &in, sizeof(in),
+ sizeof(in));
+ if (error)
+ break;
+ if ((tp->t_flagsext & TF_MEASURESNDBW) == 0 ||
+ tp->t_bwmeas == NULL) {
+ error = EINVAL;
+ break;
+ }
+ minpkts = (in.min_burst_size != 0) ? in.min_burst_size :
+ tp->t_bwmeas->bw_minsizepkts;
+ maxpkts = (in.max_burst_size != 0) ? in.max_burst_size :
+ tp->t_bwmeas->bw_maxsizepkts;
+ if (minpkts > maxpkts) {
+ error = EINVAL;
+ break;
+ }
+ tp->t_bwmeas->bw_minsizepkts = minpkts;
+ tp->t_bwmeas->bw_maxsizepkts = maxpkts;
+ tp->t_bwmeas->bw_minsize = (minpkts * tp->t_maxseg);
+ tp->t_bwmeas->bw_maxsize = (maxpkts * tp->t_maxseg);
+ break;
+ }