forked from mirrors/linux
		
	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 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
 | 
					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
 | 
					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
 | 
					bareudp device decapsulates the udp header and passes the inner packet to the
 | 
				
			||||||
passing the packet buffer to the network stack.
 | 
					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;
 | 
						__be16             port;
 | 
				
			||||||
	u16	           sport_min;
 | 
						u16	           sport_min;
 | 
				
			||||||
	bool               multi_proto_mode;
 | 
						bool               multi_proto_mode;
 | 
				
			||||||
 | 
						bool               rx_collect_metadata;
 | 
				
			||||||
	struct socket      __rcu *sock;
 | 
						struct socket      __rcu *sock;
 | 
				
			||||||
	struct list_head   next;        /* bareudp node  on namespace list */
 | 
						struct list_head   next;        /* bareudp node  on namespace list */
 | 
				
			||||||
	struct gro_cells   gro_cells;
 | 
						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++;
 | 
							bareudp->dev->stats.rx_dropped++;
 | 
				
			||||||
		goto drop;
 | 
							goto drop;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (bareudp->rx_collect_metadata) {
 | 
				
			||||||
	tun_dst = udp_tun_rx_dst(skb, family, TUNNEL_KEY, 0, 0);
 | 
							tun_dst = udp_tun_rx_dst(skb, family, TUNNEL_KEY, 0, 0);
 | 
				
			||||||
	if (!tun_dst) {
 | 
							if (!tun_dst) {
 | 
				
			||||||
		bareudp->dev->stats.rx_dropped++;
 | 
								bareudp->dev->stats.rx_dropped++;
 | 
				
			||||||
		goto drop;
 | 
								goto drop;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							skb_dst_set(skb, &tun_dst->dst);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	skb_dst_set(skb, &tun_dst->dst);
 | 
					 | 
				
			||||||
	skb->dev = bareudp->dev;
 | 
						skb->dev = bareudp->dev;
 | 
				
			||||||
	oiph = skb_network_header(skb);
 | 
						oiph = skb_network_header(skb);
 | 
				
			||||||
	skb_reset_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])
 | 
						if (data[IFLA_BAREUDP_MULTIPROTO_MODE])
 | 
				
			||||||
		conf->multi_proto_mode = true;
 | 
							conf->multi_proto_mode = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (data[IFLA_BAREUDP_RX_COLLECT_METADATA])
 | 
				
			||||||
 | 
							conf->rx_collect_metadata = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -612,6 +617,8 @@ static int bareudp_configure(struct net *net, struct net_device *dev,
 | 
				
			||||||
	bareudp->ethertype = conf->ethertype;
 | 
						bareudp->ethertype = conf->ethertype;
 | 
				
			||||||
	bareudp->sport_min = conf->sport_min;
 | 
						bareudp->sport_min = conf->sport_min;
 | 
				
			||||||
	bareudp->multi_proto_mode = conf->multi_proto_mode;
 | 
						bareudp->multi_proto_mode = conf->multi_proto_mode;
 | 
				
			||||||
 | 
						bareudp->rx_collect_metadata = conf->rx_collect_metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = register_netdevice(dev);
 | 
						err = register_netdevice(dev);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		return 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(__be16)) +  /* IFLA_BAREUDP_ETHERTYPE */
 | 
				
			||||||
		nla_total_size(sizeof(__u16))  +  /* IFLA_BAREUDP_SRCPORT_MIN */
 | 
							nla_total_size(sizeof(__u16))  +  /* IFLA_BAREUDP_SRCPORT_MIN */
 | 
				
			||||||
		nla_total_size(0)              +  /* IFLA_BAREUDP_MULTIPROTO_MODE */
 | 
							nla_total_size(0)              +  /* IFLA_BAREUDP_MULTIPROTO_MODE */
 | 
				
			||||||
 | 
							nla_total_size(0)              +  /* IFLA_BAREUDP_RX_COLLECT_METADATA */
 | 
				
			||||||
		0;
 | 
							0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -685,6 +693,9 @@ static int bareudp_fill_info(struct sk_buff *skb, const struct net_device *dev)
 | 
				
			||||||
	if (bareudp->multi_proto_mode &&
 | 
						if (bareudp->multi_proto_mode &&
 | 
				
			||||||
	    nla_put_flag(skb, IFLA_BAREUDP_MULTIPROTO_MODE))
 | 
						    nla_put_flag(skb, IFLA_BAREUDP_MULTIPROTO_MODE))
 | 
				
			||||||
		goto nla_put_failure;
 | 
							goto nla_put_failure;
 | 
				
			||||||
 | 
						if (bareudp->rx_collect_metadata &&
 | 
				
			||||||
 | 
						    nla_put_flag(skb, IFLA_BAREUDP_RX_COLLECT_METADATA))
 | 
				
			||||||
 | 
							goto nla_put_failure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,7 @@ struct bareudp_conf {
 | 
				
			||||||
	__be16 port;
 | 
						__be16 port;
 | 
				
			||||||
	u16 sport_min;
 | 
						u16 sport_min;
 | 
				
			||||||
	bool multi_proto_mode;
 | 
						bool multi_proto_mode;
 | 
				
			||||||
 | 
						bool rx_collect_metadata;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct net_device *bareudp_dev_create(struct net *net, const char *name,
 | 
					struct net_device *bareudp_dev_create(struct net *net, const char *name,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -600,6 +600,7 @@ enum {
 | 
				
			||||||
	IFLA_BAREUDP_ETHERTYPE,
 | 
						IFLA_BAREUDP_ETHERTYPE,
 | 
				
			||||||
	IFLA_BAREUDP_SRCPORT_MIN,
 | 
						IFLA_BAREUDP_SRCPORT_MIN,
 | 
				
			||||||
	IFLA_BAREUDP_MULTIPROTO_MODE,
 | 
						IFLA_BAREUDP_MULTIPROTO_MODE,
 | 
				
			||||||
 | 
						IFLA_BAREUDP_RX_COLLECT_METADATA,
 | 
				
			||||||
	__IFLA_BAREUDP_MAX
 | 
						__IFLA_BAREUDP_MAX
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue