Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69cce1d1 authored by David S. Miller's avatar David S. Miller
Browse files

net: Abstract dst->neighbour accesses behind helpers.



dst_{get,set}_neighbour()

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9cbb7ecb
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
	}
+8 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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__);
@@ -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;
@@ -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;
+21 −21
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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",
@@ -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) ||
@@ -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;
@@ -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__);
+1 −1
Original line number Diff line number Diff line
@@ -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;
+27 −14
Original line number Diff line number Diff line
@@ -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);
@@ -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;

@@ -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 {
@@ -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,
@@ -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);
@@ -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;
		}

@@ -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);

@@ -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