Linux Audio

Check our new training course

Loading...
v6.13.7
  1// SPDX-License-Identifier: GPL-2.0
  2/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
  3
  4#include "vmlinux.h"
  5#include <bpf/bpf_helpers.h>
  6#include <bpf/bpf_tracing.h>
  7#include "bpf_tracing_net.h"
  8
  9char _license[] SEC("license") = "GPL";
 10
 11struct socket_cookie {
 12	__u64 cookie_key;
 13	__u64 cookie_value;
 14};
 15
 16struct {
 17	__uint(type, BPF_MAP_TYPE_CGRP_STORAGE);
 18	__uint(map_flags, BPF_F_NO_PREALLOC);
 19	__type(key, int);
 20	__type(value, struct socket_cookie);
 21} socket_cookies SEC(".maps");
 22
 23SEC("cgroup/connect6")
 24int set_cookie(struct bpf_sock_addr *ctx)
 25{
 26	struct socket_cookie *p;
 27	struct tcp_sock *tcp_sk;
 28	struct bpf_sock *sk;
 29
 30	if (ctx->family != AF_INET6 || ctx->user_family != AF_INET6)
 31		return 1;
 32
 33	sk = ctx->sk;
 34	if (!sk)
 35		return 1;
 36
 37	tcp_sk = bpf_skc_to_tcp_sock(sk);
 38	if (!tcp_sk)
 39		return 1;
 40
 41	p = bpf_cgrp_storage_get(&socket_cookies,
 42		tcp_sk->inet_conn.icsk_inet.sk.sk_cgrp_data.cgroup, 0,
 43		BPF_LOCAL_STORAGE_GET_F_CREATE);
 44	if (!p)
 45		return 1;
 46
 47	p->cookie_value = 0xF;
 48	p->cookie_key = bpf_get_socket_cookie(ctx);
 49	return 1;
 50}
 51
 52SEC("sockops")
 53int update_cookie_sockops(struct bpf_sock_ops *ctx)
 54{
 55	struct socket_cookie *p;
 56	struct tcp_sock *tcp_sk;
 57	struct bpf_sock *sk;
 58
 59	if (ctx->family != AF_INET6 || ctx->op != BPF_SOCK_OPS_TCP_CONNECT_CB)
 60		return 1;
 61
 62	sk = ctx->sk;
 63	if (!sk)
 64		return 1;
 65
 66	tcp_sk = bpf_skc_to_tcp_sock(sk);
 67	if (!tcp_sk)
 68		return 1;
 69
 70	p = bpf_cgrp_storage_get(&socket_cookies,
 71		tcp_sk->inet_conn.icsk_inet.sk.sk_cgrp_data.cgroup, 0, 0);
 72	if (!p)
 73		return 1;
 74
 75	if (p->cookie_key != bpf_get_socket_cookie(ctx))
 76		return 1;
 77
 78	p->cookie_value |= (ctx->local_port << 8);
 79	return 1;
 80}
 81
 82SEC("fexit/inet_stream_connect")
 83int BPF_PROG(update_cookie_tracing, struct socket *sock,
 84	     struct sockaddr *uaddr, int addr_len, int flags)
 85{
 86	struct socket_cookie *p;
 87
 88	if (uaddr->sa_family != AF_INET6)
 89		return 0;
 90
 91	p = bpf_cgrp_storage_get(&socket_cookies, sock->sk->sk_cgrp_data.cgroup, 0, 0);
 92	if (!p)
 93		return 0;
 94
 95	if (p->cookie_key != bpf_get_socket_cookie(sock->sk))
 96		return 0;
 97
 98	p->cookie_value |= 0xF0;
 99	return 0;
100}
v6.8
  1// SPDX-License-Identifier: GPL-2.0
  2/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
  3
  4#include "vmlinux.h"
  5#include <bpf/bpf_helpers.h>
  6#include <bpf/bpf_tracing.h>
  7#include "bpf_tracing_net.h"
  8
  9char _license[] SEC("license") = "GPL";
 10
 11struct socket_cookie {
 12	__u64 cookie_key;
 13	__u64 cookie_value;
 14};
 15
 16struct {
 17	__uint(type, BPF_MAP_TYPE_CGRP_STORAGE);
 18	__uint(map_flags, BPF_F_NO_PREALLOC);
 19	__type(key, int);
 20	__type(value, struct socket_cookie);
 21} socket_cookies SEC(".maps");
 22
 23SEC("cgroup/connect6")
 24int set_cookie(struct bpf_sock_addr *ctx)
 25{
 26	struct socket_cookie *p;
 27	struct tcp_sock *tcp_sk;
 28	struct bpf_sock *sk;
 29
 30	if (ctx->family != AF_INET6 || ctx->user_family != AF_INET6)
 31		return 1;
 32
 33	sk = ctx->sk;
 34	if (!sk)
 35		return 1;
 36
 37	tcp_sk = bpf_skc_to_tcp_sock(sk);
 38	if (!tcp_sk)
 39		return 1;
 40
 41	p = bpf_cgrp_storage_get(&socket_cookies,
 42		tcp_sk->inet_conn.icsk_inet.sk.sk_cgrp_data.cgroup, 0,
 43		BPF_LOCAL_STORAGE_GET_F_CREATE);
 44	if (!p)
 45		return 1;
 46
 47	p->cookie_value = 0xF;
 48	p->cookie_key = bpf_get_socket_cookie(ctx);
 49	return 1;
 50}
 51
 52SEC("sockops")
 53int update_cookie_sockops(struct bpf_sock_ops *ctx)
 54{
 55	struct socket_cookie *p;
 56	struct tcp_sock *tcp_sk;
 57	struct bpf_sock *sk;
 58
 59	if (ctx->family != AF_INET6 || ctx->op != BPF_SOCK_OPS_TCP_CONNECT_CB)
 60		return 1;
 61
 62	sk = ctx->sk;
 63	if (!sk)
 64		return 1;
 65
 66	tcp_sk = bpf_skc_to_tcp_sock(sk);
 67	if (!tcp_sk)
 68		return 1;
 69
 70	p = bpf_cgrp_storage_get(&socket_cookies,
 71		tcp_sk->inet_conn.icsk_inet.sk.sk_cgrp_data.cgroup, 0, 0);
 72	if (!p)
 73		return 1;
 74
 75	if (p->cookie_key != bpf_get_socket_cookie(ctx))
 76		return 1;
 77
 78	p->cookie_value |= (ctx->local_port << 8);
 79	return 1;
 80}
 81
 82SEC("fexit/inet_stream_connect")
 83int BPF_PROG(update_cookie_tracing, struct socket *sock,
 84	     struct sockaddr *uaddr, int addr_len, int flags)
 85{
 86	struct socket_cookie *p;
 87
 88	if (uaddr->sa_family != AF_INET6)
 89		return 0;
 90
 91	p = bpf_cgrp_storage_get(&socket_cookies, sock->sk->sk_cgrp_data.cgroup, 0, 0);
 92	if (!p)
 93		return 0;
 94
 95	if (p->cookie_key != bpf_get_socket_cookie(sock->sk))
 96		return 0;
 97
 98	p->cookie_value |= 0xF0;
 99	return 0;
100}