xenserver/usr_sbin_brctl \
xenserver/usr_sbin_xen-bugtool \
xenserver/usr_share_vswitch_scripts_sysconfig.template \
+ xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge \
xenserver/vswitch-xen.spec
dump_vif_details="/usr/share/vswitch/scripts/dump-vif-details"
service="/sbin/service"
IP="/sbin/ip"
+vif_on_internal_bridge="/usr/share/vswitch/scripts/vif-on-internal-bridge"
handle_promiscuous()
{
if [ -n "${vm_uuid}" ] ; then
vif_details="$vif_details --add=port.${dev}.vm-uuid=${vm_uuid}"
fi
+
+ # vNetManager needs to know the network UUID(s) associated with
+ # each datapath. Normally interface-reconfigure adds them, but
+ # interface-reconfigure never gets called for internal networks
+ # (xapi does the addbr ioctl internally), so we have to do it
+ # here instead for internal networks. This is only acceptable
+ # because xapi is lazy about creating internal networks: it
+ # only creates one just before it adds the first vif to it.
+ # There may still be a brief delay between the initial
+ # ovs-vswitchd connection to vNetManager and setting this
+ # configuration variable, but vNetManager can tolerate that.
+ local internal=$(${vif_on_internal_bridge} ${DOMID} ${DEVID})
+ if [ "$internal" = "true" ]; then
+ local bridge=$(xenstore-read "${PRIVATE}/bridge" 2>/dev/null)
+ local net_uuid=$(xenstore-read "${PRIVATE}/network-uuid" 2>/dev/null)
+ local key="bridge.${bridge}.xs-network-uuids"
+
+ vif_details="$vif_details --del-match=${key}=*"
+ vif_details="$vif_details --add=${key}=${net_uuid}"
+ fi
+
echo ${vif_details}
}
--- /dev/null
+#!/usr/bin/python
+#
+# Script to determine whether a vif is on an internal bridge
+
+# Copyright (C) 2009 Nicira Networks, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without warranty of any kind.
+
+import sys
+import XenAPI
+import xen.lowlevel.xs
+
+# Query XenStore for the opaque reference of this vif
+def get_vif_ref(domid, devid):
+ xenstore = xen.lowlevel.xs.xs()
+ t = xenstore.transaction_start()
+ vif_ref = xenstore.read(t, '/xapi/%s/private/vif/%s/ref' % (domid, devid))
+ xenstore.transaction_end(t)
+ return vif_ref
+
+# Query XAPI for the information we need using the vif's opaque reference
+def dump_vif_info(domid, devid, vif_ref):
+ try:
+ session = XenAPI.xapi_local()
+ session.xenapi.login_with_password("root", "")
+ vif_rec = session.xenapi.VIF.get_record(vif_ref)
+ net_rec = session.xenapi.network.get_record(vif_rec["network"])
+
+ if len(net_rec['PIFs']) == 0:
+ sys.stdout.write("true\n")
+ else:
+ sys.stdout.write("false\n")
+
+ finally:
+ session.xenapi.session.logout()
+
+if __name__ == '__main__':
+ if (len(sys.argv) != 3):
+ sys.stderr.write("ERROR: %s <domid> <devid>\n" % sys.argv[0])
+ sys.exit(1)
+
+ domid = sys.argv[1]
+ devid = sys.argv[2]
+
+ vif_ref = get_vif_ref(domid, devid)
+ if not vif_ref:
+ sys.stderr.write("ERROR: Could not find interface vif%s.%s\n"
+ % (domid, devid))
+ sys.exit(1)
+
+ dump_vif_info(domid, devid, vif_ref)
+ sys.exit(0)
+
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/interface-reconfigure
install -m 755 xenserver/etc_xensource_scripts_vif \
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/vif
+install -m 755 xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/vif-on-internal-bridge
install -m 755 xenserver/usr_sbin_xen-bugtool \
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/xen-bugtool
install -m 755 xenserver/usr_sbin_brctl \
/usr/share/vswitch/scripts/XSFeatureVSwitch.py
/usr/share/vswitch/scripts/brctl
/usr/share/vswitch/scripts/sysconfig.template
+/usr/share/vswitch/scripts/vif-on-internal-bridge
/usr/share/vswitch/scripts/xen-backend.rules
# Following two files are generated automatically by rpm. We don't
# really need them and they won't be used on the XenServer, but there