diff options
author | John Fastabend <john.fastabend@gmail.com> | 2018-03-18 12:58:07 -0700 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2018-03-19 21:14:41 +0100 |
commit | e6373ce70a01292424a118d9457d927349dad51d (patch) | |
tree | 3ee302cbffd8e46184c11465ec0e00e48ce69d6f /samples/sockmap | |
parent | 468b3fdea8826b232a570d95ba45272eb38919cb (diff) |
bpf: sockmap add SK_DROP tests
Add tests for SK_DROP.
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'samples/sockmap')
-rw-r--r-- | samples/sockmap/sockmap_kern.c | 15 | ||||
-rw-r--r-- | samples/sockmap/sockmap_user.c | 62 |
2 files changed, 61 insertions, 16 deletions
diff --git a/samples/sockmap/sockmap_kern.c b/samples/sockmap/sockmap_kern.c index 735226794ce1..8b6c34cd5f46 100644 --- a/samples/sockmap/sockmap_kern.c +++ b/samples/sockmap/sockmap_kern.c @@ -236,4 +236,19 @@ int bpf_prog9(struct sk_msg_md *msg) return SK_PASS; } +SEC("sk_msg7") +int bpf_prog10(struct sk_msg_md *msg) +{ + int *bytes, zero = 0; + + bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero); + if (bytes) + bpf_msg_apply_bytes(msg, *bytes); + bytes = bpf_map_lookup_elem(&sock_cork_bytes, &zero); + if (bytes) + bpf_msg_cork_bytes(msg, *bytes); + return SK_DROP; +} + + char _license[] SEC("license") = "GPL"; diff --git a/samples/sockmap/sockmap_user.c b/samples/sockmap/sockmap_user.c index 4e0a3d87881f..52c4ed7774d4 100644 --- a/samples/sockmap/sockmap_user.c +++ b/samples/sockmap/sockmap_user.c @@ -59,6 +59,7 @@ int txmsg_pass; int txmsg_noisy; int txmsg_redir; int txmsg_redir_noisy; +int txmsg_drop; int txmsg_apply; int txmsg_cork; @@ -75,6 +76,7 @@ static const struct option long_options[] = { {"txmsg_noisy", no_argument, &txmsg_noisy, 1 }, {"txmsg_redir", no_argument, &txmsg_redir, 1 }, {"txmsg_redir_noisy", no_argument, &txmsg_redir_noisy, 1}, + {"txmsg_drop", no_argument, &txmsg_drop, 1 }, {"txmsg_apply", required_argument, NULL, 'a'}, {"txmsg_cork", required_argument, NULL, 'k'}, {0, 0, NULL, 0 } @@ -210,9 +212,19 @@ struct msg_stats { struct timespec end; }; +struct sockmap_options { + int verbose; + bool base; + bool sendpage; + bool data_test; + bool drop_expected; +}; + static int msg_loop_sendpage(int fd, int iov_length, int cnt, - struct msg_stats *s) + struct msg_stats *s, + struct sockmap_options *opt) { + bool drop = opt->drop_expected; unsigned char k = 0; FILE *file; int i, fp; @@ -229,12 +241,18 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, for (i = 0; i < cnt; i++) { int sent = sendfile(fd, fp, NULL, iov_length); - if (sent < 0) { + if (!drop && sent < 0) { perror("send loop error:"); close(fp); return sent; + } else if (drop && sent >= 0) { + printf("sendpage loop error expected: %i\n", sent); + close(fp); + return -EIO; } - s->bytes_sent += sent; + + if (sent > 0) + s->bytes_sent += sent; } clock_gettime(CLOCK_MONOTONIC, &s->end); close(fp); @@ -242,12 +260,15 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, } static int msg_loop(int fd, int iov_count, int iov_length, int cnt, - struct msg_stats *s, bool tx, bool data_test) + struct msg_stats *s, bool tx, + struct sockmap_options *opt) { struct msghdr msg = {0}; int err, i, flags = MSG_NOSIGNAL; struct iovec *iov; unsigned char k; + bool data_test = opt->data_test; + bool drop = opt->drop_expected; iov = calloc(iov_count, sizeof(struct iovec)); if (!iov) @@ -281,11 +302,16 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, for (i = 0; i < cnt; i++) { int sent = sendmsg(fd, &msg, flags); - if (sent < 0) { + if (!drop && sent < 0) { perror("send loop error:"); goto out_errno; + } else if (drop && sent >= 0) { + printf("send loop error expected: %i\n", sent); + errno = -EIO; + goto out_errno; } - s->bytes_sent += sent; + if (sent > 0) + s->bytes_sent += sent; } clock_gettime(CLOCK_MONOTONIC, &s->end); } else { @@ -375,13 +401,6 @@ static inline float recvdBps(struct msg_stats s) return s.bytes_recvd / (s.end.tv_sec - s.start.tv_sec); } -struct sockmap_options { - int verbose; - bool base; - bool sendpage; - bool data_test; -}; - static int sendmsg_test(int iov_count, int iov_buf, int cnt, struct sockmap_options *opt) { @@ -399,10 +418,13 @@ static int sendmsg_test(int iov_count, int iov_buf, int cnt, rxpid = fork(); if (rxpid == 0) { + if (opt->drop_expected) + exit(1); + if (opt->sendpage) iov_count = 1; err = msg_loop(rx_fd, iov_count, iov_buf, - cnt, &s, false, opt->data_test); + cnt, &s, false, opt); if (err) fprintf(stderr, "msg_loop_rx: iov_count %i iov_buf %i cnt %i err %i\n", @@ -426,10 +448,10 @@ static int sendmsg_test(int iov_count, int iov_buf, int cnt, txpid = fork(); if (txpid == 0) { if (opt->sendpage) - err = msg_loop_sendpage(c1, iov_buf, cnt, &s); + err = msg_loop_sendpage(c1, iov_buf, cnt, &s, opt); else err = msg_loop(c1, iov_count, iov_buf, - cnt, &s, true, opt->data_test); + cnt, &s, true, opt); if (err) fprintf(stderr, @@ -674,6 +696,9 @@ run: tx_prog_fd = prog_fd[5]; else if (txmsg_redir_noisy) tx_prog_fd = prog_fd[6]; + else if (txmsg_drop) + tx_prog_fd = prog_fd[9]; + /* apply and cork must be last */ else if (txmsg_apply) tx_prog_fd = prog_fd[7]; else if (txmsg_cork) @@ -700,6 +725,7 @@ run: err, strerror(errno)); return err; } + if (txmsg_redir || txmsg_redir_noisy) redir_fd = c2; else @@ -736,6 +762,10 @@ run: } } + + if (txmsg_drop) + options.drop_expected = true; + if (test == PING_PONG) err = forever_ping_pong(rate, &options); else if (test == SENDMSG) { |