From: Giuseppe Lettieri Date: Thu, 31 Jan 2013 14:09:26 +0000 (+0100) Subject: Merge branch 'mainstream' X-Git-Tag: sliver-openvswitch-1.9.90-3~3 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=305b76debf72120672a8ba81d3356b6dccb1da9a;hp=-c;p=sliver-openvswitch.git Merge branch 'mainstream' Conflicts: lib/dpif-netdev.c --- 305b76debf72120672a8ba81d3356b6dccb1da9a diff --combined lib/automake.mk index 185f092c5,d333a4d21..58d8da26d --- a/lib/automake.mk +++ b/lib/automake.mk @@@ -90,9 -90,9 +90,11 @@@ lib_libopenvswitch_a_SOURCES = lib/multipath.c \ lib/multipath.h \ lib/netdev-dummy.c \ + lib/netdev-tunnel.c \ + lib/netdev-pltap.c \ lib/netdev-provider.h \ + lib/netdev-vport.c \ + lib/netdev-vport.h \ lib/netdev.c \ lib/netdev.h \ lib/netflow.h \ @@@ -187,8 -187,6 +189,8 @@@ lib/timeval.h \ lib/token-bucket.c \ lib/token-bucket.h \ + lib/tunalloc.c \ + lib/tunalloc.h \ lib/type-props.h \ lib/unaligned.h \ lib/unicode.c \ @@@ -241,8 -239,6 +243,6 @@@ lib_libopenvswitch_a_SOURCES += lib/dpif-linux.h \ lib/netdev-linux.c \ lib/netdev-linux.h \ - lib/netdev-vport.c \ - lib/netdev-vport.h \ lib/netlink-notifier.c \ lib/netlink-notifier.h \ lib/netlink-protocol.h \ diff --combined lib/dpif-netdev.c index 13f57157c,038dfdc9a..129839c21 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@@ -1,5 -1,5 +1,5 @@@ /* - * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@@ -40,6 -40,7 +40,7 @@@ #include "hmap.h" #include "list.h" #include "netdev.h" + #include "netdev-vport.h" #include "netlink.h" #include "odp-util.h" #include "ofp-print.h" @@@ -180,13 -181,18 +181,25 @@@ dpif_netdev_enumerate(struct sset *all_ return 0; } + static bool + dpif_netdev_class_is_dummy(const struct dpif_class *class) + { + return class != &dpif_netdev_class; + } + ++static bool ++dpif_netdev_class_is_planetlab(const struct dpif_class *class) ++{ ++ return class == &dpif_planetlab_class; ++} ++ static const char * dpif_netdev_port_open_type(const struct dpif_class *class, const char *type) { return strcmp(type, "internal") ? type - : class == &dpif_netdev_class ? "tap" - : class == &dpif_planetlab_class ? "pltap" - : "dummy"; ++ : dpif_netdev_class_is_planetlab(class) ? "pltap" + : dpif_netdev_class_is_dummy(class) ? "dummy" + : "tap"; } static struct dpif * @@@ -210,8 -216,7 +223,8 @@@ choose_port(struct dp_netdev *dp, cons { int port_no; - if (dp->class != &dpif_netdev_class) { + if (dp->class != &dpif_netdev_class && + dp->class != &dpif_planetlab_class) { const char *p; int start_no = 0; @@@ -387,7 -392,8 +400,8 @@@ do_add_port(struct dp_netdev *dp, cons /* XXX reject non-Ethernet devices */ error = netdev_listen(netdev); - if (error) { + if (error + && !(error == EOPNOTSUPP && dpif_netdev_class_is_dummy(dp->class))) { VLOG_ERR("%s: cannot receive packets on this network device (%s)", devname, strerror(errno)); netdev_close(netdev); @@@ -432,11 -438,11 +446,11 @@@ dpif_netdev_port_add(struct dpif *dpif } port_no = *port_nop; } else { - port_no = choose_port(dp, netdev_get_name(netdev)); + port_no = choose_port(dp, netdev_vport_get_dpif_port(netdev)); } if (port_no >= 0) { *port_nop = port_no; - return do_add_port(dp, netdev_get_name(netdev), + return do_add_port(dp, netdev_vport_get_dpif_port(netdev), netdev_get_type(netdev), port_no); } return EFBIG; @@@ -475,7 -481,7 +489,7 @@@ get_port_by_name(struct dp_netdev *dp struct dp_netdev_port *port; LIST_FOR_EACH (port, node, &dp->port_list) { - if (!strcmp(netdev_get_name(port->netdev), devname)) { + if (!strcmp(netdev_vport_get_dpif_port(port->netdev), devname)) { *portp = port; return 0; } @@@ -499,7 -505,7 +513,7 @@@ do_del_port(struct dp_netdev *dp, uint3 dp->ports[port->port_no] = NULL; dp->serial++; - name = xstrdup(netdev_get_name(port->netdev)); + name = xstrdup(netdev_vport_get_dpif_port(port->netdev)); netdev_close(port->netdev); free(port->type); @@@ -513,7 -519,7 +527,7 @@@ static voi answer_port_query(const struct dp_netdev_port *port, struct dpif_port *dpif_port) { - dpif_port->name = xstrdup(netdev_get_name(port->netdev)); + dpif_port->name = xstrdup(netdev_vport_get_dpif_port(port->netdev)); dpif_port->type = xstrdup(port->type); dpif_port->port_no = port->port_no; } @@@ -604,7 -610,7 +618,7 @@@ dpif_netdev_port_dump_next(const struc struct dp_netdev_port *port = dp->ports[port_no]; if (port) { free(state->name); - state->name = xstrdup(netdev_get_name(port->netdev)); + state->name = xstrdup(netdev_vport_get_dpif_port(port->netdev)); dpif_port->name = state->name; dpif_port->type = port->type; dpif_port->port_no = port->port_no; @@@ -1063,7 -1069,8 +1077,8 @@@ dpif_netdev_run(struct dpif *dpif } else if (error != EAGAIN && error != EOPNOTSUPP) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); VLOG_ERR_RL(&rl, "error receiving data from %s: %s", - netdev_get_name(port->netdev), strerror(error)); + netdev_vport_get_dpif_port(port->netdev), + strerror(error)); } } ofpbuf_uninit(&packet); @@@ -1287,49 -1294,41 +1302,49 @@@ dp_netdev_execute_actions(struct dp_net } } +#define DPIF_NETDEV_CLASS_FUNCTIONS \ + dpif_netdev_enumerate, \ + dpif_netdev_port_open_type, \ + dpif_netdev_open, \ + dpif_netdev_close, \ + dpif_netdev_destroy, \ + dpif_netdev_run, \ + dpif_netdev_wait, \ + dpif_netdev_get_stats, \ + dpif_netdev_port_add, \ + dpif_netdev_port_del, \ + dpif_netdev_port_query_by_number, \ + dpif_netdev_port_query_by_name, \ + dpif_netdev_get_max_ports, \ + NULL, /* port_get_pid */ \ + dpif_netdev_port_dump_start, \ + dpif_netdev_port_dump_next, \ + dpif_netdev_port_dump_done, \ + dpif_netdev_port_poll, \ + dpif_netdev_port_poll_wait, \ + dpif_netdev_flow_get, \ + dpif_netdev_flow_put, \ + dpif_netdev_flow_del, \ + dpif_netdev_flow_flush, \ + dpif_netdev_flow_dump_start, \ + dpif_netdev_flow_dump_next, \ + dpif_netdev_flow_dump_done, \ + dpif_netdev_execute, \ + NULL, /* operate */ \ + dpif_netdev_recv_set, \ + dpif_netdev_queue_to_priority, \ + dpif_netdev_recv, \ + dpif_netdev_recv_wait, \ + dpif_netdev_recv_purge, \ + const struct dpif_class dpif_netdev_class = { "netdev", - dpif_netdev_enumerate, - dpif_netdev_port_open_type, - dpif_netdev_open, - dpif_netdev_close, - dpif_netdev_destroy, - dpif_netdev_run, - dpif_netdev_wait, - dpif_netdev_get_stats, - dpif_netdev_port_add, - dpif_netdev_port_del, - dpif_netdev_port_query_by_number, - dpif_netdev_port_query_by_name, - dpif_netdev_get_max_ports, - NULL, /* port_get_pid */ - dpif_netdev_port_dump_start, - dpif_netdev_port_dump_next, - dpif_netdev_port_dump_done, - dpif_netdev_port_poll, - dpif_netdev_port_poll_wait, - dpif_netdev_flow_get, - dpif_netdev_flow_put, - dpif_netdev_flow_del, - dpif_netdev_flow_flush, - dpif_netdev_flow_dump_start, - dpif_netdev_flow_dump_next, - dpif_netdev_flow_dump_done, - dpif_netdev_execute, - NULL, /* operate */ - dpif_netdev_recv_set, - dpif_netdev_queue_to_priority, - dpif_netdev_recv, - dpif_netdev_recv_wait, - dpif_netdev_recv_purge, + DPIF_NETDEV_CLASS_FUNCTIONS +}; + +const struct dpif_class dpif_planetlab_class = { + "planetlab", + DPIF_NETDEV_CLASS_FUNCTIONS }; static void @@@ -1362,4 -1361,3 +1377,4 @@@ dpif_dummy_register(bool override dpif_dummy_register__("dummy"); } + diff --combined lib/netdev.c index 3c528a8d6,e338d7c64..d358e40bb --- a/lib/netdev.c +++ b/lib/netdev.c @@@ -73,19 -73,18 +73,20 @@@ netdev_initialize(void inited = true; fatal_signal_add_hook(close_all_netdevs, NULL, NULL, true); + netdev_vport_patch_register(); #ifdef LINUX_DATAPATH netdev_register_provider(&netdev_linux_class); netdev_register_provider(&netdev_internal_class); netdev_register_provider(&netdev_tap_class); - netdev_vport_register(); + netdev_vport_tunnel_register(); #endif #ifdef __FreeBSD__ netdev_register_provider(&netdev_tap_class); netdev_register_provider(&netdev_bsd_class); #endif + netdev_register_provider(&netdev_tunnel_class); + netdev_register_provider(&netdev_pltap_class); } } @@@ -1443,6 -1442,14 +1444,14 @@@ netdev_get_type(const struct netdev *ne return netdev_get_dev(netdev)->netdev_class->type; } + + const char * + netdev_get_type_from_name(const char *name) + { + const struct netdev_dev *dev = netdev_dev_from_name(name); + return dev ? netdev_dev_get_type(dev) : NULL; + } + struct netdev_dev * netdev_get_dev(const struct netdev *netdev) {