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 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 New Issue
Block a user