@@ -739,7 +739,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
unsigned long flags;
rcu_read_lock();
- if (likely(skb_dst(skb))) {
+ if (likely(skb_dst(skb)) && !(dev->priv_flags & IFF_EIPOIB_VIF)) {
n = dst_neigh_lookup_skb(skb_dst(skb), skb);
if (!n) {
++dev->stats.tx_dropped;
@@ -807,7 +807,8 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* unicast GID -- should be ARP or RARP reply */
if ((be16_to_cpup((__be16 *) skb->data) != ETH_P_ARP) &&
- (be16_to_cpup((__be16 *) skb->data) != ETH_P_RARP)) {
+ (be16_to_cpup((__be16 *) skb->data) != ETH_P_RARP) &&
+ !(dev->priv_flags & IFF_EIPOIB_VIF)) {
ipoib_warn(priv, "Unicast, no %s: type %04x, QPN %06x %pI6\n",
skb_dst(skb) ? "neigh" : "dst",
be16_to_cpup((__be16 *) skb->data),
@@ -857,7 +858,7 @@ static int ipoib_hard_header(struct sk_buff *skb,
* destination address into skb->cb so we can figure out where
* to send the packet later.
*/
- if (!skb_dst(skb)) {
+ if (!skb_dst(skb) || dev->priv_flags & IFF_EIPOIB_VIF) {
struct ipoib_cb *cb = (struct ipoib_cb *) skb->cb;
memcpy(cb->hwaddr, daddr, INFINIBAND_ALEN);
}