brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · d58004e Raw
65 lines · c
1/* Copyright (c) 2017 Facebook2 *3 * This program is free software; you can redistribute it and/or4 * modify it under the terms of version 2 of the GNU General Public5 * License as published by the Free Software Foundation.6 *7 * BPF program to set SYN and SYN-ACK RTOs to 10ms when using IPv6 addresses8 * and the first 5.5 bytes of the IPv6 addresses are the same (in this example9 * that means both hosts are in the same datacenter).10 *11 * Use "bpftool cgroup attach $cg sock_ops $prog" to load this BPF program.12 */13 14#include <uapi/linux/bpf.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 123 24SEC("sockops")25int bpf_synrto(struct bpf_sock_ops *skops)26{27	int rv = -1;28	int op;29 30	/* For testing purposes, only execute rest of BPF program31	 * if neither port numberis 5560132	 */33	if (bpf_ntohl(skops->remote_port) != 55601 &&34	    skops->local_port != 55601) {35		skops->reply = -1;36		return 1;37	}38 39	op = (int) skops->op;40 41#ifdef DEBUG42	bpf_printk("BPF command: %d\n", op);43#endif44 45	/* Check for TIMEOUT_INIT operation and IPv6 addresses */46	if (op == BPF_SOCK_OPS_TIMEOUT_INIT &&47		skops->family == AF_INET6) {48 49		/* If the first 5.5 bytes of the IPv6 address are the same50		 * then both hosts are in the same datacenter51		 * so use an RTO of 10ms52		 */53		if (skops->local_ip6[0] == skops->remote_ip6[0] &&54		    (bpf_ntohl(skops->local_ip6[1]) & 0xfff00000) ==55		    (bpf_ntohl(skops->remote_ip6[1]) & 0xfff00000))56			rv = 10;57	}58#ifdef DEBUG59	bpf_printk("Returning %d\n", rv);60#endif61	skops->reply = rv;62	return 1;63}64char _license[] SEC("license") = "GPL";65