diff options
Diffstat (limited to 'include/net/neighbour.h')
| -rw-r--r-- | include/net/neighbour.h | 34 | 
1 files changed, 21 insertions, 13 deletions
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 4014b623880..4ba8521490b 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h @@ -108,8 +108,8 @@ struct neighbour {  	__u8			dead;  	seqlock_t		ha_lock;  	unsigned char		ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))]; -	struct hh_cache		*hh; -	int			(*output)(struct sk_buff *skb); +	struct hh_cache		hh; +	int			(*output)(struct neighbour *, struct sk_buff *);  	const struct neigh_ops	*ops;  	struct rcu_head		rcu;  	struct net_device	*dev; @@ -118,12 +118,10 @@ struct neighbour {  struct neigh_ops {  	int			family; -	void			(*solicit)(struct neighbour *, struct sk_buff*); -	void			(*error_report)(struct neighbour *, struct sk_buff*); -	int			(*output)(struct sk_buff*); -	int			(*connected_output)(struct sk_buff*); -	int			(*hh_output)(struct sk_buff*); -	int			(*queue_xmit)(struct sk_buff*); +	void			(*solicit)(struct neighbour *, struct sk_buff *); +	void			(*error_report)(struct neighbour *, struct sk_buff *); +	int			(*output)(struct neighbour *, struct sk_buff *); +	int			(*connected_output)(struct neighbour *, struct sk_buff *);  };  struct pneigh_entry { @@ -142,7 +140,7 @@ struct pneigh_entry {  struct neigh_hash_table {  	struct neighbour __rcu	**hash_buckets; -	unsigned int		hash_mask; +	unsigned int		hash_shift;  	__u32			hash_rnd;  	struct rcu_head		rcu;  }; @@ -205,9 +203,10 @@ extern int			neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,  					     u32 flags);  extern void			neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);  extern int			neigh_ifdown(struct neigh_table *tbl, struct net_device *dev); -extern int			neigh_resolve_output(struct sk_buff *skb); -extern int			neigh_connected_output(struct sk_buff *skb); -extern int			neigh_compat_output(struct sk_buff *skb); +extern int			neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb); +extern int			neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb); +extern int			neigh_compat_output(struct neighbour *neigh, struct sk_buff *skb); +extern int			neigh_direct_output(struct neighbour *neigh, struct sk_buff *skb);  extern struct neighbour 	*neigh_event_ns(struct neigh_table *tbl,  						u8 *lladdr, void *saddr,  						struct net_device *dev); @@ -341,7 +340,16 @@ static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb)  	} while (read_seqretry(&hh->hh_lock, seq));  	skb_push(skb, hh_len); -	return hh->hh_output(skb); +	return dev_queue_xmit(skb); +} + +static inline int neigh_output(struct neighbour *n, struct sk_buff *skb) +{ +	struct hh_cache *hh = &n->hh; +	if ((n->nud_state & NUD_CONNECTED) && hh->hh_len) +		return neigh_hh_output(hh, skb); +	else +		return n->output(n, skb);  }  static inline struct neighbour *  |