forked from Minki/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
@ -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 New Issue
Block a user