From mboxrd@z Thu Jan 1 00:00:00 1970 From: Brenden Blanco Subject: [PATCH v6 02/12] net: add ndo to set xdp prog in adapter rx Date: Thu, 7 Jul 2016 19:15:14 -0700 Message-ID: <1467944124-14891-3-git-send-email-bblanco@plumgrid.com> References: <1467944124-14891-1-git-send-email-bblanco@plumgrid.com> Cc: Brenden Blanco , Martin KaFai Lau , Jesper Dangaard Brouer , Ari Saha , Alexei Starovoitov , Or Gerlitz , john.fastabend@gmail.com, hannes@stressinduktion.org, Thomas Graf , Tom Herbert , Daniel Borkmann To: davem@davemloft.net, netdev@vger.kernel.org Return-path: Received: from mail-pa0-f50.google.com ([209.85.220.50]:35985 "EHLO mail-pa0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753645AbcGHCPh (ORCPT ); Thu, 7 Jul 2016 22:15:37 -0400 Received: by mail-pa0-f50.google.com with SMTP id uj8so10962389pab.3 for ; Thu, 07 Jul 2016 19:15:36 -0700 (PDT) In-Reply-To: <1467944124-14891-1-git-send-email-bblanco@plumgrid.com> Sender: netdev-owner@vger.kernel.org List-ID: Add two new set/check netdev ops for drivers implementing the BPF_PROG_TYPE_XDP filter. Signed-off-by: Brenden Blanco --- include/linux/netdevice.h | 14 ++++++++++++++ net/core/dev.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 49736a3..36ae955 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -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); @@ -1087,6 +1088,15 @@ 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_set)(struct net_device *dev, struct bpf_prog *prog); + * This function is used to 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, but not on the passed in prog. + * bool (*ndo_xdp_attached)(struct net_device *dev); + * This function is used to check if a bpf program is set on the device. + * The callee should return true if a program is currently attached and + * running. * */ struct net_device_ops { @@ -1271,6 +1281,9 @@ struct net_device_ops { struct sk_buff *skb); void (*ndo_set_rx_headroom)(struct net_device *dev, int needed_headroom); + int (*ndo_xdp_set)(struct net_device *dev, + struct bpf_prog *prog); + bool (*ndo_xdp_attached)(struct net_device *dev); }; /** @@ -3257,6 +3270,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); diff --git a/net/core/dev.c b/net/core/dev.c index b92d63b..154b057 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -94,6 +94,7 @@ #include #include #include +#include #include #include #include @@ -6615,6 +6616,35 @@ int dev_change_proto_down(struct net_device *dev, bool proto_down) EXPORT_SYMBOL(dev_change_proto_down); /** + * dev_change_xdp_fd - set or clear a bpf program for a device rx path + * @dev: device + * @fd: new program fd or negative value to clear + * + * Set or clear a bpf program for a device + */ +int dev_change_xdp_fd(struct net_device *dev, int fd) +{ + const struct net_device_ops *ops = dev->netdev_ops; + struct bpf_prog *prog = NULL; + int err; + + if (!ops->ndo_xdp_set) + return -EOPNOTSUPP; + if (fd >= 0) { + prog = bpf_prog_get_type(fd, BPF_PROG_TYPE_XDP); + if (IS_ERR(prog)) + return PTR_ERR(prog); + } + + err = ops->ndo_xdp_set(dev, prog); + if (err < 0 && prog) + bpf_prog_put(prog); + + return err; +} +EXPORT_SYMBOL(dev_change_xdp_fd); + +/** * dev_new_index - allocate an ifindex * @net: the applicable net namespace * -- 2.8.2