mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	bareudp: Added attribute to enable & disable rx metadata collection
Metadata need not be collected in receive if the packet from bareudp device is not targeted to openvswitch. Signed-off-by: Martin <martin.varghese@nokia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									8930449628
								
							
						
					
					
						commit
						fe80536acf
					
				
					 4 changed files with 23 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -48,5 +48,7 @@ enabled.
 | 
			
		|||
The bareudp device could be used along with OVS or flower filter in TC.
 | 
			
		||||
The OVS or TC flower layer must set the tunnel information in SKB dst field before
 | 
			
		||||
sending packet buffer to the bareudp device for transmission. On reception the
 | 
			
		||||
bareudp device extracts and stores the tunnel information in SKB dst field before
 | 
			
		||||
passing the packet buffer to the network stack.
 | 
			
		||||
bareudp device decapsulates the udp header and passes the inner packet to the
 | 
			
		||||
network stack. If RX_COLLECT_METADATA flag is enabled in the device the tunnel
 | 
			
		||||
information will be stored in the SKB dst field before the packet buffer is
 | 
			
		||||
passed to the network stack.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,7 @@ struct bareudp_dev {
 | 
			
		|||
	__be16             port;
 | 
			
		||||
	u16	           sport_min;
 | 
			
		||||
	bool               multi_proto_mode;
 | 
			
		||||
	bool               rx_collect_metadata;
 | 
			
		||||
	struct socket      __rcu *sock;
 | 
			
		||||
	struct list_head   next;        /* bareudp node  on namespace list */
 | 
			
		||||
	struct gro_cells   gro_cells;
 | 
			
		||||
| 
						 | 
				
			
			@ -125,13 +126,14 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
 | 
			
		|||
		bareudp->dev->stats.rx_dropped++;
 | 
			
		||||
		goto drop;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tun_dst = udp_tun_rx_dst(skb, family, TUNNEL_KEY, 0, 0);
 | 
			
		||||
	if (!tun_dst) {
 | 
			
		||||
		bareudp->dev->stats.rx_dropped++;
 | 
			
		||||
		goto drop;
 | 
			
		||||
	if (bareudp->rx_collect_metadata) {
 | 
			
		||||
		tun_dst = udp_tun_rx_dst(skb, family, TUNNEL_KEY, 0, 0);
 | 
			
		||||
		if (!tun_dst) {
 | 
			
		||||
			bareudp->dev->stats.rx_dropped++;
 | 
			
		||||
			goto drop;
 | 
			
		||||
		}
 | 
			
		||||
		skb_dst_set(skb, &tun_dst->dst);
 | 
			
		||||
	}
 | 
			
		||||
	skb_dst_set(skb, &tun_dst->dst);
 | 
			
		||||
	skb->dev = bareudp->dev;
 | 
			
		||||
	oiph = skb_network_header(skb);
 | 
			
		||||
	skb_reset_network_header(skb);
 | 
			
		||||
| 
						 | 
				
			
			@ -575,6 +577,9 @@ static int bareudp2info(struct nlattr *data[], struct bareudp_conf *conf,
 | 
			
		|||
	if (data[IFLA_BAREUDP_MULTIPROTO_MODE])
 | 
			
		||||
		conf->multi_proto_mode = true;
 | 
			
		||||
 | 
			
		||||
	if (data[IFLA_BAREUDP_RX_COLLECT_METADATA])
 | 
			
		||||
		conf->rx_collect_metadata = true;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -612,6 +617,8 @@ static int bareudp_configure(struct net *net, struct net_device *dev,
 | 
			
		|||
	bareudp->ethertype = conf->ethertype;
 | 
			
		||||
	bareudp->sport_min = conf->sport_min;
 | 
			
		||||
	bareudp->multi_proto_mode = conf->multi_proto_mode;
 | 
			
		||||
	bareudp->rx_collect_metadata = conf->rx_collect_metadata;
 | 
			
		||||
 | 
			
		||||
	err = register_netdevice(dev);
 | 
			
		||||
	if (err)
 | 
			
		||||
		return err;
 | 
			
		||||
| 
						 | 
				
			
			@ -669,6 +676,7 @@ static size_t bareudp_get_size(const struct net_device *dev)
 | 
			
		|||
		nla_total_size(sizeof(__be16)) +  /* IFLA_BAREUDP_ETHERTYPE */
 | 
			
		||||
		nla_total_size(sizeof(__u16))  +  /* IFLA_BAREUDP_SRCPORT_MIN */
 | 
			
		||||
		nla_total_size(0)              +  /* IFLA_BAREUDP_MULTIPROTO_MODE */
 | 
			
		||||
		nla_total_size(0)              +  /* IFLA_BAREUDP_RX_COLLECT_METADATA */
 | 
			
		||||
		0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -685,6 +693,9 @@ static int bareudp_fill_info(struct sk_buff *skb, const struct net_device *dev)
 | 
			
		|||
	if (bareudp->multi_proto_mode &&
 | 
			
		||||
	    nla_put_flag(skb, IFLA_BAREUDP_MULTIPROTO_MODE))
 | 
			
		||||
		goto nla_put_failure;
 | 
			
		||||
	if (bareudp->rx_collect_metadata &&
 | 
			
		||||
	    nla_put_flag(skb, IFLA_BAREUDP_RX_COLLECT_METADATA))
 | 
			
		||||
		goto nla_put_failure;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,7 @@ struct bareudp_conf {
 | 
			
		|||
	__be16 port;
 | 
			
		||||
	u16 sport_min;
 | 
			
		||||
	bool multi_proto_mode;
 | 
			
		||||
	bool rx_collect_metadata;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct net_device *bareudp_dev_create(struct net *net, const char *name,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -600,6 +600,7 @@ enum {
 | 
			
		|||
	IFLA_BAREUDP_ETHERTYPE,
 | 
			
		||||
	IFLA_BAREUDP_SRCPORT_MIN,
 | 
			
		||||
	IFLA_BAREUDP_MULTIPROTO_MODE,
 | 
			
		||||
	IFLA_BAREUDP_RX_COLLECT_METADATA,
 | 
			
		||||
	__IFLA_BAREUDP_MAX
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue