From: Ben Pfaff Date: Wed, 4 Jan 2012 22:38:46 +0000 (-0800) Subject: ofproto: Fix detection of in-use VLANs based on the flow table. X-Git-Tag: sliver-openvswitch-0.1-1~520 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=9075907cab7a9e91a260b7fae01c8ab24ef76d91;p=sliver-openvswitch.git ofproto: Fix detection of in-use VLANs based on the flow table. I swear I tested this, but the code was obviously wrong. Signed-off-by: Ben Pfaff Reported-by: Brendan Kelley Bug #8729. --- diff --git a/AUTHORS b/AUTHORS index ac34b20bb..821f780dd 100644 --- a/AUTHORS +++ b/AUTHORS @@ -64,6 +64,7 @@ Alexey I. Froloff raorn@altlinux.org Bob Ball bob.ball@citrix.com Brad Hall brad@nicira.com Brandon Heller brandonh@stanford.edu +Brendan Kelley bkelley@nicira.com Bryan Fulton bryan@nicira.com Bryan Osoro bosoro@nicira.com Cedric Hobbs cedric@nicira.com diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index b6f920772..af35aba2c 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, 2011 Nicira Networks. + * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks. * Copyright (c) 2010 Jean Tourrilhes - HP-Labs. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -3191,12 +3191,16 @@ ofoperation_complete(struct ofoperation *op, int error) if (op->victim) { ofproto_rule_destroy__(op->victim); } - if (!(rule->cr.wc.vlan_tci_mask & htons(VLAN_VID_MASK)) - && ofproto->vlan_bitmap) { - uint16_t vid = vlan_tci_to_vid(rule->cr.flow.vlan_tci); - - if (!bitmap_is_set(ofproto->vlan_bitmap, vid)) { - bitmap_set1(ofproto->vlan_bitmap, vid); + if ((rule->cr.wc.vlan_tci_mask & htons(VLAN_VID_MASK)) + == htons(VLAN_VID_MASK)) { + if (ofproto->vlan_bitmap) { + uint16_t vid = vlan_tci_to_vid(rule->cr.flow.vlan_tci); + + if (!bitmap_is_set(ofproto->vlan_bitmap, vid)) { + bitmap_set1(ofproto->vlan_bitmap, vid); + ofproto->vlans_changed = true; + } + } else { ofproto->vlans_changed = true; } } @@ -3336,7 +3340,8 @@ ofproto_get_vlan_usage(struct ofproto *ofproto, unsigned long int *vlan_bitmap) const struct cls_table *table; HMAP_FOR_EACH (table, hmap_node, &cls->tables) { - if (!(table->wc.vlan_tci_mask & htons(VLAN_VID_MASK))) { + if ((table->wc.vlan_tci_mask & htons(VLAN_VID_MASK)) + == htons(VLAN_VID_MASK)) { const struct cls_rule *rule; HMAP_FOR_EACH (rule, hmap_node, &table->rules) {