diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/Kconfig | 8 | ||||
-rw-r--r-- | net/ipv4/Makefile | 3 | ||||
-rw-r--r-- | net/ipv4/inet_diag.c | 27 | ||||
-rw-r--r-- | net/ipv4/tcp_diag.c | 54 |
4 files changed, 63 insertions, 29 deletions
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index 019e88d8f29e..e55136ae09f4 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig | |||
@@ -413,8 +413,8 @@ config INET_TUNNEL | |||
413 | 413 | ||
414 | If unsure, say Y. | 414 | If unsure, say Y. |
415 | 415 | ||
416 | config IP_INET_DIAG | 416 | config INET_DIAG |
417 | tristate "IP: INET socket monitoring interface" | 417 | tristate "INET: socket monitoring interface" |
418 | default y | 418 | default y |
419 | ---help--- | 419 | ---help--- |
420 | Support for INET (TCP, DCCP, etc) socket monitoring interface used by | 420 | Support for INET (TCP, DCCP, etc) socket monitoring interface used by |
@@ -423,6 +423,10 @@ config IP_INET_DIAG | |||
423 | 423 | ||
424 | If unsure, say Y. | 424 | If unsure, say Y. |
425 | 425 | ||
426 | config INET_TCP_DIAG | ||
427 | depends on INET_DIAG | ||
428 | def_tristate INET_DIAG | ||
429 | |||
426 | config TCP_CONG_ADVANCED | 430 | config TCP_CONG_ADVANCED |
427 | bool "TCP: advanced congestion control" | 431 | bool "TCP: advanced congestion control" |
428 | ---help--- | 432 | ---help--- |
diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile index fe5accbb56bf..f0435d00db6b 100644 --- a/net/ipv4/Makefile +++ b/net/ipv4/Makefile | |||
@@ -30,8 +30,9 @@ obj-$(CONFIG_IP_ROUTE_MULTIPATH_WRANDOM) += multipath_wrandom.o | |||
30 | obj-$(CONFIG_IP_ROUTE_MULTIPATH_DRR) += multipath_drr.o | 30 | obj-$(CONFIG_IP_ROUTE_MULTIPATH_DRR) += multipath_drr.o |
31 | obj-$(CONFIG_NETFILTER) += netfilter/ | 31 | obj-$(CONFIG_NETFILTER) += netfilter/ |
32 | obj-$(CONFIG_IP_VS) += ipvs/ | 32 | obj-$(CONFIG_IP_VS) += ipvs/ |
33 | obj-$(CONFIG_IP_INET_DIAG) += inet_diag.o | 33 | obj-$(CONFIG_INET_DIAG) += inet_diag.o |
34 | obj-$(CONFIG_IP_ROUTE_MULTIPATH_CACHED) += multipath.o | 34 | obj-$(CONFIG_IP_ROUTE_MULTIPATH_CACHED) += multipath.o |
35 | obj-$(CONFIG_INET_TCP_DIAG) += tcp_diag.o | ||
35 | obj-$(CONFIG_TCP_CONG_BIC) += tcp_bic.o | 36 | obj-$(CONFIG_TCP_CONG_BIC) += tcp_bic.o |
36 | obj-$(CONFIG_TCP_CONG_WESTWOOD) += tcp_westwood.o | 37 | obj-$(CONFIG_TCP_CONG_WESTWOOD) += tcp_westwood.o |
37 | obj-$(CONFIG_TCP_CONG_HSTCP) += tcp_highspeed.o | 38 | obj-$(CONFIG_TCP_CONG_HSTCP) += tcp_highspeed.o |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 3bd510941da0..1880ad8575d8 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -797,25 +797,6 @@ static void inet_diag_rcv(struct sock *sk, int len) | |||
797 | } | 797 | } |
798 | } | 798 | } |
799 | 799 | ||
800 | static void tcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, | ||
801 | void *_info) | ||
802 | { | ||
803 | const struct tcp_sock *tp = tcp_sk(sk); | ||
804 | struct tcp_info *info = _info; | ||
805 | |||
806 | r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq; | ||
807 | r->idiag_wqueue = tp->write_seq - tp->snd_una; | ||
808 | if (info != NULL) | ||
809 | tcp_get_info(sk, info); | ||
810 | } | ||
811 | |||
812 | static struct inet_diag_handler tcp_diag_handler = { | ||
813 | .idiag_hashinfo = &tcp_hashinfo, | ||
814 | .idiag_get_info = tcp_diag_get_info, | ||
815 | .idiag_type = TCPDIAG_GETSOCK, | ||
816 | .idiag_info_size = sizeof(struct tcp_info), | ||
817 | }; | ||
818 | |||
819 | static DEFINE_SPINLOCK(inet_diag_register_lock); | 800 | static DEFINE_SPINLOCK(inet_diag_register_lock); |
820 | 801 | ||
821 | int inet_diag_register(const struct inet_diag_handler *h) | 802 | int inet_diag_register(const struct inet_diag_handler *h) |
@@ -864,19 +845,13 @@ static int __init inet_diag_init(void) | |||
864 | goto out; | 845 | goto out; |
865 | 846 | ||
866 | memset(inet_diag_table, 0, inet_diag_table_size); | 847 | memset(inet_diag_table, 0, inet_diag_table_size); |
867 | |||
868 | idiagnl = netlink_kernel_create(NETLINK_INET_DIAG, inet_diag_rcv, | 848 | idiagnl = netlink_kernel_create(NETLINK_INET_DIAG, inet_diag_rcv, |
869 | THIS_MODULE); | 849 | THIS_MODULE); |
870 | if (idiagnl == NULL) | 850 | if (idiagnl == NULL) |
871 | goto out_free_table; | 851 | goto out_free_table; |
872 | 852 | err = 0; | |
873 | err = inet_diag_register(&tcp_diag_handler); | ||
874 | if (err) | ||
875 | goto out_sock_release; | ||
876 | out: | 853 | out: |
877 | return err; | 854 | return err; |
878 | out_sock_release: | ||
879 | sock_release(idiagnl->sk_socket); | ||
880 | out_free_table: | 855 | out_free_table: |
881 | kfree(inet_diag_table); | 856 | kfree(inet_diag_table); |
882 | goto out; | 857 | goto out; |
diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c new file mode 100644 index 000000000000..c148c1081880 --- /dev/null +++ b/net/ipv4/tcp_diag.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * tcp_diag.c Module for monitoring TCP transport protocols sockets. | ||
3 | * | ||
4 | * Version: $Id: tcp_diag.c,v 1.3 2002/02/01 22:01:04 davem Exp $ | ||
5 | * | ||
6 | * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/inet_diag.h> | ||
18 | |||
19 | #include <linux/tcp.h> | ||
20 | |||
21 | #include <net/tcp.h> | ||
22 | |||
23 | static void tcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, | ||
24 | void *_info) | ||
25 | { | ||
26 | const struct tcp_sock *tp = tcp_sk(sk); | ||
27 | struct tcp_info *info = _info; | ||
28 | |||
29 | r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq; | ||
30 | r->idiag_wqueue = tp->write_seq - tp->snd_una; | ||
31 | if (info != NULL) | ||
32 | tcp_get_info(sk, info); | ||
33 | } | ||
34 | |||
35 | static struct inet_diag_handler tcp_diag_handler = { | ||
36 | .idiag_hashinfo = &tcp_hashinfo, | ||
37 | .idiag_get_info = tcp_diag_get_info, | ||
38 | .idiag_type = TCPDIAG_GETSOCK, | ||
39 | .idiag_info_size = sizeof(struct tcp_info), | ||
40 | }; | ||
41 | |||
42 | static int __init tcp_diag_init(void) | ||
43 | { | ||
44 | return inet_diag_register(&tcp_diag_handler); | ||
45 | } | ||
46 | |||
47 | static void __exit tcp_diag_exit(void) | ||
48 | { | ||
49 | inet_diag_unregister(&tcp_diag_handler); | ||
50 | } | ||
51 | |||
52 | module_init(tcp_diag_init); | ||
53 | module_exit(tcp_diag_exit); | ||
54 | MODULE_LICENSE("GPL"); | ||