Loading drivers/infiniband/core/addr.c +4 −3 Original line number Diff line number Diff line Loading @@ -215,7 +215,7 @@ static int addr4_resolve(struct sockaddr_in *src_in, neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->dst.dev); if (!neigh || !(neigh->nud_state & NUD_VALID)) { neigh_event_send(rt->dst.neighbour, NULL); neigh_event_send(dst_get_neighbour(&rt->dst), NULL); ret = -ENODATA; if (neigh) goto release; Loading Loading @@ -273,9 +273,10 @@ static int addr6_resolve(struct sockaddr_in6 *src_in, goto put; } neigh = dst->neighbour; neigh = dst_get_neighbour(dst); if (!neigh || !(neigh->nud_state & NUD_VALID)) { neigh_event_send(dst->neighbour, NULL); if (neigh) neigh_event_send(neigh, NULL); ret = -ENODATA; goto put; } Loading drivers/infiniband/hw/cxgb3/iwch_cm.c +8 −4 Original line number Diff line number Diff line Loading @@ -1328,6 +1328,7 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) struct iwch_ep *child_ep, *parent_ep = ctx; struct cpl_pass_accept_req *req = cplhdr(skb); unsigned int hwtid = GET_TID(req); struct neighbour *neigh; struct dst_entry *dst; struct l2t_entry *l2t; struct rtable *rt; Loading Loading @@ -1364,7 +1365,8 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) goto reject; } dst = &rt->dst; l2t = t3_l2t_get(tdev, dst->neighbour, dst->neighbour->dev); neigh = dst_get_neighbour(dst); l2t = t3_l2t_get(tdev, neigh, neigh->dev); if (!l2t) { printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", __func__); Loading Loading @@ -1874,10 +1876,11 @@ static int is_loopback_dst(struct iw_cm_id *cm_id) int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) { int err = 0; struct iwch_dev *h = to_iwch_dev(cm_id->device); struct neighbour *neigh; struct iwch_ep *ep; struct rtable *rt; int err = 0; if (is_loopback_dst(cm_id)) { err = -ENOSYS; Loading Loading @@ -1933,9 +1936,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) } ep->dst = &rt->dst; neigh = dst_get_neighbour(ep->dst); /* get a l2t entry */ ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst->neighbour, ep->dst->neighbour->dev); ep->l2t = t3_l2t_get(ep->com.tdev, neigh, neigh->dev); if (!ep->l2t) { printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); err = -ENOMEM; Loading drivers/infiniband/hw/cxgb4/cm.c +21 −21 Original line number Diff line number Diff line Loading @@ -1325,6 +1325,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) unsigned int stid = GET_POPEN_TID(ntohl(req->tos_stid)); struct tid_info *t = dev->rdev.lldi.tids; unsigned int hwtid = GET_TID(req); struct neighbour *neigh; struct dst_entry *dst; struct l2t_entry *l2t; struct rtable *rt; Loading Loading @@ -1357,11 +1358,11 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) goto reject; } dst = &rt->dst; if (dst->neighbour->dev->flags & IFF_LOOPBACK) { neigh = dst_get_neighbour(dst); if (neigh->dev->flags & IFF_LOOPBACK) { pdev = ip_dev_find(&init_net, peer_ip); BUG_ON(!pdev); l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, dst->neighbour, pdev, 0); l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, neigh, pdev, 0); mtu = pdev->mtu; tx_chan = cxgb4_port_chan(pdev); smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1; Loading @@ -1372,17 +1373,16 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) rss_qid = dev->rdev.lldi.rxq_ids[cxgb4_port_idx(pdev) * step]; dev_put(pdev); } else { l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, dst->neighbour, dst->neighbour->dev, 0); l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, neigh, neigh->dev, 0); mtu = dst_mtu(dst); tx_chan = cxgb4_port_chan(dst->neighbour->dev); smac_idx = (cxgb4_port_viid(dst->neighbour->dev) & 0x7F) << 1; tx_chan = cxgb4_port_chan(neigh->dev); smac_idx = (cxgb4_port_viid(neigh->dev) & 0x7F) << 1; step = dev->rdev.lldi.ntxq / dev->rdev.lldi.nchan; txq_idx = cxgb4_port_idx(dst->neighbour->dev) * step; ctrlq_idx = cxgb4_port_idx(dst->neighbour->dev); txq_idx = cxgb4_port_idx(neigh->dev) * step; ctrlq_idx = cxgb4_port_idx(neigh->dev); step = dev->rdev.lldi.nrxq / dev->rdev.lldi.nchan; rss_qid = dev->rdev.lldi.rxq_ids[ cxgb4_port_idx(dst->neighbour->dev) * step]; cxgb4_port_idx(neigh->dev) * step]; } if (!l2t) { printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", Loading Loading @@ -1847,6 +1847,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) struct c4iw_ep *ep; struct rtable *rt; struct net_device *pdev; struct neighbour *neigh; int step; if ((conn_param->ord > c4iw_max_read_depth) || Loading Loading @@ -1908,14 +1909,15 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) } ep->dst = &rt->dst; neigh = dst_get_neighbour(ep->dst); /* get a l2t entry */ if (ep->dst->neighbour->dev->flags & IFF_LOOPBACK) { if (neigh->dev->flags & IFF_LOOPBACK) { PDBG("%s LOOPBACK\n", __func__); pdev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr); ep->l2t = cxgb4_l2t_get(ep->com.dev->rdev.lldi.l2t, ep->dst->neighbour, pdev, 0); neigh, pdev, 0); ep->mtu = pdev->mtu; ep->tx_chan = cxgb4_port_chan(pdev); ep->smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1; Loading @@ -1930,20 +1932,18 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) dev_put(pdev); } else { ep->l2t = cxgb4_l2t_get(ep->com.dev->rdev.lldi.l2t, ep->dst->neighbour, ep->dst->neighbour->dev, 0); neigh, neigh->dev, 0); ep->mtu = dst_mtu(ep->dst); ep->tx_chan = cxgb4_port_chan(ep->dst->neighbour->dev); ep->smac_idx = (cxgb4_port_viid(ep->dst->neighbour->dev) & 0x7F) << 1; ep->tx_chan = cxgb4_port_chan(neigh->dev); ep->smac_idx = (cxgb4_port_viid(neigh->dev) & 0x7F) << 1; step = ep->com.dev->rdev.lldi.ntxq / ep->com.dev->rdev.lldi.nchan; ep->txq_idx = cxgb4_port_idx(ep->dst->neighbour->dev) * step; ep->ctrlq_idx = cxgb4_port_idx(ep->dst->neighbour->dev); ep->txq_idx = cxgb4_port_idx(neigh->dev) * step; ep->ctrlq_idx = cxgb4_port_idx(neigh->dev); step = ep->com.dev->rdev.lldi.nrxq / ep->com.dev->rdev.lldi.nchan; ep->rss_qid = ep->com.dev->rdev.lldi.rxq_ids[ cxgb4_port_idx(ep->dst->neighbour->dev) * step]; cxgb4_port_idx(neigh->dev) * step]; } if (!ep->l2t) { printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); Loading drivers/infiniband/hw/nes/nes_cm.c +1 −1 Original line number Diff line number Diff line Loading @@ -1151,7 +1151,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi } if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) neigh_event_send(rt->dst.neighbour, NULL); neigh_event_send(dst_get_neighbour(&rt->dst), NULL); ip_rt_put(rt); return rc; Loading drivers/infiniband/ulp/ipoib/ipoib_main.c +27 −14 Original line number Diff line number Diff line Loading @@ -560,9 +560,11 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_path *path; struct ipoib_neigh *neigh; struct neighbour *n; unsigned long flags; neigh = ipoib_neigh_alloc(skb_dst(skb)->neighbour, skb->dev); n = dst_get_neighbour(skb_dst(skb)); neigh = ipoib_neigh_alloc(n, skb->dev); if (!neigh) { ++dev->stats.tx_dropped; dev_kfree_skb_any(skb); Loading @@ -571,9 +573,9 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) spin_lock_irqsave(&priv->lock, flags); path = __path_find(dev, skb_dst(skb)->neighbour->ha + 4); path = __path_find(dev, n->ha + 4); if (!path) { path = path_rec_create(dev, skb_dst(skb)->neighbour->ha + 4); path = path_rec_create(dev, n->ha + 4); if (!path) goto err_path; Loading Loading @@ -607,7 +609,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) } } else { spin_unlock_irqrestore(&priv->lock, flags); ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb_dst(skb)->neighbour->ha)); ipoib_send(dev, skb, path->ah, IPOIB_QPN(n->ha)); return; } } else { Loading Loading @@ -637,17 +639,20 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) static void ipoib_path_lookup(struct sk_buff *skb, struct net_device *dev) { struct ipoib_dev_priv *priv = netdev_priv(skb->dev); struct dst_entry *dst = skb_dst(skb); struct neighbour *n; /* Look up path record for unicasts */ if (skb_dst(skb)->neighbour->ha[4] != 0xff) { n = dst_get_neighbour(dst); if (n->ha[4] != 0xff) { neigh_add_path(skb, dev); return; } /* Add in the P_Key for multicasts */ skb_dst(skb)->neighbour->ha[8] = (priv->pkey >> 8) & 0xff; skb_dst(skb)->neighbour->ha[9] = priv->pkey & 0xff; ipoib_mcast_send(dev, skb_dst(skb)->neighbour->ha + 4, skb); n->ha[8] = (priv->pkey >> 8) & 0xff; n->ha[9] = priv->pkey & 0xff; ipoib_mcast_send(dev, n->ha + 4, skb); } static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, Loading Loading @@ -712,18 +717,20 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_neigh *neigh; struct neighbour *n; unsigned long flags; if (likely(skb_dst(skb) && skb_dst(skb)->neighbour)) { if (unlikely(!*to_ipoib_neigh(skb_dst(skb)->neighbour))) { n = dst_get_neighbour(skb_dst(skb)); if (likely(skb_dst(skb) && n)) { if (unlikely(!*to_ipoib_neigh(n))) { ipoib_path_lookup(skb, dev); return NETDEV_TX_OK; } neigh = *to_ipoib_neigh(skb_dst(skb)->neighbour); neigh = *to_ipoib_neigh(n); if (unlikely((memcmp(&neigh->dgid.raw, skb_dst(skb)->neighbour->ha + 4, n->ha + 4, sizeof(union ib_gid))) || (neigh->dev != dev))) { spin_lock_irqsave(&priv->lock, flags); Loading @@ -749,7 +756,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_OK; } } else if (neigh->ah) { ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(skb_dst(skb)->neighbour->ha)); ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(n->ha)); return NETDEV_TX_OK; } Loading Loading @@ -812,6 +819,8 @@ static int ipoib_hard_header(struct sk_buff *skb, const void *daddr, const void *saddr, unsigned len) { struct ipoib_header *header; struct dst_entry *dst; struct neighbour *n; header = (struct ipoib_header *) skb_push(skb, sizeof *header); Loading @@ -823,7 +832,11 @@ static int ipoib_hard_header(struct sk_buff *skb, * destination address onto the front of the skb so we can * figure out where to send the packet later. */ if ((!skb_dst(skb) || !skb_dst(skb)->neighbour) && daddr) { dst = skb_dst(skb); n = NULL; if (dst) n = dst_get_neighbour(dst); if ((!dst || !n) && daddr) { struct ipoib_pseudoheader *phdr = (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr); memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN); Loading Loading
drivers/infiniband/core/addr.c +4 −3 Original line number Diff line number Diff line Loading @@ -215,7 +215,7 @@ static int addr4_resolve(struct sockaddr_in *src_in, neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->dst.dev); if (!neigh || !(neigh->nud_state & NUD_VALID)) { neigh_event_send(rt->dst.neighbour, NULL); neigh_event_send(dst_get_neighbour(&rt->dst), NULL); ret = -ENODATA; if (neigh) goto release; Loading Loading @@ -273,9 +273,10 @@ static int addr6_resolve(struct sockaddr_in6 *src_in, goto put; } neigh = dst->neighbour; neigh = dst_get_neighbour(dst); if (!neigh || !(neigh->nud_state & NUD_VALID)) { neigh_event_send(dst->neighbour, NULL); if (neigh) neigh_event_send(neigh, NULL); ret = -ENODATA; goto put; } Loading
drivers/infiniband/hw/cxgb3/iwch_cm.c +8 −4 Original line number Diff line number Diff line Loading @@ -1328,6 +1328,7 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) struct iwch_ep *child_ep, *parent_ep = ctx; struct cpl_pass_accept_req *req = cplhdr(skb); unsigned int hwtid = GET_TID(req); struct neighbour *neigh; struct dst_entry *dst; struct l2t_entry *l2t; struct rtable *rt; Loading Loading @@ -1364,7 +1365,8 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) goto reject; } dst = &rt->dst; l2t = t3_l2t_get(tdev, dst->neighbour, dst->neighbour->dev); neigh = dst_get_neighbour(dst); l2t = t3_l2t_get(tdev, neigh, neigh->dev); if (!l2t) { printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", __func__); Loading Loading @@ -1874,10 +1876,11 @@ static int is_loopback_dst(struct iw_cm_id *cm_id) int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) { int err = 0; struct iwch_dev *h = to_iwch_dev(cm_id->device); struct neighbour *neigh; struct iwch_ep *ep; struct rtable *rt; int err = 0; if (is_loopback_dst(cm_id)) { err = -ENOSYS; Loading Loading @@ -1933,9 +1936,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) } ep->dst = &rt->dst; neigh = dst_get_neighbour(ep->dst); /* get a l2t entry */ ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst->neighbour, ep->dst->neighbour->dev); ep->l2t = t3_l2t_get(ep->com.tdev, neigh, neigh->dev); if (!ep->l2t) { printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); err = -ENOMEM; Loading
drivers/infiniband/hw/cxgb4/cm.c +21 −21 Original line number Diff line number Diff line Loading @@ -1325,6 +1325,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) unsigned int stid = GET_POPEN_TID(ntohl(req->tos_stid)); struct tid_info *t = dev->rdev.lldi.tids; unsigned int hwtid = GET_TID(req); struct neighbour *neigh; struct dst_entry *dst; struct l2t_entry *l2t; struct rtable *rt; Loading Loading @@ -1357,11 +1358,11 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) goto reject; } dst = &rt->dst; if (dst->neighbour->dev->flags & IFF_LOOPBACK) { neigh = dst_get_neighbour(dst); if (neigh->dev->flags & IFF_LOOPBACK) { pdev = ip_dev_find(&init_net, peer_ip); BUG_ON(!pdev); l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, dst->neighbour, pdev, 0); l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, neigh, pdev, 0); mtu = pdev->mtu; tx_chan = cxgb4_port_chan(pdev); smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1; Loading @@ -1372,17 +1373,16 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) rss_qid = dev->rdev.lldi.rxq_ids[cxgb4_port_idx(pdev) * step]; dev_put(pdev); } else { l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, dst->neighbour, dst->neighbour->dev, 0); l2t = cxgb4_l2t_get(dev->rdev.lldi.l2t, neigh, neigh->dev, 0); mtu = dst_mtu(dst); tx_chan = cxgb4_port_chan(dst->neighbour->dev); smac_idx = (cxgb4_port_viid(dst->neighbour->dev) & 0x7F) << 1; tx_chan = cxgb4_port_chan(neigh->dev); smac_idx = (cxgb4_port_viid(neigh->dev) & 0x7F) << 1; step = dev->rdev.lldi.ntxq / dev->rdev.lldi.nchan; txq_idx = cxgb4_port_idx(dst->neighbour->dev) * step; ctrlq_idx = cxgb4_port_idx(dst->neighbour->dev); txq_idx = cxgb4_port_idx(neigh->dev) * step; ctrlq_idx = cxgb4_port_idx(neigh->dev); step = dev->rdev.lldi.nrxq / dev->rdev.lldi.nchan; rss_qid = dev->rdev.lldi.rxq_ids[ cxgb4_port_idx(dst->neighbour->dev) * step]; cxgb4_port_idx(neigh->dev) * step]; } if (!l2t) { printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", Loading Loading @@ -1847,6 +1847,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) struct c4iw_ep *ep; struct rtable *rt; struct net_device *pdev; struct neighbour *neigh; int step; if ((conn_param->ord > c4iw_max_read_depth) || Loading Loading @@ -1908,14 +1909,15 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) } ep->dst = &rt->dst; neigh = dst_get_neighbour(ep->dst); /* get a l2t entry */ if (ep->dst->neighbour->dev->flags & IFF_LOOPBACK) { if (neigh->dev->flags & IFF_LOOPBACK) { PDBG("%s LOOPBACK\n", __func__); pdev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr); ep->l2t = cxgb4_l2t_get(ep->com.dev->rdev.lldi.l2t, ep->dst->neighbour, pdev, 0); neigh, pdev, 0); ep->mtu = pdev->mtu; ep->tx_chan = cxgb4_port_chan(pdev); ep->smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1; Loading @@ -1930,20 +1932,18 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) dev_put(pdev); } else { ep->l2t = cxgb4_l2t_get(ep->com.dev->rdev.lldi.l2t, ep->dst->neighbour, ep->dst->neighbour->dev, 0); neigh, neigh->dev, 0); ep->mtu = dst_mtu(ep->dst); ep->tx_chan = cxgb4_port_chan(ep->dst->neighbour->dev); ep->smac_idx = (cxgb4_port_viid(ep->dst->neighbour->dev) & 0x7F) << 1; ep->tx_chan = cxgb4_port_chan(neigh->dev); ep->smac_idx = (cxgb4_port_viid(neigh->dev) & 0x7F) << 1; step = ep->com.dev->rdev.lldi.ntxq / ep->com.dev->rdev.lldi.nchan; ep->txq_idx = cxgb4_port_idx(ep->dst->neighbour->dev) * step; ep->ctrlq_idx = cxgb4_port_idx(ep->dst->neighbour->dev); ep->txq_idx = cxgb4_port_idx(neigh->dev) * step; ep->ctrlq_idx = cxgb4_port_idx(neigh->dev); step = ep->com.dev->rdev.lldi.nrxq / ep->com.dev->rdev.lldi.nchan; ep->rss_qid = ep->com.dev->rdev.lldi.rxq_ids[ cxgb4_port_idx(ep->dst->neighbour->dev) * step]; cxgb4_port_idx(neigh->dev) * step]; } if (!ep->l2t) { printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); Loading
drivers/infiniband/hw/nes/nes_cm.c +1 −1 Original line number Diff line number Diff line Loading @@ -1151,7 +1151,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi } if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) neigh_event_send(rt->dst.neighbour, NULL); neigh_event_send(dst_get_neighbour(&rt->dst), NULL); ip_rt_put(rt); return rc; Loading
drivers/infiniband/ulp/ipoib/ipoib_main.c +27 −14 Original line number Diff line number Diff line Loading @@ -560,9 +560,11 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_path *path; struct ipoib_neigh *neigh; struct neighbour *n; unsigned long flags; neigh = ipoib_neigh_alloc(skb_dst(skb)->neighbour, skb->dev); n = dst_get_neighbour(skb_dst(skb)); neigh = ipoib_neigh_alloc(n, skb->dev); if (!neigh) { ++dev->stats.tx_dropped; dev_kfree_skb_any(skb); Loading @@ -571,9 +573,9 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) spin_lock_irqsave(&priv->lock, flags); path = __path_find(dev, skb_dst(skb)->neighbour->ha + 4); path = __path_find(dev, n->ha + 4); if (!path) { path = path_rec_create(dev, skb_dst(skb)->neighbour->ha + 4); path = path_rec_create(dev, n->ha + 4); if (!path) goto err_path; Loading Loading @@ -607,7 +609,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) } } else { spin_unlock_irqrestore(&priv->lock, flags); ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb_dst(skb)->neighbour->ha)); ipoib_send(dev, skb, path->ah, IPOIB_QPN(n->ha)); return; } } else { Loading Loading @@ -637,17 +639,20 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) static void ipoib_path_lookup(struct sk_buff *skb, struct net_device *dev) { struct ipoib_dev_priv *priv = netdev_priv(skb->dev); struct dst_entry *dst = skb_dst(skb); struct neighbour *n; /* Look up path record for unicasts */ if (skb_dst(skb)->neighbour->ha[4] != 0xff) { n = dst_get_neighbour(dst); if (n->ha[4] != 0xff) { neigh_add_path(skb, dev); return; } /* Add in the P_Key for multicasts */ skb_dst(skb)->neighbour->ha[8] = (priv->pkey >> 8) & 0xff; skb_dst(skb)->neighbour->ha[9] = priv->pkey & 0xff; ipoib_mcast_send(dev, skb_dst(skb)->neighbour->ha + 4, skb); n->ha[8] = (priv->pkey >> 8) & 0xff; n->ha[9] = priv->pkey & 0xff; ipoib_mcast_send(dev, n->ha + 4, skb); } static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, Loading Loading @@ -712,18 +717,20 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_neigh *neigh; struct neighbour *n; unsigned long flags; if (likely(skb_dst(skb) && skb_dst(skb)->neighbour)) { if (unlikely(!*to_ipoib_neigh(skb_dst(skb)->neighbour))) { n = dst_get_neighbour(skb_dst(skb)); if (likely(skb_dst(skb) && n)) { if (unlikely(!*to_ipoib_neigh(n))) { ipoib_path_lookup(skb, dev); return NETDEV_TX_OK; } neigh = *to_ipoib_neigh(skb_dst(skb)->neighbour); neigh = *to_ipoib_neigh(n); if (unlikely((memcmp(&neigh->dgid.raw, skb_dst(skb)->neighbour->ha + 4, n->ha + 4, sizeof(union ib_gid))) || (neigh->dev != dev))) { spin_lock_irqsave(&priv->lock, flags); Loading @@ -749,7 +756,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_OK; } } else if (neigh->ah) { ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(skb_dst(skb)->neighbour->ha)); ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(n->ha)); return NETDEV_TX_OK; } Loading Loading @@ -812,6 +819,8 @@ static int ipoib_hard_header(struct sk_buff *skb, const void *daddr, const void *saddr, unsigned len) { struct ipoib_header *header; struct dst_entry *dst; struct neighbour *n; header = (struct ipoib_header *) skb_push(skb, sizeof *header); Loading @@ -823,7 +832,11 @@ static int ipoib_hard_header(struct sk_buff *skb, * destination address onto the front of the skb so we can * figure out where to send the packet later. */ if ((!skb_dst(skb) || !skb_dst(skb)->neighbour) && daddr) { dst = skb_dst(skb); n = NULL; if (dst) n = dst_get_neighbour(dst); if ((!dst || !n) && daddr) { struct ipoib_pseudoheader *phdr = (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr); memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN); Loading