55 lines · 1.3 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0/*  OpenVPN data channel offload * *  Copyright (C) 2012-2025 OpenVPN, Inc. * *  Author:	James Yonan <james@openvpn.net> *		Antonio Quartulli <antonio@openvpn.net> */ #include <linux/netdevice.h>#include <linux/socket.h> #include "ovpnpriv.h"#include "bind.h"#include "peer.h" /** * ovpn_bind_from_sockaddr - retrieve binding matching sockaddr * @ss: the sockaddr to match * * Return: the bind matching the passed sockaddr if found, NULL otherwise */struct ovpn_bind *ovpn_bind_from_sockaddr(const struct sockaddr_storage *ss){	struct ovpn_bind *bind;	size_t sa_len; 	if (ss->ss_family == AF_INET)		sa_len = sizeof(struct sockaddr_in);	else if (ss->ss_family == AF_INET6)		sa_len = sizeof(struct sockaddr_in6);	else		return ERR_PTR(-EAFNOSUPPORT); 	bind = kzalloc_obj(*bind, GFP_ATOMIC);	if (unlikely(!bind))		return ERR_PTR(-ENOMEM); 	memcpy(&bind->remote, ss, sa_len); 	return bind;} /** * ovpn_bind_reset - assign new binding to peer * @peer: the peer whose binding has to be replaced * @new: the new bind to assign */void ovpn_bind_reset(struct ovpn_peer *peer, struct ovpn_bind *new){	lockdep_assert_held(&peer->lock); 	kfree_rcu(rcu_replace_pointer(peer->bind, new,				      lockdep_is_held(&peer->lock)), rcu);}