summaryrefslogtreecommitdiffstats
path: root/sys/netinet/if_ether.c
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2015-12-16 09:16:06 +0000
committermelifaro <melifaro@FreeBSD.org>2015-12-16 09:16:06 +0000
commitb2f446313468f5dd643849b55606deda0852499b (patch)
treeeb07fb6f1f3971ee33ac94c88b36ca5f55e6e1c2 /sys/netinet/if_ether.c
parent3d03354a9230e4702e64940c74b710e4fa6aab7e (diff)
downloadFreeBSD-src-b2f446313468f5dd643849b55606deda0852499b.zip
FreeBSD-src-b2f446313468f5dd643849b55606deda0852499b.tar.gz
Fix ARP reply handling changed in r286955.
If source of ARP request didn't pass the routing check (e.g. not in directly connected network), be polite and still answer the request instead of dropping frame. Reported by: quadro at irc@rusnet
Diffstat (limited to 'sys/netinet/if_ether.c')
-rw-r--r--sys/netinet/if_ether.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index 2214542..ce1487f 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -855,12 +855,20 @@ match:
arp_check_update_lle(ah, isaddr, ifp, bridged, la);
else if (itaddr.s_addr == myaddr.s_addr) {
/*
- * Reply to our address, but no lle exists yet.
- * do we really have to create an entry?
+ * Request/reply to our address, but no lle exists yet.
+ * Try to create new llentry.
*/
la = lltable_alloc_entry(LLTABLE(ifp), 0, dst);
- if (la == NULL)
- goto drop;
+ if (la == NULL) {
+
+ /*
+ * lle creation may fail if source address belongs
+ * to non-directly connected subnet. However, we
+ * will try to answer the request instead of dropping
+ * frame.
+ */
+ goto reply;
+ }
lltable_set_entry_addr(ifp, la, ar_sha(ah));
IF_AFDATA_WLOCK(ifp);
OpenPOWER on IntegriCloud