Loading include/linux/inet_diag.h +9 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #include <uapi/linux/inet_diag.h> struct net; struct sock; struct inet_hashinfo; struct nlattr; Loading @@ -23,6 +24,10 @@ struct inet_diag_handler { void (*idiag_get_info)(struct sock *sk, struct inet_diag_msg *r, void *info); int (*destroy)(struct sk_buff *in_skb, struct inet_diag_req_v2 *req); __u16 idiag_type; }; Loading @@ -39,6 +44,10 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, const struct nlmsghdr *nlh, struct inet_diag_req_v2 *req); struct sock *inet_diag_find_one_icsk(struct net *net, struct inet_hashinfo *hashinfo, struct inet_diag_req_v2 *req); int inet_diag_bc_sk(const struct nlattr *_bc, struct sock *sk); extern int inet_diag_register(const struct inet_diag_handler *handler); Loading include/linux/sock_diag.h +2 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ struct sock; struct sock_diag_handler { __u8 family; int (*dump)(struct sk_buff *skb, struct nlmsghdr *nlh); int (*destroy)(struct sk_buff *skb, struct nlmsghdr *nlh); }; int sock_diag_register(const struct sock_diag_handler *h); Loading @@ -26,4 +27,5 @@ int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr); int sock_diag_put_filterinfo(bool may_report_filterinfo, struct sock *sk, struct sk_buff *skb, int attrtype); int sock_diag_destroy(struct sock *sk, int err); #endif include/net/sock.h +1 −0 Original line number Diff line number Diff line Loading @@ -1049,6 +1049,7 @@ struct proto { void (*destroy_cgroup)(struct mem_cgroup *memcg); struct cg_proto *(*proto_cgroup)(struct mem_cgroup *memcg); #endif int (*diag_destroy)(struct sock *sk, int err); }; /* Loading include/uapi/linux/sock_diag.h +1 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ #include <linux/types.h> #define SOCK_DIAG_BY_FAMILY 20 #define SOCK_DESTROY_BACKPORT 21 struct sock_diag_req { __u8 sdiag_family; Loading net/core/sock_diag.c +20 −3 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ void sock_diag_unregister(const struct sock_diag_handler *hnld) } EXPORT_SYMBOL_GPL(sock_diag_unregister); static int __sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) static int __sock_diag_cmd(struct sk_buff *skb, struct nlmsghdr *nlh) { int err; struct sock_diag_req *req = nlmsg_data(nlh); Loading @@ -152,8 +152,12 @@ static int __sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) hndl = sock_diag_handlers[req->sdiag_family]; if (hndl == NULL) err = -ENOENT; else else if (nlh->nlmsg_type == SOCK_DIAG_BY_FAMILY) err = hndl->dump(skb, nlh); else if (nlh->nlmsg_type == SOCK_DESTROY_BACKPORT && hndl->destroy) err = hndl->destroy(skb, nlh); else err = -EOPNOTSUPP; mutex_unlock(&sock_diag_table_mutex); return err; Loading @@ -179,7 +183,8 @@ static int sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) return ret; case SOCK_DIAG_BY_FAMILY: return __sock_diag_rcv_msg(skb, nlh); case SOCK_DESTROY_BACKPORT: return __sock_diag_cmd(skb, nlh); default: return -EINVAL; } Loading @@ -194,6 +199,18 @@ static void sock_diag_rcv(struct sk_buff *skb) mutex_unlock(&sock_diag_mutex); } int sock_diag_destroy(struct sock *sk, int err) { if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) return -EPERM; if (!sk->sk_prot->diag_destroy) return -EOPNOTSUPP; return sk->sk_prot->diag_destroy(sk, err); } EXPORT_SYMBOL_GPL(sock_diag_destroy); static int __net_init diag_net_init(struct net *net) { struct netlink_kernel_cfg cfg = { Loading Loading
include/linux/inet_diag.h +9 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #include <uapi/linux/inet_diag.h> struct net; struct sock; struct inet_hashinfo; struct nlattr; Loading @@ -23,6 +24,10 @@ struct inet_diag_handler { void (*idiag_get_info)(struct sock *sk, struct inet_diag_msg *r, void *info); int (*destroy)(struct sk_buff *in_skb, struct inet_diag_req_v2 *req); __u16 idiag_type; }; Loading @@ -39,6 +44,10 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, const struct nlmsghdr *nlh, struct inet_diag_req_v2 *req); struct sock *inet_diag_find_one_icsk(struct net *net, struct inet_hashinfo *hashinfo, struct inet_diag_req_v2 *req); int inet_diag_bc_sk(const struct nlattr *_bc, struct sock *sk); extern int inet_diag_register(const struct inet_diag_handler *handler); Loading
include/linux/sock_diag.h +2 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ struct sock; struct sock_diag_handler { __u8 family; int (*dump)(struct sk_buff *skb, struct nlmsghdr *nlh); int (*destroy)(struct sk_buff *skb, struct nlmsghdr *nlh); }; int sock_diag_register(const struct sock_diag_handler *h); Loading @@ -26,4 +27,5 @@ int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr); int sock_diag_put_filterinfo(bool may_report_filterinfo, struct sock *sk, struct sk_buff *skb, int attrtype); int sock_diag_destroy(struct sock *sk, int err); #endif
include/net/sock.h +1 −0 Original line number Diff line number Diff line Loading @@ -1049,6 +1049,7 @@ struct proto { void (*destroy_cgroup)(struct mem_cgroup *memcg); struct cg_proto *(*proto_cgroup)(struct mem_cgroup *memcg); #endif int (*diag_destroy)(struct sock *sk, int err); }; /* Loading
include/uapi/linux/sock_diag.h +1 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ #include <linux/types.h> #define SOCK_DIAG_BY_FAMILY 20 #define SOCK_DESTROY_BACKPORT 21 struct sock_diag_req { __u8 sdiag_family; Loading
net/core/sock_diag.c +20 −3 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ void sock_diag_unregister(const struct sock_diag_handler *hnld) } EXPORT_SYMBOL_GPL(sock_diag_unregister); static int __sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) static int __sock_diag_cmd(struct sk_buff *skb, struct nlmsghdr *nlh) { int err; struct sock_diag_req *req = nlmsg_data(nlh); Loading @@ -152,8 +152,12 @@ static int __sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) hndl = sock_diag_handlers[req->sdiag_family]; if (hndl == NULL) err = -ENOENT; else else if (nlh->nlmsg_type == SOCK_DIAG_BY_FAMILY) err = hndl->dump(skb, nlh); else if (nlh->nlmsg_type == SOCK_DESTROY_BACKPORT && hndl->destroy) err = hndl->destroy(skb, nlh); else err = -EOPNOTSUPP; mutex_unlock(&sock_diag_table_mutex); return err; Loading @@ -179,7 +183,8 @@ static int sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) return ret; case SOCK_DIAG_BY_FAMILY: return __sock_diag_rcv_msg(skb, nlh); case SOCK_DESTROY_BACKPORT: return __sock_diag_cmd(skb, nlh); default: return -EINVAL; } Loading @@ -194,6 +199,18 @@ static void sock_diag_rcv(struct sk_buff *skb) mutex_unlock(&sock_diag_mutex); } int sock_diag_destroy(struct sock *sk, int err) { if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) return -EPERM; if (!sk->sk_prot->diag_destroy) return -EOPNOTSUPP; return sk->sk_prot->diag_destroy(sk, err); } EXPORT_SYMBOL_GPL(sock_diag_destroy); static int __net_init diag_net_init(struct net *net) { struct netlink_kernel_cfg cfg = { Loading