|
@@ -721,6 +721,14 @@ int ipoib_check_sm_sendonly_fullmember_support(struct ipoib_dev_priv *priv)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static void push_pseudo_header(struct sk_buff *skb, const char *daddr)
|
|
|
+{
|
|
|
+ struct ipoib_pseudo_header *phdr;
|
|
|
+
|
|
|
+ phdr = (struct ipoib_pseudo_header *)skb_push(skb, sizeof(*phdr));
|
|
|
+ memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN);
|
|
|
+}
|
|
|
+
|
|
|
void ipoib_flush_paths(struct net_device *dev)
|
|
|
{
|
|
|
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
|
@@ -947,8 +955,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|
|
}
|
|
|
if (skb_queue_len(&neigh->queue) <
|
|
|
IPOIB_MAX_PATH_REC_QUEUE) {
|
|
|
- /* put pseudoheader back on for next time */
|
|
|
- skb_push(skb, IPOIB_PSEUDO_LEN);
|
|
|
+ push_pseudo_header(skb, neigh->daddr);
|
|
|
__skb_queue_tail(&neigh->queue, skb);
|
|
|
} else {
|
|
|
ipoib_warn(priv, "queue length limit %d. Packet drop.\n",
|
|
@@ -966,10 +973,12 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|
|
|
|
|
if (!path->query && path_rec_start(dev, path))
|
|
|
goto err_path;
|
|
|
- if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE)
|
|
|
+ if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
|
|
|
+ push_pseudo_header(skb, neigh->daddr);
|
|
|
__skb_queue_tail(&neigh->queue, skb);
|
|
|
- else
|
|
|
+ } else {
|
|
|
goto err_drop;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
@@ -1005,8 +1014,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
|
|
|
}
|
|
|
if (path) {
|
|
|
if (skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
|
|
|
- /* put pseudoheader back on for next time */
|
|
|
- skb_push(skb, IPOIB_PSEUDO_LEN);
|
|
|
+ push_pseudo_header(skb, phdr->hwaddr);
|
|
|
__skb_queue_tail(&path->queue, skb);
|
|
|
} else {
|
|
|
++dev->stats.tx_dropped;
|
|
@@ -1038,8 +1046,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
|
|
|
return;
|
|
|
} else if ((path->query || !path_rec_start(dev, path)) &&
|
|
|
skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
|
|
|
- /* put pseudoheader back on for next time */
|
|
|
- skb_push(skb, IPOIB_PSEUDO_LEN);
|
|
|
+ push_pseudo_header(skb, phdr->hwaddr);
|
|
|
__skb_queue_tail(&path->queue, skb);
|
|
|
} else {
|
|
|
++dev->stats.tx_dropped;
|
|
@@ -1120,8 +1127,7 @@ send_using_neigh:
|
|
|
}
|
|
|
|
|
|
if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
|
|
|
- /* put pseudoheader back on for next time */
|
|
|
- skb_push(skb, sizeof(*phdr));
|
|
|
+ push_pseudo_header(skb, phdr->hwaddr);
|
|
|
spin_lock_irqsave(&priv->lock, flags);
|
|
|
__skb_queue_tail(&neigh->queue, skb);
|
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
@@ -1153,7 +1159,6 @@ static int ipoib_hard_header(struct sk_buff *skb,
|
|
|
unsigned short type,
|
|
|
const void *daddr, const void *saddr, unsigned len)
|
|
|
{
|
|
|
- struct ipoib_pseudo_header *phdr;
|
|
|
struct ipoib_header *header;
|
|
|
|
|
|
header = (struct ipoib_header *) skb_push(skb, sizeof *header);
|
|
@@ -1166,8 +1171,7 @@ static int ipoib_hard_header(struct sk_buff *skb,
|
|
|
* destination address into skb hard header so we can figure out where
|
|
|
* to send the packet later.
|
|
|
*/
|
|
|
- phdr = (struct ipoib_pseudo_header *) skb_push(skb, sizeof(*phdr));
|
|
|
- memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN);
|
|
|
+ push_pseudo_header(skb, daddr);
|
|
|
|
|
|
return IPOIB_HARD_LEN;
|
|
|
}
|