diff options
Diffstat (limited to 'net/ipv4/arp.c')
-rw-r--r-- | net/ipv4/arp.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index fea4929f6200..247ec1951c35 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -654,11 +654,19 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, | |||
654 | arp_ptr += dev->addr_len; | 654 | arp_ptr += dev->addr_len; |
655 | memcpy(arp_ptr, &src_ip, 4); | 655 | memcpy(arp_ptr, &src_ip, 4); |
656 | arp_ptr += 4; | 656 | arp_ptr += 4; |
657 | if (target_hw != NULL) | 657 | |
658 | memcpy(arp_ptr, target_hw, dev->addr_len); | 658 | switch (dev->type) { |
659 | else | 659 | #if IS_ENABLED(CONFIG_FIREWIRE_NET) |
660 | memset(arp_ptr, 0, dev->addr_len); | 660 | case ARPHRD_IEEE1394: |
661 | arp_ptr += dev->addr_len; | 661 | break; |
662 | #endif | ||
663 | default: | ||
664 | if (target_hw != NULL) | ||
665 | memcpy(arp_ptr, target_hw, dev->addr_len); | ||
666 | else | ||
667 | memset(arp_ptr, 0, dev->addr_len); | ||
668 | arp_ptr += dev->addr_len; | ||
669 | } | ||
662 | memcpy(arp_ptr, &dest_ip, 4); | 670 | memcpy(arp_ptr, &dest_ip, 4); |
663 | 671 | ||
664 | return skb; | 672 | return skb; |
@@ -781,7 +789,14 @@ static int arp_process(struct sk_buff *skb) | |||
781 | arp_ptr += dev->addr_len; | 789 | arp_ptr += dev->addr_len; |
782 | memcpy(&sip, arp_ptr, 4); | 790 | memcpy(&sip, arp_ptr, 4); |
783 | arp_ptr += 4; | 791 | arp_ptr += 4; |
784 | arp_ptr += dev->addr_len; | 792 | switch (dev_type) { |
793 | #if IS_ENABLED(CONFIG_FIREWIRE_NET) | ||
794 | case ARPHRD_IEEE1394: | ||
795 | break; | ||
796 | #endif | ||
797 | default: | ||
798 | arp_ptr += dev->addr_len; | ||
799 | } | ||
785 | memcpy(&tip, arp_ptr, 4); | 800 | memcpy(&tip, arp_ptr, 4); |
786 | /* | 801 | /* |
787 | * Check for bad requests for 127.x.x.x and requests for multicast | 802 | * Check for bad requests for 127.x.x.x and requests for multicast |