#include <linux/skmsg.h>
#include <linux/skbuff.h>
#include <linux/scatterlist.h>
#include <net/sock.h>
#include <net/tcp.h>
#include <net/tls.h>
#include <trace/events/sock.h>
static bool sk_msg_try_coalesce_ok(struct sk_msg *msg, int elem_first_coalesce)
{ … }
int sk_msg_alloc(struct sock *sk, struct sk_msg *msg, int len,
int elem_first_coalesce)
{ … }
EXPORT_SYMBOL_GPL(…);
int sk_msg_clone(struct sock *sk, struct sk_msg *dst, struct sk_msg *src,
u32 off, u32 len)
{ … }
EXPORT_SYMBOL_GPL(…);
void sk_msg_return_zero(struct sock *sk, struct sk_msg *msg, int bytes)
{ … }
EXPORT_SYMBOL_GPL(…);
void sk_msg_return(struct sock *sk, struct sk_msg *msg, int bytes)
{ … }
EXPORT_SYMBOL_GPL(…);
static int sk_msg_free_elem(struct sock *sk, struct sk_msg *msg, u32 i,
bool charge)
{ … }
static int __sk_msg_free(struct sock *sk, struct sk_msg *msg, u32 i,
bool charge)
{ … }
int sk_msg_free_nocharge(struct sock *sk, struct sk_msg *msg)
{ … }
EXPORT_SYMBOL_GPL(…);
int sk_msg_free(struct sock *sk, struct sk_msg *msg)
{ … }
EXPORT_SYMBOL_GPL(…);
static void __sk_msg_free_partial(struct sock *sk, struct sk_msg *msg,
u32 bytes, bool charge)
{ … }
void sk_msg_free_partial(struct sock *sk, struct sk_msg *msg, u32 bytes)
{ … }
EXPORT_SYMBOL_GPL(…);
void sk_msg_free_partial_nocharge(struct sock *sk, struct sk_msg *msg,
u32 bytes)
{ … }
void sk_msg_trim(struct sock *sk, struct sk_msg *msg, int len)
{ … }
EXPORT_SYMBOL_GPL(…);
int sk_msg_zerocopy_from_iter(struct sock *sk, struct iov_iter *from,
struct sk_msg *msg, u32 bytes)
{ … }
EXPORT_SYMBOL_GPL(…);
int sk_msg_memcopy_from_iter(struct sock *sk, struct iov_iter *from,
struct sk_msg *msg, u32 bytes)
{ … }
EXPORT_SYMBOL_GPL(…);
int sk_msg_recvmsg(struct sock *sk, struct sk_psock *psock, struct msghdr *msg,
int len, int flags)
{ … }
EXPORT_SYMBOL_GPL(…);
bool sk_msg_is_readable(struct sock *sk)
{ … }
EXPORT_SYMBOL_GPL(…);
static struct sk_msg *alloc_sk_msg(gfp_t gfp)
{ … }
static struct sk_msg *sk_psock_create_ingress_msg(struct sock *sk,
struct sk_buff *skb)
{ … }
static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb,
u32 off, u32 len,
struct sk_psock *psock,
struct sock *sk,
struct sk_msg *msg)
{ … }
static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb,
u32 off, u32 len);
static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb,
u32 off, u32 len)
{ … }
static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb,
u32 off, u32 len)
{ … }
static int sk_psock_handle_skb(struct sk_psock *psock, struct sk_buff *skb,
u32 off, u32 len, bool ingress)
{ … }
static void sk_psock_skb_state(struct sk_psock *psock,
struct sk_psock_work_state *state,
int len, int off)
{ … }
static void sk_psock_backlog(struct work_struct *work)
{ … }
struct sk_psock *sk_psock_init(struct sock *sk, int node)
{ … }
EXPORT_SYMBOL_GPL(…);
struct sk_psock_link *sk_psock_link_pop(struct sk_psock *psock)
{ … }
static void __sk_psock_purge_ingress_msg(struct sk_psock *psock)
{ … }
static void __sk_psock_zap_ingress(struct sk_psock *psock)
{ … }
static void sk_psock_link_destroy(struct sk_psock *psock)
{ … }
void sk_psock_stop(struct sk_psock *psock)
{ … }
static void sk_psock_done_strp(struct sk_psock *psock);
static void sk_psock_destroy(struct work_struct *work)
{ … }
void sk_psock_drop(struct sock *sk, struct sk_psock *psock)
{ … }
EXPORT_SYMBOL_GPL(…);
static int sk_psock_map_verd(int verdict, bool redir)
{ … }
int sk_psock_msg_verdict(struct sock *sk, struct sk_psock *psock,
struct sk_msg *msg)
{ … }
EXPORT_SYMBOL_GPL(…);
static int sk_psock_skb_redirect(struct sk_psock *from, struct sk_buff *skb)
{ … }
static void sk_psock_tls_verdict_apply(struct sk_buff *skb,
struct sk_psock *from, int verdict)
{ … }
int sk_psock_tls_strp_read(struct sk_psock *psock, struct sk_buff *skb)
{ … }
EXPORT_SYMBOL_GPL(…);
static int sk_psock_verdict_apply(struct sk_psock *psock, struct sk_buff *skb,
int verdict)
{ … }
static void sk_psock_write_space(struct sock *sk)
{ … }
#if IS_ENABLED(CONFIG_BPF_STREAM_PARSER)
static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb)
{ … }
static int sk_psock_strp_read_done(struct strparser *strp, int err)
{ … }
static int sk_psock_strp_parse(struct strparser *strp, struct sk_buff *skb)
{ … }
static void sk_psock_strp_data_ready(struct sock *sk)
{ … }
int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock)
{ … }
void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)
{ … }
void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock)
{ … }
static void sk_psock_done_strp(struct sk_psock *psock)
{ … }
#else
static void sk_psock_done_strp(struct sk_psock *psock)
{
}
#endif
static int sk_psock_verdict_recv(struct sock *sk, struct sk_buff *skb)
{ … }
static void sk_psock_verdict_data_ready(struct sock *sk)
{ … }
void sk_psock_start_verdict(struct sock *sk, struct sk_psock *psock)
{ … }
void sk_psock_stop_verdict(struct sock *sk, struct sk_psock *psock)
{ … }