cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sockopt_qos_to_cc.c (926B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2021 Facebook */
      3#include <string.h>
      4#include <linux/tcp.h>
      5#include <netinet/in.h>
      6#include <linux/bpf.h>
      7#include <bpf/bpf_helpers.h>
      8#include "bpf_tcp_helpers.h"
      9
     10char _license[] SEC("license") = "GPL";
     11
     12SEC("cgroup/setsockopt")
     13int sockopt_qos_to_cc(struct bpf_sockopt *ctx)
     14{
     15	void *optval_end = ctx->optval_end;
     16	int *optval = ctx->optval;
     17	char buf[TCP_CA_NAME_MAX];
     18	char cc_reno[TCP_CA_NAME_MAX] = "reno";
     19	char cc_cubic[TCP_CA_NAME_MAX] = "cubic";
     20
     21	if (ctx->level != SOL_IPV6 || ctx->optname != IPV6_TCLASS)
     22		return 1;
     23
     24	if (optval + 1 > optval_end)
     25		return 0; /* EPERM, bounds check */
     26
     27	if (bpf_getsockopt(ctx->sk, SOL_TCP, TCP_CONGESTION, &buf, sizeof(buf)))
     28		return 0;
     29
     30	if (!tcp_cc_eq(buf, cc_cubic))
     31		return 0;
     32
     33	if (*optval == 0x2d) {
     34		if (bpf_setsockopt(ctx->sk, SOL_TCP, TCP_CONGESTION, &cc_reno,
     35				sizeof(cc_reno)))
     36			return 0;
     37	}
     38	return 1;
     39}