diff options
| author | David S. Miller <davem@davemloft.net> | 2012-02-01 17:23:11 -0500 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-02-01 17:23:11 -0500 | 
| commit | 7161c76f0def54f5dc7fd9a5534bb3e3e2b2aa60 (patch) | |
| tree | 84e4cde60709c8e4c9762334e71d78aaa85ee8da /net/atm/clip.c | |
| parent | 3329bdfc4071840816d6666c6463fdb0bd4c8264 (diff) | |
| download | olio-linux-3.10-7161c76f0def54f5dc7fd9a5534bb3e3e2b2aa60.tar.xz olio-linux-3.10-7161c76f0def54f5dc7fd9a5534bb3e3e2b2aa60.zip  | |
atm: clip: Convert over to dst_neigh_lookup().
CLIP only support ipv4, and this is evidenced by the fact that it
is a device specific extension of arp_tbl, so this conversion is
pretty straightforward.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/atm/clip.c')
| -rw-r--r-- | net/atm/clip.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/net/atm/clip.c b/net/atm/clip.c index c12c2582457..ef95a30306f 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c @@ -328,6 +328,8 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,  	struct atmarp_entry *entry;  	struct neighbour *n;  	struct atm_vcc *vcc; +	struct rtable *rt; +	__be32 *daddr;  	int old;  	unsigned long flags; @@ -338,7 +340,12 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,  		dev->stats.tx_dropped++;  		return NETDEV_TX_OK;  	} -	n = dst_get_neighbour_noref(dst); +	rt = (struct rtable *) dst; +	if (rt->rt_gateway) +		daddr = &rt->rt_gateway; +	else +		daddr = &ip_hdr(skb)->daddr; +	n = dst_neigh_lookup(dst, daddr);  	if (!n) {  		pr_err("NO NEIGHBOUR !\n");  		dev_kfree_skb(skb); @@ -358,7 +365,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,  			dev_kfree_skb(skb);  			dev->stats.tx_dropped++;  		} -		return NETDEV_TX_OK; +		goto out_release_neigh;  	}  	pr_debug("neigh %p, vccs %p\n", entry, entry->vccs);  	ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc; @@ -377,14 +384,14 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,  	old = xchg(&entry->vccs->xoff, 1);	/* assume XOFF ... */  	if (old) {  		pr_warning("XOFF->XOFF transition\n"); -		return NETDEV_TX_OK; +		goto out_release_neigh;  	}  	dev->stats.tx_packets++;  	dev->stats.tx_bytes += skb->len;  	vcc->send(vcc, skb);  	if (atm_may_send(vcc, 0)) {  		entry->vccs->xoff = 0; -		return NETDEV_TX_OK; +		goto out_release_neigh;  	}  	spin_lock_irqsave(&clip_priv->xoff_lock, flags);  	netif_stop_queue(dev);	/* XOFF -> throttle immediately */ @@ -396,6 +403,8 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,  	   of the brief netif_stop_queue. If this isn't true or if it  	   changes, use netif_wake_queue instead. */  	spin_unlock_irqrestore(&clip_priv->xoff_lock, flags); +out_release_neigh: +	neigh_release(n);  	return NETDEV_TX_OK;  }  |