Hi, people have alreadycomplained at me that I write so long e-mails today, so I can write more...
On Wed, Oct 12, 2022 at 08:39:31AM +0200, Gert Doering wrote: > Factor 1: single-peer (client or p2p) vs. multi-peer > > single-peer -> DCO has only 1 peer, all packets that go into the > tun/dco interface are sent out to the single peer > ("dumb pipe mode") - exactly like tun(4) behaves > > If a subnet is configured on the interface, packets to > ALL IPs (!= local) in that subnet are sent to the other > side. No next-hop lookup is done. This is "sort of" handled in if_ovpn.c today ovpn_route_peer(struct ovpn_softc *sc, struct mbuf **m0, const struct sockaddr *dst) { ... /* Shortcut if we're a client (or are a server and have only one client). */ if (sc->peercount == 1) return (ovpn_find_only_peer(sc)); ... so this works for the client, but has one interesting drawback on the server - if there is only a single client connected, the server will send ALL to-be-tunneled packets to that client. As soon as client #2 connects, packets are properly sorted. [..] > Factor 2: IFF_POINTOPOINT vs. IFF_BROADCAST > > This seems to be a *BSD-specific thing, aka "there is nothing in the > Linux specific code that seems to bother with this". I've whacked at if_ovpn.c and dco_freebsd.c a bit now, and I seem to have working code for both ends. I am not a FreeBSD kernel coder, so I have no idea how many behavioural standards I am violating, but it makes "real subnet mode in OpenVPN" work for me, with DCO. Kernel patch attached, OpenVPN patches will follow soonish (outside of this e-mail thread). gert -- "If was one thing all people took for granted, was conviction that if you feed honest figures into a computer, honest figures come out. Never doubted it myself till I met a computer with a sense of humor." Robert A. Heinlein, The Moon is a Harsh Mistress Gert Doering - Munich, Germany g...@greenie.muc.de
From ddb95b7f57d78498003f3212b23e6adb0b5a9828 Mon Sep 17 00:00:00 2001 From: Gert Doering <g...@greenie.muc.de> Date: Wed, 12 Oct 2022 15:30:07 +0200 Subject: [PATCH] if_ovpn(4): implement ioctl() to set if_flags Fully working openvpn(8) --iroute support needs real subnet config on ovpn(4) interfaces (IFF_BROADCAST), while client-side/p2p configs need IFF_POINTOPOINT setting. So make this configurable. --- sys/net/if_ovpn.c | 41 +++++++++++++++++++++++++++++++++++++++++ sys/net/if_ovpn.h | 1 + 2 files changed, 42 insertions(+) diff --git a/sys/net/if_ovpn.c b/sys/net/if_ovpn.c index ed0ff178972..dfb475e3072 100644 --- a/sys/net/if_ovpn.c +++ b/sys/net/if_ovpn.c @@ -1081,6 +1081,44 @@ ovpn_set_peer(struct ifnet *ifp, const nvlist_t *nvl) return (0); } +static int +ovpn_set_ifmode(struct ifnet *ifp, const nvlist_t *nvl) +{ + struct ovpn_softc *sc = ifp->if_softc; + + if (nvl == NULL) + return (EINVAL); + + if (! nvlist_exists_number(nvl, "ifmode") ) + return (EINVAL); + + int ifmode = nvlist_get_number(nvl, "ifmode"); + + OVPN_WLOCK(sc); + + /* deny this if UP */ + if (ifp->if_flags & IFF_UP) { + OVPN_WUNLOCK(sc); + return (EBUSY); + } + + switch (ifmode & ~IFF_MULTICAST) { + case IFF_POINTOPOINT: + case IFF_BROADCAST: + ifp->if_flags &= + ~(IFF_BROADCAST|IFF_POINTOPOINT|IFF_MULTICAST); + ifp->if_flags |= ifmode; + break; + default: + OVPN_WUNLOCK(sc); + return (EINVAL); + } + + OVPN_WUNLOCK(sc); + + return (0); +} + static int ovpn_ioctl_set(struct ifnet *ifp, struct ifdrv *ifd) { @@ -1135,6 +1173,9 @@ ovpn_ioctl_set(struct ifnet *ifp, struct ifdrv *ifd) case OVPN_SET_PEER: ret = ovpn_set_peer(ifp, nvl); break; + case OVPN_SET_IFMODE: + ret = ovpn_set_ifmode(ifp, nvl); + break; default: ret = ENOTSUP; } diff --git a/sys/net/if_ovpn.h b/sys/net/if_ovpn.h index 26a9907711c..fd1c21e7043 100644 --- a/sys/net/if_ovpn.h +++ b/sys/net/if_ovpn.h @@ -60,5 +60,6 @@ enum ovpn_key_cipher { #define OVPN_SEND_PKT _IO ('D', 9) #define OVPN_POLL_PKT _IO ('D', 10) #define OVPN_GET_PKT _IO ('D', 11) +#define OVPN_SET_IFMODE _IO ('D', 12) #endif -- 2.37.3
signature.asc
Description: PGP signature
_______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel