On Fri, Jul 06, 2012 at 09:51:12PM -0400, Ed Maste wrote:
> A packet received by em0 is intercepted by BPF and delivered to Open
> vSwitch via libpcap.  Open vSwitch delivers it to the tap device, and
> the stack then gets copies from both em0 and br0.  This can be addressed
> by a firewall rule to discard packets received by em0 so that they don't
> make it beyond the BPF call.
> 
> It isn't clear to me though why the Linux userspace mode does not behave
> the same way though.  I had a (very) brief look at the way PF_PACKET is
> handled in Linux and it seemed like the packet would still be passed up
> the stack -- there must be something else that I'm missing.

Linux appears to have a special case such that a packet will never be
delivered back to the socket from which it originates via the network
tap interface, see dev_queue_xmit_nit() in net/core/dev.c:

/*
 *      Support routine. Sends outgoing frames to any network
 *      taps currently in use.
 */

static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
{
        struct packet_type *ptype;
        struct sk_buff *skb2 = NULL;
        struct packet_type *pt_prev = NULL;

        rcu_read_lock();
        list_for_each_entry_rcu(ptype, &ptype_all, list) {
                /* Never send packets back to the socket
                 * they originated from - MvS (miqu...@drinkel.ow.org)
                 */
                if ((ptype->dev == dev || !ptype->dev) &&
                    (ptype->af_packet_priv == NULL ||
                     (struct sock *)ptype->af_packet_priv != skb->sk)) {
                        if (pt_prev) {
                                deliver_skb(skb2, pt_prev, skb->dev);
                                pt_prev = ptype;
                                continue;
                        }
  
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to