Index: sys/kern/uipc_domain.c =================================================================== --- sys/kern/uipc_domain.c +++ sys/kern/uipc_domain.c @@ -479,6 +479,18 @@ (*pr->pr_ctlinput)(cmd, sa, (void *)0); } +int +pr_milli_to_slowtimo(int ms) +{ + return (ms * PR_SLOWHZ / 1000); +} + +int +pr_milli_to_fasttimo(int ms) +{ + return (ms * PR_FASTHZ / 1000); +} + static void pfslowtimo(void *arg) { Index: sys/net/route.h =================================================================== --- sys/net/route.h +++ sys/net/route.h @@ -85,21 +85,15 @@ u_long rmx_recvpipe; /* inbound delay-bandwidth product */ u_long rmx_sendpipe; /* outbound delay-bandwidth product */ u_long rmx_ssthresh; /* outbound gateway buffer limit */ - u_long rmx_rtt; /* estimated round trip time */ - u_long rmx_rttvar; /* estimated rtt variance */ + u_long rmx_rtt; /* estimated round trip time (microseconds) */ + u_long rmx_rttvar; /* estimated rtt variance (microseconds) */ u_long rmx_pksent; /* packets sent using this route */ u_long rmx_weight; /* route weight */ u_long rmx_nhidx; /* route nexhop index */ u_long rmx_filler[2]; /* will be used for T/TCP later */ }; -/* - * rmx_rtt and rmx_rttvar are stored as microseconds; - * RTTTOPRHZ(rtt) converts to a value suitable for use - * by a protocol slowtimo counter. - */ #define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ -#define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ)) /* lle state is exported in rmx_state rt_metrics field */ #define rmx_state rmx_weight Index: sys/netinet/igmp.c =================================================================== --- sys/netinet/igmp.c +++ sys/netinet/igmp.c @@ -816,7 +816,7 @@ case IGMP_AWAKENING_MEMBER: inm->inm_state = IGMP_REPORTING_MEMBER; inm->inm_timer = IGMP_RANDOM_DELAY( - IGMP_V1V2_MAX_RI * PR_FASTHZ); + pr_milli_to_fasttimo(IGMP_V1V2_MAX_RI * 1000)); V_current_state_timers_running = 1; break; case IGMP_LEAVING_MEMBER: @@ -886,7 +886,7 @@ igmp_set_version(igi, IGMP_VERSION_2); - timer = igmp->igmp_code * PR_FASTHZ / IGMP_TIMER_SCALE; + timer = pr_milli_to_fasttimo(igmp->igmp_code * 1000) / IGMP_TIMER_SCALE; if (timer == 0) timer = 1; @@ -1026,7 +1026,7 @@ (IGMP_EXP(igmpv3->igmp_qqi) + 3); } - timer = maxresp * PR_FASTHZ / IGMP_TIMER_SCALE; + timer = pr_milli_to_fasttimo(maxresp * 1000) / IGMP_TIMER_SCALE; if (timer == 0) timer = 1; @@ -1740,8 +1740,8 @@ if (igi->igi_version == IGMP_VERSION_3) { loop = (igi->igi_flags & IGIF_LOOPBACK) ? 1 : 0; - uri_fasthz = IGMP_RANDOM_DELAY(igi->igi_uri * - PR_FASTHZ); + uri_fasthz = IGMP_RANDOM_DELAY( + pr_milli_to_fasttimo(igi->igi_uri * 1000)); mbufq_init(&qrq, IGMP_MAX_G_GS_PACKETS); mbufq_init(&scq, IGMP_MAX_STATE_CHANGE_PACKETS); } @@ -2000,7 +2000,7 @@ * Section 8.12. */ old_version_timer = igi->igi_rv * igi->igi_qi + igi->igi_qri; - old_version_timer *= PR_SLOWHZ; + old_version_timer *= pr_milli_to_slowtimo(1000); if (version == IGMP_VERSION_1) { igi->igi_v1_timer = old_version_timer; @@ -2433,7 +2433,7 @@ IGMP_v1_HOST_MEMBERSHIP_REPORT); if (error == 0) { inm->inm_timer = IGMP_RANDOM_DELAY( - IGMP_V1V2_MAX_RI * PR_FASTHZ); + pr_milli_to_fasttimo(IGMP_V1V2_MAX_RI * 1000)); V_current_state_timers_running = 1; } break; @@ -3422,7 +3422,7 @@ */ if (mbufq_first(&igi->igi_gq) != NULL) { igi->igi_v3_timer = 1 + IGMP_RANDOM_DELAY( - IGMP_RESPONSE_BURST_INTERVAL); + pr_milli_to_fasttimo(IGMP_RESPONSE_BURST_INTERVAL_MS)); V_interface_timers_running = 1; } } Index: sys/netinet/igmp_var.h =================================================================== --- sys/netinet/igmp_var.h +++ sys/netinet/igmp_var.h @@ -148,7 +148,7 @@ #define IGMP_MAX_STATE_CHANGE_PACKETS 8 /* # of packets per state change */ #define IGMP_MAX_RESPONSE_PACKETS 16 /* # of packets for general query */ #define IGMP_MAX_RESPONSE_BURST 4 /* # of responses to send at once */ -#define IGMP_RESPONSE_BURST_INTERVAL (PR_FASTHZ / 2) /* 500ms */ +#define IGMP_RESPONSE_BURST_INTERVAL_MS 500 /* * IGMP-specific mbuf flags. Index: sys/netinet/ip6.h =================================================================== --- sys/netinet/ip6.h +++ sys/netinet/ip6.h @@ -254,7 +254,7 @@ */ #define IPV6_MAXHLIM 255 /* maximum hoplimit */ #define IPV6_DEFHLIM 64 /* default hlim */ -#define IPV6_FRAGTTL 120 /* ttl for fragment packets, in slowtimo tick */ +#define IPV6_DEFFRAGTTL 60 /* ttl for fragment packets, in seconds */ #define IPV6_HLIMDEC 1 /* subtracted when forwarding */ #define IPV6_MMTU 1280 /* minimal MTU and reassembly. 1024 + 256 */ Index: sys/netinet6/frag6.c =================================================================== --- sys/netinet6/frag6.c +++ sys/netinet6/frag6.c @@ -124,6 +124,10 @@ #define V_ip6_maxfragpackets VNET(ip6_maxfragpackets) #define V_frag6_nfragpackets VNET(frag6_nfragpackets) +/* Maximum per-VNET reassembly timeout (seconds) */ +VNET_DEFINE_STATIC(u_int, ip6_maxfragttl) = IPV6_DEFFRAGTTL; +#define V_ip6_maxfragttl VNET(ip6_maxfragttl) + /* Maximum per-VNET reassembly queues per bucket and fragments per packet. */ VNET_DEFINE_STATIC(int, ip6_maxfragbucketsize); VNET_DEFINE_STATIC(int, ip6_maxfragsperpacket); @@ -212,6 +216,26 @@ CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_maxfragbucketsize), 0, "Maximum number of reassembly queues per hash bucket"); +static int +sysctl_ip6_maxfragttl(SYSCTL_HANDLER_ARGS) +{ + int error, val; + + val = V_ip6_maxfragttl; + error = sysctl_handle_int(oidp, &val, 0, req); + if (error != 0 || !req->newptr) + return (error); + if (val <= 0) + val = IPV6_DEFFRAGTTL; + V_ip6_maxfragpackets = val; + frag6_set_bucketsize(); + return (0); +} +SYSCTL_PROC(_net_inet6_ip6, OID_AUTO, maxfragttl, + CTLFLAG_VNET | CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, + NULL, 0, sysctl_ip6_maxfragttl, "I", + "Maximum TTL of fragments, in seconds"); + /* * Remove the IPv6 fragmentation header from the mbuf. */ @@ -551,7 +575,7 @@ /* ip6q_nxt will be filled afterwards, from 1st fragment. */ TAILQ_INIT(&q6->ip6q_frags); q6->ip6q_ident = ip6f->ip6f_ident; - q6->ip6q_ttl = IPV6_FRAGTTL; + q6->ip6q_ttl = pr_milli_to_slowtimo(V_ip6_maxfragttl * 1000); q6->ip6q_src = ip6->ip6_src; q6->ip6q_dst = ip6->ip6_dst; q6->ip6q_ecn = IPV6_ECN(ip6); Index: sys/netinet6/in6.c =================================================================== --- sys/netinet6/in6.c +++ sys/netinet6/in6.c @@ -733,7 +733,7 @@ return (NULL); } - delay = (delay * PR_FASTHZ) / hz; + delay = pr_milli_to_fasttimo(delay * 1000) / hz; error = in6_joingroup(ifp, mcaddr, NULL, &imm->i6mm_maddr, delay); if (error) { Index: sys/netinet6/mld6.c =================================================================== --- sys/netinet6/mld6.c +++ sys/netinet6/mld6.c @@ -670,7 +670,7 @@ KASSERT(mli != NULL, ("%s: no mld_ifsoftc for ifp %p", __func__, ifp)); mld_set_version(mli, MLD_VERSION_1); - timer = (ntohs(mld->mld_maxdelay) * PR_FASTHZ) / MLD_TIMER_SCALE; + timer = (pr_milli_to_fasttimo(ntohs(mld->mld_maxdelay) * 1000)) / MLD_TIMER_SCALE; if (timer == 0) timer = 1; @@ -821,7 +821,7 @@ maxdelay = (MLD_MRC_MANT(maxdelay) | 0x1000) << (MLD_MRC_EXP(maxdelay) + 3); } - timer = (maxdelay * PR_FASTHZ) / MLD_TIMER_SCALE; + timer = (pr_milli_to_fasttimo(maxdelay * 1000)) / MLD_TIMER_SCALE; if (timer == 0) timer = 1; @@ -1380,7 +1380,7 @@ if (mli->mli_version == MLD_VERSION_2) { uri_fasthz = MLD_RANDOM_DELAY(mli->mli_uri * - PR_FASTHZ); + pr_milli_to_fasttimo(1000)); mbufq_init(&qrq, MLD_MAX_G_GS_PACKETS); mbufq_init(&scq, MLD_MAX_STATE_CHANGE_PACKETS); } @@ -1616,7 +1616,7 @@ * Section 9.12. */ old_version_timer = (mli->mli_rv * mli->mli_qi) + mli->mli_qri; - old_version_timer *= PR_SLOWHZ; + old_version_timer *= pr_milli_to_slowtimo(1000); mli->mli_v1_timer = old_version_timer; } @@ -2003,7 +2003,7 @@ * and delay sending the initial MLDv1 report * by not transitioning to the IDLE state. */ - odelay = MLD_RANDOM_DELAY(MLD_V1_MAX_RI * PR_FASTHZ); + odelay = MLD_RANDOM_DELAY(pr_milli_to_fasttimo(MLD_V1_MAX_RI * 1000)); if (delay) { inm->in6m_timer = max(delay, odelay); V_current_state_timers_running6 = 1; @@ -3039,7 +3039,7 @@ */ if (mbufq_first(&mli->mli_gq) != NULL) { mli->mli_v2_timer = 1 + MLD_RANDOM_DELAY( - MLD_RESPONSE_BURST_INTERVAL); + pr_milli_to_fasttimo(MLD_RESPONSE_BURST_INTERVAL_MS)); V_interface_timers_running6 = 1; } } Index: sys/netinet6/mld6_var.h =================================================================== --- sys/netinet6/mld6_var.h +++ sys/netinet6/mld6_var.h @@ -83,7 +83,7 @@ #define MLD_MAX_STATE_CHANGE_PACKETS 8 /* # of packets per state change */ #define MLD_MAX_RESPONSE_PACKETS 16 /* # of packets for general query */ #define MLD_MAX_RESPONSE_BURST 4 /* # of responses to send at once */ -#define MLD_RESPONSE_BURST_INTERVAL (PR_FASTHZ / 2) /* 500ms */ +#define MLD_RESPONSE_BURST_INTERVAL_MS 500 /* * MLD-specific mbuf flags. Index: sys/sys/protosw.h =================================================================== --- sys/sys/protosw.h +++ sys/sys/protosw.h @@ -100,6 +100,9 @@ #define PR_SLOWHZ 2 /* 2 slow timeouts per second */ #define PR_FASTHZ 5 /* 5 fast timeouts per second */ +int pr_milli_to_slowtimo(int ms); +int pr_milli_to_fasttimo(int ms); + /* * This number should be defined again within each protocol family to avoid * confusion.