ax25: Stop depending on arp_find
Have ax25_neigh_output perform ordinary arp resolution before calling ax25_neigh_xmit. Call dev_hard_header in ax25_neigh_output with a destination address so it will not fail, and the destination mac address will not need to be set in ax25_neigh_xmit. Remove arp_find from ax25_neigh_xmit (the ordinary arp resolution added to ax25_neigh_output removes the need for calling arp_find). Document how close ax25_neigh_output is to neigh_resolve_output. Cc: Ralf Baechle <ralf@linux-mips.org> Cc: linux-hams@vger.kernel.org Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
abb7b755d9
commit
945db424bf
|
@ -115,9 +115,6 @@ static int ax25_neigh_xmit(struct sk_buff *skb)
|
||||||
dst = (ax25_address *)(bp + 1);
|
dst = (ax25_address *)(bp + 1);
|
||||||
src = (ax25_address *)(bp + 8);
|
src = (ax25_address *)(bp + 8);
|
||||||
|
|
||||||
if (arp_find(bp + 1, skb))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
route = ax25_get_route(dst, NULL);
|
route = ax25_get_route(dst, NULL);
|
||||||
if (route) {
|
if (route) {
|
||||||
digipeat = route->digipeat;
|
digipeat = route->digipeat;
|
||||||
|
@ -218,16 +215,35 @@ put:
|
||||||
|
|
||||||
static int ax25_neigh_output(struct neighbour *neigh, struct sk_buff *skb)
|
static int ax25_neigh_output(struct neighbour *neigh, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct net_device *dev = skb->dev;
|
/* Except for calling ax25_neigh_xmit instead of
|
||||||
|
* dev_queue_xmit this is neigh_resolve_output.
|
||||||
|
*/
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
__skb_pull(skb, skb_network_offset(skb));
|
if (!neigh_event_send(neigh, skb)) {
|
||||||
|
int err;
|
||||||
|
struct net_device *dev = neigh->dev;
|
||||||
|
unsigned int seq;
|
||||||
|
|
||||||
if (dev_hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL,
|
do {
|
||||||
skb->len) < 0 &&
|
__skb_pull(skb, skb_network_offset(skb));
|
||||||
ax25_neigh_xmit(skb));
|
seq = read_seqbegin(&neigh->ha_lock);
|
||||||
return 0;
|
err = dev_hard_header(skb, dev, ntohs(skb->protocol),
|
||||||
|
neigh->ha, NULL, skb->len);
|
||||||
|
} while (read_seqretry(&neigh->ha_lock, seq));
|
||||||
|
|
||||||
return dev_queue_xmit(skb);
|
if (err >= 0) {
|
||||||
|
ax25_neigh_xmit(skb);
|
||||||
|
} else
|
||||||
|
goto out_kfree_skb;
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
out_kfree_skb:
|
||||||
|
rc = -EINVAL;
|
||||||
|
kfree_skb(skb);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ax25_neigh_construct(struct neighbour *neigh)
|
int ax25_neigh_construct(struct neighbour *neigh)
|
||||||
|
|
Loading…
Reference in New Issue