diff options
author | Roland Dreier <roland@purestorage.com> | 2012-02-07 09:51:21 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-02-08 18:26:54 -0500 |
commit | 936d7de3d736e0737542641269436f4b5968e9ef (patch) | |
tree | d83c1f3ce184202d31ade4fe46e78b6b7100e0ae /drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |
parent | a1728800bed3b93b231d99e97c756f622b9991c2 (diff) |
IPoIB: Stop lying about hard_header_len and use skb->cb to stash LL addresses
Commit a0417fa3a18a ("net: Make qdisc_skb_cb upper size bound
explicit.") made it possible for a netdev driver to use skb->cb
between its header_ops.create method and its .ndo_start_xmit
method. Use this in ipoib_hard_header() to stash away the LL address
(GID + QPN), instead of the "ipoib_pseudoheader" hack. This allows
IPoIB to stop lying about its hard_header_len, which will let us fix
the L2 check for GRO.
Signed-off-by: Roland Dreier <roland@purestorage.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib_multicast.c')
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 10 |
1 files changed, 1 insertions, 9 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index f7ff9dd66cda..20ebc6fd1bb9 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -262,21 +262,13 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | |||
262 | netif_tx_lock_bh(dev); | 262 | netif_tx_lock_bh(dev); |
263 | while (!skb_queue_empty(&mcast->pkt_queue)) { | 263 | while (!skb_queue_empty(&mcast->pkt_queue)) { |
264 | struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); | 264 | struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); |
265 | struct dst_entry *dst = skb_dst(skb); | ||
266 | struct neighbour *n = NULL; | ||
267 | 265 | ||
268 | netif_tx_unlock_bh(dev); | 266 | netif_tx_unlock_bh(dev); |
269 | 267 | ||
270 | skb->dev = dev; | 268 | skb->dev = dev; |
271 | if (dst) | ||
272 | n = dst_get_neighbour_noref_raw(dst); | ||
273 | if (!dst || !n) { | ||
274 | /* put pseudoheader back on for next time */ | ||
275 | skb_push(skb, sizeof (struct ipoib_pseudoheader)); | ||
276 | } | ||
277 | |||
278 | if (dev_queue_xmit(skb)) | 269 | if (dev_queue_xmit(skb)) |
279 | ipoib_warn(priv, "dev_queue_xmit failed to requeue packet\n"); | 270 | ipoib_warn(priv, "dev_queue_xmit failed to requeue packet\n"); |
271 | |||
280 | netif_tx_lock_bh(dev); | 272 | netif_tx_lock_bh(dev); |
281 | } | 273 | } |
282 | netif_tx_unlock_bh(dev); | 274 | netif_tx_unlock_bh(dev); |