2025-03-25, 00:15:48 +0100, Antonio Quartulli wrote: > On 24/03/2025 11:48, Sabrina Dubroca wrote: > > Hello Antonio, > > > > A few questions wrt the API: > > > > 2025-03-18, 02:40:53 +0100, Antonio Quartulli wrote: > > > +static bool ovpn_nl_attr_sockaddr_remote(struct nlattr **attrs, > > > + struct sockaddr_storage *ss) > > > +{ > > > + struct sockaddr_in6 *sin6; > > > + struct sockaddr_in *sin; > > > + struct in6_addr *in6; > > > + __be16 port = 0; > > > + __be32 *in; > > > + > > > + ss->ss_family = AF_UNSPEC; > > > + > > > + if (attrs[OVPN_A_PEER_REMOTE_PORT]) > > > + port = nla_get_be16(attrs[OVPN_A_PEER_REMOTE_PORT]); > > > > What's the expected behavior if REMOTE_PORT isn't provided? We'll send > > packets do port 0 (which I'm guessing will get dropped on the other > > side) until we get a message from the peer and float sets the correct > > port/address? > > I have never seen a packet going out with port 0 :)
It will if you hack into ovpn-cli to skip OVPN_A_PEER_REMOTE_PORT. I don't know how networks/admins react to such packets. > But being dropped is most likely what's going to happen. > > I'd say this is not something that we expect the user to do: > if the remote address if specified, the user should specify a non-zero port > too. > > We could add a check to ensure that a port is always specified if the remote > address is there too, just to avoid the user to shoot himself in the foot. > But we expect the user to pass an addr:port where the peer is listening to > (and that can't be a 0 port). If we expect that (even if a well-behaved userspace would never do it), I have a preference for enforcing that expectation. Since there's already a policy rejecting OVPN_A_PEER_REMOTE_PORT == 0, this would be more consistent IMO. An alternative would be to select a default (non-zero) port if none is provided. > > > > > > > +static int ovpn_nl_peer_modify(struct ovpn_peer *peer, struct genl_info > > > *info, > > > + struct nlattr **attrs) > > > +{ > > [...] > > > + /* when setting the keepalive, both parameters have to be configured */ > > > + if (attrs[OVPN_A_PEER_KEEPALIVE_INTERVAL] && > > > + attrs[OVPN_A_PEER_KEEPALIVE_TIMEOUT]) { > > > + interv = nla_get_u32(attrs[OVPN_A_PEER_KEEPALIVE_INTERVAL]); > > > + timeout = nla_get_u32(attrs[OVPN_A_PEER_KEEPALIVE_TIMEOUT]); > > > + ovpn_peer_keepalive_set(peer, interv, timeout); > > > > Should we interpret OVPN_A_PEER_KEEPALIVE_INTERVAL = 0 && > > OVPN_A_PEER_KEEPALIVE_TIMEOUT == 0 as "disable keepalive/timeout" on > > an active peer? And maybe "one set to 0, the other set to some > > non-zero value" as invalid? Setting either value to 0 doesn't seem > > very useful (timeout = 0 will probably kill the peer immediately, and > > I suspect interval = 0 would be quite spammy). > > > > Considering "0" as "disable keepalive" is the current intention. > > In ovpn_peer_keepalive_work_single() you can see that if either one if 0, we > just skip the peer: > > 1217 /* we expect both timers to be configured at the same time, > 1218 * therefore bail out if either is not set > 1219 */ > 1220 if (!peer->keepalive_timeout || !peer->keepalive_interval) { > 1221 spin_unlock_bh(&peer->lock); > 1222 return 0; > 1223 } > > does it make sense? Ah, true. Sorry, I forgot about that. So after _NEW/_SET we'll run the work once, and that peer will be ignored. And if there's no other peer requiring keepalive, next_run will be 0 and we don't reschedule. That's good, thanks. -- Sabrina