[Pkg-vsquare-devel] Bug#469098: vde2: vde_switch doesn't handle correctly mac-addresses migrating between switch ports
Andrzej Lemieszek
agl at unx.lublin.pl
Mon Mar 3 01:37:18 UTC 2008
Package: vde2
Version: 2.2.0-pre2-1
Severity: normal
Tags: patch
Function find_in_hash_update in the vde_switch hash.c code contains a kind of
protection against switch port flapping (resulting e.g. from switch
loops or duplicate mac-addressess). When switch code detects that
mac-address already assigned to old switch port appears on another
switch port in the time shorter then min_persistence (default: 3) seconds,
since it was last_seen on the old port, it doesn't modify port field
in the hash entry for this mac. This code contains bug because
- after skipping hash change it updates last_seen variable with the
new timestamp, so the min_persistence time has to be counted from the
beginning - and - in result - mac-address can't move between ports.
This bug makes vde_switch totally unusable with testing virtual router redundancy
implementations like CARP or VRRP, which assign virtual mac-address to
master router and send it's advertising frames very frequently (by
default - every 1 second). After changing the master router,
frames can't reach the new router, which sends its advertisments all
the time and doesn't allow old port to expire:
Mar 2 22:00:41 sierra vde_switch[26171]: MAC 00:00:5e:00:01:05 moved from port 12 to port 11
Mar 2 22:00:41 sierra vde_switch[26171]: MAC 00:00:5e:00:01:06 moved from port 12 to port 11
Mar 2 22:00:42 sierra vde_switch[26171]: MAC 00:00:5e:00:01:05 moved from port 12 to port 11
Mar 2 22:00:42 sierra vde_switch[26171]: MAC 00:00:5e:00:01:06 moved from port 12 to port 11
Mar 2 22:00:43 sierra vde_switch[26171]: MAC 00:00:5e:00:01:05 moved from port 12 to port 11
Mar 2 22:00:43 sierra last message repeated 2 times
....
but the hash table remains the same:
vde$ hash/print
0000 DATA END WITH '.'
Hash: 0021 Addr: 00:00:5e:00:01:05 VLAN 0005 to port: 012 age 0 secs
Hash: 0025 Addr: 00:00:5e:00:01:06 VLAN 0006 to port: 012 age 0 secs
...
The solution is simply not updating last_seen hash entry field, when
the port change is skipped (see attached patch), - it makes
vde_switch usable with virtual routers, But for the future this code
needs a bit more cleaning.
--
Andrzej Lemieszek <agl at unx.lublin.pl>
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.22-3-686 (SMP w/2 CPU cores)
Locale: LANG=pl_PL.UTF-8, LC_CTYPE=pl_PL.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages vde2 depends on:
ii adduser 3.105 add and remove users and groups
ii libc6 2.7-3 GNU C Library: Shared libraries
ii libpcap0.8 0.9.8-2 System interface for user-level pa
ii libvdemgmt0 2.2.0-pre2-1 Virtual Distributed Ethernet - Man
ii libvdeplug2 2.2.0-pre2-1 Virtual Distributed Ethernet - Plu
Versions of packages vde2 recommends:
pn daemon <none> (no description available)
-- no debconf information
-------------- next part --------------
--- vde2-2.2.0-pre2.orig/hash.c
+++ vde2-2.2.0-pre2/hash.c
@@ -110,10 +110,13 @@
oldport=e->port;
now=qtime();
if (oldport!=port) {
- if ((now - e->last_seen) > min_persistence)
+ if ((now - e->last_seen) > min_persistence) {
e->port=port;
+ e->last_seen = now;
+ }
+ } else {
+ e->last_seen = now;
}
- e->last_seen = now;
return oldport;
}
More information about the Pkg-vsquare-devel
mailing list