we have ppsratecheck().
This commit is contained in:
parent
28e65e3d2b
commit
86b51224d4
sys
@ -304,6 +304,7 @@ extern const char *if_name(struct ifnet *);
|
|||||||
#define if_addrlist if_addrhead
|
#define if_addrlist if_addrhead
|
||||||
#define if_list if_link
|
#define if_list if_link
|
||||||
|
|
||||||
|
#define HAVE_PPSRATECHECK
|
||||||
#define WITH_CONVERT_AND_STRIP_IP_LEN
|
#define WITH_CONVERT_AND_STRIP_IP_LEN
|
||||||
|
|
||||||
#if 1 /* at this moment, all OSes do this */
|
#if 1 /* at this moment, all OSes do this */
|
||||||
|
@ -129,10 +129,6 @@ static int icmp6_rip6_input __P((struct mbuf **, int));
|
|||||||
static int icmp6_ratelimit __P((const struct in6_addr *, const int, const int));
|
static int icmp6_ratelimit __P((const struct in6_addr *, const int, const int));
|
||||||
static const char *icmp6_redirect_diag __P((struct in6_addr *,
|
static const char *icmp6_redirect_diag __P((struct in6_addr *,
|
||||||
struct in6_addr *, struct in6_addr *));
|
struct in6_addr *, struct in6_addr *));
|
||||||
#define HAVE_PPSRATECHECK
|
|
||||||
#ifndef HAVE_PPSRATECHECK
|
|
||||||
static int ppsratecheck __P((struct timeval *, int *, int));
|
|
||||||
#endif
|
|
||||||
static struct mbuf *ni6_input __P((struct mbuf *, int));
|
static struct mbuf *ni6_input __P((struct mbuf *, int));
|
||||||
static struct mbuf *ni6_nametodns __P((const char *, int, int));
|
static struct mbuf *ni6_nametodns __P((const char *, int, int));
|
||||||
static int ni6_dnsmatch __P((const char *, int, const char *, int));
|
static int ni6_dnsmatch __P((const char *, int, const char *, int));
|
||||||
@ -2738,76 +2734,6 @@ icmp6_ctloutput(so, sopt)
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HAVE_PPSRATECHECK
|
|
||||||
#ifndef timersub
|
|
||||||
#define timersub(tvp, uvp, vvp) \
|
|
||||||
do { \
|
|
||||||
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
|
|
||||||
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
|
|
||||||
if ((vvp)->tv_usec < 0) { \
|
|
||||||
(vvp)->tv_sec--; \
|
|
||||||
(vvp)->tv_usec += 1000000; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ppsratecheck(): packets (or events) per second limitation.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
ppsratecheck(lasttime, curpps, maxpps)
|
|
||||||
struct timeval *lasttime;
|
|
||||||
int *curpps;
|
|
||||||
int maxpps; /* maximum pps allowed */
|
|
||||||
{
|
|
||||||
struct timeval tv, delta;
|
|
||||||
int s, rv;
|
|
||||||
|
|
||||||
s = splclock();
|
|
||||||
microtime(&tv);
|
|
||||||
splx(s);
|
|
||||||
|
|
||||||
timersub(&tv, lasttime, &delta);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check for 0,0 so that the message will be seen at least once.
|
|
||||||
* If more than one second has passed since the last update of
|
|
||||||
* lasttime, reset the counter.
|
|
||||||
*
|
|
||||||
* We do increment *curpps even in *curpps < maxpps case, as some may
|
|
||||||
* try to use *curpps for stat purposes as well.
|
|
||||||
*/
|
|
||||||
if ((lasttime->tv_sec == 0 && lasttime->tv_usec == 0) ||
|
|
||||||
delta.tv_sec >= 1) {
|
|
||||||
*lasttime = tv;
|
|
||||||
*curpps = 0;
|
|
||||||
rv = 1;
|
|
||||||
} else if (maxpps < 0)
|
|
||||||
rv = 1;
|
|
||||||
else if (*curpps < maxpps)
|
|
||||||
rv = 1;
|
|
||||||
else
|
|
||||||
rv = 0;
|
|
||||||
|
|
||||||
#if 1 /* DIAGNOSTIC? */
|
|
||||||
/* be careful about wrap-around */
|
|
||||||
if (*curpps + 1 > *curpps)
|
|
||||||
*curpps = *curpps + 1;
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* assume that there's not too many calls to this function.
|
|
||||||
* not sure if the assumption holds, as it depends on *caller's*
|
|
||||||
* behavior, not the behavior of this function.
|
|
||||||
* IMHO it is wrong to make assumption on the caller's behavior,
|
|
||||||
* so the above #if is #if 1, not #ifdef DIAGNOSTIC.
|
|
||||||
*/
|
|
||||||
*curpps = *curpps + 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return (rv);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform rate limit check.
|
* Perform rate limit check.
|
||||||
* Returns 0 if it is okay to send the icmp6 packet.
|
* Returns 0 if it is okay to send the icmp6 packet.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user