-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This generates a set of sockets, attaches BPF programs, and sends some simple traffic using basic send/recv pattern. Additionally, we do a bunch of negative tests to ensure adding/removing socks out of the sockmap fail correctly. Signed-off-by: John Fastabend <john.fastabend@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
John Fastabend
authored and
David S. Miller
committed
Aug 16, 2017
1 parent
41bc94f
commit 6f6d33f
Showing
7 changed files
with
443 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
#include <linux/bpf.h> | ||
#include "bpf_helpers.h" | ||
#include "bpf_util.h" | ||
#include "bpf_endian.h" | ||
|
||
int _version SEC("version") = 1; | ||
|
||
#define bpf_printk(fmt, ...) \ | ||
({ \ | ||
char ____fmt[] = fmt; \ | ||
bpf_trace_printk(____fmt, sizeof(____fmt), \ | ||
##__VA_ARGS__); \ | ||
}) | ||
|
||
SEC("sk_skb1") | ||
int bpf_prog1(struct __sk_buff *skb) | ||
{ | ||
void *data_end = (void *)(long) skb->data_end; | ||
void *data = (void *)(long) skb->data; | ||
__u32 lport = skb->local_port; | ||
__u32 rport = skb->remote_port; | ||
char *d = data; | ||
|
||
if (data + 8 > data_end) | ||
return skb->len; | ||
|
||
/* This write/read is a bit pointless but tests the verifier and | ||
* strparser handler for read/write pkt data and access into sk | ||
* fields. | ||
*/ | ||
d[0] = 1; | ||
|
||
bpf_printk("data[0] = (%u): local_port %i remote %i\n", | ||
d[0], lport, bpf_ntohl(rport)); | ||
return skb->len; | ||
} | ||
|
||
char _license[] SEC("license") = "GPL"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
#include <linux/bpf.h> | ||
#include "bpf_helpers.h" | ||
#include "bpf_util.h" | ||
#include "bpf_endian.h" | ||
|
||
int _version SEC("version") = 1; | ||
|
||
#define bpf_printk(fmt, ...) \ | ||
({ \ | ||
char ____fmt[] = fmt; \ | ||
bpf_trace_printk(____fmt, sizeof(____fmt), \ | ||
##__VA_ARGS__); \ | ||
}) | ||
|
||
struct bpf_map_def SEC("maps") sock_map = { | ||
.type = BPF_MAP_TYPE_SOCKMAP, | ||
.key_size = sizeof(int), | ||
.value_size = sizeof(int), | ||
.max_entries = 20, | ||
}; | ||
|
||
SEC("sk_skb2") | ||
int bpf_prog2(struct __sk_buff *skb) | ||
{ | ||
void *data_end = (void *)(long) skb->data_end; | ||
void *data = (void *)(long) skb->data; | ||
__u32 lport = skb->local_port; | ||
__u32 rport = skb->remote_port; | ||
char *d = data; | ||
|
||
if (data + 8 > data_end) | ||
return SK_DROP; | ||
|
||
d[0] = 0xd; | ||
d[1] = 0xe; | ||
d[2] = 0xa; | ||
d[3] = 0xd; | ||
d[4] = 0xb; | ||
d[5] = 0xe; | ||
d[6] = 0xe; | ||
d[7] = 0xf; | ||
|
||
bpf_printk("data[0] = (%u): local_port %i remote %i\n", | ||
d[0], lport, bpf_ntohl(rport)); | ||
return bpf_sk_redirect_map(&sock_map, 5, 0); | ||
} | ||
|
||
char _license[] SEC("license") = "GPL"; |
Oops, something went wrong.