forked from luck/tmp_suning_uos_patched
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);
|
||||
src = (ax25_address *)(bp + 8);
|
||||
|
||||
if (arp_find(bp + 1, skb))
|
||||
return 1;
|
||||
|
||||
route = ax25_get_route(dst, NULL);
|
||||
if (route) {
|
||||
digipeat = route->digipeat;
|
||||
|
@ -218,16 +215,35 @@ static int ax25_neigh_xmit(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,
|
||||
skb->len) < 0 &&
|
||||
ax25_neigh_xmit(skb));
|
||||
return 0;
|
||||
do {
|
||||
__skb_pull(skb, skb_network_offset(skb));
|
||||
seq = read_seqbegin(&neigh->ha_lock);
|
||||
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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user