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