neigh: Don't require dst in neigh_hh_init

- Add protocol to neigh_tbl so that dst->ops->protocol is not needed
- Acquire the device from neigh->dev

This results in a neigh_hh_init that will cache the samve values
regardless of the packets flowing through it.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric W. Biederman 2015-03-02 00:13:22 -06:00 committed by David S. Miller
parent 59b2af26b9
commit bdf53c5849
5 changed files with 8 additions and 4 deletions

View File

@ -193,6 +193,7 @@ struct neigh_table {
int family; int family;
int entry_size; int entry_size;
int key_len; int key_len;
__be16 protocol;
__u32 (*hash)(const void *pkey, __u32 (*hash)(const void *pkey,
const struct net_device *dev, const struct net_device *dev,
__u32 *hash_rnd); __u32 *hash_rnd);

View File

@ -1263,10 +1263,10 @@ struct neighbour *neigh_event_ns(struct neigh_table *tbl,
EXPORT_SYMBOL(neigh_event_ns); EXPORT_SYMBOL(neigh_event_ns);
/* called with read_lock_bh(&n->lock); */ /* called with read_lock_bh(&n->lock); */
static void neigh_hh_init(struct neighbour *n, struct dst_entry *dst) static void neigh_hh_init(struct neighbour *n)
{ {
struct net_device *dev = dst->dev; struct net_device *dev = n->dev;
__be16 prot = dst->ops->protocol; __be16 prot = n->tbl->protocol;
struct hh_cache *hh = &n->hh; struct hh_cache *hh = &n->hh;
write_lock_bh(&n->lock); write_lock_bh(&n->lock);
@ -1296,7 +1296,7 @@ int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb)
unsigned int seq; unsigned int seq;
if (dev->header_ops->cache && !neigh->hh.hh_len) if (dev->header_ops->cache && !neigh->hh.hh_len)
neigh_hh_init(neigh, dst); neigh_hh_init(neigh);
do { do {
__skb_pull(skb, skb_network_offset(skb)); __skb_pull(skb, skb_network_offset(skb));

View File

@ -97,6 +97,7 @@ struct neigh_table dn_neigh_table = {
.family = PF_DECnet, .family = PF_DECnet,
.entry_size = NEIGH_ENTRY_SIZE(sizeof(struct dn_neigh)), .entry_size = NEIGH_ENTRY_SIZE(sizeof(struct dn_neigh)),
.key_len = sizeof(__le16), .key_len = sizeof(__le16),
.protocol = cpu_to_be16(ETH_P_DNA_RT),
.hash = dn_neigh_hash, .hash = dn_neigh_hash,
.constructor = dn_neigh_construct, .constructor = dn_neigh_construct,
.id = "dn_neigh_cache", .id = "dn_neigh_cache",

View File

@ -152,6 +152,7 @@ static const struct neigh_ops arp_direct_ops = {
struct neigh_table arp_tbl = { struct neigh_table arp_tbl = {
.family = AF_INET, .family = AF_INET,
.key_len = 4, .key_len = 4,
.protocol = cpu_to_be16(ETH_P_IP),
.hash = arp_hash, .hash = arp_hash,
.constructor = arp_constructor, .constructor = arp_constructor,
.proxy_redo = parp_redo, .proxy_redo = parp_redo,

View File

@ -117,6 +117,7 @@ static const struct neigh_ops ndisc_direct_ops = {
struct neigh_table nd_tbl = { struct neigh_table nd_tbl = {
.family = AF_INET6, .family = AF_INET6,
.key_len = sizeof(struct in6_addr), .key_len = sizeof(struct in6_addr),
.protocol = cpu_to_be16(ETH_P_IPV6),
.hash = ndisc_hash, .hash = ndisc_hash,
.constructor = ndisc_constructor, .constructor = ndisc_constructor,
.pconstructor = pndisc_constructor, .pconstructor = pndisc_constructor,