diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-04 11:47:58 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-04 11:47:58 -0700 | 
| commit | 6ba74014c1ab0e37af7de6f64b4eccbbae3cb9e7 (patch) | |
| tree | 8f3892fc44f1e403675a6d7e88fda5c70e56ee4c /net/ipv4/arp.c | |
| parent | 5abd9ccced7a726c817dd6b5b96bc933859138d1 (diff) | |
| parent | 3ff1c25927e3af61c6bf0e4ed959504058ae4565 (diff) | |
| download | olio-linux-3.10-6ba74014c1ab0e37af7de6f64b4eccbbae3cb9e7.tar.xz olio-linux-3.10-6ba74014c1ab0e37af7de6f64b4eccbbae3cb9e7.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1443 commits)
  phy/marvell: add 88ec048 support
  igb: Program MDICNFG register prior to PHY init
  e1000e: correct MAC-PHY interconnect register offset for 82579
  hso: Add new product ID
  can: Add driver for esd CAN-USB/2 device
  l2tp: fix export of header file for userspace
  can-raw: Fix skb_orphan_try handling
  Revert "net: remove zap_completion_queue"
  net: cleanup inclusion
  phy/marvell: add 88e1121 interface mode support
  u32: negative offset fix
  net: Fix a typo from "dev" to "ndev"
  igb: Use irq_synchronize per vector when using MSI-X
  ixgbevf: fix null pointer dereference due to filter being set for VLAN 0
  e1000e: Fix irq_synchronize in MSI-X case
  e1000e: register pm_qos request on hardware activation
  ip_fragment: fix subtracting PPPOE_SES_HLEN from mtu twice
  net: Add getsockopt support for TCP thin-streams
  cxgb4: update driver version
  cxgb4: add new PCI IDs
  ...
Manually fix up conflicts in:
 - drivers/net/e1000e/netdev.c: due to pm_qos registration
   infrastructure changes
 - drivers/net/phy/marvell.c: conflict between adding 88ec048 support
   and cleaning up the IDs
 - drivers/net/wireless/ipw2x00/ipw2100.c: trivial ipw2100_pm_qos_req
   conflict (registration change vs marking it static)
