504 struct neighbour *n = dst->neighbour; |
504 struct neighbour *n = dst->neighbour; |
505 |
505 |
506 if (dev == NULL) |
506 if (dev == NULL) |
507 return -EINVAL; |
507 return -EINVAL; |
508 if (n == NULL) { |
508 if (n == NULL) { |
509 __be32 nexthop = ((struct rtable*)dst)->rt_gateway; |
509 __be32 nexthop = ((struct rtable *)dst)->rt_gateway; |
510 if (dev->flags&(IFF_LOOPBACK|IFF_POINTOPOINT)) |
510 if (dev->flags&(IFF_LOOPBACK|IFF_POINTOPOINT)) |
511 nexthop = 0; |
511 nexthop = 0; |
512 n = __neigh_lookup_errno( |
512 n = __neigh_lookup_errno( |
513 #if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) |
513 #if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) |
514 dev->type == ARPHRD_ATM ? clip_tbl_hook : |
514 dev->type == ARPHRD_ATM ? clip_tbl_hook : |
638 arp->ar_op = htons(type); |
638 arp->ar_op = htons(type); |
639 |
639 |
640 arp_ptr=(unsigned char *)(arp+1); |
640 arp_ptr=(unsigned char *)(arp+1); |
641 |
641 |
642 memcpy(arp_ptr, src_hw, dev->addr_len); |
642 memcpy(arp_ptr, src_hw, dev->addr_len); |
643 arp_ptr+=dev->addr_len; |
643 arp_ptr += dev->addr_len; |
644 memcpy(arp_ptr, &src_ip,4); |
644 memcpy(arp_ptr, &src_ip, 4); |
645 arp_ptr+=4; |
645 arp_ptr += 4; |
646 if (target_hw != NULL) |
646 if (target_hw != NULL) |
647 memcpy(arp_ptr, target_hw, dev->addr_len); |
647 memcpy(arp_ptr, target_hw, dev->addr_len); |
648 else |
648 else |
649 memset(arp_ptr, 0, dev->addr_len); |
649 memset(arp_ptr, 0, dev->addr_len); |
650 arp_ptr+=dev->addr_len; |
650 arp_ptr += dev->addr_len; |
651 memcpy(arp_ptr, &dest_ip, 4); |
651 memcpy(arp_ptr, &dest_ip, 4); |
652 |
652 |
653 return skb; |
653 return skb; |
654 |
654 |
655 out: |
655 out: |
816 |
816 |
817 rt = skb->rtable; |
817 rt = skb->rtable; |
818 addr_type = rt->rt_type; |
818 addr_type = rt->rt_type; |
819 |
819 |
820 if (addr_type == RTN_LOCAL) { |
820 if (addr_type == RTN_LOCAL) { |
821 n = neigh_event_ns(&arp_tbl, sha, &sip, dev); |
821 int dont_send = 0; |
822 if (n) { |
822 |
823 int dont_send = 0; |
823 if (!dont_send) |
824 |
824 dont_send |= arp_ignore(in_dev,sip,tip); |
825 if (!dont_send) |
825 if (!dont_send && IN_DEV_ARPFILTER(in_dev)) |
826 dont_send |= arp_ignore(in_dev,sip,tip); |
826 dont_send |= arp_filter(sip,tip,dev); |
827 if (!dont_send && IN_DEV_ARPFILTER(in_dev)) |
827 if (!dont_send) { |
828 dont_send |= arp_filter(sip,tip,dev); |
828 n = neigh_event_ns(&arp_tbl, sha, &sip, dev); |
829 if (!dont_send) |
829 if (n) { |
830 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha); |
830 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha); |
831 |
831 neigh_release(n); |
832 neigh_release(n); |
832 } |
833 } |
833 } |
834 goto out; |
834 goto out; |
835 } else if (IN_DEV_FORWARD(in_dev)) { |
835 } else if (IN_DEV_FORWARD(in_dev)) { |
836 if (addr_type == RTN_UNICAST && rt->u.dst.dev != dev && |
836 if (addr_type == RTN_UNICAST && rt->u.dst.dev != dev && |
837 (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, net, &tip, dev, 0))) { |
837 (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, net, &tip, dev, 0))) { |
1306 } |
1306 } |
1307 hbuffer[--k] = 0; |
1307 hbuffer[--k] = 0; |
1308 #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) |
1308 #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) |
1309 } |
1309 } |
1310 #endif |
1310 #endif |
1311 sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->primary_key)); |
1311 sprintf(tbuf, "%pI4", n->primary_key); |
1312 seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", |
1312 seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", |
1313 tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); |
1313 tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); |
1314 read_unlock(&n->lock); |
1314 read_unlock(&n->lock); |
1315 } |
1315 } |
1316 |
1316 |
1319 { |
1319 { |
1320 struct net_device *dev = n->dev; |
1320 struct net_device *dev = n->dev; |
1321 int hatype = dev ? dev->type : 0; |
1321 int hatype = dev ? dev->type : 0; |
1322 char tbuf[16]; |
1322 char tbuf[16]; |
1323 |
1323 |
1324 sprintf(tbuf, NIPQUAD_FMT, NIPQUAD(*(u32*)n->key)); |
1324 sprintf(tbuf, "%pI4", n->key); |
1325 seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", |
1325 seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", |
1326 tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", |
1326 tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00", |
1327 dev ? dev->name : "*"); |
1327 dev ? dev->name : "*"); |
1328 } |
1328 } |
1329 |
1329 |