Lines Matching +full:refresh +full:- +full:rate +full:- +full:hz
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
87 ARP_LLINFO_VERIFY, /* LLE is valid, need refresh */
155 * const int max = fls(INT_MAX / hz) - 1;
172 "Minimum log(9) level for recording rate limited arp log messages. "
209 if (lle->la_flags & LLE_STATIC) { in arptimer()
213 if (callout_pending(&lle->lle_timer)) { in arptimer()
232 ifp = lle->lle_tbl->llt_ifp; in arptimer()
233 CURVNET_SET(ifp->if_vnet); in arptimer()
235 switch (lle->ln_state) { in arptimer()
241 * Change state and re-schedule ourselves. in arptimer()
244 lle->ln_state = ARP_LLINFO_VERIFY; in arptimer()
245 callout_schedule(&lle->lle_timer, hz * V_arpt_rexmit); in arptimer()
250 if (llentry_get_hittime(lle) > 0 && lle->la_preempt > 0) { in arptimer()
251 /* Entry was used, issue refresh request */ in arptimer()
255 dst = lle->r_l3addr.addr4; in arptimer()
256 lle->la_preempt--; in arptimer()
257 callout_schedule(&lle->lle_timer, hz * V_arpt_rexmit); in arptimer()
266 if (lle->la_expire > time_uptime) { in arptimer()
267 callout_schedule(&lle->lle_timer, hz * V_arpt_rexmit); in arptimer()
278 if ((lle->la_flags & LLE_DELETED) == 0) { in arptimer()
281 if (lle->la_flags & LLE_VALID) in arptimer()
288 callout_stop(&lle->lle_timer); in arptimer()
296 if (lle->la_flags & LLE_LINKED) { in arptimer()
298 lltable_unlink_entry(lle->lle_tbl, lle); in arptimer()
311 * Stores link-layer header for @ifp in format suitable for if_output()
333 error = ifp->if_requestencap(ifp, &ereq); in arp_fillheader()
342 * - arp header source ip address
343 * - arp header target ip address
344 * - arp header source ethernet address
368 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in arprequest_internal()
369 if (ifa->ifa_addr->sa_family != AF_INET) in arprequest_internal()
372 if (ifa->ifa_carp) { in arprequest_internal()
375 sip = &IA_SIN(ifa)->sin_addr; in arprequest_internal()
378 sip = &IA_SIN(ifa)->sin_addr; in arprequest_internal()
381 if (0 == ((sip->s_addr ^ tip->s_addr) & in arprequest_internal()
382 IA_MASKSIN(ifa)->sin_addr.s_addr)) in arprequest_internal()
395 m->m_len = sizeof(*ah) + 2 * sizeof(struct in_addr) + in arprequest_internal()
396 2 * ifp->if_addrlen; in arprequest_internal()
397 m->m_pkthdr.len = m->m_len; in arprequest_internal()
398 M_ALIGN(m, m->m_len); in arprequest_internal()
400 bzero((caddr_t)ah, m->m_len); in arprequest_internal()
404 ah->ar_pro = htons(ETHERTYPE_IP); in arprequest_internal()
405 ah->ar_hln = ifp->if_addrlen; /* hardware address length */ in arprequest_internal()
406 ah->ar_pln = sizeof(struct in_addr); /* protocol address length */ in arprequest_internal()
407 ah->ar_op = htons(ARPOP_REQUEST); in arprequest_internal()
408 bcopy(enaddr, ar_sha(ah), ah->ar_hln); in arprequest_internal()
409 bcopy(sip, ar_spa(ah), ah->ar_pln); in arprequest_internal()
410 bcopy(tip, ar_tpa(ah), ah->ar_pln); in arprequest_internal()
429 m->m_flags |= M_BCAST; in arprequest_internal()
431 error = (*ifp->if_output)(ifp, m, &sa, &ro); in arprequest_internal()
450 * Resolve an IP address into an ethernet address - heavy version.
479 if (la == NULL && (ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) == 0) { in arpresolve_full()
486 inet_ntoa_r(SIN(dst)->sin_addr, addrbuf), in arpresolve_full()
495 /* Prefer ANY existing lle over newly-created one */ in arpresolve_full()
509 if ((la->la_flags & LLE_VALID) && in arpresolve_full()
510 ((la->la_flags & LLE_STATIC) || la->la_expire > time_uptime)) { in arpresolve_full()
512 lladdr = la->ll_addr; in arpresolve_full()
513 ll_len = ifp->if_addrlen; in arpresolve_full()
515 lladdr = la->r_linkdata; in arpresolve_full()
516 ll_len = la->r_hdrlen; in arpresolve_full()
523 *pflags = la->la_flags & (LLE_VALID|LLE_IFADDR); in arpresolve_full()
532 renew = (la->la_asked == 0 || la->la_expire != time_uptime); in arpresolve_full()
551 if (la->la_asked < V_arp_maxtries) in arpresolve_full()
560 la->la_expire = time_uptime; in arpresolve_full()
561 canceled = callout_reset(&la->lle_timer, hz * V_arpt_down, in arpresolve_full()
565 la->la_asked++; in arpresolve_full()
567 e = arprequest_internal(ifp, NULL, &SIN(dst)->sin_addr, NULL); in arpresolve_full()
612 if (m->m_flags & M_BCAST) { in arpresolve()
615 ifp->if_broadcastaddr, ifp->if_addrlen); in arpresolve()
618 if (m->m_flags & M_MCAST) { in arpresolve()
620 ETHER_MAP_IP_MULTICAST(&SIN(dst)->sin_addr, desten); in arpresolve()
626 if (la != NULL && (la->r_flags & RLLE_VALID) != 0) { in arpresolve()
628 bcopy(la->r_linkdata, desten, la->r_hdrlen); in arpresolve()
630 *pflags = LLE_VALID | (la->r_flags & RLLE_IFADDR); in arpresolve()
649 * then the protocol-specific routine is called.
659 ifp = m->m_pkthdr.rcvif; in arpintr()
661 if (m->m_len < sizeof(struct arphdr) && in arpintr()
670 if (m->m_len < arphdr_len(ar)) { in arpintr()
682 switch (ntohs(ar->ar_hrd)) { in arpintr()
701 * Currently we are capable of handling 20-byte in arpintr()
702 * addresses ( sizeof(lle->ll_addr) ) in arpintr()
704 if (ar->ar_hln >= 20) in arpintr()
710 "%s\n", ntohs(ar->ar_hrd), if_name(ifp)); in arpintr()
715 if (hlen != 0 && hlen != ar->ar_hln) { in arpintr()
718 layer, ar->ar_hln, if_name(ifp)); in arpintr()
724 switch (ntohs(ar->ar_pro)) { in arpintr()
770 struct ifnet *ifp = m->m_pkthdr.rcvif; in in_arpinput()
796 if (ifp->if_bridge) in in_arpinput()
798 if (ifp->if_type == IFT_BRIDGE) in in_arpinput()
811 if (ah->ar_pln != sizeof(struct in_addr)) { in in_arpinput()
819 ifp->if_addrlen, (u_char *)ar_sha(ah), ":"); in in_arpinput()
823 op = ntohs(ah->ar_op); in in_arpinput()
836 if (((bridged && bridge_same_p(ia->ia_ifp->if_bridge, ifp->if_bridge)) || in in_arpinput()
837 ia->ia_ifp == ifp) && in in_arpinput()
838 itaddr.s_addr == ia->ia_addr.sin_addr.s_addr && in in_arpinput()
839 (ia->ia_ifa.ifa_carp == NULL || in in_arpinput()
840 (*carp_iamatch_p)(&ia->ia_ifa, &enaddr))) { in in_arpinput()
841 ifa_ref(&ia->ia_ifa); in in_arpinput()
846 if (((bridged && bridge_same_p(ia->ia_ifp->if_bridge, ifp->if_bridge)) || in in_arpinput()
847 ia->ia_ifp == ifp) && in in_arpinput()
848 isaddr.s_addr == ia->ia_addr.sin_addr.s_addr) { in in_arpinput()
849 ifa_ref(&ia->ia_ifa); in in_arpinput()
854 (bridge_get_softc_p(ia->ia_ifp) == ifp->if_softc && \ in in_arpinput()
855 !bcmp(IF_LLADDR(ia->ia_ifp), IF_LLADDR(ifp), ifp->if_addrlen) && \ in in_arpinput()
856 addr == ia->ia_addr.sin_addr.s_addr) in in_arpinput()
866 ifa_ref(&ia->ia_ifa); in in_arpinput()
867 ifp = ia->ia_ifp; in in_arpinput()
878 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) in in_arpinput()
879 if (ifa->ifa_addr->sa_family == AF_INET && in in_arpinput()
880 (ifa->ifa_carp == NULL || in in_arpinput()
892 ifa_ref(&ia->ia_ifa); in in_arpinput()
896 carped = (ia->ia_ifa.ifa_carp != NULL); in in_arpinput()
897 myaddr = ia->ia_addr.sin_addr; in in_arpinput()
898 ifa_free(&ia->ia_ifa); in in_arpinput()
899 if (!bcmp(ar_sha(ah), enaddr, ifp->if_addrlen)) in in_arpinput()
901 if (!bcmp(ar_sha(ah), ifp->if_broadcastaddr, ifp->if_addrlen)) { in in_arpinput()
907 if (ifp->if_addrlen != ah->ar_hln) { in in_arpinput()
909 "i/f %d (ignored)\n", ifp->if_addrlen, in in_arpinput()
910 (u_char *) ar_sha(ah), ":", ah->ar_hln, in in_arpinput()
911 ifp->if_addrlen); in in_arpinput()
924 ifp->if_addrlen, (u_char *)ar_sha(ah), ":", in in_arpinput()
925 inet_ntoa_r(isaddr, addrbuf), ifp->if_xname); in in_arpinput()
930 if (ifp->if_flags & IFF_STATICARP) in in_arpinput()
956 * to non-directly connected subnet. However, we in in_arpinput()
973 * 1a) 'arp -s' static entry or in in_arpinput()
976 * 2) it was the result of sending first packet to-host in in_arpinput()
983 * existing lle over newly-create one. in in_arpinput()
993 /* Free newly-create entry and handle packet */ in in_arpinput()
1009 (void)memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln); in in_arpinput()
1010 (void)memcpy(ar_sha(ah), enaddr, ah->ar_hln); in in_arpinput()
1021 if ((lle != NULL) && (lle->la_flags & LLE_PUB)) { in in_arpinput()
1022 (void)memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln); in in_arpinput()
1023 (void)memcpy(ar_sha(ah), lle->ll_addr, ah->ar_hln); in in_arpinput()
1033 nh = fib4_lookup(ifp->if_fib, itaddr, 0, 0, 0); in in_arpinput()
1042 if (nh->nh_ifp == ifp) in in_arpinput()
1045 (void)memcpy(ar_tha(ah), ar_sha(ah), ah->ar_hln); in in_arpinput()
1046 (void)memcpy(ar_sha(ah), enaddr, ah->ar_hln); in in_arpinput()
1055 nh = fib4_lookup(ifp->if_fib, isaddr, 0, 0, 0); in in_arpinput()
1058 if (nh->nh_ifp != ifp) { in in_arpinput()
1062 ifp->if_xname); in in_arpinput()
1075 /* RFC 3927 link-local IPv4; always reply by broadcast. */ in in_arpinput()
1077 printf("arp: sending reply for link-local addr %s\n", in in_arpinput()
1080 m->m_flags |= M_BCAST; in in_arpinput()
1081 m->m_flags &= ~M_MCAST; in in_arpinput()
1084 m->m_flags &= ~(M_BCAST|M_MCAST); in in_arpinput()
1086 (void)memcpy(ar_tpa(ah), ar_spa(ah), ah->ar_pln); in in_arpinput()
1087 (void)memcpy(ar_spa(ah), &itaddr, ah->ar_pln); in in_arpinput()
1088 ah->ar_op = htons(ARPOP_REPLY); in in_arpinput()
1089 ah->ar_pro = htons(ETHERTYPE_IP); /* let's be sure! */ in in_arpinput()
1090 m->m_len = sizeof(*ah) + (2 * ah->ar_pln) + (2 * ah->ar_hln); in in_arpinput()
1091 m->m_pkthdr.len = m->m_len; in in_arpinput()
1092 m->m_pkthdr.rcvif = NULL; in in_arpinput()
1117 (*ifp->if_output)(ifp, m, &sa, &ro); in in_arpinput()
1133 chain = la->la_hold; in arp_grab_holdchain()
1134 la->la_hold = NULL; in arp_grab_holdchain()
1135 la->la_numheld = 0; in arp_grab_holdchain()
1149 .ro_prepend = la->r_linkdata, in arp_flush_holdchain()
1150 .ro_plen = la->r_hdrlen, in arp_flush_holdchain()
1156 m_hold_next = m_hold->m_nextpkt; in arp_flush_holdchain()
1157 m_hold->m_nextpkt = NULL; in arp_flush_holdchain()
1160 (*ifp->if_output)(ifp, m_hold, (struct sockaddr *)&sin, &ro); in arp_flush_holdchain()
1180 if (!bridged && la->lle_tbl->llt_ifp != ifp) { in arp_check_update_lle()
1185 la->lle_tbl->llt_ifp->if_xname, in arp_check_update_lle()
1186 ifp->if_addrlen, (u_char *)ar_sha(ah), ":", in arp_check_update_lle()
1187 ifp->if_xname); in arp_check_update_lle()
1191 if ((la->la_flags & LLE_VALID) && in arp_check_update_lle()
1192 bcmp(ar_sha(ah), la->ll_addr, ifp->if_addrlen)) { in arp_check_update_lle()
1193 if (la->la_flags & LLE_STATIC) { in arp_check_update_lle()
1199 ifp->if_addrlen, in arp_check_update_lle()
1202 ifp->if_xname); in arp_check_update_lle()
1209 ifp->if_addrlen, in arp_check_update_lle()
1210 (u_char *)la->ll_addr, ":", in arp_check_update_lle()
1211 ifp->if_addrlen, (u_char *)ar_sha(ah), ":", in arp_check_update_lle()
1212 ifp->if_xname); in arp_check_update_lle()
1225 if (memcmp(la->r_linkdata, linkhdr, linkhdrsize) != 0 || in arp_check_update_lle()
1226 (la->la_flags & LLE_VALID) == 0) { in arp_check_update_lle()
1247 if (la->la_hold != NULL) { in arp_check_update_lle()
1264 la->ln_state = ARP_LLINFO_REACHABLE; in arp_mark_lle_reachable()
1267 if ((ifp->if_flags & IFF_STICKYARP) != 0) in arp_mark_lle_reachable()
1268 la->la_flags |= LLE_STATIC; in arp_mark_lle_reachable()
1270 if (!(la->la_flags & LLE_STATIC)) { in arp_mark_lle_reachable()
1272 la->la_expire = time_uptime + V_arpt_keep; in arp_mark_lle_reachable()
1273 wtime = V_arpt_keep - V_arp_maxtries * V_arpt_rexmit; in arp_mark_lle_reachable()
1276 canceled = callout_reset(&la->lle_timer, in arp_mark_lle_reachable()
1277 hz * wtime, arptimer, la); in arp_mark_lle_reachable()
1281 la->la_asked = 0; in arp_mark_lle_reachable()
1282 la->la_preempt = V_arp_maxtries; in arp_mark_lle_reachable()
1286 * Add permanent link-layer record for given interface address.
1337 if (!error && req->newptr) { in sysctl_garp_rexmit()
1360 if (callout_pending(&ia->ia_garp_timer) || in garp_rexmit()
1361 !callout_active(&ia->ia_garp_timer)) { in garp_rexmit()
1362 IF_ADDR_WUNLOCK(ia->ia_ifa.ifa_ifp); in garp_rexmit()
1363 ifa_free(&ia->ia_ifa); in garp_rexmit()
1368 CURVNET_SET(ia->ia_ifa.ifa_ifp->if_vnet); in garp_rexmit()
1373 IF_ADDR_WUNLOCK(ia->ia_ifa.ifa_ifp); in garp_rexmit()
1375 arprequest(ia->ia_ifa.ifa_ifp, &IA_SIN(ia)->sin_addr, in garp_rexmit()
1376 &IA_SIN(ia)->sin_addr, IF_LLADDR(ia->ia_ifa.ifa_ifp)); in garp_rexmit()
1383 ++ia->ia_garp_count; in garp_rexmit()
1384 if (ia->ia_garp_count >= V_garp_rexmit_count) { in garp_rexmit()
1385 ifa_free(&ia->ia_ifa); in garp_rexmit()
1388 IF_ADDR_WLOCK(ia->ia_ifa.ifa_ifp); in garp_rexmit()
1389 rescheduled = callout_reset(&ia->ia_garp_timer, in garp_rexmit()
1390 (1 << ia->ia_garp_count) * hz, in garp_rexmit()
1392 IF_ADDR_WUNLOCK(ia->ia_ifa.ifa_ifp); in garp_rexmit()
1394 ifa_free(&ia->ia_ifa); in garp_rexmit()
1425 IF_ADDR_WLOCK(ia->ia_ifa.ifa_ifp); in garp_timer_start()
1426 ia->ia_garp_count = 0; in garp_timer_start()
1427 if (callout_reset(&ia->ia_garp_timer, (1 << ia->ia_garp_count) * hz, in garp_timer_start()
1431 IF_ADDR_WUNLOCK(ia->ia_ifa.ifa_ifp); in garp_timer_start()
1441 if (ifa->ifa_carp != NULL) in arp_ifinit()
1444 dst = ifa->ifa_addr; in arp_ifinit()
1447 if (ntohl(dst_in->sin_addr.s_addr) == INADDR_ANY) in arp_ifinit()
1450 arp_announce_ifaddr(ifp, dst_in->sin_addr, IF_LLADDR(ifp)); in arp_ifinit()
1476 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in arp_handle_ifllchange()
1477 if (ifa->ifa_addr->sa_family == AF_INET) in arp_handle_ifllchange()
1490 if (ifp->if_afdata[AF_INET] == NULL) in arp_iflladdr()
1495 if ((ifp->if_flags & IFF_UP) != 0) in arp_iflladdr()