return 0;
 }
 
+static int ibmveth_is_packet_unsupported(struct sk_buff *skb,
+                                        struct net_device *netdev)
+{
+       struct ethhdr *ether_header;
+       int ret = 0;
+
+       ether_header = eth_hdr(skb);
+
+       if (ether_addr_equal(ether_header->h_dest, netdev->dev_addr)) {
+               netdev_dbg(netdev, "veth doesn't support loopback packets, dropping packet.\n");
+               netdev->stats.tx_dropped++;
+               ret = -EOPNOTSUPP;
+       }
+
+       if (!ether_addr_equal(ether_header->h_source, netdev->dev_addr)) {
+               netdev_dbg(netdev, "source packet MAC address does not match veth device's, dropping packet.\n");
+               netdev->stats.tx_dropped++;
+               ret = -EOPNOTSUPP;
+       }
+
+       return ret;
+}
+
 static netdev_tx_t ibmveth_start_xmit(struct sk_buff *skb,
                                      struct net_device *netdev)
 {
        dma_addr_t dma_addr;
        unsigned long mss = 0;
 
+       if (ibmveth_is_packet_unsupported(skb, netdev))
+               goto out;
+
        /* veth doesn't handle frag_list, so linearize the skb.
         * When GRO is enabled SKB's can have frag_list.
         */