blob: caed8b1614ffc0aae5e43ffca0c403a0c7b9401f [file] [log] [blame]
Björn Töpeldac09142018-05-18 14:00:21 +02001/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2/*
Björn Töpelc0c77d82018-05-02 13:01:23 +02003 * if_xdp: XDP socket user-space interface
4 * Copyright(c) 2018 Intel Corporation.
5 *
Björn Töpelc0c77d82018-05-02 13:01:23 +02006 * Author(s): Björn Töpel <bjorn.topel@intel.com>
7 * Magnus Karlsson <magnus.karlsson@intel.com>
8 */
9
10#ifndef _LINUX_IF_XDP_H
11#define _LINUX_IF_XDP_H
12
13#include <linux/types.h>
14
Magnus Karlsson965a9902018-05-02 13:01:26 +020015/* Options for the sxdp_flags field */
Björn Töpel173d3ad2018-06-04 14:05:55 +020016#define XDP_SHARED_UMEM (1 << 0)
17#define XDP_COPY (1 << 1) /* Force copy-mode */
18#define XDP_ZEROCOPY (1 << 2) /* Force zero-copy mode */
Magnus Karlsson965a9902018-05-02 13:01:26 +020019
20struct sockaddr_xdp {
21 __u16 sxdp_family;
Björn Töpelad756462018-05-22 09:34:57 +020022 __u16 sxdp_flags;
Magnus Karlsson965a9902018-05-02 13:01:26 +020023 __u32 sxdp_ifindex;
24 __u32 sxdp_queue_id;
25 __u32 sxdp_shared_umem_fd;
Magnus Karlsson965a9902018-05-02 13:01:26 +020026};
27
Björn Töpelb3a9e0b2018-05-22 09:34:59 +020028struct xdp_ring_offset {
29 __u64 producer;
30 __u64 consumer;
31 __u64 desc;
32};
33
34struct xdp_mmap_offsets {
35 struct xdp_ring_offset rx;
36 struct xdp_ring_offset tx;
37 struct xdp_ring_offset fr; /* Fill */
38 struct xdp_ring_offset cr; /* Completion */
39};
40
Björn Töpelc0c77d82018-05-02 13:01:23 +020041/* XDP socket options */
Björn Töpelb3a9e0b2018-05-22 09:34:59 +020042#define XDP_MMAP_OFFSETS 1
43#define XDP_RX_RING 2
44#define XDP_TX_RING 3
45#define XDP_UMEM_REG 4
46#define XDP_UMEM_FILL_RING 5
47#define XDP_UMEM_COMPLETION_RING 6
48#define XDP_STATISTICS 7
Björn Töpelc0c77d82018-05-02 13:01:23 +020049
50struct xdp_umem_reg {
51 __u64 addr; /* Start of packet data area */
52 __u64 len; /* Length of packet data area */
Björn Töpelbbff2f32018-06-04 13:57:13 +020053 __u32 chunk_size;
54 __u32 headroom;
Björn Töpelc0c77d82018-05-02 13:01:23 +020055};
56
Magnus Karlssonaf75d9e2018-05-02 13:01:35 +020057struct xdp_statistics {
58 __u64 rx_dropped; /* Dropped for reasons other than invalid desc */
59 __u64 rx_invalid_descs; /* Dropped due to invalid descriptor */
60 __u64 tx_invalid_descs; /* Dropped due to invalid descriptor */
61};
62
Magnus Karlsson423f3832018-05-02 13:01:24 +020063/* Pgoff for mmaping the rings */
Björn Töpelb9b6b682018-05-02 13:01:25 +020064#define XDP_PGOFF_RX_RING 0
Magnus Karlssonf6145902018-05-02 13:01:32 +020065#define XDP_PGOFF_TX_RING 0x80000000
Geert Uytterhoevena5a16e42018-06-07 15:37:34 +020066#define XDP_UMEM_PGOFF_FILL_RING 0x100000000ULL
67#define XDP_UMEM_PGOFF_COMPLETION_RING 0x180000000ULL
Magnus Karlsson423f3832018-05-02 13:01:24 +020068
Björn Töpelb3a9e0b2018-05-22 09:34:59 +020069/* Rx/Tx descriptor */
Björn Töpelb9b6b682018-05-02 13:01:25 +020070struct xdp_desc {
Björn Töpelbbff2f32018-06-04 13:57:13 +020071 __u64 addr;
Björn Töpelb9b6b682018-05-02 13:01:25 +020072 __u32 len;
Björn Töpelbbff2f32018-06-04 13:57:13 +020073 __u32 options;
Björn Töpelb9b6b682018-05-02 13:01:25 +020074};
75
Björn Töpelbbff2f32018-06-04 13:57:13 +020076/* UMEM descriptor is __u64 */
Magnus Karlsson423f3832018-05-02 13:01:24 +020077
Björn Töpelc0c77d82018-05-02 13:01:23 +020078#endif /* _LINUX_IF_XDP_H */