[ovs-dev] [PATCH] netdev-linux: do not send packets to down tap ifaces.
Jan Scheurich
jan.scheurich at ericsson.com
Mon Jan 15 12:25:47 UTC 2018
Hi Vishal,
I assume you want to count these packets as "tx dropped" on the tap interface ports in DOWN state, right?
BR, Jan
> -----Original Message-----
> From: ovs-dev-bounces at openvswitch.org [mailto:ovs-dev-bounces at openvswitch.org] On Behalf Of Vishal Deep Ajmera
> Sent: Monday, 15 January, 2018 11:27
> To: Flavio Leitner <fbl at sysclose.org>; dev at openvswitch.org
> Subject: Re: [ovs-dev] [PATCH] netdev-linux: do not send packets to down tap ifaces.
>
> Hi Flavio,
>
> Thank you for looking into this issue. It certainly improves the situation for broadcast frames when we have multiple tap ports on the
> bridge which are in DOWN state.
>
> However, I see an issue with the patch. It does not handle device statistics. Earlier even when tap-port was DOWN, we would make a write
> system-call and kernel drops the packets which also accounts it in device statistics (drop counter). But now, since we skip sending packets
> to kernel then we will have to adjust it in netdev-linux. Can you modify the patch accordingly ?
>
> Warm Regards,
> Vishal Ajmera
>
> -----Original Message-----
> From: ovs-dev-bounces at openvswitch.org [mailto:ovs-dev-bounces at openvswitch.org] On Behalf Of Flavio Leitner
> Sent: Wednesday, January 10, 2018 9:37 PM
> To: dev at openvswitch.org
> Cc: Flavio Leitner <fbl at sysclose.org>
> Subject: [ovs-dev] [PATCH] netdev-linux: do not send packets to down tap ifaces.
>
> Today OVS pushes packets to the TAP interface ignoring its current state. That works because the kernel will return -EIO when it's not UP
> and OVS will just ignore that as it is not an OVS issue.
>
> However, it causes a huge impact when broadcasts happen when using userspace datapath accelerated with DPDK (e.g.: action NORMAL).
> This patch improves the situation by checking the TAP's interface state before issueing any syscall.
>
> However, there might be use-cases moving interfaces to other networking namespaces and in that case, OVS can't retrieve the iface state
> (sets it to DOWN). That would stop the traffic breaking the use-case. This patch relies on netlink notifications to find out if the device is
> local or not. When it's local, the device state is checked otherwise it will behave as before.
>
> Signed-off-by: Flavio Leitner <fbl at sysclose.org>
> ---
> lib/netdev-linux.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index ccb6def6c..53b08bebd 100644
> --- a/lib/netdev-linux.c
> +++ b/lib/netdev-linux.c
> @@ -502,6 +502,7 @@ struct netdev_linux {
>
> /* For devices of class netdev_tap_class only. */
> int tap_fd;
> + bool present; /* If the device is present in the namespace */
> };
>
> struct netdev_rxq_linux {
> @@ -750,8 +751,10 @@ netdev_linux_update(struct netdev_linux *dev,
> dev->ifindex = change->if_index;
> dev->cache_valid |= VALID_IFINDEX;
> dev->get_ifindex_error = 0;
> + dev->present = true;
> } else {
> netdev_linux_changed(dev, change->ifi_flags, 0);
> + dev->present = false;
> }
> } else if (rtnetlink_type_is_rtnlgrp_addr(change->nlmsg_type)) {
> /* Invalidates in4, in6. */
> @@ -1234,6 +1237,16 @@ netdev_linux_tap_batch_send(struct netdev *netdev_, {
> struct netdev_linux *netdev = netdev_linux_cast(netdev_);
> struct dp_packet *packet;
> +
> + /* The Linux tap driver returns EIO if the device is not up,
> + * so if the device is not up, don't waste time sending it.
> + * However, if the device is in another network namespace
> + * then OVS can't retrieve the state. In that case, send the
> + * packets anyway. */
> + if (netdev->present && !(netdev->ifi_flags & IFF_UP)) {
> + return 0;
> + }
> +
> DP_PACKET_BATCH_FOR_EACH (packet, batch) {
> size_t size = dp_packet_size(packet);
> ssize_t retval;
> --
> 2.14.3
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
More information about the dev
mailing list