xref: /linux/drivers/net/ovpn/io.c (revision 2c7e4a2663a1ab5a740c59c31991579b6b865a26)
1c2d950c4SAntonio Quartulli // SPDX-License-Identifier: GPL-2.0
2c2d950c4SAntonio Quartulli /*  OpenVPN data channel offload
3c2d950c4SAntonio Quartulli  *
4c2d950c4SAntonio Quartulli  *  Copyright (C) 2019-2025 OpenVPN, Inc.
5c2d950c4SAntonio Quartulli  *
6c2d950c4SAntonio Quartulli  *  Author:	James Yonan <james@openvpn.net>
7c2d950c4SAntonio Quartulli  *		Antonio Quartulli <antonio@openvpn.net>
8c2d950c4SAntonio Quartulli  */
9c2d950c4SAntonio Quartulli 
108534731dSAntonio Quartulli #include <crypto/aead.h>
11c2d950c4SAntonio Quartulli #include <linux/netdevice.h>
12c2d950c4SAntonio Quartulli #include <linux/skbuff.h>
13ab66abbcSAntonio Quartulli #include <net/gro_cells.h>
1408857b5eSAntonio Quartulli #include <net/gso.h>
1504ca1495SAntonio Quartulli #include <net/ip.h>
16c2d950c4SAntonio Quartulli 
1708857b5eSAntonio Quartulli #include "ovpnpriv.h"
1808857b5eSAntonio Quartulli #include "peer.h"
19ab66abbcSAntonio Quartulli #include "io.h"
208534731dSAntonio Quartulli #include "bind.h"
218534731dSAntonio Quartulli #include "crypto.h"
228534731dSAntonio Quartulli #include "crypto_aead.h"
23ab66abbcSAntonio Quartulli #include "netlink.h"
24ab66abbcSAntonio Quartulli #include "proto.h"
2511851cbdSAntonio Quartulli #include "tcp.h"
2608857b5eSAntonio Quartulli #include "udp.h"
2708857b5eSAntonio Quartulli #include "skb.h"
2808857b5eSAntonio Quartulli #include "socket.h"
2908857b5eSAntonio Quartulli 
303ecfd934SAntonio Quartulli const unsigned char ovpn_keepalive_message[OVPN_KEEPALIVE_SIZE] = {
313ecfd934SAntonio Quartulli 	0x2a, 0x18, 0x7b, 0xf3, 0x64, 0x1e, 0xb4, 0xcb,
323ecfd934SAntonio Quartulli 	0x07, 0xed, 0x2d, 0x0a, 0x98, 0x1f, 0xc7, 0x48
333ecfd934SAntonio Quartulli };
343ecfd934SAntonio Quartulli 
353ecfd934SAntonio Quartulli /**
363ecfd934SAntonio Quartulli  * ovpn_is_keepalive - check if skb contains a keepalive message
373ecfd934SAntonio Quartulli  * @skb: packet to check
383ecfd934SAntonio Quartulli  *
393ecfd934SAntonio Quartulli  * Assumes that the first byte of skb->data is defined.
403ecfd934SAntonio Quartulli  *
413ecfd934SAntonio Quartulli  * Return: true if skb contains a keepalive or false otherwise
423ecfd934SAntonio Quartulli  */
ovpn_is_keepalive(struct sk_buff * skb)433ecfd934SAntonio Quartulli static bool ovpn_is_keepalive(struct sk_buff *skb)
443ecfd934SAntonio Quartulli {
453ecfd934SAntonio Quartulli 	if (*skb->data != ovpn_keepalive_message[0])
463ecfd934SAntonio Quartulli 		return false;
473ecfd934SAntonio Quartulli 
483ecfd934SAntonio Quartulli 	if (skb->len != OVPN_KEEPALIVE_SIZE)
493ecfd934SAntonio Quartulli 		return false;
503ecfd934SAntonio Quartulli 
513ecfd934SAntonio Quartulli 	if (!pskb_may_pull(skb, OVPN_KEEPALIVE_SIZE))
523ecfd934SAntonio Quartulli 		return false;
533ecfd934SAntonio Quartulli 
543ecfd934SAntonio Quartulli 	return !memcmp(skb->data, ovpn_keepalive_message, OVPN_KEEPALIVE_SIZE);
553ecfd934SAntonio Quartulli }
563ecfd934SAntonio Quartulli 
57ab66abbcSAntonio Quartulli /* Called after decrypt to write the IP packet to the device.
58ab66abbcSAntonio Quartulli  * This method is expected to manage/free the skb.
59ab66abbcSAntonio Quartulli  */
ovpn_netdev_write(struct ovpn_peer * peer,struct sk_buff * skb)60ab66abbcSAntonio Quartulli static void ovpn_netdev_write(struct ovpn_peer *peer, struct sk_buff *skb)
61ab66abbcSAntonio Quartulli {
62ab66abbcSAntonio Quartulli 	unsigned int pkt_len;
63ab66abbcSAntonio Quartulli 	int ret;
64ab66abbcSAntonio Quartulli 
65ab66abbcSAntonio Quartulli 	/* we can't guarantee the packet wasn't corrupted before entering the
66ab66abbcSAntonio Quartulli 	 * VPN, therefore we give other layers a chance to check that
67ab66abbcSAntonio Quartulli 	 */
68ab66abbcSAntonio Quartulli 	skb->ip_summed = CHECKSUM_NONE;
69ab66abbcSAntonio Quartulli 
70ab66abbcSAntonio Quartulli 	/* skb hash for transport packet no longer valid after decapsulation */
71ab66abbcSAntonio Quartulli 	skb_clear_hash(skb);
72ab66abbcSAntonio Quartulli 
73ab66abbcSAntonio Quartulli 	/* post-decrypt scrub -- prepare to inject encapsulated packet onto the
74ab66abbcSAntonio Quartulli 	 * interface, based on __skb_tunnel_rx() in dst.h
75ab66abbcSAntonio Quartulli 	 */
76ab66abbcSAntonio Quartulli 	skb->dev = peer->ovpn->dev;
77ab66abbcSAntonio Quartulli 	skb_set_queue_mapping(skb, 0);
78ab66abbcSAntonio Quartulli 	skb_scrub_packet(skb, true);
79ab66abbcSAntonio Quartulli 
808534731dSAntonio Quartulli 	/* network header reset in ovpn_decrypt_post() */
81ab66abbcSAntonio Quartulli 	skb_reset_transport_header(skb);
82ab66abbcSAntonio Quartulli 	skb_reset_inner_headers(skb);
83ab66abbcSAntonio Quartulli 
84ab66abbcSAntonio Quartulli 	/* cause packet to be "received" by the interface */
85ab66abbcSAntonio Quartulli 	pkt_len = skb->len;
86ab66abbcSAntonio Quartulli 	ret = gro_cells_receive(&peer->ovpn->gro_cells, skb);
8704ca1495SAntonio Quartulli 	if (likely(ret == NET_RX_SUCCESS)) {
88ab66abbcSAntonio Quartulli 		/* update RX stats with the size of decrypted packet */
8904ca1495SAntonio Quartulli 		ovpn_peer_stats_increment_rx(&peer->vpn_stats, pkt_len);
90ab66abbcSAntonio Quartulli 		dev_dstats_rx_add(peer->ovpn->dev, pkt_len);
91ab66abbcSAntonio Quartulli 	}
9204ca1495SAntonio Quartulli }
93ab66abbcSAntonio Quartulli 
ovpn_decrypt_post(void * data,int ret)948534731dSAntonio Quartulli void ovpn_decrypt_post(void *data, int ret)
95ab66abbcSAntonio Quartulli {
968534731dSAntonio Quartulli 	struct ovpn_crypto_key_slot *ks;
978534731dSAntonio Quartulli 	unsigned int payload_offset = 0;
988534731dSAntonio Quartulli 	struct sk_buff *skb = data;
99f0281c1dSAntonio Quartulli 	struct ovpn_socket *sock;
1008534731dSAntonio Quartulli 	struct ovpn_peer *peer;
1018534731dSAntonio Quartulli 	__be16 proto;
1028534731dSAntonio Quartulli 	__be32 *pid;
1038534731dSAntonio Quartulli 
1048534731dSAntonio Quartulli 	/* crypto is happening asynchronously. this function will be called
1058534731dSAntonio Quartulli 	 * again later by the crypto callback with a proper return code
1068534731dSAntonio Quartulli 	 */
1078534731dSAntonio Quartulli 	if (unlikely(ret == -EINPROGRESS))
1088534731dSAntonio Quartulli 		return;
1098534731dSAntonio Quartulli 
1108534731dSAntonio Quartulli 	payload_offset = ovpn_skb_cb(skb)->payload_offset;
1118534731dSAntonio Quartulli 	ks = ovpn_skb_cb(skb)->ks;
1128534731dSAntonio Quartulli 	peer = ovpn_skb_cb(skb)->peer;
1138534731dSAntonio Quartulli 
1148534731dSAntonio Quartulli 	/* crypto is done, cleanup skb CB and its members */
1158534731dSAntonio Quartulli 	kfree(ovpn_skb_cb(skb)->iv);
1168534731dSAntonio Quartulli 	kfree(ovpn_skb_cb(skb)->sg);
1178534731dSAntonio Quartulli 	aead_request_free(ovpn_skb_cb(skb)->req);
118ab66abbcSAntonio Quartulli 
119ab66abbcSAntonio Quartulli 	if (unlikely(ret < 0))
120ab66abbcSAntonio Quartulli 		goto drop;
121ab66abbcSAntonio Quartulli 
1228534731dSAntonio Quartulli 	/* PID sits after the op */
1238534731dSAntonio Quartulli 	pid = (__force __be32 *)(skb->data + OVPN_OPCODE_SIZE);
1248534731dSAntonio Quartulli 	ret = ovpn_pktid_recv(&ks->pid_recv, ntohl(*pid), 0);
1258534731dSAntonio Quartulli 	if (unlikely(ret < 0)) {
1268534731dSAntonio Quartulli 		net_err_ratelimited("%s: PKT ID RX error for peer %u: %d\n",
1278534731dSAntonio Quartulli 				    netdev_name(peer->ovpn->dev), peer->id,
1288534731dSAntonio Quartulli 				    ret);
1298534731dSAntonio Quartulli 		goto drop;
1308534731dSAntonio Quartulli 	}
1318534731dSAntonio Quartulli 
1323ecfd934SAntonio Quartulli 	/* keep track of last received authenticated packet for keepalive */
1333ecfd934SAntonio Quartulli 	WRITE_ONCE(peer->last_recv, ktime_get_real_seconds());
1343ecfd934SAntonio Quartulli 
135f0281c1dSAntonio Quartulli 	rcu_read_lock();
136f0281c1dSAntonio Quartulli 	sock = rcu_dereference(peer->sock);
137*ba499a07SAntonio Quartulli 	if (sock && sock->sk->sk_protocol == IPPROTO_UDP)
138f0281c1dSAntonio Quartulli 		/* check if this peer changed local or remote endpoint */
139f0281c1dSAntonio Quartulli 		ovpn_peer_endpoints_update(peer, skb);
140f0281c1dSAntonio Quartulli 	rcu_read_unlock();
141f0281c1dSAntonio Quartulli 
1428534731dSAntonio Quartulli 	/* point to encapsulated IP packet */
1438534731dSAntonio Quartulli 	__skb_pull(skb, payload_offset);
1448534731dSAntonio Quartulli 
1458534731dSAntonio Quartulli 	/* check if this is a valid datapacket that has to be delivered to the
1468534731dSAntonio Quartulli 	 * ovpn interface
1478534731dSAntonio Quartulli 	 */
1488534731dSAntonio Quartulli 	skb_reset_network_header(skb);
1498534731dSAntonio Quartulli 	proto = ovpn_ip_check_protocol(skb);
1508534731dSAntonio Quartulli 	if (unlikely(!proto)) {
1518534731dSAntonio Quartulli 		/* check if null packet */
1528534731dSAntonio Quartulli 		if (unlikely(!pskb_may_pull(skb, 1))) {
1538534731dSAntonio Quartulli 			net_info_ratelimited("%s: NULL packet received from peer %u\n",
1548534731dSAntonio Quartulli 					     netdev_name(peer->ovpn->dev),
1558534731dSAntonio Quartulli 					     peer->id);
1568534731dSAntonio Quartulli 			goto drop;
1578534731dSAntonio Quartulli 		}
1588534731dSAntonio Quartulli 
1593ecfd934SAntonio Quartulli 		if (ovpn_is_keepalive(skb)) {
1603ecfd934SAntonio Quartulli 			net_dbg_ratelimited("%s: ping received from peer %u\n",
1613ecfd934SAntonio Quartulli 					    netdev_name(peer->ovpn->dev),
1623ecfd934SAntonio Quartulli 					    peer->id);
1633ecfd934SAntonio Quartulli 			/* we drop the packet, but this is not a failure */
1643ecfd934SAntonio Quartulli 			consume_skb(skb);
1653ecfd934SAntonio Quartulli 			goto drop_nocount;
1663ecfd934SAntonio Quartulli 		}
1673ecfd934SAntonio Quartulli 
1688534731dSAntonio Quartulli 		net_info_ratelimited("%s: unsupported protocol received from peer %u\n",
1698534731dSAntonio Quartulli 				     netdev_name(peer->ovpn->dev), peer->id);
1708534731dSAntonio Quartulli 		goto drop;
1718534731dSAntonio Quartulli 	}
1728534731dSAntonio Quartulli 	skb->protocol = proto;
1738534731dSAntonio Quartulli 
1748534731dSAntonio Quartulli 	/* perform Reverse Path Filtering (RPF) */
1758534731dSAntonio Quartulli 	if (unlikely(!ovpn_peer_check_by_src(peer->ovpn, skb, peer))) {
1768534731dSAntonio Quartulli 		if (skb->protocol == htons(ETH_P_IPV6))
1778534731dSAntonio Quartulli 			net_dbg_ratelimited("%s: RPF dropped packet from peer %u, src: %pI6c\n",
1788534731dSAntonio Quartulli 					    netdev_name(peer->ovpn->dev),
1798534731dSAntonio Quartulli 					    peer->id, &ipv6_hdr(skb)->saddr);
1808534731dSAntonio Quartulli 		else
1818534731dSAntonio Quartulli 			net_dbg_ratelimited("%s: RPF dropped packet from peer %u, src: %pI4\n",
1828534731dSAntonio Quartulli 					    netdev_name(peer->ovpn->dev),
1838534731dSAntonio Quartulli 					    peer->id, &ip_hdr(skb)->saddr);
1848534731dSAntonio Quartulli 		goto drop;
1858534731dSAntonio Quartulli 	}
1868534731dSAntonio Quartulli 
187ab66abbcSAntonio Quartulli 	ovpn_netdev_write(peer, skb);
188ab66abbcSAntonio Quartulli 	/* skb is passed to upper layer - don't free it */
189ab66abbcSAntonio Quartulli 	skb = NULL;
190ab66abbcSAntonio Quartulli drop:
191ab66abbcSAntonio Quartulli 	if (unlikely(skb))
192ab66abbcSAntonio Quartulli 		dev_dstats_rx_dropped(peer->ovpn->dev);
1933ecfd934SAntonio Quartulli 	kfree_skb(skb);
1943ecfd934SAntonio Quartulli drop_nocount:
1958534731dSAntonio Quartulli 	if (likely(peer))
196ab66abbcSAntonio Quartulli 		ovpn_peer_put(peer);
1978534731dSAntonio Quartulli 	if (likely(ks))
1988534731dSAntonio Quartulli 		ovpn_crypto_key_slot_put(ks);
199ab66abbcSAntonio Quartulli }
200ab66abbcSAntonio Quartulli 
201ab66abbcSAntonio Quartulli /* RX path entry point: decrypt packet and forward it to the device */
ovpn_recv(struct ovpn_peer * peer,struct sk_buff * skb)202ab66abbcSAntonio Quartulli void ovpn_recv(struct ovpn_peer *peer, struct sk_buff *skb)
203ab66abbcSAntonio Quartulli {
2048534731dSAntonio Quartulli 	struct ovpn_crypto_key_slot *ks;
2058534731dSAntonio Quartulli 	u8 key_id;
2068534731dSAntonio Quartulli 
20704ca1495SAntonio Quartulli 	ovpn_peer_stats_increment_rx(&peer->link_stats, skb->len);
20804ca1495SAntonio Quartulli 
2098534731dSAntonio Quartulli 	/* get the key slot matching the key ID in the received packet */
2108534731dSAntonio Quartulli 	key_id = ovpn_key_id_from_skb(skb);
2118534731dSAntonio Quartulli 	ks = ovpn_crypto_key_id_to_slot(&peer->crypto, key_id);
2128534731dSAntonio Quartulli 	if (unlikely(!ks)) {
2138534731dSAntonio Quartulli 		net_info_ratelimited("%s: no available key for peer %u, key-id: %u\n",
2148534731dSAntonio Quartulli 				     netdev_name(peer->ovpn->dev), peer->id,
2158534731dSAntonio Quartulli 				     key_id);
2168534731dSAntonio Quartulli 		dev_dstats_rx_dropped(peer->ovpn->dev);
2178534731dSAntonio Quartulli 		kfree_skb(skb);
2188534731dSAntonio Quartulli 		ovpn_peer_put(peer);
2198534731dSAntonio Quartulli 		return;
220ab66abbcSAntonio Quartulli 	}
221ab66abbcSAntonio Quartulli 
2228534731dSAntonio Quartulli 	memset(ovpn_skb_cb(skb), 0, sizeof(struct ovpn_cb));
2238534731dSAntonio Quartulli 	ovpn_decrypt_post(skb, ovpn_aead_decrypt(peer, ks, skb));
2248534731dSAntonio Quartulli }
2258534731dSAntonio Quartulli 
ovpn_encrypt_post(void * data,int ret)2268534731dSAntonio Quartulli void ovpn_encrypt_post(void *data, int ret)
22708857b5eSAntonio Quartulli {
2288534731dSAntonio Quartulli 	struct ovpn_crypto_key_slot *ks;
2298534731dSAntonio Quartulli 	struct sk_buff *skb = data;
23008857b5eSAntonio Quartulli 	struct ovpn_socket *sock;
2318534731dSAntonio Quartulli 	struct ovpn_peer *peer;
23204ca1495SAntonio Quartulli 	unsigned int orig_len;
2338534731dSAntonio Quartulli 
2348534731dSAntonio Quartulli 	/* encryption is happening asynchronously. This function will be
2358534731dSAntonio Quartulli 	 * called later by the crypto callback with a proper return value
2368534731dSAntonio Quartulli 	 */
2378534731dSAntonio Quartulli 	if (unlikely(ret == -EINPROGRESS))
2388534731dSAntonio Quartulli 		return;
2398534731dSAntonio Quartulli 
2408534731dSAntonio Quartulli 	ks = ovpn_skb_cb(skb)->ks;
2418534731dSAntonio Quartulli 	peer = ovpn_skb_cb(skb)->peer;
2428534731dSAntonio Quartulli 
2438534731dSAntonio Quartulli 	/* crypto is done, cleanup skb CB and its members */
2448534731dSAntonio Quartulli 	kfree(ovpn_skb_cb(skb)->iv);
2458534731dSAntonio Quartulli 	kfree(ovpn_skb_cb(skb)->sg);
2468534731dSAntonio Quartulli 	aead_request_free(ovpn_skb_cb(skb)->req);
24708857b5eSAntonio Quartulli 
24889d3c0e4SAntonio Quartulli 	if (unlikely(ret == -ERANGE)) {
24989d3c0e4SAntonio Quartulli 		/* we ran out of IVs and we must kill the key as it can't be
25089d3c0e4SAntonio Quartulli 		 * use anymore
25189d3c0e4SAntonio Quartulli 		 */
25289d3c0e4SAntonio Quartulli 		netdev_warn(peer->ovpn->dev,
25389d3c0e4SAntonio Quartulli 			    "killing key %u for peer %u\n", ks->key_id,
25489d3c0e4SAntonio Quartulli 			    peer->id);
25589d3c0e4SAntonio Quartulli 		if (ovpn_crypto_kill_key(&peer->crypto, ks->key_id))
25689d3c0e4SAntonio Quartulli 			/* let userspace know so that a new key must be negotiated */
25789d3c0e4SAntonio Quartulli 			ovpn_nl_key_swap_notify(peer, ks->key_id);
25889d3c0e4SAntonio Quartulli 
25989d3c0e4SAntonio Quartulli 		goto err;
26089d3c0e4SAntonio Quartulli 	}
26189d3c0e4SAntonio Quartulli 
26208857b5eSAntonio Quartulli 	if (unlikely(ret < 0))
26308857b5eSAntonio Quartulli 		goto err;
26408857b5eSAntonio Quartulli 
26508857b5eSAntonio Quartulli 	skb_mark_not_on_list(skb);
26604ca1495SAntonio Quartulli 	orig_len = skb->len;
26708857b5eSAntonio Quartulli 
26808857b5eSAntonio Quartulli 	rcu_read_lock();
26908857b5eSAntonio Quartulli 	sock = rcu_dereference(peer->sock);
27008857b5eSAntonio Quartulli 	if (unlikely(!sock))
27108857b5eSAntonio Quartulli 		goto err_unlock;
27208857b5eSAntonio Quartulli 
273*ba499a07SAntonio Quartulli 	switch (sock->sk->sk_protocol) {
27408857b5eSAntonio Quartulli 	case IPPROTO_UDP:
275*ba499a07SAntonio Quartulli 		ovpn_udp_send_skb(peer, sock->sk, skb);
27608857b5eSAntonio Quartulli 		break;
27711851cbdSAntonio Quartulli 	case IPPROTO_TCP:
278*ba499a07SAntonio Quartulli 		ovpn_tcp_send_skb(peer, sock->sk, skb);
27911851cbdSAntonio Quartulli 		break;
28008857b5eSAntonio Quartulli 	default:
28108857b5eSAntonio Quartulli 		/* no transport configured yet */
28208857b5eSAntonio Quartulli 		goto err_unlock;
28308857b5eSAntonio Quartulli 	}
28404ca1495SAntonio Quartulli 
28504ca1495SAntonio Quartulli 	ovpn_peer_stats_increment_tx(&peer->link_stats, orig_len);
2863ecfd934SAntonio Quartulli 	/* keep track of last sent packet for keepalive */
2873ecfd934SAntonio Quartulli 	WRITE_ONCE(peer->last_sent, ktime_get_real_seconds());
28808857b5eSAntonio Quartulli 	/* skb passed down the stack - don't free it */
28908857b5eSAntonio Quartulli 	skb = NULL;
29008857b5eSAntonio Quartulli err_unlock:
29108857b5eSAntonio Quartulli 	rcu_read_unlock();
29208857b5eSAntonio Quartulli err:
29308857b5eSAntonio Quartulli 	if (unlikely(skb))
29408857b5eSAntonio Quartulli 		dev_dstats_tx_dropped(peer->ovpn->dev);
2958534731dSAntonio Quartulli 	if (likely(peer))
29608857b5eSAntonio Quartulli 		ovpn_peer_put(peer);
2978534731dSAntonio Quartulli 	if (likely(ks))
2988534731dSAntonio Quartulli 		ovpn_crypto_key_slot_put(ks);
29908857b5eSAntonio Quartulli 	kfree_skb(skb);
30008857b5eSAntonio Quartulli }
30108857b5eSAntonio Quartulli 
ovpn_encrypt_one(struct ovpn_peer * peer,struct sk_buff * skb)30208857b5eSAntonio Quartulli static bool ovpn_encrypt_one(struct ovpn_peer *peer, struct sk_buff *skb)
30308857b5eSAntonio Quartulli {
3048534731dSAntonio Quartulli 	struct ovpn_crypto_key_slot *ks;
3058534731dSAntonio Quartulli 
3068534731dSAntonio Quartulli 	/* get primary key to be used for encrypting data */
3078534731dSAntonio Quartulli 	ks = ovpn_crypto_key_slot_primary(&peer->crypto);
3088534731dSAntonio Quartulli 	if (unlikely(!ks))
3098534731dSAntonio Quartulli 		return false;
31008857b5eSAntonio Quartulli 
31108857b5eSAntonio Quartulli 	/* take a reference to the peer because the crypto code may run async.
31208857b5eSAntonio Quartulli 	 * ovpn_encrypt_post() will release it upon completion
31308857b5eSAntonio Quartulli 	 */
31408857b5eSAntonio Quartulli 	if (unlikely(!ovpn_peer_hold(peer))) {
31508857b5eSAntonio Quartulli 		DEBUG_NET_WARN_ON_ONCE(1);
3168534731dSAntonio Quartulli 		ovpn_crypto_key_slot_put(ks);
31708857b5eSAntonio Quartulli 		return false;
31808857b5eSAntonio Quartulli 	}
31908857b5eSAntonio Quartulli 
3208534731dSAntonio Quartulli 	memset(ovpn_skb_cb(skb), 0, sizeof(struct ovpn_cb));
3218534731dSAntonio Quartulli 	ovpn_encrypt_post(skb, ovpn_aead_encrypt(peer, ks, skb));
32208857b5eSAntonio Quartulli 	return true;
32308857b5eSAntonio Quartulli }
32408857b5eSAntonio Quartulli 
32508857b5eSAntonio Quartulli /* send skb to connected peer, if any */
ovpn_send(struct ovpn_priv * ovpn,struct sk_buff * skb,struct ovpn_peer * peer)32608857b5eSAntonio Quartulli static void ovpn_send(struct ovpn_priv *ovpn, struct sk_buff *skb,
32708857b5eSAntonio Quartulli 		      struct ovpn_peer *peer)
32808857b5eSAntonio Quartulli {
32908857b5eSAntonio Quartulli 	struct sk_buff *curr, *next;
33008857b5eSAntonio Quartulli 
33108857b5eSAntonio Quartulli 	/* this might be a GSO-segmented skb list: process each skb
33208857b5eSAntonio Quartulli 	 * independently
33308857b5eSAntonio Quartulli 	 */
33408857b5eSAntonio Quartulli 	skb_list_walk_safe(skb, curr, next) {
33508857b5eSAntonio Quartulli 		if (unlikely(!ovpn_encrypt_one(peer, curr))) {
33608857b5eSAntonio Quartulli 			dev_dstats_tx_dropped(ovpn->dev);
33708857b5eSAntonio Quartulli 			kfree_skb(curr);
33808857b5eSAntonio Quartulli 		}
33908857b5eSAntonio Quartulli 	}
34008857b5eSAntonio Quartulli 
34108857b5eSAntonio Quartulli 	ovpn_peer_put(peer);
34208857b5eSAntonio Quartulli }
343c2d950c4SAntonio Quartulli 
344c2d950c4SAntonio Quartulli /* Send user data to the network
345c2d950c4SAntonio Quartulli  */
ovpn_net_xmit(struct sk_buff * skb,struct net_device * dev)346c2d950c4SAntonio Quartulli netdev_tx_t ovpn_net_xmit(struct sk_buff *skb, struct net_device *dev)
347c2d950c4SAntonio Quartulli {
34808857b5eSAntonio Quartulli 	struct ovpn_priv *ovpn = netdev_priv(dev);
34908857b5eSAntonio Quartulli 	struct sk_buff *segments, *curr, *next;
35008857b5eSAntonio Quartulli 	struct sk_buff_head skb_list;
35108857b5eSAntonio Quartulli 	struct ovpn_peer *peer;
35208857b5eSAntonio Quartulli 	__be16 proto;
35308857b5eSAntonio Quartulli 	int ret;
35408857b5eSAntonio Quartulli 
35508857b5eSAntonio Quartulli 	/* reset netfilter state */
35608857b5eSAntonio Quartulli 	nf_reset_ct(skb);
35708857b5eSAntonio Quartulli 
35808857b5eSAntonio Quartulli 	/* verify IP header size in network packet */
35908857b5eSAntonio Quartulli 	proto = ovpn_ip_check_protocol(skb);
36008857b5eSAntonio Quartulli 	if (unlikely(!proto || skb->protocol != proto))
36108857b5eSAntonio Quartulli 		goto drop;
36208857b5eSAntonio Quartulli 
36308857b5eSAntonio Quartulli 	if (skb_is_gso(skb)) {
36408857b5eSAntonio Quartulli 		segments = skb_gso_segment(skb, 0);
36508857b5eSAntonio Quartulli 		if (IS_ERR(segments)) {
36608857b5eSAntonio Quartulli 			ret = PTR_ERR(segments);
36708857b5eSAntonio Quartulli 			net_err_ratelimited("%s: cannot segment payload packet: %d\n",
36808857b5eSAntonio Quartulli 					    netdev_name(dev), ret);
36908857b5eSAntonio Quartulli 			goto drop;
37008857b5eSAntonio Quartulli 		}
37108857b5eSAntonio Quartulli 
37208857b5eSAntonio Quartulli 		consume_skb(skb);
37308857b5eSAntonio Quartulli 		skb = segments;
37408857b5eSAntonio Quartulli 	}
37508857b5eSAntonio Quartulli 
37608857b5eSAntonio Quartulli 	/* from this moment on, "skb" might be a list */
37708857b5eSAntonio Quartulli 
37808857b5eSAntonio Quartulli 	__skb_queue_head_init(&skb_list);
37908857b5eSAntonio Quartulli 	skb_list_walk_safe(skb, curr, next) {
38008857b5eSAntonio Quartulli 		skb_mark_not_on_list(curr);
38108857b5eSAntonio Quartulli 
38208857b5eSAntonio Quartulli 		curr = skb_share_check(curr, GFP_ATOMIC);
38308857b5eSAntonio Quartulli 		if (unlikely(!curr)) {
38408857b5eSAntonio Quartulli 			net_err_ratelimited("%s: skb_share_check failed for payload packet\n",
38508857b5eSAntonio Quartulli 					    netdev_name(dev));
38608857b5eSAntonio Quartulli 			dev_dstats_tx_dropped(ovpn->dev);
38708857b5eSAntonio Quartulli 			continue;
38808857b5eSAntonio Quartulli 		}
38908857b5eSAntonio Quartulli 
39008857b5eSAntonio Quartulli 		__skb_queue_tail(&skb_list, curr);
39108857b5eSAntonio Quartulli 	}
39208857b5eSAntonio Quartulli 	skb_list.prev->next = NULL;
39308857b5eSAntonio Quartulli 
39408857b5eSAntonio Quartulli 	/* retrieve peer serving the destination IP of this packet */
39508857b5eSAntonio Quartulli 	peer = ovpn_peer_get_by_dst(ovpn, skb);
39608857b5eSAntonio Quartulli 	if (unlikely(!peer)) {
3970ca74dfaSAntonio Quartulli 		switch (skb->protocol) {
3980ca74dfaSAntonio Quartulli 		case htons(ETH_P_IP):
3990ca74dfaSAntonio Quartulli 			net_dbg_ratelimited("%s: no peer to send data to dst=%pI4\n",
4000ca74dfaSAntonio Quartulli 					    netdev_name(ovpn->dev),
4010ca74dfaSAntonio Quartulli 					    &ip_hdr(skb)->daddr);
4020ca74dfaSAntonio Quartulli 			break;
4030ca74dfaSAntonio Quartulli 		case htons(ETH_P_IPV6):
4040ca74dfaSAntonio Quartulli 			net_dbg_ratelimited("%s: no peer to send data to dst=%pI6c\n",
4050ca74dfaSAntonio Quartulli 					    netdev_name(ovpn->dev),
4060ca74dfaSAntonio Quartulli 					    &ipv6_hdr(skb)->daddr);
4070ca74dfaSAntonio Quartulli 			break;
4080ca74dfaSAntonio Quartulli 		}
40908857b5eSAntonio Quartulli 		goto drop;
41008857b5eSAntonio Quartulli 	}
4114ca6438dSAntonio Quartulli 	/* dst was needed for peer selection - it can now be dropped */
4124ca6438dSAntonio Quartulli 	skb_dst_drop(skb);
41308857b5eSAntonio Quartulli 
41404ca1495SAntonio Quartulli 	ovpn_peer_stats_increment_tx(&peer->vpn_stats, skb->len);
41508857b5eSAntonio Quartulli 	ovpn_send(ovpn, skb_list.next, peer);
41608857b5eSAntonio Quartulli 
41708857b5eSAntonio Quartulli 	return NETDEV_TX_OK;
41808857b5eSAntonio Quartulli 
41908857b5eSAntonio Quartulli drop:
42008857b5eSAntonio Quartulli 	dev_dstats_tx_dropped(ovpn->dev);
421c2d950c4SAntonio Quartulli 	skb_tx_error(skb);
42208857b5eSAntonio Quartulli 	kfree_skb_list(skb);
42347e8e9d2SAntonio Quartulli 	return NETDEV_TX_OK;
424c2d950c4SAntonio Quartulli }
4253ecfd934SAntonio Quartulli 
4263ecfd934SAntonio Quartulli /**
4273ecfd934SAntonio Quartulli  * ovpn_xmit_special - encrypt and transmit an out-of-band message to peer
4283ecfd934SAntonio Quartulli  * @peer: peer to send the message to
4293ecfd934SAntonio Quartulli  * @data: message content
4303ecfd934SAntonio Quartulli  * @len: message length
4313ecfd934SAntonio Quartulli  *
4323ecfd934SAntonio Quartulli  * Assumes that caller holds a reference to peer, which will be
4333ecfd934SAntonio Quartulli  * passed to ovpn_send()
4343ecfd934SAntonio Quartulli  */
ovpn_xmit_special(struct ovpn_peer * peer,const void * data,const unsigned int len)4353ecfd934SAntonio Quartulli void ovpn_xmit_special(struct ovpn_peer *peer, const void *data,
4363ecfd934SAntonio Quartulli 		       const unsigned int len)
4373ecfd934SAntonio Quartulli {
4383ecfd934SAntonio Quartulli 	struct ovpn_priv *ovpn;
4393ecfd934SAntonio Quartulli 	struct sk_buff *skb;
4403ecfd934SAntonio Quartulli 
4413ecfd934SAntonio Quartulli 	ovpn = peer->ovpn;
4423ecfd934SAntonio Quartulli 	if (unlikely(!ovpn)) {
4433ecfd934SAntonio Quartulli 		ovpn_peer_put(peer);
4443ecfd934SAntonio Quartulli 		return;
4453ecfd934SAntonio Quartulli 	}
4463ecfd934SAntonio Quartulli 
4473ecfd934SAntonio Quartulli 	skb = alloc_skb(256 + len, GFP_ATOMIC);
4483ecfd934SAntonio Quartulli 	if (unlikely(!skb)) {
4493ecfd934SAntonio Quartulli 		ovpn_peer_put(peer);
4503ecfd934SAntonio Quartulli 		return;
4513ecfd934SAntonio Quartulli 	}
4523ecfd934SAntonio Quartulli 
4533ecfd934SAntonio Quartulli 	skb_reserve(skb, 128);
4543ecfd934SAntonio Quartulli 	skb->priority = TC_PRIO_BESTEFFORT;
4553ecfd934SAntonio Quartulli 	__skb_put_data(skb, data, len);
4563ecfd934SAntonio Quartulli 
4573ecfd934SAntonio Quartulli 	ovpn_send(ovpn, skb, peer);
4583ecfd934SAntonio Quartulli }
459