Diffstat (limited to 'net/ipv4/arp.c')
| -rw-r--r-- | net/ipv4/arp.c | 51 | 
1 files changed, 23 insertions, 28 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index f094b75810d..96c1955b3e2 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -116,6 +116,7 @@  #if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)  #include <net/atmclip.h>  struct neigh_table *clip_tbl_hook; +EXPORT_SYMBOL(clip_tbl_hook);  #endif  #include <asm/system.h> @@ -169,6 +170,7 @@ const struct neigh_ops arp_broken_ops = {  	.hh_output =		dev_queue_xmit,  	.queue_xmit =		dev_queue_xmit,  }; +EXPORT_SYMBOL(arp_broken_ops);  struct neigh_table arp_tbl = {  	.family =	AF_INET, @@ -198,6 +200,7 @@ struct neigh_table arp_tbl = {  	.gc_thresh2 =	512,  	.gc_thresh3 =	1024,  }; +EXPORT_SYMBOL(arp_tbl);  int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir)  { @@ -333,11 +336,14 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)  	struct net_device *dev = neigh->dev;  	__be32 target = *(__be32*)neigh->primary_key;  	int probes = atomic_read(&neigh->probes); -	struct in_device *in_dev = in_dev_get(dev); +	struct in_device *in_dev; -	if (!in_dev) +	rcu_read_lock(); +	in_dev = __in_dev_get_rcu(dev); +	if (!in_dev) { +		rcu_read_unlock();  		return; - +	}  	switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {  	default:  	case 0:		/* By default announce any local IP */ @@ -358,9 +364,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)  	case 2:		/* Avoid secondary IPs, get a primary/preferred one */  		break;  	} +	rcu_read_unlock(); -	if (in_dev) -		in_dev_put(in_dev);  	if (!saddr)  		saddr = inet_select_addr(dev, target, RT_SCOPE_LINK); @@ -427,7 +432,7 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)  	if (ip_route_output_key(net, &rt, &fl) < 0)  		return 1; -	if (rt->u.dst.dev != dev) { +	if (rt->dst.dev != dev) {  		NET_INC_STATS_BH(net, LINUX_MIB_ARPFILTER);  		flag = 1;  	} @@ -497,6 +502,7 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb)  		kfree_skb(skb);  	return 1;  } +EXPORT_SYMBOL(arp_find);  /* END OF OBSOLETE FUNCTIONS */ @@ -532,7 +538,7 @@ static inline int arp_fwd_proxy(struct in_device *in_dev,  	struct in_device *out_dev;  	int imi, omi = -1; -	if (rt->u.dst.dev == dev) +	if (rt->dst.dev == dev)  		return 0;  	if (!IN_DEV_PROXY_ARP(in_dev)) @@ -545,10 +551,10 @@ static inline int arp_fwd_proxy(struct in_device *in_dev,  	/* place to check for proxy_arp for routes */ -	if ((out_dev = in_dev_get(rt->u.dst.dev)) != NULL) { +	out_dev = __in_dev_get_rcu(rt->dst.dev); +	if (out_dev)  		omi = IN_DEV_MEDIUM_ID(out_dev); -		in_dev_put(out_dev); -	} +  	return (omi != imi && omi != -1);  } @@ -576,7 +582,7 @@ static inline int arp_fwd_pvlan(struct in_device *in_dev,  				__be32 sip, __be32 tip)  {  	/* Private VLAN is only concerned about the same ethernet segment */ -	if (rt->u.dst.dev != dev) +	if (rt->dst.dev != dev)  		return 0;  	/* Don't reply on self probes (often done by windowz boxes)*/ @@ -698,6 +704,7 @@ out:  	kfree_skb(skb);  	return NULL;  } +EXPORT_SYMBOL(arp_create);  /*   *	Send an arp packet. @@ -707,6 +714,7 @@ void arp_xmit(struct sk_buff *skb)  	/* Send it off, maybe filter it using firewalling first.  */  	NF_HOOK(NFPROTO_ARP, NF_ARP_OUT, skb, NULL, skb->dev, dev_queue_xmit);  } +EXPORT_SYMBOL(arp_xmit);  /*   *	Create and send an arp packet. @@ -733,6 +741,7 @@ void arp_send(int type, int ptype, __be32 dest_ip,  	arp_xmit(skb);  } +EXPORT_SYMBOL(arp_send);  /*   *	Process an arp request. @@ -741,7 +750,7 @@ void arp_send(int type, int ptype, __be32 dest_ip,  static int arp_process(struct sk_buff *skb)  {  	struct net_device *dev = skb->dev; -	struct in_device *in_dev = in_dev_get(dev); +	struct in_device *in_dev = __in_dev_get_rcu(dev);  	struct arphdr *arp;  	unsigned char *arp_ptr;  	struct rtable *rt; @@ -890,7 +899,6 @@ static int arp_process(struct sk_buff *skb)  					arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);  				} else {  					pneigh_enqueue(&arp_tbl, in_dev->arp_parms, skb); -					in_dev_put(in_dev);  					return 0;  				}  				goto out; @@ -936,8 +944,6 @@ static int arp_process(struct sk_buff *skb)  	}  out: -	if (in_dev) -		in_dev_put(in_dev);  	consume_skb(skb);  	return 0;  } @@ -1045,7 +1051,7 @@ static int arp_req_set(struct net *net, struct arpreq *r,  		struct rtable * rt;  		if ((err = ip_route_output_key(net, &rt, &fl)) != 0)  			return err; -		dev = rt->u.dst.dev; +		dev = rt->dst.dev;  		ip_rt_put(rt);  		if (!dev)  			return -EINVAL; @@ -1152,7 +1158,7 @@ static int arp_req_delete(struct net *net, struct arpreq *r,  		struct rtable * rt;  		if ((err = ip_route_output_key(net, &rt, &fl)) != 0)  			return err; -		dev = rt->u.dst.dev; +		dev = rt->dst.dev;  		ip_rt_put(rt);  		if (!dev)  			return -EINVAL; @@ -1453,14 +1459,3 @@ static int __init arp_proc_init(void)  }  #endif /* CONFIG_PROC_FS */ - -EXPORT_SYMBOL(arp_broken_ops); -EXPORT_SYMBOL(arp_find); -EXPORT_SYMBOL(arp_create); -EXPORT_SYMBOL(arp_xmit); -EXPORT_SYMBOL(arp_send); -EXPORT_SYMBOL(arp_tbl); - -#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) -EXPORT_SYMBOL(clip_tbl_hook); -#endif  |