neigh: Pass neighbour entry to output ops.
This will get us closer to being able to do "neigh stuff" completely independent of the underlying dst_entry for protocols (ipv4/ipv6) that wish to do so. We will also be able to make dst entries neigh-less. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@ -51,9 +51,9 @@
|
||||
static int dn_neigh_construct(struct neighbour *);
|
||||
static void dn_long_error_report(struct neighbour *, struct sk_buff *);
|
||||
static void dn_short_error_report(struct neighbour *, struct sk_buff *);
|
||||
static int dn_long_output(struct sk_buff *);
|
||||
static int dn_short_output(struct sk_buff *);
|
||||
static int dn_phase3_output(struct sk_buff *);
|
||||
static int dn_long_output(struct neighbour *, struct sk_buff *);
|
||||
static int dn_short_output(struct neighbour *, struct sk_buff *);
|
||||
static int dn_phase3_output(struct neighbour *, struct sk_buff *);
|
||||
|
||||
|
||||
/*
|
||||
@ -218,10 +218,8 @@ static int dn_neigh_output_packet(struct sk_buff *skb)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int dn_long_output(struct sk_buff *skb)
|
||||
static int dn_long_output(struct neighbour *neigh, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct neighbour *neigh = dst->neighbour;
|
||||
struct net_device *dev = neigh->dev;
|
||||
int headroom = dev->hard_header_len + sizeof(struct dn_long_packet) + 3;
|
||||
unsigned char *data;
|
||||
@ -265,10 +263,8 @@ static int dn_long_output(struct sk_buff *skb)
|
||||
neigh->dev, dn_neigh_output_packet);
|
||||
}
|
||||
|
||||
static int dn_short_output(struct sk_buff *skb)
|
||||
static int dn_short_output(struct neighbour *neigh, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct neighbour *neigh = dst->neighbour;
|
||||
struct net_device *dev = neigh->dev;
|
||||
int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2;
|
||||
struct dn_short_packet *sp;
|
||||
@ -309,10 +305,8 @@ static int dn_short_output(struct sk_buff *skb)
|
||||
* Phase 3 output is the same is short output, execpt that
|
||||
* it clears the area bits before transmission.
|
||||
*/
|
||||
static int dn_phase3_output(struct sk_buff *skb)
|
||||
static int dn_phase3_output(struct neighbour *neigh, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct neighbour *neigh = dst->neighbour;
|
||||
struct net_device *dev = neigh->dev;
|
||||
int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2;
|
||||
struct dn_short_packet *sp;
|
||||
|
@ -705,6 +705,14 @@ out:
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
static int dn_to_neigh_output(struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct neighbour *n = dst->neighbour;
|
||||
|
||||
return n->output(n, skb);
|
||||
}
|
||||
|
||||
static int dn_output(struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
@ -733,7 +741,7 @@ static int dn_output(struct sk_buff *skb)
|
||||
cb->hops = 0;
|
||||
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_LOCAL_OUT, skb, NULL, dev,
|
||||
neigh->output);
|
||||
dn_to_neigh_output);
|
||||
|
||||
error:
|
||||
if (net_ratelimit())
|
||||
@ -750,7 +758,6 @@ static int dn_forward(struct sk_buff *skb)
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct dn_dev *dn_db = rcu_dereference(dst->dev->dn_ptr);
|
||||
struct dn_route *rt;
|
||||
struct neighbour *neigh = dst->neighbour;
|
||||
int header_len;
|
||||
#ifdef CONFIG_NETFILTER
|
||||
struct net_device *dev = skb->dev;
|
||||
@ -783,7 +790,7 @@ static int dn_forward(struct sk_buff *skb)
|
||||
cb->rt_flags |= DN_RT_F_IE;
|
||||
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_FORWARD, skb, dev, skb->dev,
|
||||
neigh->output);
|
||||
dn_to_neigh_output);
|
||||
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
|
Reference in New Issue
Block a user