Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v6.18 61 lines 1.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* OpenVPN data channel offload 3 * 4 * Copyright (C) 2020-2025 OpenVPN, Inc. 5 * 6 * Author: Antonio Quartulli <antonio@openvpn.net> 7 * James Yonan <james@openvpn.net> 8 */ 9 10#ifndef _NET_OVPN_SKB_H_ 11#define _NET_OVPN_SKB_H_ 12 13#include <linux/in.h> 14#include <linux/in6.h> 15#include <linux/ip.h> 16#include <linux/ipv6.h> 17#include <linux/skbuff.h> 18#include <linux/socket.h> 19#include <linux/types.h> 20 21struct ovpn_cb { 22 struct ovpn_peer *peer; 23 struct ovpn_crypto_key_slot *ks; 24 struct aead_request *req; 25 struct scatterlist *sg; 26 u8 *iv; 27 unsigned int payload_offset; 28 bool nosignal; 29}; 30 31static inline struct ovpn_cb *ovpn_skb_cb(struct sk_buff *skb) 32{ 33 BUILD_BUG_ON(sizeof(struct ovpn_cb) > sizeof(skb->cb)); 34 return (struct ovpn_cb *)skb->cb; 35} 36 37/* Return IP protocol version from skb header. 38 * Return 0 if protocol is not IPv4/IPv6 or cannot be read. 39 */ 40static inline __be16 ovpn_ip_check_protocol(struct sk_buff *skb) 41{ 42 __be16 proto = 0; 43 44 /* skb could be non-linear, 45 * make sure IP header is in non-fragmented part 46 */ 47 if (!pskb_network_may_pull(skb, sizeof(struct iphdr))) 48 return 0; 49 50 if (ip_hdr(skb)->version == 4) { 51 proto = htons(ETH_P_IP); 52 } else if (ip_hdr(skb)->version == 6) { 53 if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr))) 54 return 0; 55 proto = htons(ETH_P_IPV6); 56 } 57 58 return proto; 59} 60 61#endif /* _NET_OVPN_SKB_H_ */