|
@@ -63,6 +63,7 @@ struct wpan_dev;
|
|
|
struct mpls_dev;
|
|
|
/* UDP Tunnel offloads */
|
|
|
struct udp_tunnel_info;
|
|
|
+struct bpf_prog;
|
|
|
|
|
|
void netdev_set_default_ethtool_ops(struct net_device *dev,
|
|
|
const struct ethtool_ops *ops);
|
|
@@ -799,6 +800,33 @@ struct tc_to_netdev {
|
|
|
};
|
|
|
};
|
|
|
|
|
|
+/* These structures hold the attributes of xdp state that are being passed
|
|
|
+ * to the netdevice through the xdp op.
|
|
|
+ */
|
|
|
+enum xdp_netdev_command {
|
|
|
+ /* Set or clear a bpf program used in the earliest stages of packet
|
|
|
+ * rx. The prog will have been loaded as BPF_PROG_TYPE_XDP. The callee
|
|
|
+ * is responsible for calling bpf_prog_put on any old progs that are
|
|
|
+ * stored. In case of error, the callee need not release the new prog
|
|
|
+ * reference, but on success it takes ownership and must bpf_prog_put
|
|
|
+ * when it is no longer used.
|
|
|
+ */
|
|
|
+ XDP_SETUP_PROG,
|
|
|
+ /* Check if a bpf program is set on the device. The callee should
|
|
|
+ * return true if a program is currently attached and running.
|
|
|
+ */
|
|
|
+ XDP_QUERY_PROG,
|
|
|
+};
|
|
|
+
|
|
|
+struct netdev_xdp {
|
|
|
+ enum xdp_netdev_command command;
|
|
|
+ union {
|
|
|
+ /* XDP_SETUP_PROG */
|
|
|
+ struct bpf_prog *prog;
|
|
|
+ /* XDP_QUERY_PROG */
|
|
|
+ bool prog_attached;
|
|
|
+ };
|
|
|
+};
|
|
|
|
|
|
/*
|
|
|
* This structure defines the management hooks for network devices.
|
|
@@ -1087,6 +1115,9 @@ struct tc_to_netdev {
|
|
|
* appropriate rx headroom value allows avoiding skb head copy on
|
|
|
* forward. Setting a negative value resets the rx headroom to the
|
|
|
* default value.
|
|
|
+ * int (*ndo_xdp)(struct net_device *dev, struct netdev_xdp *xdp);
|
|
|
+ * This function is used to set or query state related to XDP on the
|
|
|
+ * netdevice. See definition of enum xdp_netdev_command for details.
|
|
|
*
|
|
|
*/
|
|
|
struct net_device_ops {
|
|
@@ -1271,6 +1302,8 @@ struct net_device_ops {
|
|
|
struct sk_buff *skb);
|
|
|
void (*ndo_set_rx_headroom)(struct net_device *dev,
|
|
|
int needed_headroom);
|
|
|
+ int (*ndo_xdp)(struct net_device *dev,
|
|
|
+ struct netdev_xdp *xdp);
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -3257,6 +3290,7 @@ int dev_get_phys_port_id(struct net_device *dev,
|
|
|
int dev_get_phys_port_name(struct net_device *dev,
|
|
|
char *name, size_t len);
|
|
|
int dev_change_proto_down(struct net_device *dev, bool proto_down);
|
|
|
+int dev_change_xdp_fd(struct net_device *dev, int fd);
|
|
|
struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *dev);
|
|
|
struct sk_buff *dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
|
struct netdev_queue *txq, int *ret);
|