--- /usr/src/linux/net/sctp/proc.c 2005-03-02 08:38:37.000000000 +0100 +++ /mnt/isjfs_home/root/proc.c 2005-05-16 18:00:55.000000000 +0200 @@ -128,6 +128,23 @@ remove_proc_entry("snmp", proc_net_sctp); } +/* Dump primary local addresses of an endpoint. */ +static void sctp_seq_dump_primary_local_addr(struct seq_file *seq, struct sctp_ep_common *epb) +{ + struct list_head *pos; + struct sctp_sockaddr_entry *laddr; + union sctp_addr *addr; + struct sctp_af *af; + + list_for_each(pos, &epb->bind_addr.address_list) { + laddr = list_entry(pos, struct sctp_sockaddr_entry, list); + addr = (union sctp_addr *)&laddr->a; + af = sctp_get_af_specific(addr->sa.sa_family); + af->seq_dump_addr(seq, addr); + break; + } +} + /* Dump local addresses of an association/endpoint. */ static void sctp_seq_dump_local_addrs(struct seq_file *seq, struct sctp_ep_common *epb) { @@ -169,16 +186,22 @@ struct sock *sk; int hash; - seq_printf(seq, " ENDPT SOCK STY SST HBKT LPORT LADDRS\n"); + seq_printf(seq, " ENDPT SOCK STY SST HBKT LPORT uid inode pladdr LADDRS\n"); for (hash = 0; hash < sctp_ep_hashsize; hash++) { head = &sctp_ep_hashtable[hash]; read_lock(&head->lock); for (epb = head->chain; epb; epb = epb->next) { ep = sctp_ep(epb); sk = epb->sk; - seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d ", ep, sk, + seq_printf(seq, "%8p %8p %-3d %-3d %-4d %-5d %5d %5lu ", ep, sk, sctp_sk(sk)->type, sk->sk_state, hash, - epb->bind_addr.port); + epb->bind_addr.port, + sock_i_uid(sk), sock_i_ino(sk)); + + /* print primary local address */ + sctp_seq_dump_primary_local_addr(seq, epb); + seq_printf(seq, " "); + sctp_seq_dump_local_addrs(seq, epb); seq_printf(seq, "\n"); } @@ -229,9 +252,11 @@ struct sctp_association *assoc; struct sock *sk; int hash; + struct sctp_af *af; + union sctp_addr *addr; - seq_printf(seq, " ASSOC SOCK STY SST ST HBKT LPORT RPORT " - "LADDRS <-> RADDRS\n"); + seq_printf(seq, " ASSOC SOCK STY SST ST HBKT tx_queue rx_queue uid inode LPORT RPORT " + "pladdr praddr LADDRS <-> RADDRS\n"); for (hash = 0; hash < sctp_assoc_hashsize; hash++) { head = &sctp_assoc_hashtable[hash]; read_lock(&head->lock); @@ -239,10 +264,25 @@ assoc = sctp_assoc(epb); sk = epb->sk; seq_printf(seq, - "%8p %8p %-3d %-3d %-2d %-4d %-5d %-5d ", + "%8p %8p %-3d %-3d %-2d %-4d %8d %8d %3d %5lu %-5d %5d ", assoc, sk, sctp_sk(sk)->type, sk->sk_state, - assoc->state, hash, epb->bind_addr.port, + assoc->state, hash, + (sk->sk_rcvbuf - assoc->rwnd), + assoc->sndbuf_used, + sock_i_uid(sk), sock_i_ino(sk), + epb->bind_addr.port, assoc->peer.port); + + /* print primary local address */ + sctp_seq_dump_primary_local_addr(seq, epb); + seq_printf(seq, " "); + + /* print primary remote address */ + addr = &(assoc->peer.primary_addr); + af = sctp_get_af_specific(addr->sa.sa_family); + af->seq_dump_addr(seq, addr); + seq_printf(seq, " "); + sctp_seq_dump_local_addrs(seq, epb); seq_printf(seq, "<-> "); sctp_seq_dump_remote_addrs(seq, assoc);