[ovs-dev] [PATCH] netdev-linux: Do not log a warning if the device is down.
Daniele Di Proietto
diproiettod at vmware.com
Thu Jul 7 01:26:27 UTC 2016
I took your version of the code (much clearer!) and pushed this to master.
Thanks,
Daniele
On 24/06/2016 21:38, "Ben Pfaff" <blp at ovn.org> wrote:
>On Fri, Jun 10, 2016 at 03:52:16PM -0700, Daniele Di Proietto wrote:
>> In the userspace datapath we use tap devices as internal netdev. The
>> datapath doesn't consider whether a device is up or down before sending
>> to it, and so far this hasn't been a problem.
>>
>> Since Linux upstream commit 1bd4978a88ac("tun: honor IFF_UP in
>> tun_get_user()"), included in 4.4, writing to a tap device that is not
>> up sets errno to EIO. This commit avoids printing a warning in this
>> case.
>>
>> This fixes a failures in the system-userspace-testsuites.
>>
>> Reported-by: Joe Stringer <joe at ovn.org>
>> Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
>
>Acked-by: Ben Pfaff <blp at ovn.org>
>
>However, the logic is getting a little nonobvious here in my opinion.
>Here's a version that I think is equivalent (I have not tested it) and
>seems to me easier to understand:
>
>diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
>index ef11d12..1cc0a5f 100644
>--- a/lib/netdev-linux.c
>+++ b/lib/netdev-linux.c
>@@ -1223,15 +1223,20 @@ netdev_linux_send(struct netdev *netdev_, int qid OVS_UNUSED,
> }
>
> if (retval < 0) {
>- /* The Linux AF_PACKET implementation never blocks waiting for room
>- * for packets, instead returning ENOBUFS. Translate this into
>- * EAGAIN for the caller. */
>- error = errno == ENOBUFS ? EAGAIN : errno;
>- if (error == EINTR) {
>- /* continue without incrementing 'i', i.e. retry this packet */
>+ if (errno == EINTR) {
>+ /* The send was interrupted by a signal. Retry the packet by
>+ * continuing without incrementing 'i'. */
> continue;
>+ } else if (errno == EIO && is_tap_netdev(netdev_)) {
>+ /* The Linux tap driver returns EIO if the device is not up.
>+ * From the OVS side this is not an error, so ignore it. */
>+ } else {
>+ /* The Linux AF_PACKET implementation never blocks waiting for
>+ * room for packets, instead returning ENOBUFS. Translate this
>+ * into EAGAIN for the caller. */
>+ error = errno == ENOBUFS ? EAGAIN : errno;
>+ break;
> }
>- break;
> } else if (retval != size) {
> VLOG_WARN_RL(&rl, "sent partial Ethernet packet (%"PRIuSIZE" bytes"
> " of %"PRIuSIZE") on %s", retval, size,
>
More information about the dev
mailing list