diff options
| author | Andi Kleen <ak@linux.intel.com> | 2008-07-21 18:16:54 -0400 |
|---|---|---|
| committer | Andi Kleen <ak@linux.intel.com> | 2008-07-21 18:16:54 -0400 |
| commit | 8294fafdafc602ed11f401c44628fab8558c5cf5 (patch) | |
| tree | c8d0371cfd05226b56d52bfde9c69f8caca4501d /net/sctp/proc.c | |
| parent | 725c3a2d70f958adee807c178178819a50f68a56 (diff) | |
| parent | bf20e740a4bcc686de02e2fd1c1810a58872f46e (diff) | |
Merge branch 'for-upstream/acpi-test' of git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6 into release-2.6.27
Diffstat (limited to 'net/sctp/proc.c')
| -rw-r--r-- | net/sctp/proc.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/net/sctp/proc.c b/net/sctp/proc.c index 0aba759cb9b7..5dd89831eceb 100644 --- a/net/sctp/proc.c +++ b/net/sctp/proc.c | |||
| @@ -383,3 +383,144 @@ void sctp_assocs_proc_exit(void) | |||
| 383 | { | 383 | { |
| 384 | remove_proc_entry("assocs", proc_net_sctp); | 384 | remove_proc_entry("assocs", proc_net_sctp); |
| 385 | } | 385 | } |
| 386 | |||
| 387 | static void *sctp_remaddr_seq_start(struct seq_file *seq, loff_t *pos) | ||
| 388 | { | ||
| 389 | if (*pos >= sctp_assoc_hashsize) | ||
| 390 | return NULL; | ||
| 391 | |||
| 392 | if (*pos < 0) | ||
| 393 | *pos = 0; | ||
| 394 | |||
| 395 | if (*pos == 0) | ||
| 396 | seq_printf(seq, "ADDR ASSOC_ID HB_ACT RTO MAX_PATH_RTX " | ||
| 397 | "REM_ADDR_RTX START\n"); | ||
| 398 | |||
| 399 | return (void *)pos; | ||
| 400 | } | ||
| 401 | |||
| 402 | static void *sctp_remaddr_seq_next(struct seq_file *seq, void *v, loff_t *pos) | ||
| 403 | { | ||
| 404 | if (++*pos >= sctp_assoc_hashsize) | ||
| 405 | return NULL; | ||
| 406 | |||
| 407 | return pos; | ||
| 408 | } | ||
| 409 | |||
| 410 | static void sctp_remaddr_seq_stop(struct seq_file *seq, void *v) | ||
| 411 | { | ||
| 412 | return; | ||
| 413 | } | ||
| 414 | |||
| 415 | static int sctp_remaddr_seq_show(struct seq_file *seq, void *v) | ||
| 416 | { | ||
| 417 | struct sctp_hashbucket *head; | ||
| 418 | struct sctp_ep_common *epb; | ||
| 419 | struct sctp_association *assoc; | ||
| 420 | struct hlist_node *node; | ||
| 421 | struct sctp_transport *tsp; | ||
| 422 | int hash = *(loff_t *)v; | ||
| 423 | |||
| 424 | if (hash >= sctp_assoc_hashsize) | ||
| 425 | return -ENOMEM; | ||
| 426 | |||
| 427 | head = &sctp_assoc_hashtable[hash]; | ||
| 428 | sctp_local_bh_disable(); | ||
| 429 | read_lock(&head->lock); | ||
| 430 | sctp_for_each_hentry(epb, node, &head->chain) { | ||
| 431 | assoc = sctp_assoc(epb); | ||
| 432 | list_for_each_entry(tsp, &assoc->peer.transport_addr_list, | ||
| 433 | transports) { | ||
| 434 | /* | ||
| 435 | * The remote address (ADDR) | ||
| 436 | */ | ||
| 437 | tsp->af_specific->seq_dump_addr(seq, &tsp->ipaddr); | ||
| 438 | seq_printf(seq, " "); | ||
| 439 | |||
| 440 | /* | ||
| 441 | * The association ID (ASSOC_ID) | ||
| 442 | */ | ||
| 443 | seq_printf(seq, "%d ", tsp->asoc->assoc_id); | ||
| 444 | |||
| 445 | /* | ||
| 446 | * If the Heartbeat is active (HB_ACT) | ||
| 447 | * Note: 1 = Active, 0 = Inactive | ||
| 448 | */ | ||
| 449 | seq_printf(seq, "%d ", timer_pending(&tsp->hb_timer)); | ||
| 450 | |||
| 451 | /* | ||
| 452 | * Retransmit time out (RTO) | ||
| 453 | */ | ||
| 454 | seq_printf(seq, "%lu ", tsp->rto); | ||
| 455 | |||
| 456 | /* | ||
| 457 | * Maximum path retransmit count (PATH_MAX_RTX) | ||
| 458 | */ | ||
| 459 | seq_printf(seq, "%d ", tsp->pathmaxrxt); | ||
| 460 | |||
| 461 | /* | ||
| 462 | * remote address retransmit count (REM_ADDR_RTX) | ||
| 463 | * Note: We don't have a way to tally this at the moment | ||
| 464 | * so lets just leave it as zero for the moment | ||
| 465 | */ | ||
| 466 | seq_printf(seq, "0 "); | ||
| 467 | |||
| 468 | /* | ||
| 469 | * remote address start time (START). This is also not | ||
| 470 | * currently implemented, but we can record it with a | ||
| 471 | * jiffies marker in a subsequent patch | ||
| 472 | */ | ||
| 473 | seq_printf(seq, "0"); | ||
| 474 | |||
| 475 | seq_printf(seq, "\n"); | ||
| 476 | } | ||
| 477 | } | ||
| 478 | |||
| 479 | read_unlock(&head->lock); | ||
| 480 | sctp_local_bh_enable(); | ||
| 481 | |||
| 482 | return 0; | ||
| 483 | |||
| 484 | } | ||
| 485 | |||
| 486 | static const struct seq_operations sctp_remaddr_ops = { | ||
| 487 | .start = sctp_remaddr_seq_start, | ||
| 488 | .next = sctp_remaddr_seq_next, | ||
| 489 | .stop = sctp_remaddr_seq_stop, | ||
| 490 | .show = sctp_remaddr_seq_show, | ||
| 491 | }; | ||
| 492 | |||
| 493 | /* Cleanup the proc fs entry for 'remaddr' object. */ | ||
| 494 | void sctp_remaddr_proc_exit(void) | ||
| 495 | { | ||
| 496 | remove_proc_entry("remaddr", proc_net_sctp); | ||
| 497 | } | ||
| 498 | |||
| 499 | static int sctp_remaddr_seq_open(struct inode *inode, struct file *file) | ||
| 500 | { | ||
| 501 | return seq_open(file, &sctp_remaddr_ops); | ||
| 502 | } | ||
| 503 | |||
| 504 | static const struct file_operations sctp_remaddr_seq_fops = { | ||
| 505 | .open = sctp_remaddr_seq_open, | ||
| 506 | .read = seq_read, | ||
| 507 | .llseek = seq_lseek, | ||
| 508 | .release = seq_release, | ||
| 509 | }; | ||
| 510 | |||
| 511 | int __init sctp_remaddr_proc_init(void) | ||
| 512 | { | ||
| 513 | struct proc_dir_entry *p; | ||
| 514 | |||
| 515 | p = create_proc_entry("remaddr", S_IRUGO, proc_net_sctp); | ||
| 516 | if (!p) | ||
| 517 | return -ENOMEM; | ||
| 518 | p->proc_fops = &sctp_remaddr_seq_fops; | ||
| 519 | |||
| 520 | return 0; | ||
| 521 | } | ||
| 522 | |||
| 523 | void sctp_assoc_proc_exit(void) | ||
| 524 | { | ||
| 525 | remove_proc_entry("remaddr", proc_net_sctp); | ||
| 526 | } | ||
