From 4048d8aaf310d298e571608ffbd9ca68febffeb2 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 4 Jan 2012 14:38:46 -0800 Subject: [PATCH] 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. --- AUTHORS | 1 + ofproto/ofproto.c | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index 29de8bf42..02f48402e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -60,6 +60,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 b81bd6b84..78b7916da 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"); @@ -3166,12 +3166,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; } } @@ -3310,7 +3314,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) { -- 2.43.0