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