| 368 | } |
| 369 | |
| 370 | bool FlowControllerImpl::SetFlowLimit(int ns, FlowType type, int64_t lower, int64_t upper) { |
| 371 | log_debug("set(or get) flow limit bound, ns %d; type %s; lower %ld; upper %ld", |
| 372 | ns, FlowTypeStr(type), lower, upper); |
| 373 | if (lower < -1 || upper < -1) { |
| 374 | log_error("invliad flow limit parameter, lower %ld; upper %ld", lower, upper); |
| 375 | return false; |
| 376 | } |
| 377 | if (ns == -1) { |
| 378 | bool success = true; |
| 379 | for (size_t i = 0; i < MAXAREA; ++i) |
| 380 | if (SetFlowLimit(i, type, lower, upper) == false) |
| 381 | success = false; |
| 382 | return success; |
| 383 | } else { |
| 384 | FlowLimit limit = GetFlowLimit(ns, type); |
| 385 | if (upper != -1) |
| 386 | limit.upper = upper; |
| 387 | if (lower != -1) |
| 388 | limit.lower = lower; |
| 389 | |
| 390 | if (limit.lower > limit.upper) { |
| 391 | log_error("%ld > %ld is invalid", limit.lower, limit.upper); |
| 392 | return false; |
| 393 | } |
| 394 | |
| 395 | if (ns < 0 || ns > MAXAREA) ns = MAXAREA; |
| 396 | switch (type) { |
| 397 | case IN: |
| 398 | if (lower >= 0) |
| 399 | flows_[ns].in.lower_bound = lower; |
| 400 | if (upper >= 0) |
| 401 | flows_[ns].in.upper_bound = upper; |
| 402 | break; |
| 403 | case OUT: |
| 404 | if (lower >= 0) |
| 405 | flows_[ns].out.lower_bound = lower; |
| 406 | if (upper >= 0) |
| 407 | flows_[ns].out.upper_bound = upper; |
| 408 | break; |
| 409 | case OPS: |
| 410 | if (lower >= 0) |
| 411 | flows_[ns].ops.lower_bound = lower; |
| 412 | if (upper >= 0) |
| 413 | flows_[ns].ops.upper_bound = upper; |
| 414 | break; |
| 415 | default: |
| 416 | log_error("unknow type %d", type); |
| 417 | break; |
| 418 | } |
| 419 | } |
| 420 | return true; |
| 421 | } |
| 422 | |
| 423 | void FlowControllerImpl::SetAreaFlowPolicy(int ns, bool flag) { |
| 424 | area_flow_policy_.set(ns, flag); |
no test coverage detected