Commit fe80536a authored by Martin's avatar Martin Committed by David S. Miller

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: default avatarMartin <martin.varghese@nokia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 89304496
...@@ -48,5 +48,7 @@ enabled. ...@@ -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 { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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 { ...@@ -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
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment