3 # Copyright (C) 2008,2009 Citrix Systems, Inc.
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU Lesser General Public License as published
7 # by the Free Software Foundation; version 2.1 only. with the special
8 # exception on linking described in file LICENSE.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU Lesser General Public License for more details.
15 # CA-23900: Warning: when VIFs are added to windows guests with PV drivers the backend vif device is registered,
16 # unregistered and then registered again. This causes the udev event to fire twice and this script runs twice.
17 # Since the first invocation of the script races with the device unregistration, spurious errors are possible
18 # which will be logged but are safe to ignore since the second script invocation should complete the operation.
19 # Note that each script invocation is run synchronously from udev and so the scripts don't race with each other.
21 # Keep other-config/ keys in sync with device.ml:vif_udev_keys
23 BRCTL
="/usr/sbin/brctl"
26 vsctl
="/usr/bin/ovs-vsctl"
27 dump_vif_details
="/usr/share/vswitch/scripts/dump-vif-details"
31 local arg
=$
(xenstore-read
"${PRIVATE}/other-config/promiscuous" 2>/dev
/null
)
32 if [ $?
-eq 0 -a -n "${arg}" ] ; then
36 true|on
) echo 1 > /sys
/class
/net
/${dev}/brport
/promisc
;;
37 *) echo 0 > /sys
/class
/net
/${dev}/brport
/promisc
;;
41 logger
-t script-vif
"${dev}: Promiscuous ports are not supported via vSwitch."
50 local arg
=$
(xenstore-read
"${PRIVATE}/other-config/ethtool-${opt}" 2>/dev
/null
)
51 if [ $?
-eq 0 -a -n "${arg}" ] ; then
53 true|on
) /sbin
/ethtool
-K "${dev}" "${opt}" on
;;
54 false|off
) /sbin
/ethtool
-K "${dev}" "${opt}" off
;;
55 *) logger
-t scripts-vif
"Unknown ethtool argument ${opt}=${arg} on ${dev}/${VIFUUID}" ;;
62 local mtu
=$
(xenstore-read
"${PRIVATE}/MTU" 2>/dev
/null
)
63 if [ $?
-eq 0 -a -n "${mtu}" ]; then
64 echo "${mtu}" > /sys
/class
/net
/${dev}/mtu
70 local address
=$
(xenstore-read
"${PRIVATE}/bridge-MAC")
71 if [ $?
-ne 0 -o -z "${address}" ]; then
72 logger
-t scripts-vif
"Failed to read ${PRIVATE}/bridge-MAC from xenstore"
75 local bridge
=$
(xenstore-read
"${PRIVATE}/bridge")
76 if [ $?
-ne 0 -o -z "${bridge}" ]; then
77 logger
-t scripts-vif
"Failed to read ${PRIVATE}/bridge from xenstore"
80 logger
-t scripts-vif
"Adding ${dev} to ${bridge} with address ${address}"
82 ${IP} link set "${dev}" down || logger -t scripts-vif "Failed to ip link set ${dev} down
"
83 ${IP} link set "${dev}" arp off || logger -t scripts-vif "Failed to ip link set ${dev} arp off"
84 ${IP} link set "${dev}" multicast off || logger -t scripts-vif "Failed to ip link set ${dev} multicast off
"
85 ${IP} link set "${dev}" address "${address}" || logger -t scripts-vif "Failed to ip link set ${dev} address ${address}"
86 ${IP} addr flush "${dev}" || logger -t scripts-vif "Failed to ip addr flush ${dev}"
90 ${BRCTL} setfd "${bridge}" 0 || logger -t scripts-vif "Failed to brctl setfd ${bridge} 0"
91 ${BRCTL} addif "${bridge}" "${dev}" || logger -t scripts-vif "Failed to brctl addif ${bridge} ${dev}"
94 local vif_details=$($dump_vif_details $DOMID $DEVID)
95 if [ $? -ne 0 -o -z "${vif_details}" ]; then
96 logger -t scripts-vif "Failed to retrieve vif details
for vswitch
"
99 $vsctl add-port $bridge $dev $vif_details
103 ${IP} link set "${dev}" up || logger -t scripts-vif "Failed to ip link set ${dev} up"
108 case $NETWORK_MODE in
113 $vsctl del-port
$bridge $dev
118 NETWORK_MODE
=$
(cat /etc
/xensource
/network.conf
)
122 case $NETWORK_MODE in
125 logger
-t scripts-vif
"Unknown network mode $NETWORK_MODE"
132 DOMID
=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
133 DEVID
=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
134 dev
=vif
${DOMID}.
${DEVID}
138 DOMID
=`echo ${dev#tap} | cut -f 1 -d '.'`
139 DEVID
=`echo ${dev#tap} | cut -f 2 -d '.'`
142 logger
-t scripts-vif
"unknown interface type ${TYPE}"
147 XAPI
=/xapi
/${DOMID}/hotplug
/vif
/${DEVID}
148 HOTPLUG
=/xapi
/${DOMID}/hotplug
/vif
/${DEVID}
149 PRIVATE
=/xapi
/${DOMID}/private
/vif
/${DEVID}
151 logger
-t scripts-vif
"Called as \"$@\" domid:$DOMID devid:$DEVID mode:$NETWORK_MODE"
154 if [ "${TYPE}" = "vif" ] ; then
166 xenstore-write
"${HOTPLUG}/vif" "${dev}"
167 xenstore-write
"${HOTPLUG}/hotplug" "online"
169 # xs-xen.pq.hq:91e986b8e49f netback-wait-for-hotplug
170 xenstore-write
"/local/domain/0/backend/vif/${DOMID}/${DEVID}/hotplug-status" "connected"
175 if [ "${TYPE}" = "tap" ] ; then
181 if [ "${TYPE}" = "vif" ] ;then
182 xenstore-rm
"${HOTPLUG}/hotplug"
184 logger
-t scripts-vif
"${dev} has been removed"