brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · 223d9c2 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 initial receive window to 40 packets when using IPv68 * and the first 5.5 bytes of the IPv6 addresses are not the same (in this9 * example that means both hosts are not 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_rwnd(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) !=34	    55601 && 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 RWND_INIT operation and IPv6 addresses */46	if (op == BPF_SOCK_OPS_RWND_INIT &&47		skops->family == AF_INET6) {48 49		/* If the first 5.5 bytes of the IPv6 address are not the same50		 * then both hosts are not in the same datacenter51		 * so use a larger initial advertized window (40 packets)52		 */53		if (skops->local_ip6[0] != skops->remote_ip6[0] ||54		    (bpf_ntohl(skops->local_ip6[1]) & 0xfffff000) !=55		    (bpf_ntohl(skops->remote_ip6[1]) & 0xfffff000))56			rv = 40;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