mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	veth: Support RX XDP metadata
The goal is to enable end-to-end testing of the metadata for AF_XDP. Cc: John Fastabend <john.fastabend@gmail.com> Cc: David Ahern <dsahern@gmail.com> Cc: Martin KaFai Lau <martin.lau@linux.dev> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Willem de Bruijn <willemb@google.com> Cc: Jesper Dangaard Brouer <brouer@redhat.com> Cc: Anatoly Burakov <anatoly.burakov@intel.com> Cc: Alexander Lobakin <alexandr.lobakin@intel.com> Cc: Magnus Karlsson <magnus.karlsson@gmail.com> Cc: Maryam Tahhan <mtahhan@redhat.com> Cc: xdp-hints@xdp-project.net Cc: netdev@vger.kernel.org Signed-off-by: Stanislav Fomichev <sdf@google.com> Link: https://lore.kernel.org/r/20230119221536.3349901-11-sdf@google.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
This commit is contained in:
		
							parent
							
								
									fefb695a74
								
							
						
					
					
						commit
						306531f024
					
				
					 1 changed files with 31 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -118,6 +118,7 @@ static struct {
 | 
			
		|||
 | 
			
		||||
struct veth_xdp_buff {
 | 
			
		||||
	struct xdp_buff xdp;
 | 
			
		||||
	struct sk_buff *skb;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int veth_get_link_ksettings(struct net_device *dev,
 | 
			
		||||
| 
						 | 
				
			
			@ -602,6 +603,7 @@ static struct xdp_frame *veth_xdp_rcv_one(struct veth_rq *rq,
 | 
			
		|||
 | 
			
		||||
		xdp_convert_frame_to_buff(frame, xdp);
 | 
			
		||||
		xdp->rxq = &rq->xdp_rxq;
 | 
			
		||||
		vxbuf.skb = NULL;
 | 
			
		||||
 | 
			
		||||
		act = bpf_prog_run_xdp(xdp_prog, xdp);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -823,6 +825,7 @@ static struct sk_buff *veth_xdp_rcv_skb(struct veth_rq *rq,
 | 
			
		|||
	__skb_push(skb, skb->data - skb_mac_header(skb));
 | 
			
		||||
	if (veth_convert_skb_to_xdp_buff(rq, xdp, &skb))
 | 
			
		||||
		goto drop;
 | 
			
		||||
	vxbuf.skb = skb;
 | 
			
		||||
 | 
			
		||||
	orig_data = xdp->data;
 | 
			
		||||
	orig_data_end = xdp->data_end;
 | 
			
		||||
| 
						 | 
				
			
			@ -1602,6 +1605,28 @@ static int veth_xdp(struct net_device *dev, struct netdev_bpf *xdp)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int veth_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
 | 
			
		||||
{
 | 
			
		||||
	struct veth_xdp_buff *_ctx = (void *)ctx;
 | 
			
		||||
 | 
			
		||||
	if (!_ctx->skb)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	*timestamp = skb_hwtstamps(_ctx->skb)->hwtstamp;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int veth_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
 | 
			
		||||
{
 | 
			
		||||
	struct veth_xdp_buff *_ctx = (void *)ctx;
 | 
			
		||||
 | 
			
		||||
	if (!_ctx->skb)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	*hash = skb_get_hash(_ctx->skb);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct net_device_ops veth_netdev_ops = {
 | 
			
		||||
	.ndo_init            = veth_dev_init,
 | 
			
		||||
	.ndo_open            = veth_open,
 | 
			
		||||
| 
						 | 
				
			
			@ -1623,6 +1648,11 @@ static const struct net_device_ops veth_netdev_ops = {
 | 
			
		|||
	.ndo_get_peer_dev	= veth_peer_dev,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct xdp_metadata_ops veth_xdp_metadata_ops = {
 | 
			
		||||
	.xmo_rx_timestamp		= veth_xdp_rx_timestamp,
 | 
			
		||||
	.xmo_rx_hash			= veth_xdp_rx_hash,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define VETH_FEATURES (NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HW_CSUM | \
 | 
			
		||||
		       NETIF_F_RXCSUM | NETIF_F_SCTP_CRC | NETIF_F_HIGHDMA | \
 | 
			
		||||
		       NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL | \
 | 
			
		||||
| 
						 | 
				
			
			@ -1639,6 +1669,7 @@ static void veth_setup(struct net_device *dev)
 | 
			
		|||
	dev->priv_flags |= IFF_PHONY_HEADROOM;
 | 
			
		||||
 | 
			
		||||
	dev->netdev_ops = &veth_netdev_ops;
 | 
			
		||||
	dev->xdp_metadata_ops = &veth_xdp_metadata_ops;
 | 
			
		||||
	dev->ethtool_ops = &veth_ethtool_ops;
 | 
			
		||||
	dev->features |= NETIF_F_LLTX;
 | 
			
		||||
	dev->features |= VETH_FEATURES;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue