* [PATCHv2 0/2] Resolve packet capturing on macvlan lowerdev
@ 2011-04-29 0:22 David Ward
2011-04-29 0:22 ` [PATCHv2 1/2] net: Export dev_queue_xmit_nit for use by macvlan driver David Ward
2011-04-29 0:22 ` [PATCHv2 2/2] macvlan: Send frames to AF_PACKET sockets attached to lowerdev David Ward
0 siblings, 2 replies; 5+ messages in thread
From: David Ward @ 2011-04-29 0:22 UTC (permalink / raw)
To: netdev; +Cc: David Ward, Patrick McHardy
Change in v2: Declare variables in basic block before other code appears
The following two patches address situations where macvlan interfaces on
the same lowerdev are created inside separate containers/namespaces, and
traffic between these interfaces needs to be captured by monitoring the
lowerdev outside the containers/namespaces using tcpdump or Wireshark.
The only case where this doesn't work now is for unicast frames when the
macvlan interfaces are operating in bridge mode; this fixes that case.
Should the dev_queue_xmit_nit function be renamed to something more
meaningful, which would indicate its role in sending outgoing frames to
AF_PACKET sockets? It is currently a misnomer: this function used to be
invoked by dev_queue_xmit, but that is no longer the case.
Thanks,
David
David Ward (2):
net: Export dev_queue_xmit_nit for use by macvlan driver
macvlan: Send frames to AF_PACKET sockets attached to lowerdev
drivers/net/macvlan.c | 5 ++++-
include/linux/netdevice.h | 2 ++
net/core/dev.c | 14 +++++++++-----
3 files changed, 15 insertions(+), 6 deletions(-)
--
1.7.4.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCHv2 1/2] net: Export dev_queue_xmit_nit for use by macvlan driver
2011-04-29 0:22 [PATCHv2 0/2] Resolve packet capturing on macvlan lowerdev David Ward
@ 2011-04-29 0:22 ` David Ward
2011-05-05 17:50 ` David Miller
2011-04-29 0:22 ` [PATCHv2 2/2] macvlan: Send frames to AF_PACKET sockets attached to lowerdev David Ward
1 sibling, 1 reply; 5+ messages in thread
From: David Ward @ 2011-04-29 0:22 UTC (permalink / raw)
To: netdev; +Cc: David Ward, Patrick McHardy
Export dev_queue_xmit_nit for use by the macvlan virtual network device
driver. Also, use 'dev' instead of 'skb->dev' in this function.
Signed-off-by: David Ward <david.ward@ll.mit.edu>
---
include/linux/netdevice.h | 2 ++
net/core/dev.c | 14 +++++++++-----
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index cb8178a..b63e517 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2099,6 +2099,8 @@ extern int dev_hard_start_xmit(struct sk_buff *skb,
struct netdev_queue *txq);
extern int dev_forward_skb(struct net_device *dev,
struct sk_buff *skb);
+extern void dev_queue_xmit_nit(struct sk_buff *skb,
+ struct net_device *dev);
extern int netdev_budget;
diff --git a/net/core/dev.c b/net/core/dev.c
index 3bbb4c2..b15622e 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1521,11 +1521,13 @@ static inline int deliver_skb(struct sk_buff *skb,
}
/*
- * Support routine. Sends outgoing frames to any network
- * taps currently in use.
+ * dev_queue_xmit_nit - send outgoing frame to AF_PACKET sockets
+ *
+ * @skb: buffer to send
+ * @dev: network device that AF_PACKET sockets are attached to (if any)
*/
-static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
+void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
{
struct packet_type *ptype;
struct sk_buff *skb2 = NULL;
@@ -1540,7 +1542,8 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
(ptype->af_packet_priv == NULL ||
(struct sock *)ptype->af_packet_priv != skb->sk)) {
if (pt_prev) {
- deliver_skb(skb2, pt_prev, skb->dev);
+ atomic_inc(&skb2->users);
+ pt_prev->func(skb2, dev, pt_prev, dev);
pt_prev = ptype;
continue;
}
@@ -1573,9 +1576,10 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
}
}
if (pt_prev)
- pt_prev->func(skb2, skb->dev, pt_prev, skb->dev);
+ pt_prev->func(skb2, dev, pt_prev, dev);
rcu_read_unlock();
}
+EXPORT_SYMBOL(dev_queue_xmit_nit);
/* netif_setup_tc - Handle tc mappings on real_num_tx_queues change
* @dev: Network device
--
1.7.4.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCHv2 2/2] macvlan: Send frames to AF_PACKET sockets attached to lowerdev
2011-04-29 0:22 [PATCHv2 0/2] Resolve packet capturing on macvlan lowerdev David Ward
2011-04-29 0:22 ` [PATCHv2 1/2] net: Export dev_queue_xmit_nit for use by macvlan driver David Ward
@ 2011-04-29 0:22 ` David Ward
1 sibling, 0 replies; 5+ messages in thread
From: David Ward @ 2011-04-29 0:22 UTC (permalink / raw)
To: netdev; +Cc: David Ward, Patrick McHardy
In bridge mode, unicast frames can be forwarded directly between macvlan
interfaces attached to the same lowerdev without calling dev_queue_xmit.
These frames should still be sent to any AF_PACKET sockets (network taps)
attached to the lowerdev.
Signed-off-by: David Ward <david.ward@ll.mit.edu>
---
drivers/net/macvlan.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 3ad5425..25c7632 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -238,7 +238,10 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
dest = macvlan_hash_lookup(port, eth->h_dest);
if (dest && dest->mode == MACVLAN_MODE_BRIDGE) {
unsigned int length = skb->len + ETH_HLEN;
- int ret = dest->forward(dest->dev, skb);
+ int ret = NET_RX_DROP;
+
+ dev_queue_xmit_nit(skb, vlan->lowerdev);
+ ret = dest->forward(dest->dev, skb);
macvlan_count_rx(dest, length,
ret == NET_RX_SUCCESS, 0);
--
1.7.4.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCHv2 1/2] net: Export dev_queue_xmit_nit for use by macvlan driver
2011-04-29 0:22 ` [PATCHv2 1/2] net: Export dev_queue_xmit_nit for use by macvlan driver David Ward
@ 2011-05-05 17:50 ` David Miller
2011-05-07 16:47 ` Ward, David - 0663 - MITLL
0 siblings, 1 reply; 5+ messages in thread
From: David Miller @ 2011-05-05 17:50 UTC (permalink / raw)
To: david.ward; +Cc: netdev, kaber
From: David Ward <david.ward@ll.mit.edu>
Date: Thu, 28 Apr 2011 20:22:31 -0400
> @@ -1521,11 +1521,13 @@ static inline int deliver_skb(struct sk_buff *skb,
> }
>
> /*
> - * Support routine. Sends outgoing frames to any network
> - * taps currently in use.
> + * dev_queue_xmit_nit - send outgoing frame to AF_PACKET sockets
> + *
> + * @skb: buffer to send
> + * @dev: network device that AF_PACKET sockets are attached to (if any)
> */
Your change to this comment is inaccurate.
AF_PACKET is only one of several types of entities that register these
kinds of taps.
Also, I really don't like exposing these kinds of internals for what is
largely a macvlan internal issue. Please find a less intrustive way
to solve this problem.
Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCHv2 1/2] net: Export dev_queue_xmit_nit for use by macvlan driver
2011-05-05 17:50 ` David Miller
@ 2011-05-07 16:47 ` Ward, David - 0663 - MITLL
0 siblings, 0 replies; 5+ messages in thread
From: Ward, David - 0663 - MITLL @ 2011-05-07 16:47 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, kaber@trash.net
[-- Attachment #1: Type: text/plain, Size: 1188 bytes --]
On 05/05/2011 01:50 PM, David Miller wrote:
> From: David Ward<david.ward@ll.mit.edu>
> Date: Thu, 28 Apr 2011 20:22:31 -0400
>
>> @@ -1521,11 +1521,13 @@ static inline int deliver_skb(struct sk_buff *skb,
>> }
>>
>> /*
>> - * Support routine. Sends outgoing frames to any network
>> - * taps currently in use.
>> + * dev_queue_xmit_nit - send outgoing frame to AF_PACKET sockets
>> + *
>> + * @skb: buffer to send
>> + * @dev: network device that AF_PACKET sockets are attached to (if any)
>> */
> I really don't like exposing these kinds of internals for what is
> largely a macvlan internal issue. Please find a less intrustive way
> to solve this problem.
>
> Thanks.
What do you think about creating __dev_forward_skb, which takes as an
additional parameter a device (or maybe a list of devices) whose taps
should see this packet as it is forwarded, such as a macvlan lowerdev?
This function would be able to call dev_queue_xmit_nit for (each of)
these devices.
Since the list of current network taps (ptype_all) is static inside
net/core/dev.c, some type of change has to be made to net/core/dev.c to
fix this.
Thanks,
David
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 5650 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-05-07 17:19 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-29 0:22 [PATCHv2 0/2] Resolve packet capturing on macvlan lowerdev David Ward
2011-04-29 0:22 ` [PATCHv2 1/2] net: Export dev_queue_xmit_nit for use by macvlan driver David Ward
2011-05-05 17:50 ` David Miller
2011-05-07 16:47 ` Ward, David - 0663 - MITLL
2011-04-29 0:22 ` [PATCHv2 2/2] macvlan: Send frames to AF_PACKET sockets attached to lowerdev David Ward
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).