net/ipv4/arp.c
changeset 2 d1f6d8b6f81c
parent 0 aa628870c1d3
equal deleted inserted replaced
1:0056487c491e 2:d1f6d8b6f81c
   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