aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2021-08-02 22:39:00 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2021-09-07 21:02:58 +0000
commit280201438072f6800af1bdf77edc334e4cdf42cb (patch)
tree710bee9eb3dd9854d50929fa386e9b8bc93530ff /sys/netinet
parent0f7162e0cd46784442b44f44e9303dc29705dc6b (diff)
downloadsrc-280201438072f6800af1bdf77edc334e4cdf42cb.tar.gz
src-280201438072f6800af1bdf77edc334e4cdf42cb.zip
[lltable] Unify datapath feedback mechamism.
Use newly-create llentry_request_feedback(), llentry_mark_used() and llentry_get_hittime() to request datapatch usage check and fetch the results in the same fashion both in IPv4 and IPv6. While here, simplify llentry_provide_feedback() wrapper by eliminating 1 condition check. Differential Revision: https://reviews.freebsd.org/D31390 (cherry picked from commit f3a3b061216936b6233d1624dfdba03240d7c045)
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/if_ether.c25
-rw-r--r--sys/netinet/in.c15
2 files changed, 8 insertions, 32 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index ef50ec9ca964..3eb9d7210afb 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -207,7 +207,6 @@ arptimer(void *arg)
{
struct llentry *lle = (struct llentry *)arg;
struct ifnet *ifp;
- int r_skip_req;
if (lle->la_flags & LLE_STATIC) {
return;
@@ -240,27 +239,17 @@ arptimer(void *arg)
/*
* Expiration time is approaching.
- * Let's try to refresh entry if it is still
- * in use.
- *
- * Set r_skip_req to get feedback from
- * fast path. Change state and re-schedule
- * ourselves.
+ * Request usage feedback from the datapath.
+ * Change state and re-schedule ourselves.
*/
- LLE_REQ_LOCK(lle);
- lle->r_skip_req = 1;
- LLE_REQ_UNLOCK(lle);
+ llentry_request_feedback(lle);
lle->ln_state = ARP_LLINFO_VERIFY;
callout_schedule(&lle->lle_timer, hz * V_arpt_rexmit);
LLE_WUNLOCK(lle);
CURVNET_RESTORE();
return;
case ARP_LLINFO_VERIFY:
- LLE_REQ_LOCK(lle);
- r_skip_req = lle->r_skip_req;
- LLE_REQ_UNLOCK(lle);
-
- if (r_skip_req == 0 && lle->la_preempt > 0) {
+ if (llentry_get_hittime(lle) > 0 && lle->la_preempt > 0) {
/* Entry was used, issue refresh request */
struct epoch_tracker et;
struct in_addr dst;
@@ -532,7 +521,7 @@ arpresolve_full(struct ifnet *ifp, int is_gw, int flags, struct mbuf *m,
bcopy(lladdr, desten, ll_len);
/* Notify LLE code that the entry was used by datapath */
- llentry_mark_used(la);
+ llentry_provide_feedback(la);
if (pflags != NULL)
*pflags = la->la_flags & (LLE_VALID|LLE_IFADDR);
if (plle) {
@@ -656,7 +645,7 @@ arpresolve(struct ifnet *ifp, int is_gw, struct mbuf *m,
if (pflags != NULL)
*pflags = LLE_VALID | (la->r_flags & RLLE_IFADDR);
/* Notify the LLE handling code that the entry was used. */
- llentry_mark_used(la);
+ llentry_provide_feedback(la);
if (plle) {
LLE_ADDREF(la);
*plle = la;
@@ -1225,7 +1214,7 @@ arp_check_update_lle(struct arphdr *ah, struct in_addr isaddr, struct ifnet *ifp
return;
/* Clear fast path feedback request if set */
- la->r_skip_req = 0;
+ llentry_mark_used(la);
}
arp_mark_lle_reachable(la);
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index bcf071a81e0e..d1dd2b31b6ef 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -1265,19 +1265,6 @@ in_lltable_destroy_lle_unlocked(epoch_context_t ctx)
}
/*
- * Called by the datapath to indicate that
- * the entry was used.
- */
-static void
-in_lltable_mark_used(struct llentry *lle)
-{
-
- LLE_REQ_LOCK(lle);
- lle->r_skip_req = 0;
- LLE_REQ_UNLOCK(lle);
-}
-
-/*
* Called by LLE_FREE_LOCKED when number of references
* drops to zero.
*/
@@ -1681,7 +1668,7 @@ in_lltattach(struct ifnet *ifp)
llt->llt_fill_sa_entry = in_lltable_fill_sa_entry;
llt->llt_free_entry = in_lltable_free_entry;
llt->llt_match_prefix = in_lltable_match_prefix;
- llt->llt_mark_used = in_lltable_mark_used;
+ llt->llt_mark_used = llentry_mark_used;
lltable_link(llt);
return (llt);