In order to be able to unit test the tunnel flow setup code we need to be able to generate netdevs that appear to be like tunnel devices. This adds a dummy_tunnel netdev with two differences from the normal dummy devices: the ability to set and read config and a different type to identify them as needing tunnel translation.
Signed-off-by: Jesse Gross <je...@nicira.com> --- lib/netdev-dummy.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 6aa4084..bb65c12 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -29,6 +29,7 @@ #include "packets.h" #include "poll-loop.h" #include "shash.h" +#include "smap.h" #include "sset.h" #include "unixctl.h" #include "vlog.h" @@ -37,6 +38,7 @@ VLOG_DEFINE_THIS_MODULE(netdev_dummy); struct netdev_dev_dummy { struct netdev_dev netdev_dev; + struct smap config; uint8_t hwaddr[ETH_ADDR_LEN]; int mtu; struct netdev_stats stats; @@ -94,6 +96,7 @@ netdev_dummy_create(const struct netdev_class *class, const char *name, netdev_dev = xzalloc(sizeof *netdev_dev); netdev_dev_init(&netdev_dev->netdev_dev, name, class); + smap_init(&netdev_dev->config); netdev_dev->hwaddr[0] = 0xaa; netdev_dev->hwaddr[1] = 0x55; netdev_dev->hwaddr[2] = n >> 24; @@ -119,12 +122,35 @@ netdev_dummy_destroy(struct netdev_dev *netdev_dev_) { struct netdev_dev_dummy *netdev_dev = netdev_dev_dummy_cast(netdev_dev_); + smap_destroy(&netdev_dev->config); shash_find_and_delete(&dummy_netdev_devs, netdev_dev_get_name(netdev_dev_)); free(netdev_dev); } static int +netdev_dummy_get_config(struct netdev_dev *netdev_dev_, struct smap *args) +{ + struct netdev_dev_dummy *netdev_dev = netdev_dev_dummy_cast(netdev_dev_); + + smap_destroy(args); + smap_clone(args, &netdev_dev->config); + + return 0; +} + +static int +netdev_dummy_set_config(struct netdev_dev *netdev_dev_, const struct smap *args) +{ + struct netdev_dev_dummy *netdev_dev = netdev_dev_dummy_cast(netdev_dev_); + + smap_destroy(&netdev_dev->config); + smap_clone(&netdev_dev->config, args); + + return 0; +} + +static int netdev_dummy_open(struct netdev_dev *netdev_dev_, struct netdev **netdevp) { struct netdev_dev_dummy *netdev_dev = netdev_dev_dummy_cast(netdev_dev_); @@ -370,6 +396,67 @@ static const struct netdev_class dummy_class = { netdev_dummy_change_seq }; +static const struct netdev_class dummy_tunnel_class = { + "dummy_tunnel", + NULL, /* init */ + NULL, /* run */ + NULL, /* wait */ + + netdev_dummy_create, + netdev_dummy_destroy, + netdev_dummy_get_config, + netdev_dummy_set_config, + + netdev_dummy_open, + netdev_dummy_close, + + netdev_dummy_listen, + netdev_dummy_recv, + netdev_dummy_recv_wait, + netdev_dummy_drain, + + NULL, /* send */ + NULL, /* send_wait */ + + netdev_dummy_set_etheraddr, + netdev_dummy_get_etheraddr, + netdev_dummy_get_mtu, + netdev_dummy_set_mtu, + NULL, /* get_ifindex */ + NULL, /* get_carrier */ + NULL, /* get_carrier_resets */ + NULL, /* get_miimon */ + netdev_dummy_get_stats, + netdev_dummy_set_stats, + + NULL, /* get_features */ + NULL, /* set_advertisements */ + + NULL, /* set_policing */ + NULL, /* get_qos_types */ + NULL, /* get_qos_capabilities */ + NULL, /* get_qos */ + NULL, /* set_qos */ + NULL, /* get_queue */ + NULL, /* set_queue */ + NULL, /* delete_queue */ + NULL, /* get_queue_stats */ + NULL, /* dump_queues */ + NULL, /* dump_queue_stats */ + + NULL, /* get_in4 */ + NULL, /* set_in4 */ + NULL, /* get_in6 */ + NULL, /* add_router */ + NULL, /* get_next_hop */ + NULL, /* get_drv_info */ + NULL, /* arp_lookup */ + + netdev_dummy_update_flags, + + netdev_dummy_change_seq +}; + static struct ofpbuf * eth_from_packet_or_flow(const char *s) { @@ -529,4 +616,5 @@ netdev_dummy_register(bool override) sset_destroy(&types); } netdev_register_provider(&dummy_class); + netdev_register_provider(&dummy_tunnel_class); } -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev