diff options
| author | David S. Miller <davem@davemloft.net> | 2016-04-15 17:29:37 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-04-15 17:29:37 -0400 |
| commit | 4e811b1e11d5bc9e25ca1a30ce6654add2b571e3 (patch) | |
| tree | d8a03375bdd9433670e8d16db957462a480c83fa /include | |
| parent | 311b21774f1389f9c34eac4da90c43c95fc2b62b (diff) | |
| parent | 53fa10369c45a51947f06e8b622d2fa2cc64fda1 (diff) | |
Merge branch 'sctp-diag'
Xin Long says:
====================
sctp: support sctp_diag in kernel
This patchset will add sctp_diag module to implement diag interface on
sctp in kernel.
For a listening sctp endpoint, we will just dump it's ep info.
For a sctp connection, we will the assoc info and it's ep info.
The ss dump will looks like:
[iproute2]# ./misc/ss --sctp -n -l
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.16.254.254:8888 *:*
LISTEN 0 5 127.0.0.1:1234 *:*
LISTEN 0 5 127.0.0.1:1234 *:*
- ESTAB 0 0 127.0.0.1%lo:1234 127.0.0.1:4321
LISTEN 0 128 172.16.254.254:8888 *:*
- ESTAB 0 0 172.16.254.254%eth1:8888 172.16.253.253:8888
- ESTAB 0 0 172.16.254.254%eth1:8888 172.16.1.1:8888
- ESTAB 0 0 172.16.254.254%eth1:8888 172.16.1.2:8888
- ESTAB 0 0 172.16.254.254%eth1:8888 172.16.2.1:8888
- ESTAB 0 0 172.16.254.254%eth1:8888 172.16.2.2:8888
- ESTAB 0 0 172.16.254.254%eth1:8888 172.16.3.1:8888
- ESTAB 0 0 172.16.254.254%eth1:8888 172.16.3.2:8888
LISTEN 0 0 127.0.0.1:4321 *:*
- ESTAB 0 0 127.0.0.1%lo:4321 127.0.0.1:1234
The entries with '- ESTAB' are the assocs, some of them may belong to
the same endpoint. So we will dump the parent endpoint first, like the
entry with 'LISTEN'. then dump the assocs. ep and assocs entries will
be dumped in right order so that ss can show them in tree format easily.
Besides, this patchset also simplifies sctp proc codes, cause it has
some similar codes with sctp diag in sctp transport traversal.
v1->v2:
1. inet_diag_get_handler needs to return it as const.
2. merge 5/7 into 2/7 of v1.
v2->v3:
do some improvements and fixes in patch 1-4, see the details in
each patch's comment.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/sctp.h | 67 | ||||
| -rw-r--r-- | include/net/sctp/sctp.h | 16 | ||||
| -rw-r--r-- | include/uapi/linux/inet_diag.h | 2 |
3 files changed, 85 insertions, 0 deletions
diff --git a/include/linux/sctp.h b/include/linux/sctp.h index a9414fd49dc6..dacb5e711994 100644 --- a/include/linux/sctp.h +++ b/include/linux/sctp.h @@ -705,4 +705,71 @@ typedef struct sctp_auth_chunk { sctp_authhdr_t auth_hdr; } __packed sctp_auth_chunk_t; +struct sctp_info { + __u32 sctpi_tag; + __u32 sctpi_state; + __u32 sctpi_rwnd; + __u16 sctpi_unackdata; + __u16 sctpi_penddata; + __u16 sctpi_instrms; + __u16 sctpi_outstrms; + __u32 sctpi_fragmentation_point; + __u32 sctpi_inqueue; + __u32 sctpi_outqueue; + __u32 sctpi_overall_error; + __u32 sctpi_max_burst; + __u32 sctpi_maxseg; + __u32 sctpi_peer_rwnd; + __u32 sctpi_peer_tag; + __u8 sctpi_peer_capable; + __u8 sctpi_peer_sack; + __u16 __reserved1; + + /* assoc status info */ + __u64 sctpi_isacks; + __u64 sctpi_osacks; + __u64 sctpi_opackets; + __u64 sctpi_ipackets; + __u64 sctpi_rtxchunks; + __u64 sctpi_outofseqtsns; + __u64 sctpi_idupchunks; + __u64 sctpi_gapcnt; + __u64 sctpi_ouodchunks; + __u64 sctpi_iuodchunks; + __u64 sctpi_oodchunks; + __u64 sctpi_iodchunks; + __u64 sctpi_octrlchunks; + __u64 sctpi_ictrlchunks; + + /* primary transport info */ + struct sockaddr_storage sctpi_p_address; + __s32 sctpi_p_state; + __u32 sctpi_p_cwnd; + __u32 sctpi_p_srtt; + __u32 sctpi_p_rto; + __u32 sctpi_p_hbinterval; + __u32 sctpi_p_pathmaxrxt; + __u32 sctpi_p_sackdelay; + __u32 sctpi_p_sackfreq; + __u32 sctpi_p_ssthresh; + __u32 sctpi_p_partial_bytes_acked; + __u32 sctpi_p_flight_size; + __u16 sctpi_p_error; + __u16 __reserved2; + + /* sctp sock info */ + __u32 sctpi_s_autoclose; + __u32 sctpi_s_adaptation_ind; + __u32 sctpi_s_pd_point; + __u8 sctpi_s_nodelay; + __u8 sctpi_s_disable_fragments; + __u8 sctpi_s_v4mapped; + __u8 sctpi_s_frag_interleave; +}; + +struct sctp_infox { + struct sctp_info *sctpinfo; + struct sctp_association *asoc; +}; + #endif /* __LINUX_SCTP_H__ */ diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 978d5f67d5a7..3f1c0ff7d4b6 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -116,6 +116,22 @@ extern struct percpu_counter sctp_sockets_allocated; int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *); struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *); +int sctp_transport_walk_start(struct rhashtable_iter *iter); +void sctp_transport_walk_stop(struct rhashtable_iter *iter); +struct sctp_transport *sctp_transport_get_next(struct net *net, + struct rhashtable_iter *iter); +struct sctp_transport *sctp_transport_get_idx(struct net *net, + struct rhashtable_iter *iter, int pos); +int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *), + struct net *net, + const union sctp_addr *laddr, + const union sctp_addr *paddr, void *p); +int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *), + struct net *net, int pos, void *p); +int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *), void *p); +int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc, + struct sctp_info *info); + /* * sctp/primitive.c */ diff --git a/include/uapi/linux/inet_diag.h b/include/uapi/linux/inet_diag.h index 68a1f71fde9f..f5f3629dd553 100644 --- a/include/uapi/linux/inet_diag.h +++ b/include/uapi/linux/inet_diag.h @@ -113,6 +113,8 @@ enum { INET_DIAG_DCTCPINFO, INET_DIAG_PROTOCOL, /* response attribute only */ INET_DIAG_SKV6ONLY, + INET_DIAG_LOCALS, + INET_DIAG_PEERS, }; #define INET_DIAG_MAX INET_DIAG_SKV6ONLY |
