Add member is_layer3 to struct ofport_dpif to mark layer 3 ports. Set it to "true" for the only layer 3 port we support for now: lisp.
Additionally, prevent flooding to layer 3 ports. A later patch will also prevent MAC learning. This patch could be applied even without the rest of the layer 3 patches, since flooding packets to lisp ports shouldn't happen anyway. It currently breaks tests 2 and 669, not sure why. Signed-off-by: Lorand Jakab <loja...@cisco.com> --- lib/netdev-vport.c | 8 ++++++++ lib/netdev-vport.h | 1 + ofproto/ofproto-dpif.c | 5 +++++ 3 files changed, 14 insertions(+), 0 deletions(-) diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index 0374ae3..608fb6d 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -108,6 +108,14 @@ netdev_vport_is_patch(const struct netdev *netdev) return class->get_config == get_patch_config; } +bool +netdev_vport_is_layer3(const struct netdev *dev) +{ + const char *type = netdev_get_type(dev); + + return (!strcmp("lisp", type)); +} + static bool netdev_vport_needs_dst_port(const struct netdev *dev) { diff --git a/lib/netdev-vport.h b/lib/netdev-vport.h index dc49097..eaeb386 100644 --- a/lib/netdev-vport.h +++ b/lib/netdev-vport.h @@ -30,6 +30,7 @@ void netdev_vport_tunnel_register(void); void netdev_vport_patch_register(void); bool netdev_vport_is_patch(const struct netdev *); +bool netdev_vport_is_layer3(const struct netdev *); char *netdev_vport_patch_peer(const struct netdev *netdev); diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 80e97e0..58bdd2f 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -309,6 +309,7 @@ struct ofport_dpif { struct bfd *bfd; /* BFD, if any. */ bool may_enable; /* May be enabled in bonds. */ bool is_tunnel; /* This port is a tunnel. */ + bool is_layer3; /* This is a layer 3 port. */ long long int carrier_seq; /* Carrier status changes. */ struct ofport_dpif *peer; /* Peer if patch port. */ @@ -1710,6 +1711,8 @@ port_construct(struct ofport *port_) return 0; } + port->is_layer3 = netdev_vport_is_layer3(netdev); + error = dpif_port_query_by_name(ofproto->backer->dpif, netdev_vport_get_dpif_port(netdev, namebuf, sizeof namebuf), @@ -2288,6 +2291,7 @@ bundle_update(struct ofbundle *bundle) bundle->floodable = true; LIST_FOR_EACH (port, bundle_node, &bundle->ports) { if (port->up.pp.config & OFPUTIL_PC_NO_FLOOD + || port->is_layer3 || !stp_forward_in_state(port->stp_state)) { bundle->floodable = false; break; @@ -2335,6 +2339,7 @@ bundle_add_port(struct ofbundle *bundle, ofp_port_t ofp_port, port->bundle = bundle; list_push_back(&bundle->ports, &port->bundle_node); if (port->up.pp.config & OFPUTIL_PC_NO_FLOOD + || port->is_layer3 || !stp_forward_in_state(port->stp_state)) { bundle->floodable = false; } -- 1.7.7.5 (Apple Git-26) _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev