Module Name: src
Committed By: ozaki-r
Date: Wed Oct 7 00:33:28 UTC 2015
Modified Files:
src/sys/netinet: if_arp.c
Log Message:
Create an llentry after fixing an interface to store
In case of RTF_LOCAL routes, we change an output interface
of a route from original one to lo0ifp. An llentry also
has to be stored to lo0ifp in such cases.
Problem reported by roy@
To generate a diff of this commit:
cvs rdiff -u -r1.182 -r1.183 src/sys/netinet/if_arp.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.182 src/sys/netinet/if_arp.c:1.183
--- src/sys/netinet/if_arp.c:1.182 Mon Oct 5 08:17:31 2015
+++ src/sys/netinet/if_arp.c Wed Oct 7 00:33:27 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: if_arp.c,v 1.182 2015/10/05 08:17:31 ozaki-r Exp $ */
+/* $NetBSD: if_arp.c,v 1.183 2015/10/07 00:33:27 ozaki-r Exp $ */
/*-
* Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.182 2015/10/05 08:17:31 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.183 2015/10/07 00:33:27 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -576,43 +576,6 @@ arp_rtrequest(int req, struct rtentry *r
if (rt->rt_flags & RTF_BROADCAST)
break;
- /*
- * Case 2: This route may come from cloning, or a manual route
- * add with a LL address.
- */
- flags = LLE_EXCLUSIVE;
- if ((rt->rt_flags & RTF_CLONED) == 0)
- flags |= LLE_IFADDR;
-
- IF_AFDATA_WLOCK(ifp);
- la = lla_create(LLTABLE(ifp), flags, rt_getkey(rt));
- IF_AFDATA_WUNLOCK(ifp);
-
- if (la == NULL) {
- log(LOG_DEBUG, "%s: lla_create failed\n",
- __func__);
- rt->rt_llinfo = NULL;
- break;
- }
- rt->rt_llinfo = la;
- switch (ifp->if_type) {
-#if NTOKEN > 0
- case IFT_ISO88025:
- la->la_opaque = kmem_alloc(sizeof(struct token_rif),
- KM_SLEEP);
- break;
-#endif /* NTOKEN > 0 */
- default:
- break;
- }
- la->la_rt = rt;
- rt->rt_refcnt++;
- rt->rt_flags |= RTF_LLINFO;
- arp_inuse++, arp_allocated++;
-
- LLE_WUNLOCK(la);
- la = NULL;
-
INADDR_TO_IA(satocsin(rt_getkey(rt))->sin_addr, ia);
while (ia && ia->ia_ifp != ifp)
NEXT_IA_WITH_SAME_ADDR(ia);
@@ -655,6 +618,44 @@ arp_rtrequest(int req, struct rtentry *r
if (ifa != rt->rt_ifa)
rt_replace_ifa(rt, ifa);
}
+
+ /*
+ * Case 2: This route may come from cloning, or a manual route
+ * add with a LL address.
+ */
+ flags = LLE_EXCLUSIVE;
+ if ((rt->rt_flags & RTF_CLONED) == 0)
+ flags |= LLE_IFADDR;
+
+ IF_AFDATA_WLOCK(ifp);
+ la = lla_create(LLTABLE(ifp), flags, rt_getkey(rt));
+ IF_AFDATA_WUNLOCK(ifp);
+
+ if (la == NULL) {
+ log(LOG_DEBUG, "%s: lla_create failed\n",
+ __func__);
+ rt->rt_llinfo = NULL;
+ break;
+ }
+ rt->rt_llinfo = la;
+ switch (ifp->if_type) {
+#if NTOKEN > 0
+ case IFT_ISO88025:
+ la->la_opaque = kmem_alloc(sizeof(struct token_rif),
+ KM_SLEEP);
+ break;
+#endif /* NTOKEN > 0 */
+ default:
+ break;
+ }
+ la->la_rt = rt;
+ rt->rt_refcnt++;
+ rt->rt_flags |= RTF_LLINFO;
+ arp_inuse++, arp_allocated++;
+
+ LLE_WUNLOCK(la);
+ la = NULL;
+
break;
case RTM_DELETE: