Skip to content

Commit d992536

Browse files
Lawrence Brakmodavem330
authored andcommitted
bpf: Sample BPF program to set buffer sizes
This patch contains a BPF program to set initial receive window to 40 packets and send and receive buffers to 1.5MB. This would usually be done after doing appropriate checks that indicate the hosts are far enough away (i.e. large RTT). Signed-off-by: Lawrence Brakmo <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9872a4b commit d992536

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

samples/bpf/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ always += test_map_in_map_kern.o
115115
always += cookie_uid_helper_example.o
116116
always += tcp_synrto_kern.o
117117
always += tcp_rwnd_kern.o
118+
always += tcp_bufs_kern.o
118119

119120
HOSTCFLAGS += -I$(objtree)/usr/include
120121
HOSTCFLAGS += -I$(srctree)/tools/lib/

samples/bpf/tcp_bufs_kern.c

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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 initial receive window to 40 packets and send
8+
* and receive buffers to 1.5MB. This would usually be done after
9+
* doing appropriate checks that indicate the hosts are far enough
10+
* away (i.e. large RTT).
11+
*
12+
* Use load_sock_ops to load this BPF program.
13+
*/
14+
15+
#include <uapi/linux/bpf.h>
16+
#include <uapi/linux/if_ether.h>
17+
#include <uapi/linux/if_packet.h>
18+
#include <uapi/linux/ip.h>
19+
#include <linux/socket.h>
20+
#include "bpf_helpers.h"
21+
#include "bpf_endian.h"
22+
23+
#define DEBUG 1
24+
25+
#define bpf_printk(fmt, ...) \
26+
({ \
27+
char ____fmt[] = fmt; \
28+
bpf_trace_printk(____fmt, sizeof(____fmt), \
29+
##__VA_ARGS__); \
30+
})
31+
32+
SEC("sockops")
33+
int bpf_bufs(struct bpf_sock_ops *skops)
34+
{
35+
int bufsize = 1500000;
36+
int rwnd_init = 40;
37+
int rv = 0;
38+
int op;
39+
40+
/* For testing purposes, only execute rest of BPF program
41+
* if neither port numberis 55601
42+
*/
43+
if (bpf_ntohl(skops->remote_port) != 55601 &&
44+
skops->local_port != 55601)
45+
return -1;
46+
47+
op = (int) skops->op;
48+
49+
#ifdef DEBUG
50+
bpf_printk("Returning %d\n", rv);
51+
#endif
52+
53+
/* Usually there would be a check to insure the hosts are far
54+
* from each other so it makes sense to increase buffer sizes
55+
*/
56+
switch (op) {
57+
case BPF_SOCK_OPS_RWND_INIT:
58+
rv = rwnd_init;
59+
break;
60+
case BPF_SOCK_OPS_TCP_CONNECT_CB:
61+
/* Set sndbuf and rcvbuf of active connections */
62+
rv = bpf_setsockopt(skops, SOL_SOCKET, SO_SNDBUF, &bufsize,
63+
sizeof(bufsize));
64+
rv = rv*100 + bpf_setsockopt(skops, SOL_SOCKET, SO_RCVBUF,
65+
&bufsize, sizeof(bufsize));
66+
break;
67+
case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB:
68+
/* Nothing to do */
69+
break;
70+
case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB:
71+
/* Set sndbuf and rcvbuf of passive connections */
72+
rv = bpf_setsockopt(skops, SOL_SOCKET, SO_SNDBUF, &bufsize,
73+
sizeof(bufsize));
74+
rv = rv*100 + bpf_setsockopt(skops, SOL_SOCKET, SO_RCVBUF,
75+
&bufsize, sizeof(bufsize));
76+
break;
77+
default:
78+
rv = -1;
79+
}
80+
#ifdef DEBUG
81+
bpf_printk("Returning %d\n", rv);
82+
#endif
83+
skops->reply = rv;
84+
return 1;
85+
}
86+
char _license[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)