Re: [net-next PATCH 4/9] bpf: additional sockmap self tests

2017-08-28 Thread Alexei Starovoitov
On Mon, Aug 28, 2017 at 07:11:05AM -0700, John Fastabend wrote:
> Add some more sockmap tests to cover,
> 
>  - forwarding to NULL entries
>  - more than two maps to test list ops
>  - forwarding to different map
> 
> Signed-off-by: John Fastabend 

Acked-by: Alexei Starovoitov 



[net-next PATCH 4/9] bpf: additional sockmap self tests

2017-08-28 Thread John Fastabend
Add some more sockmap tests to cover,

 - forwarding to NULL entries
 - more than two maps to test list ops
 - forwarding to different map

Signed-off-by: John Fastabend 
---
 tools/testing/selftests/bpf/sockmap_parse_prog.c   |6 +
 tools/testing/selftests/bpf/sockmap_verdict_prog.c |   23 +++-
 tools/testing/selftests/bpf/test_maps.c|  113 +---
 3 files changed, 96 insertions(+), 46 deletions(-)

diff --git a/tools/testing/selftests/bpf/sockmap_parse_prog.c 
b/tools/testing/selftests/bpf/sockmap_parse_prog.c
index 710f43f..fae3b96 100644
--- a/tools/testing/selftests/bpf/sockmap_parse_prog.c
+++ b/tools/testing/selftests/bpf/sockmap_parse_prog.c
@@ -19,16 +19,16 @@ int bpf_prog1(struct __sk_buff *skb)
void *data = (void *)(long) skb->data;
__u32 lport = skb->local_port;
__u32 rport = skb->remote_port;
-   char *d = data;
+   __u8 *d = data;
 
-   if (data + 8 > data_end)
+   if (data + 10 > 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;
+   d[7] = 1;
 
bpf_printk("parse: data[0] = (%u): local_port %i remote %i\n",
   d[0], lport, bpf_ntohl(rport));
diff --git a/tools/testing/selftests/bpf/sockmap_verdict_prog.c 
b/tools/testing/selftests/bpf/sockmap_verdict_prog.c
index 0573c1d..dada207 100644
--- a/tools/testing/selftests/bpf/sockmap_verdict_prog.c
+++ b/tools/testing/selftests/bpf/sockmap_verdict_prog.c
@@ -12,7 +12,14 @@
##__VA_ARGS__); \
 })
 
-struct bpf_map_def SEC("maps") sock_map = {
+struct bpf_map_def SEC("maps") sock_map_rx = {
+   .type = BPF_MAP_TYPE_SOCKMAP,
+   .key_size = sizeof(int),
+   .value_size = sizeof(int),
+   .max_entries = 20,
+};
+
+struct bpf_map_def SEC("maps") sock_map_tx = {
.type = BPF_MAP_TYPE_SOCKMAP,
.key_size = sizeof(int),
.value_size = sizeof(int),
@@ -26,11 +33,15 @@ int bpf_prog2(struct __sk_buff *skb)
void *data = (void *)(long) skb->data;
__u32 lport = skb->local_port;
__u32 rport = skb->remote_port;
-   char *d = data;
+   __u8 *d = data;
+   __u8 sk, map;
 
if (data + 8 > data_end)
return SK_DROP;
 
+   map = d[0];
+   sk = d[1];
+
d[0] = 0xd;
d[1] = 0xe;
d[2] = 0xa;
@@ -40,9 +51,11 @@ int bpf_prog2(struct __sk_buff *skb)
d[6] = 0xe;
d[7] = 0xf;
 
-   bpf_printk("verdict: data[0] = (%u): local_port %i remote %i redirect 
5\n",
-  d[0], lport, bpf_ntohl(rport));
-   return bpf_sk_redirect_map(_map, 5, 0);
+   bpf_printk("verdict: data[0] = redir(%u:%u)\n", map, sk);
+
+   if (!map)
+   return bpf_sk_redirect_map(_map_rx, sk, 0);
+   return bpf_sk_redirect_map(_map_tx, sk, 0);
 }
 
 char _license[] SEC("license") = "GPL";
diff --git a/tools/testing/selftests/bpf/test_maps.c 
b/tools/testing/selftests/bpf/test_maps.c
index 6df6e62..0a7f457 100644
--- a/tools/testing/selftests/bpf/test_maps.c
+++ b/tools/testing/selftests/bpf/test_maps.c
@@ -465,10 +465,10 @@ static void test_sockmap(int task, void *data)
 {
int ports[] = {50200, 50201, 50202, 50204};
int err, i, fd, sfd[6] = {0xdeadbeef};
-   char buf[] = "hello sockmap user\n";
-   int one = 1, map_fd, s, sc, rc;
+   u8 buf[20] = {0x0, 0x5, 0x3, 0x2, 0x1, 0x0};
+   int one = 1, map_fd_rx, map_fd_tx, s, sc, rc;
int parse_prog, verdict_prog;
-   struct bpf_map *bpf_map;
+   struct bpf_map *bpf_map_rx, *bpf_map_tx;
struct sockaddr_in addr;
struct bpf_object *obj;
struct timeval to;
@@ -585,26 +585,38 @@ static void test_sockmap(int task, void *data)
goto out_sockmap;
}
 
-   bpf_map = bpf_object__find_map_by_name(obj, "sock_map");
-   if (IS_ERR(bpf_map)) {
-   printf("Failed to load map from verdict prog\n");
+   bpf_map_rx = bpf_object__find_map_by_name(obj, "sock_map_rx");
+   if (IS_ERR(bpf_map_rx)) {
+   printf("Failed to load map rx from verdict prog\n");
goto out_sockmap;
}
 
-   map_fd = bpf_map__fd(bpf_map);
-   if (map_fd < 0) {
+   map_fd_rx = bpf_map__fd(bpf_map_rx);
+   if (map_fd_rx < 0) {
printf("Failed to get map fd\n");
goto out_sockmap;
}
 
-   err = bpf_prog_attach(parse_prog, map_fd,
+   bpf_map_tx = bpf_object__find_map_by_name(obj, "sock_map_tx");
+   if (IS_ERR(bpf_map_tx)) {
+   printf("Failed to load map tx from verdict prog\n");
+   goto out_sockmap;
+   }
+
+   map_fd_tx = bpf_map__fd(bpf_map_tx);
+   if (map_fd_tx < 0) {
+   printf("Failed to get map tx fd\n");
+