Commit a9dc0086 authored by Mike Hibler's avatar Mike Hibler
Browse files

Merge remote branch 'origin/tpm-tmcd' into tpm-tmcd

Conflicts:
	db/libdb.pm.in
	event/stated/stated.in
parents 1f6ba160 f4cca17f
event/trafgen/tg2.0
.merge-build
......@@ -117,3 +117,25 @@ check: $(TESTS)
fi \
done
endif
ifeq ($(MERGE_BUILD),1)
.PRECIOUS: ${SRCDIR}/*
#
# I really want to say something like:
# ${TESTBED_SRCDIR}/.merged: $(wildcard ${OBJDIR}/${MERGE_BUILD_SANDBOX}/${SUBDIR}/*)
# but that causes problems if one the prereq. has a rule for it (such
# as when both GNUmakefile and GNUmakefile.in exist in the source tree),
# thus I do the equivalent manually
#
newest=$(shell ls -rtd "${OBJDIR}/${MERGE_BUILD_SANDBOX}/${SUBDIR}/"* "${TESTBED_SRCDIR}/.merged" | tail -n 1)
ifneq ($(newest),${TESTBED_SRCDIR}/.merged)
${TESTBED_SRCDIR}/.merged:
cd ${TESTBED_SRCDIR} && utils/merge-build sync
.PHONY: ${TESTBED_SRCDIR}/.merged
else
${TESTBED_SRCDIR}/.merged:
endif
${SRCDIR}/*: ${TESTBED_SRCDIR}/.merged
endif
......@@ -91,4 +91,7 @@ STANDALONE_CLEARINGHOUSE = @STANDALONE_CLEARINGHOUSE@
NODE_USAGE_SUPPORT = @NODE_USAGE_SUPPORT@
MERGE_BUILD = @MERGE_BUILD@
MERGE_BUILD_SANDBOX = @MERGE_BUILD_SANDBOX@
EXP_VIS_SUPPORT = @EXP_VIS_SUPPORT@
Emulab network testbed source release
Version 5.0
September 1, 2008
University of Utah, Flux Research Group
Welcome to Emulab!
This is the first "official" release of the full current source code for the
software that runs the Emulab network testbed at the University of Utah,
as well as over 20 testbeds at other sites:
This is the "official" source code for the software that runs the Emulab
network testbed at the University of Utah, as well as dozens of testbeds at
other sites around the world.
http://www.emulab.net/
http://www.emulab.net/
This is a snapshot of a rapidly-evolving system. It contains all Emulab
This is a snapshot of a rapidly evolving system. It contains all Emulab
source required to build a running testbed, but interaction with Emulab
admins at Utah and elsewhere will likely be required to get things up
and running.
Emulab is being actively developed, so there may be features in deployed
Emulabs (in particular, Utah's) that are not included in this release.
In the future it is our intention to make new snapshots frequently.
Emulab is also a research project, and is rapidly evolving to satisfy the
needs of both our research needs and external researchers. For that reason,
you might find bugs! We hope you will tell us about them (nicely) and maybe
even help us to fix them. More on this below.
HOW TO SETUP AN EMULAB
The Emulab installation documentation is located on the Utah Emulab Wiki:
http://users.emulab.net/trac/emulab/wiki/InstallRoot
under "Installation Documentation".
https://users.emulab.net/trac/emulab/wiki/InstallRoot
HOW TO UPDATE AN EMULAB
Updating your existing Emulab is a bit harder than a fresh install,
as different sites are running different combinations of FreeBSD,
FreeBSD ports, and Emulab software. A process that we hope will work
for most sites is located on the Utah Emulab Wiki:
http://users.emulab.net/trac/emulab/wiki/InstallRoot
under "Upgrade Documentation".
Updating your existing Emulab is a bit harder than a fresh install, but is
mostly automated. A process that we hope will work for most sites is
located on the Utah Emulab Wiki:
http://users.emulab.net/trac/emulab/wiki/InstallRoot
under "Upgrade Documentation."
TRACKING THE EMULAB SOURCE CODE
We encourage you to track the Emulab source code in real time and stay
current with our stable versions. More info on how to access the
Emulab source code repository is here:
http://users.emulab.net/trac/emulab/wiki/GitRepository
MAILING LISTS
If you are bringing up an Emulab, be sure to join the mailing list:
testbed-admins@flux.utah.edu
http://www.flux.utah.edu/mailman/listinfo/testbed-admins
emulab-admins@googlegroups.com
http://groups.google.com/group/emulab-admins
which has open archives.
Users of your Emulab should join the Emulab users group, which is intended
for all users of Emulabs anywhere, to help each other:
emulab-users@googlegroups.com
http://groups.google.com/group/emulab-users
HELP/CONTACT INFORMATION
For help and to report bugs and problems, mail
testbed-admins@flux.utah.edu (preferable)
or
testbed-ops@flux.utah.edu (if you insist on privacy)
For help and to report bugs and problems, mail to
emulab-admins@googlegroups.com
Don't be shy! In most cases, you will have the same questions other people
have. Search the archives, too! There is lots of good information there.
Don't be shy! We may be able to get on the phone with you, too,
for "big picture" issues and problems.
COPYRIGHT, LICENSE, AND DISTRIBUTION
Emulab is copyrighted by the Flux Research Group and the University of Utah.
LICENSE
See the file AGPL-COPYING for licensing conditions. In summary, the
Emulab software is distributed under a free and open source license, the
GNU Affero General Public License version 3 (AGPLv3). The AGPLv3
consists of the GNU General Public License version 3 (GPLv3) with a
single short added Section 13, which requires that the source be freely
This release of the Emulab software is distributed under the terms of the GNU
Affero General Public License, version 3 (AGPLv3). The AGPLv3 is a popular
open source license; see the file AGPL-COPYING for licensing conditions. The
AGPLv3 consists of the GNU General Public License version 3 (GPLv3) with a
single short addition (Section 13), which requires that the source be freely
available to all users who interact with the software through a network.
The Emulab source tree contains various third-party, open-source packages that
are used by Emulab. These third-party packages are copyrighted and licensed as
described in their source files.
The development of Emulab has been supported by numerous organizations
including NSF, DARPA, Intel, HP, Microsoft, Novell, Nortel, and the University
of Utah. We thank all of these organizations for making Emulab possible.
The following statement is required by DARPA and pertains to DARPA's support
for portions of the Emulab software:
DoD Distribution Statement A: Approved for public release; distribution is
unlimited.
DOCUMENTATION
We are in the process of moving all our documentation to the Utah Emulab
wiki at
http://users.emulab.net/trac/emulab/wiki/ .
Soon, but not yet, that should be considered the primary source of
information.
All of the Emulab documentation is available from the Utah Emulab site:
http://users.emulab.net/trac/emulab/wiki
Within this source tree,
- doc/* contains documentation for developers.
- www/*.html and www/{doc,tutorial}/*.html contain end-user documentation,
all linked from www/doc.php3.
We encourage people to help us improve our documentation. If you want to
make changes, please apply for an account at Utah; anyone with an account
at the Utah Emulab is allowed to edit the Wiki pages.
Other good places to start would include:
- The search box at www.emulab.net for the absolutely latest FAQs and info
- The user tutorial (www/tutorial/tutorial.html)
- The user FAQ (www/faq.html)
- The user authorization document (www/auth.html)
- Software architecture preliminary diagram (doc/arch-diagram.ps)
- Notes on the source tree and architecture (doc/arch.txt)
- Overview of some major systems (doc/overview.txt)
- The doc/papers directory, which contains a few of the papers we've
published about Emulab
- Diagrams and brief explanations of the state machines used in the
system (www/doc/states.html and www/doc/*.gif)
- Mail we have exchanged with others about hardware recommendations
(doc/hardware-mail.mbox)
- The search box at www.emulab.net
- The Emulab Wiki (http://users.emulab.net/trac/emulab/wiki)
- Getting Started document (http://users.emulab.net/trac/emulab/wiki/Auth)
- The user tutorial (http://users.emulab.net/trac/emulab/wiki/Tutorial)
- The user FAQ (http://users.emulab.net/trac/emulab/wiki/FAQ)
- Papers and talks about Emulab (http://www.emulab.net/pubs.php3)
- Papers using Emulab (http://www.emulab.net/expubs.php)
QUICK TOUR
- The Database maintains most testbed state.
* LibDB (db/libdb.pm.in) and the assorted modules (db/*.pm.in) are the
main DB interface for testbed software.
- The database maintains most testbed state.
* Assorted modules (db/*.pm.in) are the main DB interface for testbed
software.
* sql/database-create.sql contains the DB schema.
- The Web Interface (www/*) is the primary means of managing and
interfacing with the system. There is also an experimental
- The Web interface (www/*) is the primary means of managing and
interfacing with the system. There is also an experimental
standalone GUI that uses this interface.
- The tbsetup and backend directories contain the bulk of the server-side
experiment setup and management code.
* startexp (tbsetup/startexp.in) is the backend for experiment creation;
Important scripts it calls include tbprerun (tbsetup/tbprerun.in)
* startexp (tbsetup/startexp.in) is the back end for experiment creation.
Important scripts it calls include tbprerun (tbsetup/tbprerun.in)
and tbswap (tbsetup/tbswap.in).
* ns2ir (tbsetup/ns2ir/*) converts NS files to DB state (via TCL and XML).
* snmpit (tbsetup/snmpit.in) configures VLANs on switch hardware.
- assign (assign/*) maps experiments to available hardware.
- The frisbee subsystem (os/frisbee.redux, os/imagezip) is used for creation
and rapid deployment of disk images.
- The frisbee subsystem (os/frisbee.redux, os/imagezip) is used for the
creation and rapid deployment of disk images.
- The client-driven node configuration is handled by scripts on the client
which communicate with the server via a custom configuration protocol.
......@@ -123,12 +139,12 @@ SOURCE TREE ORGANIZATION
account - Account creation and management
apache - Apache HTTPD configuration
assign - Resource allocation software
backend - Server-side of the Emulab XML RPC interface
backend - Server-side of the Emulab XML-RPC interface
bugdb - Optional per-project bug database
capture - Node serial line server software
cdrom - Software related to CD-booting local and remote machines
collab - Optional per-project "collaboration" tools: CVS, jabber, mailman
db - Variety of interfaces to testbed state
db - Variety of interfaces to testbed state
delay - RHL9 patches for supporting "end-node" traffic shaping
dhcpd - DHCPD configuration
doc - Documentation (mainly internal)
......@@ -144,7 +160,7 @@ mote - Initial testbed support for Berkeley/Crossbow motes
named - BIND configuration files
os - Client-side software (disk loading, route calculation, etc.)
patches - Patches needed to compile standard software packages
pelab - Preliminary support for "Flexlab", an Emulab/PlanetLab hybrid
pelab - Preliminary support for "Flexlab," an Emulab/PlanetLab hybrid
(see http://www.cs.utah.edu/flux/flexlab/)
protogeni - Evolving software for a prototype GENI system based on Emulab
(see http://www.protogeni.net/)
......@@ -163,31 +179,9 @@ tmcd - Testbed master control daemon and client (for node configuration)
tools - Miscellaneous infrastructure tools
utils - Testbed configuration and maintenance tools
vis - Experiment visualization
wiki - Support for per-project WIKIs
wiki - Support for per-project Wikis
www - Web Interface / User Documentation
xmlrpc - Programatic XML-RPC interface to testbed
UPGRADING FROM the 4.9.0 RELEASE
There are a surprising number of differences given that we have only
advanced 0.1 in version! In a nutshell:
* Updated FreeBSD packages from FreeBSD 6.1-era to 6.3-era
* Much more of the documentation has moved into the Wiki
* Changes to the (unused) "protogeni" code
* Improvements to the installation scripts
* Integration of code/fixes from Keith Sklower and DETER (Thanks!)
* Assorted fixes
If you did install the 4.9 release on FreeBSD 6.3, and want to upgrade
to 5.0 (you should), it should be straightforward. You will need to apply
the sql/database-migrate.txt changes 4.157 to 4.160 (which are all trivial)
and rebuild and reinstall your Emulab software.
It would be good to also update your ports. In theory, this is all handled
by a magic script we provide. Refer to the "Update ports" section of
http://users.emulab.net/trac/emulab/wiki/appendix/upgrade-410-63.html
Good luck!
Jay Lepreau, lepreau@cs.utah.edu, and the Utah testbed crew.
September 1, 2008
The Emulab Team
#!/usr/bin/perl -wT
#
# EMULAB-COPYRIGHT
# Copyright (c) 2000-2008 University of Utah and the Flux Group.
# Copyright (c) 2000-2010 University of Utah and the Flux Group.
# All rights reserved.
#
use English;
......@@ -72,6 +72,7 @@ use lib "@prefix@/lib";
use libaudit;
use libdb;
use libtestbed;
use User;
#
# Function prototypes
......
......@@ -158,6 +158,10 @@ if (@ARGV < 1) {
my $orgunit = shift(@ARGV);
my $uuid = (@ARGV ? shift(@ARGV) : undef);
# Moved before uuid generation. Might be a race, might not.
TBScriptLock("mkusercert") == 0 or
fatal("Could not get the lock!");
# Generate/confirm uuid
if (!defined($uuid)) {
$uuid = NewUUID();
......@@ -176,9 +180,6 @@ if (!defined($email)) {
chdir("$WORKDIR") or
fatal("Could not chdir to $WORKDIR: $!");
TBScriptLock("mkusercert") == 0 or
fatal("Could not get the lock!");
#
# Need an index file, which is the openssl version of the DB.
#
......
......@@ -584,8 +584,8 @@ bool populate_links(DOMElement *root, tb_pgraph &pg, tb_sgraph &sg,
tb_plink *phys_link =
new tb_plink(componentId.c_str(),
tb_plink::PLINK_NORMAL, str_first_type.c_str(),
srcMac.c_str(), dstMac.c_str(),
shortNames[src_iface], shortNames[dst_iface]);
src_pnode->name, srcMac.c_str(), shortNames[src_iface],
dst_pnode->name, dstMac.c_str(), shortNames[dst_iface]);
phys_link->delay_info.bandwidth = bandwidth;
phys_link->delay_info.delay = latency;
......
......@@ -269,8 +269,8 @@ int parse_ptop(tb_pgraph &pg, tb_sgraph &sg, istream& input)
for (int cur = 0;cur<num;++cur) {
pedge pe = (add_edge(srcv,dstv,pg)).first;
tb_plink *pl = new
tb_plink(name,tb_plink::PLINK_NORMAL,link_type,srcmac,dstmac,
srciface,dstiface);
tb_plink(name,tb_plink::PLINK_NORMAL,link_type,srcnode->name,srcmac,
srciface,dstnode->name,dstmac,dstiface);
put(pedge_pmap,pe,pl);
pl->delay_info.bandwidth = ibw;
pl->delay_info.delay = idelay;
......
......@@ -407,8 +407,9 @@ bool populate_links(DOMElement *root, tb_pgraph &pg, tb_sgraph &sg) {
// other stuff if I remove them... bummer!
tb_plink *phys_link =
new tb_plink(name.c(), tb_plink::PLINK_NORMAL, str_first_type,
"(null)", "(null)", src_iface.c(), dst_iface.c());
src_pnode->name, "(null)", src_iface.c(),
dst_pnode->name, "(null)", dst_iface.c());
phys_link->delay_info.bandwidth = bandwidth.i();
phys_link->delay_info.delay = latency.i();
phys_link->delay_info.loss = packet_loss.d();
......
......@@ -360,10 +360,11 @@ public:
typedef enum {PLINK_NORMAL,PLINK_INTERSWITCH,PLINK_LAN} plinkType;
typedef hash_set<fstring> type_set;
tb_plink(fstring _name, plinkType _is_type, fstring _type, fstring _srcmac, fstring
_dstmac, fstring _srciface, fstring _dstiface)
tb_plink(fstring _name, plinkType _is_type, fstring _type, fstring _srcnode, fstring _srcmac,
fstring _srciface, fstring _dstnode, fstring _dstmac, fstring _dstiface)
: name(_name), srcmac(_srcmac), dstmac(_dstmac), is_type(_is_type),
srciface(_srciface), dstiface(_dstiface),
srcnode(_srcnode), dstnode(_dstnode),
delay_info(), bw_used(0), emulated(0), nonemulated(0),
penalty(0.0), fixends(false), current_endpoints(), current_count(0),
vedge_counts() {
......@@ -371,6 +372,7 @@ public:
}
fstring name; // the name
fstring srcnode,dstnode; // source and destination node names
fstring srcmac,dstmac; // source and destination MAC addresses.
fstring srciface, dstiface; // source and destination interface names
......
......@@ -60,7 +60,7 @@ extern tb_sgraph SG; // switch fabric
void score_link(pedge pe,vedge ve,tb_pnode *src_pnode,tb_pnode *dst_pnode);
void unscore_link(pedge pe,vedge ve,tb_pnode *src_pnode,tb_pnode *dst_pnode);
bool find_best_link(pvertex pv,pvertex switch_pv,tb_vlink *vlink,
pedge &out_edge, bool flipped, bool check_src_iface,
pedge &out_edge, bool check_src_iface,
bool check_dst_iface);
int find_interswitch_path(pvertex src_pv,pvertex dest_pv,
int bandwidth,pedge_path &out_path,
......@@ -250,13 +250,25 @@ float find_link_resolutions(resolution_vector &resolutions, pvertex pv,
pedge pe;
// Direct link (have to check both interfaces if they are fixed)
if (find_best_link(dest_pv,pv,vlink,pe,flipped,true,true)) {
if (find_best_link(dest_pv,pv,vlink,pe,true,true)) {
tb_link_info info(tb_link_info::LINK_DIRECT);
info.plinks.push_back(pe);
resolutions.push_back(info);
total_weight += LINK_RESOLVE_DIRECT;
SDEBUG(cerr << " added a direct_link " << pe << endl);
}
/*
* IMPORTANT NOTE ABOUT find_best_link -
*
* We have to tell it whether it is supposed to check the source of the
* vlink, the dest of the vlink, or both, for fixed interfaces. Of course, we
* only want to check the 'node' side, not the switch side, of interswitch
* and intraswitch paths. Of course, which end we're looking at depends on
* the order we're traversing the vlink - the flipped variable. This is why
* you see 'flipped' and '!flipped' passed to find_best_link() below.
*/
// Intraswitch link
pedge first,second;
for (pvertex_set::iterator switch_it = pnode->switches.begin();
......@@ -291,9 +303,8 @@ float find_link_resolutions(resolution_vector &resolutions, pvertex pv,
if (first_link) {
SDEBUG(cerr << " intraswitch: finding first link" << endl;)
// Check only whether the source interface is fixed - this is the
// first link in a multi-hop path
if (!find_best_link(pv,*switch_it,vlink,first,flipped,true,false)) {
// See note above
if (!find_best_link(pv,*switch_it,vlink,first,!flipped,flipped)) {
SDEBUG(cerr << " intraswitch failed - no link first" <<
endl;)
// No link to this switch
......@@ -302,11 +313,9 @@ float find_link_resolutions(resolution_vector &resolutions, pvertex pv,
}
if (second_link) {
// Check only whether the dest interface is fixed - this is the
// last link in a multi-hop path
SDEBUG(cerr << " intraswitch: finding second link (" << ")" << endl;)
if (!find_best_link(dest_pv,*switch_it,vlink,second,flipped,
false,true)) {
// See note above
if (!find_best_link(dest_pv,*switch_it,vlink,second,flipped,!flipped)) {
// No link to this switch
SDEBUG(cerr << " intraswitch failed - no link second" <<
endl;)
......@@ -375,10 +384,8 @@ float find_link_resolutions(resolution_vector &resolutions, pvertex pv,
// Get link objects
if (first_link) {
// Check only whether the source interface is fixed - this is the
// first link in a multi-hop path
if (!find_best_link(pv,*source_switch_it,vlink,first,flipped,
true,false)) {
// See note above
if (!find_best_link(pv,*source_switch_it,vlink,first,!flipped,flipped)) {
// No link to this switch
SDEBUG(cerr << " interswitch failed - no first link"
<< endl;)
......@@ -387,11 +394,9 @@ float find_link_resolutions(resolution_vector &resolutions, pvertex pv,
}
if (second_link) {
// Check only whether the dest interface is fixed - this is the
// last link in a multi-hop path
if (!find_best_link(dest_pv,*dest_switch_it,vlink,second,flipped,
false,true)) {
// No link to tshis switch
// See note above
if (!find_best_link(dest_pv,*dest_switch_it,vlink,second,flipped,!flipped)) {
// No link to this switch
SDEBUG(cerr << " interswitch failed - no second link" << endl;)
continue;
}
......@@ -521,6 +526,7 @@ void resolve_link(vvertex vv, pvertex pv, tb_vnode *vnode, tb_pnode *pnode,
if (dest_vv == vv) {
dest_vv = source(edge,VG);
SDEBUG(cerr << " dest_vv is backwards" << endl);
}
/*
......@@ -1482,8 +1488,19 @@ int add_node(vvertex vv,pvertex pv, bool deterministic, bool is_fixed, bool skip
return 0;
}
/*
* Find the best link between two physical nodes, making sure it matches the
* requirements of the given vlink. Returns results in the out_edge parameter
* NOTE: assumes the caller has done enough bookkeeping to know whether the
* source and dest interfaces need to be checked for fixed interfaces - that
* is: check_src_iface should be set if:
* this is a direct link OR
* we're mapping the end of an inter or intra switch link that connects to
* the 'source' vnode in the vlink structure
* Similar rules apply to check_dst_iface
*/
bool find_best_link(pvertex pv,pvertex switch_pv,tb_vlink *vlink,
pedge &out_edge, bool flipped, bool check_src_iface,
pedge &out_edge, bool check_src_iface,
bool check_dst_iface)
{
pvertex dest_pv;
......@@ -1506,58 +1523,62 @@ bool find_best_link(pvertex pv,pvertex switch_pv,tb_vlink *vlink,
continue;
}
// XXX: Not 100% sure it's better to do this inside find_best_link rather
// than in the caller
// if (flipped) {
// // If the endpoints are flipped, then we need to flip our notion of
// // which ones need to be compared.
// bool tmp = check_src_iface;
// check_src_iface = check_dst_iface;
// check_dst_iface = tmp;
// SDEBUG(cerr << " find_best_link: flipping interface comparisons" << endl;)
// }
SDEBUG(cerr << " find_best_link: fix_src_iface = " <<
vlink->fix_src_iface << " check_src_iface = " << check_src_iface
<< " fix_dst_iface = " << vlink->fix_dst_iface
<< " check_dst_iface = " << check_dst_iface
<< " flipped = " << flipped << endl);
<< " check_dst_iface = " << check_dst_iface << endl;)
// Whether we check the 'source' or 'destination' on the vlink against
// the phyisical link's source interface depends on whether the
// interface order in the in the pedge matches the interface order in
// the vlink
bool plink_order_reversed;
tb_vnode *src_vnode = get(vvertex_pmap,vlink->src);
tb_pnode *src_pnode = get(pvertex_pmap,src_vnode->assignment);
if (src_pnode->name != plink->srcnode) {
SDEBUG(cerr << " find_best_link: plink and vlink in " <<
"different order (" << src_pnode->name << " != " <<
plink->srcnode << ")" << endl;)
plink_order_reversed = true;
} else {
SDEBUG(cerr << " find_best_link: plink and vlink in " <<
"same order (" << src_pnode->name << " == " <<
plink->srcnode << ")" << endl;)
plink_order_reversed = false;
}
// If the vlink has a fixed source interface, and it doesn't match
// this plink, skip it
if (vlink->fix_src_iface && check_src_iface) {
// Whether we check the 'source' or 'destination' on the vlink against
// the phyisical link's source interface depends on whether we're
// traversing the link if forward or reverse (flipped) order
// fstring compare_iface = vlink->src_iface;
fstring compare_iface = (flipped? vlink->dst_iface : vlink->src_iface);
if (plink->srciface != compare_iface) {
// The interface name we compare to on the plink depends on wether it
// goes in the same 'direction' as the vlink
fstring compare_iface = (plink_order_reversed? plink->dstiface : plink->srciface);
if (vlink->src_iface != compare_iface) {
SDEBUG(cerr << " find_best_link (" << vlink->name <<
"): Fix source: " << plink->srciface << " != " <<
"): Fix source: " << vlink->src_iface << " != " <<
compare_iface << endl);
continue;
} else {
SDEBUG(cerr << " find_best_link (" << vlink->name <<
"): Fix source: " << plink->srciface << " == " <<
"): Fix source: " << vlink->src_iface << " == " <<
compare_iface << endl);
}
}
// Same for destination
// Yes, this really is srciface
// XXX: This only works because we always have the node as the 'source'
// of a plink! Shouldn't depend on this!
if (vlink->fix_dst_iface && check_dst_iface) {
// fstring compare_iface = vlink->dst_iface;
fstring compare_iface = (flipped? vlink->src_iface : vlink->dst_iface);
if (plink->srciface != compare_iface) {
// The interface name we compare to on the plink depends on wether it
// goes in the same 'direction' as the vlink
fstring compare_iface = (plink_order_reversed? plink->srciface : plink->dstiface);
if (vlink->dst_iface != compare_iface) {
SDEBUG(cerr << " find_best_link (" << vlink->name <<
"): Fix dst: " << plink->srciface << " != " <<
"): Fix dst: " << vlink->dst_iface << " != " <<
compare_iface << endl);
continue;
} else {
SDEBUG(cerr << " find_best_link (" << vlink->name <<
"): Fix dst: " << plink->srciface << " == " <<
"): Fix dst: " << vlink->dst_iface << " == " <<
compare_iface << endl);
}
}
......
......@@ -51,7 +51,9 @@ use libdb;
use libtestbed;
use User;
use Project;
use OSinfo;
use Image;
use Node;
# Protos
sub fatal($);
......
......@@ -52,6 +52,8 @@ use libtestbed;
use User;
use Project;
use Image;
use OSinfo;
use Node;
# Protos
sub fatal($);
......
#!/usr/bin/perl -wT
#
# EMULAB-COPYRIGHT
# Copyright (c) 2007, 2008 University of Utah and the Flux Group.
# Copyright (c) 2007-2010 University of Utah and the Flux Group.
# All rights reserved.
#
use English;
......@@ -53,6 +53,7 @@ $| = 1;
use lib "@prefix@/lib";
use libdb;
use libtestbed;
use User;
#
# We don't want to run this script unless its the real version.
......