Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147777386
D31391.1784343369.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D31391.1784343369.diff
View Options
Index: sys/netinet/if_ether.c
===================================================================
--- sys/netinet/if_ether.c
+++ sys/netinet/if_ether.c
@@ -1149,6 +1149,39 @@
}
#endif
+static void
+arp_grab_holdchain(struct llentry *la, struct mbuf **chain,
+ struct sockaddr_in *sin)
+{
+ LLE_WLOCK_ASSERT(la);
+
+ *chain = la->la_hold;
+ la->la_hold = NULL;
+ la->la_numheld = 0;
+ lltable_fill_sa_entry(la, (struct sockaddr *)&sin);
+}
+
+
+static void
+arp_flush_holdchain(struct ifnet *ifp, struct llentry *la, struct mbuf *chain,
+ struct sockaddr_in *dst)
+{
+ struct mbuf *m_hold, *m_hold_next;
+
+ struct route ro = {
+ .ro_prepend = la->r_linkdata,
+ .ro_plen = la->r_hdrlen,
+ };
+
+ for (m_hold = chain; m_hold != NULL; m_hold = m_hold_next) {
+ m_hold_next = m_hold->m_nextpkt;
+ m_hold->m_nextpkt = NULL;
+ /* Avoid confusing lower layers. */
+ m_clrprotoflags(m_hold);
+ (*ifp->if_output)(ifp, m_hold, (struct sockaddr *)dst, &ro);
+ }
+}
+
/*
* Checks received arp data against existing @la.
* Updates lle state/performs notification if necessary.
@@ -1157,8 +1190,6 @@
arp_check_update_lle(struct arphdr *ah, struct in_addr isaddr, struct ifnet *ifp,
int bridged, struct llentry *la)
{
- struct sockaddr sa;
- struct mbuf *m_hold, *m_hold_next;
uint8_t linkhdr[LLE_MAX_LINKHDR];
size_t linkhdrsize;
int lladdr_off;
@@ -1231,18 +1262,12 @@
* output routine.
*/
if (la->la_hold != NULL) {
- m_hold = la->la_hold;
- la->la_hold = NULL;
- la->la_numheld = 0;
- lltable_fill_sa_entry(la, &sa);
+ struct sockaddr_in sin;
+ struct mbuf *chain;
+
+ arp_grab_holdchain(la, &chain, &sin);
LLE_WUNLOCK(la);
- for (; m_hold != NULL; m_hold = m_hold_next) {
- m_hold_next = m_hold->m_nextpkt;
- m_hold->m_nextpkt = NULL;
- /* Avoid confusing lower layers. */
- m_clrprotoflags(m_hold);
- (*ifp->if_output)(ifp, m_hold, &sa, NULL);
- }
+ arp_flush_holdchain(ifp, la, chain, &sin);
} else
LLE_WUNLOCK(la);
}
Index: sys/netinet6/nd6.h
===================================================================
--- sys/netinet6/nd6.h
+++ sys/netinet6/nd6.h
@@ -378,7 +378,7 @@
char *, int, int, int);
void nd6_grab_holdchain(struct llentry *, struct mbuf **,
struct sockaddr_in6 *);
-int nd6_flush_holdchain(struct ifnet *, struct mbuf *,
+int nd6_flush_holdchain(struct ifnet *, struct llentry *, struct mbuf *,
struct sockaddr_in6 *);
int nd6_add_ifa_lle(struct in6_ifaddr *);
void nd6_rem_ifa_lle(struct in6_ifaddr *, int);
Index: sys/netinet6/nd6.c
===================================================================
--- sys/netinet6/nd6.c
+++ sys/netinet6/nd6.c
@@ -2067,7 +2067,7 @@
LLE_RUNLOCK(ln);
if (chain != NULL)
- nd6_flush_holdchain(ifp, chain, &sin6);
+ nd6_flush_holdchain(ifp, ln, chain, &sin6);
/*
* When the link-layer address of a router changes, select the
@@ -2446,19 +2446,24 @@
}
int
-nd6_flush_holdchain(struct ifnet *ifp, struct mbuf *chain,
+nd6_flush_holdchain(struct ifnet *ifp, struct llentry *lle, struct mbuf *chain,
struct sockaddr_in6 *dst)
{
struct mbuf *m, *m_head;
int error = 0;
+ struct route_in6 ro = {
+ .ro_prepend = lle->r_linkdata,
+ .ro_plen = lle->r_hdrlen,
+ };
+
m_head = chain;
while (m_head) {
m = m_head;
m_head = m_head->m_nextpkt;
m->m_nextpkt = NULL;
- error = nd6_output_ifp(ifp, ifp, m, dst, NULL);
+ error = nd6_output_ifp(ifp, ifp, m, dst, (struct route *)&ro);
}
/*
Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c
+++ sys/netinet6/nd6_nbr.c
@@ -908,7 +908,7 @@
LLE_WUNLOCK(ln);
if (chain != NULL)
- nd6_flush_holdchain(ifp, chain, &sin6);
+ nd6_flush_holdchain(ifp, ln, chain, &sin6);
if (checklink)
pfxlist_onlink_check();
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jul 18, 2:56 AM (2 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29177776
Default Alt Text
D31391.1784343369.diff (3 KB)
Attached To
Mode
D31391: [lltable] Use lltable calculated header when sending lle holdchain after successful lle resolution.
Attached
Detach File
Event Timeline
Log In to Comment