summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordlg <dlg@openbsd.org>2019-09-13 01:31:24 +0000
committerdlg <dlg@openbsd.org>2019-09-13 01:31:24 +0000
commit2057bf4fb39a10da0b116cb2e1eed6fbceb6b51e (patch)
tree1eaede4cd4a232167fa0b2ac34a2595413648905
parentSAS3 controllers have a maximum size for sgl chain segments, and the (diff)
downloadwireguard-openbsd-2057bf4fb39a10da0b116cb2e1eed6fbceb6b51e.tar.xz
wireguard-openbsd-2057bf4fb39a10da0b116cb2e1eed6fbceb6b51e.zip
tweak tun/tap kn_data to be more consistent with everything else.
for EVFILT_READ, kn_data is now like FIONREAD and reports how many bytes there are to read. previously it would report how many packets were available to read, which is not something i've seen anywhere else. for EVFILT_WRITE, report the max number of bytes a write can do. previously it was if_mtu bytes, now it is if_hdrlen + if_hardmtu bytes, which is the same as what the write path uses as it's maximum message size. discussed with and ok visa@
-rw-r--r--sys/net/if_tun.c19
1 files changed, 4 insertions, 15 deletions
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c
index d59916970e2..07491393b98 100644
--- a/sys/net/if_tun.c
+++ b/sys/net/if_tun.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_tun.c,v 1.189 2019/09/12 01:28:29 dlg Exp $ */
+/* $OpenBSD: if_tun.c,v 1.190 2019/09/13 01:31:24 dlg Exp $ */
/* $NetBSD: if_tun.c,v 1.24 1996/05/07 02:40:48 thorpej Exp $ */
/*
@@ -1008,9 +1008,6 @@ tun_dev_poll(struct tun_softc *tp, int events, struct proc *p)
*
* The tun driver uses an array of tun_softc's based on the minor number
* of the device. kn->kn_hook gets set to the specific tun_softc.
- *
- * filt_tunread() sets kn->kn_data to the iface qsize
- * filt_tunwrite() sets kn->kn_data to the MTU size
*/
int
tunkqfilter(dev_t dev, struct knote *kn)
@@ -1082,7 +1079,6 @@ filt_tunread(struct knote *kn, long hint)
{
struct tun_softc *tp;
struct ifnet *ifp;
- unsigned int len;
if (kn->kn_status & KN_DETACHED) {
kn->kn_data = 0;
@@ -1092,16 +1088,9 @@ filt_tunread(struct knote *kn, long hint)
tp = (struct tun_softc *)kn->kn_hook;
ifp = &tp->tun_if;
- len = IFQ_LEN(&ifp->if_snd);
- if (len > 0) {
- kn->kn_data = len;
+ kn->kn_data = ifq_hdatalen(&ifp->if_snd);
- TUNDEBUG(("%s: tunkqread q=%d\n", ifp->if_xname,
- IFQ_LEN(&ifp->if_snd)));
- return (1);
- }
- TUNDEBUG(("%s: tunkqread waiting\n", ifp->if_xname));
- return (0);
+ return (kn->kn_data > 0);
}
void
@@ -1131,7 +1120,7 @@ filt_tunwrite(struct knote *kn, long hint)
tp = (struct tun_softc *)kn->kn_hook;
ifp = &tp->tun_if;
- kn->kn_data = ifp->if_mtu;
+ kn->kn_data = ifp->if_hdrlen + ifp->if_hardmtu;
return (1);
}