aboutsummaryrefslogtreecommitdiffstats
path: root/net/packet/diag.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@parallels.com>2012-08-16 01:36:48 -0400
committerDavid S. Miller <davem@davemloft.net>2012-08-20 05:23:14 -0400
commitfff3321d75b1a18231876a1aceb36eacbbf6221e (patch)
treeff7d423fae980191ed922038ce5e1d0a05e19fab /net/packet/diag.c
parent16f01365fa01150bf3606fe702a80a03ec87953a (diff)
packet: Report fanout status via diag engine
Reported value is the same reported by the FANOUT getsockoption, but unlike it, the absent fanout setup results in absent nlattr, rather than in nlattr with zero value. This is done so, since zero fanout report may mean both -- no fanout, and fanout with both id and type zero. Signed-off-by: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/packet/diag.c')
-rw-r--r--net/packet/diag.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/net/packet/diag.c b/net/packet/diag.c
index e3975e4d458c..bc33fbe8a5ef 100644
--- a/net/packet/diag.c
+++ b/net/packet/diag.c
@@ -109,6 +109,22 @@ static int pdiag_put_rings_cfg(struct packet_sock *po, struct sk_buff *skb)
109 return ret; 109 return ret;
110} 110}
111 111
112static int pdiag_put_fanout(struct packet_sock *po, struct sk_buff *nlskb)
113{
114 int ret = 0;
115
116 mutex_lock(&fanout_mutex);
117 if (po->fanout) {
118 u32 val;
119
120 val = (u32)po->fanout->id | ((u32)po->fanout->type << 16);
121 ret = nla_put_u32(nlskb, PACKET_DIAG_FANOUT, val);
122 }
123 mutex_unlock(&fanout_mutex);
124
125 return ret;
126}
127
112static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag_req *req, 128static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag_req *req,
113 u32 pid, u32 seq, u32 flags, int sk_ino) 129 u32 pid, u32 seq, u32 flags, int sk_ino)
114{ 130{
@@ -139,6 +155,10 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag
139 pdiag_put_rings_cfg(po, skb)) 155 pdiag_put_rings_cfg(po, skb))
140 goto out_nlmsg_trim; 156 goto out_nlmsg_trim;
141 157
158 if ((req->pdiag_show & PACKET_SHOW_FANOUT) &&
159 pdiag_put_fanout(po, skb))
160 goto out_nlmsg_trim;
161
142 return nlmsg_end(skb, nlh); 162 return nlmsg_end(skb, nlh);
143 163
144out_nlmsg_trim: 164out_nlmsg_trim: