Commit 8a360be0 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

packet: Report more packet sk info via diag module

This reports in one rtattr message all the other scalar values, that can be
set on a packet socket with setsockopt.
Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 96ec6327
...@@ -12,6 +12,8 @@ struct packet_diag_req { ...@@ -12,6 +12,8 @@ struct packet_diag_req {
__u32 pdiag_cookie[2]; __u32 pdiag_cookie[2];
}; };
#define PACKET_SHOW_INFO 0x00000001 /* Basic packet_sk information */
struct packet_diag_msg { struct packet_diag_msg {
__u8 pdiag_family; __u8 pdiag_family;
__u8 pdiag_type; __u8 pdiag_type;
...@@ -21,4 +23,25 @@ struct packet_diag_msg { ...@@ -21,4 +23,25 @@ struct packet_diag_msg {
__u32 pdiag_cookie[2]; __u32 pdiag_cookie[2];
}; };
enum {
PACKET_DIAG_INFO,
PACKET_DIAG_MAX,
};
struct packet_diag_info {
__u32 pdi_index;
__u32 pdi_version;
__u32 pdi_reserve;
__u32 pdi_copy_thresh;
__u32 pdi_tstamp;
__u32 pdi_flags;
#define PDI_RUNNING 0x1
#define PDI_AUXDATA 0x2
#define PDI_ORIGDEV 0x4
#define PDI_VNETHDR 0x8
#define PDI_LOSS 0x10
};
#endif #endif
...@@ -7,6 +7,31 @@ ...@@ -7,6 +7,31 @@
#include "internal.h" #include "internal.h"
static int pdiag_put_info(const struct packet_sock *po, struct sk_buff *nlskb)
{
struct packet_diag_info pinfo;
pinfo.pdi_index = po->ifindex;
pinfo.pdi_version = po->tp_version;
pinfo.pdi_reserve = po->tp_reserve;
pinfo.pdi_copy_thresh = po->copy_thresh;
pinfo.pdi_tstamp = po->tp_tstamp;
pinfo.pdi_flags = 0;
if (po->running)
pinfo.pdi_flags |= PDI_RUNNING;
if (po->auxdata)
pinfo.pdi_flags |= PDI_AUXDATA;
if (po->origdev)
pinfo.pdi_flags |= PDI_ORIGDEV;
if (po->has_vnet_hdr)
pinfo.pdi_flags |= PDI_VNETHDR;
if (po->tp_loss)
pinfo.pdi_flags |= PDI_LOSS;
return nla_put(nlskb, PACKET_DIAG_INFO, sizeof(pinfo), &pinfo);
}
static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag_req *req, static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag_req *req,
u32 pid, u32 seq, u32 flags, int sk_ino) u32 pid, u32 seq, u32 flags, int sk_ino)
{ {
...@@ -25,7 +50,15 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag ...@@ -25,7 +50,15 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag
rp->pdiag_ino = sk_ino; rp->pdiag_ino = sk_ino;
sock_diag_save_cookie(sk, rp->pdiag_cookie); sock_diag_save_cookie(sk, rp->pdiag_cookie);
if ((req->pdiag_show & PACKET_SHOW_INFO) &&
pdiag_put_info(po, skb))
goto out_nlmsg_trim;
return nlmsg_end(skb, nlh); return nlmsg_end(skb, nlh);
out_nlmsg_trim:
nlmsg_cancel(skb, nlh);
return -EMSGSIZE;
} }
static int packet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb) static int packet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment