Eh, changed this from bridge: to netdev-dummy: in the subject.

Ethan

On Fri, Aug 10, 2012 at 1:53 PM, Ethan Jackson <et...@nicira.com> wrote:
> There's currently no way to set the admin state on dummy netdevs.
> This patch provides a mechanism to do so which will be used in
> future unit tests.
>
> Signed-off-by: Ethan Jackson <et...@nicira.com>
> ---
>
> Oops, I forgot to change the title of the patch.
>
> ---
>  lib/netdev-dummy.c | 75 
> +++++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 68 insertions(+), 7 deletions(-)
>
> diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
> index b8c23c5..6aa4084 100644
> --- a/lib/netdev-dummy.c
> +++ b/lib/netdev-dummy.c
> @@ -55,9 +55,14 @@ struct netdev_dummy {
>
>  static struct shash dummy_netdev_devs = 
> SHASH_INITIALIZER(&dummy_netdev_devs);
>
> +static unixctl_cb_func netdev_dummy_set_admin_state;
>  static int netdev_dummy_create(const struct netdev_class *, const char *,
>                                 struct netdev_dev **);
> -static void netdev_dummy_poll_notify(const struct netdev *);
> +static void netdev_dev_dummy_poll_notify(struct netdev_dev_dummy *);
> +static int netdev_dev_dummy_update_flags(struct netdev_dev_dummy *,
> +                                         enum netdev_flags off,
> +                                         enum netdev_flags on,
> +                                         enum netdev_flags *old_flagsp);
>
>  static bool
>  is_dummy_class(const struct netdev_class *class)
> @@ -201,7 +206,7 @@ netdev_dummy_set_etheraddr(struct netdev *netdev,
>
>      if (!eth_addr_equals(dev->hwaddr, mac)) {
>          memcpy(dev->hwaddr, mac, ETH_ADDR_LEN);
> -        netdev_dummy_poll_notify(netdev);
> +        netdev_dev_dummy_poll_notify(dev);
>      }
>
>      return 0;
> @@ -266,6 +271,14 @@ netdev_dummy_update_flags(struct netdev *netdev,
>      struct netdev_dev_dummy *dev =
>          netdev_dev_dummy_cast(netdev_get_dev(netdev));
>
> +    return netdev_dev_dummy_update_flags(dev, off, on, old_flagsp);
> +}
> +
> +static int
> +netdev_dev_dummy_update_flags(struct netdev_dev_dummy *dev,
> +                              enum netdev_flags off, enum netdev_flags on,
> +                              enum netdev_flags *old_flagsp)
> +{
>      if ((off | on) & ~(NETDEV_UP | NETDEV_PROMISC)) {
>          return EINVAL;
>      }
> @@ -274,7 +287,7 @@ netdev_dummy_update_flags(struct netdev *netdev,
>      dev->flags |= on;
>      dev->flags &= ~off;
>      if (*old_flagsp != dev->flags) {
> -        netdev_dummy_poll_notify(netdev);
> +        netdev_dev_dummy_poll_notify(dev);
>      }
>      return 0;
>  }
> @@ -288,11 +301,8 @@ netdev_dummy_change_seq(const struct netdev *netdev)
>  /* Helper functions. */
>
>  static void
> -netdev_dummy_poll_notify(const struct netdev *netdev)
> +netdev_dev_dummy_poll_notify(struct netdev_dev_dummy *dev)
>  {
> -    struct netdev_dev_dummy *dev =
> -        netdev_dev_dummy_cast(netdev_get_dev(netdev));
> -
>      dev->change_seq++;
>      if (!dev->change_seq) {
>          dev->change_seq++;
> @@ -443,11 +453,62 @@ netdev_dummy_receive(struct unixctl_conn *conn,
>      }
>  }
>
> +static void
> +netdev_dev_dummy_set_admin_state(struct netdev_dev_dummy *dev,
> +                                 bool admin_state)
> +{
> +    enum netdev_flags old_flags;
> +
> +    if (admin_state) {
> +        netdev_dev_dummy_update_flags(dev, 0, NETDEV_UP, &old_flags);
> +    } else {
> +        netdev_dev_dummy_update_flags(dev, NETDEV_UP, 0, &old_flags);
> +    }
> +}
> +
> +static void
> +netdev_dummy_set_admin_state(struct unixctl_conn *conn, int argc,
> +                             const char *argv[], void *aux OVS_UNUSED)
> +{
> +    bool up;
> +
> +    if (!strcasecmp(argv[argc - 1], "up")) {
> +        up = true;
> +    } else if ( !strcasecmp(argv[argc - 1], "down")) {
> +        up = false;
> +    } else {
> +        unixctl_command_reply_error(conn, "Invalid Admin State");
> +        return;
> +    }
> +
> +    if (argc > 2) {
> +        struct netdev_dev_dummy *dummy_dev;
> +
> +        dummy_dev  = shash_find_data(&dummy_netdev_devs, argv[1]);
> +        if (dummy_dev) {
> +            netdev_dev_dummy_set_admin_state(dummy_dev, up);
> +        } else {
> +            unixctl_command_reply_error(conn, "Unknown Dummy Interface");
> +            return;
> +        }
> +    } else {
> +        struct shash_node *node;
> +
> +        SHASH_FOR_EACH (node, &dummy_netdev_devs) {
> +            netdev_dev_dummy_set_admin_state(node->data, up);
> +        }
> +    }
> +    unixctl_command_reply(conn, "OK");
> +}
> +
>  void
>  netdev_dummy_register(bool override)
>  {
>      unixctl_command_register("netdev-dummy/receive", "NAME PACKET|FLOW...",
>                               2, INT_MAX, netdev_dummy_receive, NULL);
> +    unixctl_command_register("netdev-dummy/set-admin-state",
> +                             "[netdev] up|down", 1, 2,
> +                             netdev_dummy_set_admin_state, NULL);
>
>      if (override) {
>          struct sset types;
> --
> 1.7.11.4
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to