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

tcp_basertt_kern.c (1733B)


      1/* Copyright (c) 2017 Facebook
      2 *
      3 * This program is free software; you can redistribute it and/or
      4 * modify it under the terms of version 2 of the GNU General Public
      5 * License as published by the Free Software Foundation.
      6 *
      7 * BPF program to set base_rtt to 80us when host is running TCP-NV and
      8 * both hosts are in the same datacenter (as determined by IPv6 prefix).
      9 *
     10 * Use "bpftool cgroup attach $cg sock_ops $prog" to load this BPF program.
     11 */
     12
     13#include <uapi/linux/bpf.h>
     14#include <uapi/linux/tcp.h>
     15#include <uapi/linux/if_ether.h>
     16#include <uapi/linux/if_packet.h>
     17#include <uapi/linux/ip.h>
     18#include <linux/socket.h>
     19#include <bpf/bpf_helpers.h>
     20#include <bpf/bpf_endian.h>
     21
     22#define DEBUG 1
     23
     24SEC("sockops")
     25int bpf_basertt(struct bpf_sock_ops *skops)
     26{
     27	char cong[20];
     28	char nv[] = "nv";
     29	int rv = 0, n;
     30	int op;
     31
     32	op = (int) skops->op;
     33
     34#ifdef DEBUG
     35	bpf_printk("BPF command: %d\n", op);
     36#endif
     37
     38	/* Check if both hosts are in the same datacenter. For this
     39	 * example they are if the 1st 5.5 bytes in the IPv6 address
     40	 * are the same.
     41	 */
     42	if (skops->family == AF_INET6 &&
     43	    skops->local_ip6[0] == skops->remote_ip6[0] &&
     44	    (bpf_ntohl(skops->local_ip6[1]) & 0xfff00000) ==
     45	    (bpf_ntohl(skops->remote_ip6[1]) & 0xfff00000)) {
     46		switch (op) {
     47		case BPF_SOCK_OPS_BASE_RTT:
     48			n = bpf_getsockopt(skops, SOL_TCP, TCP_CONGESTION,
     49					   cong, sizeof(cong));
     50			if (!n && !__builtin_memcmp(cong, nv, sizeof(nv)+1)) {
     51				/* Set base_rtt to 80us */
     52				rv = 80;
     53			} else if (n) {
     54				rv = n;
     55			} else {
     56				rv = -1;
     57			}
     58			break;
     59		default:
     60			rv = -1;
     61		}
     62	} else {
     63		rv = -1;
     64	}
     65#ifdef DEBUG
     66	bpf_printk("Returning %d\n", rv);
     67#endif
     68	skops->reply = rv;
     69	return 1;
     70}
     71char _license[] SEC("license") = "GPL";