|
@@ -10,6 +10,8 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/module.h>
|
|
|
+#include <linux/net.h>
|
|
|
+#include <linux/sock_diag.h>
|
|
|
#include <linux/inet_diag.h>
|
|
|
|
|
|
#include <linux/tcp.h>
|
|
@@ -46,12 +48,29 @@ static int tcp_diag_dump_one(struct sk_buff *in_skb, const struct nlmsghdr *nlh,
|
|
|
return inet_diag_dump_one_icsk(&tcp_hashinfo, in_skb, nlh, req);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_INET_DIAG_DESTROY
|
|
|
+static int tcp_diag_destroy(struct sk_buff *in_skb,
|
|
|
+ const struct inet_diag_req_v2 *req)
|
|
|
+{
|
|
|
+ struct net *net = sock_net(in_skb->sk);
|
|
|
+ struct sock *sk = inet_diag_find_one_icsk(net, &tcp_hashinfo, req);
|
|
|
+
|
|
|
+ if (IS_ERR(sk))
|
|
|
+ return PTR_ERR(sk);
|
|
|
+
|
|
|
+ return sock_diag_destroy(sk, ECONNABORTED);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static const struct inet_diag_handler tcp_diag_handler = {
|
|
|
.dump = tcp_diag_dump,
|
|
|
.dump_one = tcp_diag_dump_one,
|
|
|
.idiag_get_info = tcp_diag_get_info,
|
|
|
.idiag_type = IPPROTO_TCP,
|
|
|
.idiag_info_size = sizeof(struct tcp_info),
|
|
|
+#ifdef CONFIG_INET_DIAG_DESTROY
|
|
|
+ .destroy = tcp_diag_destroy,
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
static int __init tcp_diag_init(void)
|