aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Fastabend <john.fastabend@gmail.com>2018-03-28 15:49:20 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2018-03-29 18:09:43 -0400
commit2596f64cb2ff5767166bee4e812734747c7a0474 (patch)
treebab85758f35f1036680347ffb84115f9b5aa35d7
parent8934ce2fd08171e8605f7fada91ee7619fe17ab8 (diff)
bpf: sockmap, add BPF_F_INGRESS tests
Add a set of tests to verify ingress flag in redirect helpers works correctly with various msg sizes. Signed-off-by: John Fastabend <john.fastabend@gmail.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r--samples/sockmap/sockmap_kern.c41
-rwxr-xr-xsamples/sockmap/sockmap_test.sh22
-rw-r--r--samples/sockmap/sockmap_user.c35
3 files changed, 87 insertions, 11 deletions
diff --git a/samples/sockmap/sockmap_kern.c b/samples/sockmap/sockmap_kern.c
index 9ad5ba79c85a..ca2872260e39 100644
--- a/samples/sockmap/sockmap_kern.c
+++ b/samples/sockmap/sockmap_kern.c
@@ -54,7 +54,7 @@ struct bpf_map_def SEC("maps") sock_map_redir = {
54 .type = BPF_MAP_TYPE_SOCKMAP, 54 .type = BPF_MAP_TYPE_SOCKMAP,
55 .key_size = sizeof(int), 55 .key_size = sizeof(int),
56 .value_size = sizeof(int), 56 .value_size = sizeof(int),
57 .max_entries = 1, 57 .max_entries = 20,
58}; 58};
59 59
60struct bpf_map_def SEC("maps") sock_apply_bytes = { 60struct bpf_map_def SEC("maps") sock_apply_bytes = {
@@ -78,6 +78,13 @@ struct bpf_map_def SEC("maps") sock_pull_bytes = {
78 .max_entries = 2 78 .max_entries = 2
79}; 79};
80 80
81struct bpf_map_def SEC("maps") sock_redir_flags = {
82 .type = BPF_MAP_TYPE_ARRAY,
83 .key_size = sizeof(int),
84 .value_size = sizeof(int),
85 .max_entries = 1
86};
87
81 88
82SEC("sk_skb1") 89SEC("sk_skb1")
83int bpf_prog1(struct __sk_buff *skb) 90int bpf_prog1(struct __sk_buff *skb)
@@ -197,8 +204,9 @@ int bpf_prog5(struct sk_msg_md *msg)
197SEC("sk_msg3") 204SEC("sk_msg3")
198int bpf_prog6(struct sk_msg_md *msg) 205int bpf_prog6(struct sk_msg_md *msg)
199{ 206{
200 int *bytes, zero = 0, one = 1; 207 int *bytes, zero = 0, one = 1, key = 0;
201 int *start, *end; 208 int *start, *end, *f;
209 __u64 flags = 0;
202 210
203 bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero); 211 bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
204 if (bytes) 212 if (bytes)
@@ -210,15 +218,22 @@ int bpf_prog6(struct sk_msg_md *msg)
210 end = bpf_map_lookup_elem(&sock_pull_bytes, &one); 218 end = bpf_map_lookup_elem(&sock_pull_bytes, &one);
211 if (start && end) 219 if (start && end)
212 bpf_msg_pull_data(msg, *start, *end, 0); 220 bpf_msg_pull_data(msg, *start, *end, 0);
213 return bpf_msg_redirect_map(msg, &sock_map_redir, zero, 0); 221 f = bpf_map_lookup_elem(&sock_redir_flags, &zero);
222 if (f && *f) {
223 key = 2;
224 flags = *f;
225 }
226 return bpf_msg_redirect_map(msg, &sock_map_redir, key, flags);
214} 227}
215 228
216SEC("sk_msg4") 229SEC("sk_msg4")
217int bpf_prog7(struct sk_msg_md *msg) 230int bpf_prog7(struct sk_msg_md *msg)
218{ 231{
219 int err1 = 0, err2 = 0, zero = 0, one = 1; 232 int err1 = 0, err2 = 0, zero = 0, one = 1, key = 0;
220 int *bytes, *start, *end, len1, len2; 233 int *f, *bytes, *start, *end, len1, len2;
234 __u64 flags = 0;
221 235
236 int err;
222 bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero); 237 bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
223 if (bytes) 238 if (bytes)
224 err1 = bpf_msg_apply_bytes(msg, *bytes); 239 err1 = bpf_msg_apply_bytes(msg, *bytes);
@@ -229,7 +244,6 @@ int bpf_prog7(struct sk_msg_md *msg)
229 start = bpf_map_lookup_elem(&sock_pull_bytes, &zero); 244 start = bpf_map_lookup_elem(&sock_pull_bytes, &zero);
230 end = bpf_map_lookup_elem(&sock_pull_bytes, &one); 245 end = bpf_map_lookup_elem(&sock_pull_bytes, &one);
231 if (start && end) { 246 if (start && end) {
232 int err;
233 247
234 bpf_printk("sk_msg2: pull(%i:%i)\n", 248 bpf_printk("sk_msg2: pull(%i:%i)\n",
235 start ? *start : 0, end ? *end : 0); 249 start ? *start : 0, end ? *end : 0);
@@ -241,9 +255,16 @@ int bpf_prog7(struct sk_msg_md *msg)
241 bpf_printk("sk_msg2: length update %i->%i\n", 255 bpf_printk("sk_msg2: length update %i->%i\n",
242 len1, len2); 256 len1, len2);
243 } 257 }
244 bpf_printk("sk_msg3: redirect(%iB) err1=%i err2=%i\n", 258 f = bpf_map_lookup_elem(&sock_redir_flags, &zero);
245 len1, err1, err2); 259 if (f && *f) {
246 return bpf_msg_redirect_map(msg, &sock_map_redir, zero, 0); 260 key = 2;
261 flags = *f;
262 }
263 bpf_printk("sk_msg3: redirect(%iB) flags=%i err=%i\n",
264 len1, flags, err1 ? err1 : err2);
265 err = bpf_msg_redirect_map(msg, &sock_map_redir, key, flags);
266 bpf_printk("sk_msg3: err %i\n", err);
267 return err;
247} 268}
248 269
249SEC("sk_msg5") 270SEC("sk_msg5")
diff --git a/samples/sockmap/sockmap_test.sh b/samples/sockmap/sockmap_test.sh
index 6d8cc40cca22..13b205fdb0f0 100755
--- a/samples/sockmap/sockmap_test.sh
+++ b/samples/sockmap/sockmap_test.sh
@@ -1,5 +1,5 @@
1#Test a bunch of positive cases to verify basic functionality 1#Test a bunch of positive cases to verify basic functionality
2for prog in "--txmsg" "--txmsg_redir" "--txmsg_drop"; do 2for prog in "--txmsg_redir --txmsg_ingress" "--txmsg" "--txmsg_redir" "--txmsg_redir --txmsg_ingress" "--txmsg_drop"; do
3for t in "sendmsg" "sendpage"; do 3for t in "sendmsg" "sendpage"; do
4for r in 1 10 100; do 4for r in 1 10 100; do
5 for i in 1 10 100; do 5 for i in 1 10 100; do
@@ -100,6 +100,16 @@ for t in "sendmsg" "sendpage"; do
100 sleep 2 100 sleep 2
101done 101done
102 102
103prog="--txmsg_redir --txmsg_apply 1 --txmsg_ingress"
104
105for t in "sendmsg" "sendpage"; do
106 TEST="./sockmap --cgroup /mnt/cgroup2/ -t $t -r $r -i $i -l $l $prog"
107 echo $TEST
108 $TEST
109 sleep 2
110done
111
112
103# Test apply and redirect with larger value than send 113# Test apply and redirect with larger value than send
104r=1 114r=1
105i=8 115i=8
@@ -113,6 +123,16 @@ for t in "sendmsg" "sendpage"; do
113 sleep 2 123 sleep 2
114done 124done
115 125
126prog="--txmsg_redir --txmsg_apply 2048 --txmsg_ingress"
127
128for t in "sendmsg" "sendpage"; do
129 TEST="./sockmap --cgroup /mnt/cgroup2/ -t $t -r $r -i $i -l $l $prog"
130 echo $TEST
131 $TEST
132 sleep 2
133done
134
135
116# Test apply and redirect with apply that never reaches limit 136# Test apply and redirect with apply that never reaches limit
117r=1024 137r=1024
118i=1 138i=1
diff --git a/samples/sockmap/sockmap_user.c b/samples/sockmap/sockmap_user.c
index 07aa237221d1..f7503f44b209 100644
--- a/samples/sockmap/sockmap_user.c
+++ b/samples/sockmap/sockmap_user.c
@@ -64,6 +64,7 @@ int txmsg_apply;
64int txmsg_cork; 64int txmsg_cork;
65int txmsg_start; 65int txmsg_start;
66int txmsg_end; 66int txmsg_end;
67int txmsg_ingress;
67 68
68static const struct option long_options[] = { 69static const struct option long_options[] = {
69 {"help", no_argument, NULL, 'h' }, 70 {"help", no_argument, NULL, 'h' },
@@ -83,6 +84,7 @@ static const struct option long_options[] = {
83 {"txmsg_cork", required_argument, NULL, 'k'}, 84 {"txmsg_cork", required_argument, NULL, 'k'},
84 {"txmsg_start", required_argument, NULL, 's'}, 85 {"txmsg_start", required_argument, NULL, 's'},
85 {"txmsg_end", required_argument, NULL, 'e'}, 86 {"txmsg_end", required_argument, NULL, 'e'},
87 {"txmsg_ingress", no_argument, &txmsg_ingress, 1 },
86 {0, 0, NULL, 0 } 88 {0, 0, NULL, 0 }
87}; 89};
88 90
@@ -793,6 +795,39 @@ run:
793 return err; 795 return err;
794 } 796 }
795 } 797 }
798
799 if (txmsg_ingress) {
800 int in = BPF_F_INGRESS;
801
802 i = 0;
803 err = bpf_map_update_elem(map_fd[6], &i, &in, BPF_ANY);
804 if (err) {
805 fprintf(stderr,
806 "ERROR: bpf_map_update_elem (txmsg_ingress): %d (%s)\n",
807 err, strerror(errno));
808 }
809 i = 1;
810 err = bpf_map_update_elem(map_fd[1], &i, &p1, BPF_ANY);
811 if (err) {
812 fprintf(stderr,
813 "ERROR: bpf_map_update_elem (p1 txmsg): %d (%s)\n",
814 err, strerror(errno));
815 }
816 err = bpf_map_update_elem(map_fd[2], &i, &p1, BPF_ANY);
817 if (err) {
818 fprintf(stderr,
819 "ERROR: bpf_map_update_elem (p1 redir): %d (%s)\n",
820 err, strerror(errno));
821 }
822
823 i = 2;
824 err = bpf_map_update_elem(map_fd[2], &i, &p2, BPF_ANY);
825 if (err) {
826 fprintf(stderr,
827 "ERROR: bpf_map_update_elem (p2 txmsg): %d (%s)\n",
828 err, strerror(errno));
829 }
830 }
796 } 831 }
797 832
798 if (txmsg_drop) 833 if (txmsg_drop)