Acked-by: Andy Zhou <[email protected]>

On Thu, Aug 1, 2013 at 2:29 PM, Ben Pfaff <[email protected]> wrote:

> Signed-off-by: Ben Pfaff <[email protected]>
> ---
>  lib/netdev-linux.c |   42 +++++++++++++-----------------------------
>  1 file changed, 13 insertions(+), 29 deletions(-)
>
> diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
> index cc86ec6..768b4e8 100644
> --- a/lib/netdev-linux.c
> +++ b/lib/netdev-linux.c
> @@ -120,10 +120,6 @@ enum {
>      VALID_DRVINFO           = 1 << 7,
>      VALID_FEATURES          = 1 << 8,
>  };
> -
> -struct tap_state {
> -    int fd;
> -};
>
>  /* Traffic control. */
>
> @@ -394,9 +390,8 @@ struct netdev_linux {
>      struct ethtool_drvinfo drvinfo;  /* Cached from ETHTOOL_GDRVINFO. */
>      struct tc *tc;
>
> -    union {
> -        struct tap_state tap;
> -    } state;
> +    /* For devices of class netdev_tap_class only. */
> +    int tap_fd;
>  };
>
>  struct netdev_rx_linux {
> @@ -645,14 +640,12 @@ netdev_linux_create_tap(const struct netdev_class
> *class OVS_UNUSED,
>                          const char *name, struct netdev **netdevp)
>  {
>      struct netdev_linux *netdev;
> -    struct tap_state *state;
>      static const char tap_dev[] = "/dev/net/tun";
>      struct ifreq ifr;
>      int error;
>
>      netdev = xzalloc(sizeof *netdev);
>      netdev->change_seq = 1;
> -    state = &netdev->state.tap;
>
>      error = cache_notifier_ref();
>      if (error) {
> @@ -660,8 +653,8 @@ netdev_linux_create_tap(const struct netdev_class
> *class OVS_UNUSED,
>      }
>
>      /* Open tap device. */
> -    state->fd = open(tap_dev, O_RDWR);
> -    if (state->fd < 0) {
> +    netdev->tap_fd = open(tap_dev, O_RDWR);
> +    if (netdev->tap_fd < 0) {
>          error = errno;
>          VLOG_WARN("opening \"%s\" failed: %s", tap_dev,
> ovs_strerror(error));
>          goto error_unref_notifier;
> @@ -670,7 +663,7 @@ netdev_linux_create_tap(const struct netdev_class
> *class OVS_UNUSED,
>      /* Create tap device. */
>      ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
>      ovs_strzcpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
> -    if (ioctl(state->fd, TUNSETIFF, &ifr) == -1) {
> +    if (ioctl(netdev->tap_fd, TUNSETIFF, &ifr) == -1) {
>          VLOG_WARN("%s: creating tap device failed: %s", name,
>                    ovs_strerror(errno));
>          error = errno;
> @@ -678,7 +671,7 @@ netdev_linux_create_tap(const struct netdev_class
> *class OVS_UNUSED,
>      }
>
>      /* Make non-blocking. */
> -    error = set_nonblocking(state->fd);
> +    error = set_nonblocking(netdev->tap_fd);
>      if (error) {
>          goto error_close;
>      }
> @@ -688,7 +681,7 @@ netdev_linux_create_tap(const struct netdev_class
> *class OVS_UNUSED,
>      return 0;
>
>  error_close:
> -    close(state->fd);
> +    close(netdev->tap_fd);
>  error_unref_notifier:
>      cache_notifier_unref();
>  error:
> @@ -697,17 +690,6 @@ error:
>  }
>
>  static void
> -destroy_tap(struct netdev_linux *netdev)
> -{
> -    struct tap_state *state = &netdev->state.tap;
> -
> -    if (state->fd >= 0) {
> -        close(state->fd);
> -    }
> -}
> -
> -/* Destroys the netdev device 'netdev_'. */
> -static void
>  netdev_linux_destroy(struct netdev *netdev_)
>  {
>      struct netdev_linux *netdev = netdev_linux_cast(netdev_);
> @@ -716,8 +698,10 @@ netdev_linux_destroy(struct netdev *netdev_)
>          netdev->tc->ops->tc_destroy(netdev->tc);
>      }
>
> -    if (netdev_get_class(netdev_) == &netdev_tap_class) {
> -        destroy_tap(netdev);
> +    if (netdev_get_class(netdev_) == &netdev_tap_class
> +        && netdev->tap_fd >= 0)
>
Should we make netdev->tap_fd >= 0 an assert?
Could zero be a valid tap_fd value?


> +    {
> +        close(netdev->tap_fd);
>      }
>      free(netdev);
>
> @@ -734,7 +718,7 @@ netdev_linux_rx_open(struct netdev *netdev_, struct
> netdev_rx **rxp)
>      int fd;
>
>      if (is_tap) {
> -        fd = netdev->state.tap.fd;
> +        fd = netdev->tap_fd;
>      } else {
>          struct sockaddr_ll sll;
>          int ifindex;
> @@ -924,7 +908,7 @@ netdev_linux_send(struct netdev *netdev_, const void
> *data, size_t size)
>               * because we attach a socket filter to the rx socket. */
>              struct netdev_linux *netdev = netdev_linux_cast(netdev_);
>
> -            retval = write(netdev->state.tap.fd, data, size);
> +            retval = write(netdev->tap_fd, data, size);
>          }
>
>          if (retval < 0) {
> --
> 1.7.10.4
>
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to