xsk: wire up XDP_DRV side of AF_XDP
authorBjörn Töpel <bjorn.topel@intel.com>
Wed, 2 May 2018 11:01:29 +0000 (13:01 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 3 May 2018 22:55:24 +0000 (15:55 -0700)
This commit wires up the xskmap to XDP_DRV layer.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
net/core/filter.c

index d3781daa26ab23e2d6116b9450db486d462a73f8..40d4bbb4508dd3691c2d24cf8282865c8cf7c4de 100644 (file)
@@ -2801,7 +2801,8 @@ static int __bpf_tx_xdp_map(struct net_device *dev_rx, void *fwd,
 {
        int err;
 
-       if (map->map_type == BPF_MAP_TYPE_DEVMAP) {
+       switch (map->map_type) {
+       case BPF_MAP_TYPE_DEVMAP: {
                struct net_device *dev = fwd;
                struct xdp_frame *xdpf;
 
@@ -2819,14 +2820,25 @@ static int __bpf_tx_xdp_map(struct net_device *dev_rx, void *fwd,
                if (err)
                        return err;
                __dev_map_insert_ctx(map, index);
-
-       } else if (map->map_type == BPF_MAP_TYPE_CPUMAP) {
+               break;
+       }
+       case BPF_MAP_TYPE_CPUMAP: {
                struct bpf_cpu_map_entry *rcpu = fwd;
 
                err = cpu_map_enqueue(rcpu, xdp, dev_rx);
                if (err)
                        return err;
                __cpu_map_insert_ctx(map, index);
+               break;
+       }
+       case BPF_MAP_TYPE_XSKMAP: {
+               struct xdp_sock *xs = fwd;
+
+               err = __xsk_map_redirect(map, xdp, xs);
+               return err;
+       }
+       default:
+               break;
        }
        return 0;
 }
@@ -2845,6 +2857,9 @@ void xdp_do_flush_map(void)
                case BPF_MAP_TYPE_CPUMAP:
                        __cpu_map_flush(map);
                        break;
+               case BPF_MAP_TYPE_XSKMAP:
+                       __xsk_map_flush(map);
+                       break;
                default:
                        break;
                }
@@ -2859,6 +2874,8 @@ static void *__xdp_map_lookup_elem(struct bpf_map *map, u32 index)
                return __dev_map_lookup_elem(map, index);
        case BPF_MAP_TYPE_CPUMAP:
                return __cpu_map_lookup_elem(map, index);
+       case BPF_MAP_TYPE_XSKMAP:
+               return __xsk_map_lookup_elem(map, index);
        default:
                return NULL;
        }