コード例 #1
0
ファイル: arp.c プロジェクト: 274914765/C
int arp_find(unsigned char *haddr, struct sk_buff *skb)
{
    struct net_device *dev = skb->dev;
    __be32 paddr;
    struct neighbour *n;

    if (!skb->dst) {
        printk(KERN_DEBUG "arp_find is called with dst==NULL\n");
        kfree_skb(skb);
        return 1;
    }

    paddr = skb->rtable->rt_gateway;

    if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr, paddr, dev))
        return 0;

    n = __neigh_lookup(&arp_tbl, &paddr, dev, 1);

    if (n) {
        n->used = jiffies;
        if (n->nud_state&NUD_VALID || neigh_event_send(n, skb) == 0) {
            read_lock_bh(&n->lock);
            memcpy(haddr, n->ha, dev->addr_len);
            read_unlock_bh(&n->lock);
            neigh_release(n);
            return 0;
        }
        neigh_release(n);
    } else
        kfree_skb(skb);
    return 1;
}
コード例 #2
0
int arp_find(unsigned char *haddr, struct sk_buff *skb)
{
	struct net_device *dev = skb->dev;
	__be32 paddr;
	struct neighbour *n;

	if (!skb_dst(skb)) {
		pr_debug("arp_find is called with dst==NULL\n");
		kfree_skb(skb);
		return 1;
	}

	paddr = rt_nexthop(skb_rtable(skb), ip_hdr(skb)->daddr);
	if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr,
			       paddr, dev))
		return 0;

	n = __neigh_lookup(&arp_tbl, &paddr, dev, 1);

	if (n) {
		n->used = jiffies;
		if (n->nud_state & NUD_VALID || neigh_event_send(n, skb) == 0) {
			neigh_ha_snapshot(haddr, n, dev);
			neigh_release(n);
			return 0;
		}
		neigh_release(n);
	} else
		kfree_skb(skb);
	return 1;
}