NetBSD-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Issues with trickle
On Wed, 19 Feb 2025, Charadon wrote:
I installed trickle using pkgin, and for some reason whenever I run it with
anything it dies with a Memory Fault.
Anyone had any luck running this? I can't find anyone else online having this
issue.
This is a NetBSD-specific issue caused by compat-related symbol renaming.
Apply the following 2 patches in sequence. The first, collects most of the
important (except the thread-related one) from GitHub. This fixes some issues
in trickle-1.07.
The second is the NetBSD-specific fix. Compile trickle as:
ac_cv_func_sendfile=no ./configure --prefix=/usr/pkg --sysconfdir=/usr/pkg/etc
otherwise, `configure' thinks NetBSD has sendfile(1)--which it doesn't. (Else
delete line 79 in `configure.in` then regen `configure` the std. way...)
-RVP
PS. Oh! and make sure none of the `-D_FORTIFY_SOURCE=N` / `-fstack-protector-XXX`
flags are set either. Those too will play havoc with the way this thing is
implemented.
---START GitHub PATCH---
diff -urN trickle-1.07.orig/bwstat.c trickle-1.07/bwstat.c
--- trickle-1.07.orig/bwstat.c 2004-10-24 09:31:27.000000000 +0000
+++ trickle-1.07/bwstat.c 2025-02-20 05:55:50.358534095 +0000
@@ -69,6 +69,7 @@
if ((bs = calloc(1, sizeof(*bs))) == NULL)
return (NULL);
+ bs->pts = 1;
TAILQ_INSERT_TAIL(&statq, bs, next);
return (bs);
@@ -143,7 +144,8 @@
struct timeval *
bwstat_getdelay(struct bwstat *bs, size_t *len, uint lim, short which)
{
- uint rate = 0, ncli = 0, npts = 0, pool = 0, ent, xent;
+ uint rate = 0, npts = 0, ent;
+ int ncli = 0, pool = 0, xent;
double delay;
static struct timeval tv;
struct bwstathead poolq;
@@ -201,7 +203,7 @@
if (ncli > 0) {
xent = pool / npts;
- if (xent == 0)
+ if (xent <= 0)
break;
TAILQ_FOREACH(xbs, &poolq, qnext)
diff -urN trickle-1.07.orig/trickle-overload.c trickle-1.07/trickle-overload.c
--- trickle-1.07.orig/trickle-overload.c 2004-12-13 01:21:53.000000000 +0000
+++ trickle-1.07/trickle-overload.c 2025-02-20 06:01:22.992531037 +0000
@@ -302,6 +302,13 @@
domain, type, protocol, sock);
#endif /* DEBUG */
+#ifdef SOCK_NONBLOCK
+ type &= ~SOCK_NONBLOCK;
+#endif
+#ifdef SOCK_CLOEXEC
+ type &= ~SOCK_CLOEXEC;
+#endif
+
if (sock != -1 && domain == AF_INET && type == SOCK_STREAM) {
if ((sd = calloc(1, sizeof(*sd))) == NULL)
return (-1);
@@ -311,7 +318,6 @@
}
/* All sockets are equals. */
- sd->stat->pts = 1;
sd->stat->lsmooth = lsmooth;
sd->stat->tsmooth = tsmooth;
sd->sock = sock;
@@ -393,18 +399,14 @@
}
static struct delay *
-select_shift(struct delayhead *dhead, struct timeval *inittv,
+select_shift(struct delayhead *dhead, struct timeval *difftv,
struct timeval **delaytv)
{
- struct timeval curtv, difftv;
struct delay *d;
struct sockdesc *sd;
- gettimeofday(&curtv, NULL);
- timersub(&curtv, inittv, &difftv);
-
TAILQ_FOREACH(d, dhead, next) {
- if (timercmp(&d->delaytv, &difftv, >))
+ if (timercmp(&d->delaytv, difftv, >))
break;
sd = d->sd;
@@ -413,7 +415,7 @@
}
if (d != NULL)
- timersub(&d->delaytv, &difftv, *delaytv);
+ timersub(&d->delaytv, difftv, *delaytv);
else
*delaytv = NULL;
@@ -431,8 +433,8 @@
{
struct sockdesc *sd;
fd_set *fdsets[] = { wfds, rfds }, *fds;
- struct timeval *delaytv, *selecttv = NULL, *timeout = NULL, _timeout,
- inittv, curtv, difftv;
+ struct timeval *delaytv, _delaytv, *selecttv = NULL, *timeout = NULL,
+ _timeout, inittv, curtv, difftv;
short which;
struct delayhead dhead;
struct delay *d, *_d;
@@ -462,15 +464,18 @@
FD_ISSET(sd->sock, fds) &&
select_delay(&dhead, sd, which)) {
FD_CLR(sd->sock, fds);
- nfds--;
}
gettimeofday(&inittv, NULL);
curtv = inittv;
d = TAILQ_FIRST(&dhead);
- delaytv = d != NULL ? &d->delaytv : NULL;
+ if (d != NULL) {
+ _delaytv = d->delaytv;
+ delaytv = &_delaytv;
+ } else
+ delaytv = NULL;
+ timersub(&curtv, &inittv, &difftv);
again:
- timersub(&inittv, &curtv, &difftv);
selecttv = NULL;
if (delaytv != NULL)
@@ -498,15 +503,15 @@
#endif /* DEBUG */
if (ret == 0 && delaytv != NULL && selecttv == delaytv) {
- _d = select_shift(&dhead, &inittv, &delaytv);
+ gettimeofday(&curtv, NULL);
+ timersub(&curtv, &inittv, &difftv);
+ _d = select_shift(&dhead, &difftv, &delaytv);
while ((d = TAILQ_FIRST(&dhead)) != _d) {
FD_SET(d->sd->sock, fdsets[d->which]);
- nfds++;
TAILQ_REMOVE(&dhead, d, next);
free(d);
}
- gettimeofday(&curtv, NULL);
goto again;
}
@@ -994,7 +999,6 @@
}
sd->sock = ret;
- sd->stat->pts = 1;
sd->stat->lsmooth = lsmooth;
sd->stat->tsmooth = tsmooth;
TAILQ_INSERT_TAIL(&sdhead, sd, next);
---END GitHub PATCH---
---START NetBSD PATCH---
diff -urN trickle-1.07.orig/trickle-overload.c trickle-1.07/trickle-overload.c
--- trickle-1.07.orig/trickle-overload.c 2025-02-20 05:50:22.992531037 +0000
+++ trickle-1.07/trickle-overload.c 2025-02-20 06:21:15.397992571 +0000
@@ -196,7 +196,12 @@
GETADDR(write);
+#ifdef __NetBSD__
+ if ((libc_socket = dlsym(dh, "__socket30")) == NULL)
+ errx(0, "[trickle] Failed to get __socket30() address");
+#else
GETADDR(socket);
+#endif
/* GETADDR(setsockopt); */
GETADDR(close);
@@ -213,7 +218,12 @@
#endif /* !__FreeBSD__ */
GETADDR(sendto);
+#ifdef __NetBSD__
+ if ((libc_select = dlsym(dh, "__select50")) == NULL)
+ errx(0, "[trickle] Failed to get __select50() address");
+#else
GETADDR(select);
+#endif
// GETADDR(poll);
GETADDR(dup);
@@ -527,7 +537,7 @@
#define POLL_WRMASK (POLLOUT | POLLWRNORM | POLLWRBAND)
#define POLL_RDMASK (POLLIN | /* POLLNORM | */ POLLPRI | POLLRDNORM | POLLRDBAND)
-#if defined(__linux__) || (defined(__svr4__) && defined(__sun__)) || defined(__OpenBSD__)
+#if defined(__linux__) || (defined(__svr4__) && defined(__sun__)) || defined(__OpenBSD__) || defined(__NetBSD__)
int
poll(struct pollfd *fds, nfds_t nfds, int __timeout)
#elif defined(__FreeBSD__)
---END NetBSD PATCH---
Home |
Main Index |
Thread Index |
Old Index