diff --git a/src/mad/sh/scripts_common.sh b/src/mad/sh/scripts_common.sh
index 4c1cc9fa7a..262d9107b7 100644
--- a/src/mad/sh/scripts_common.sh
+++ b/src/mad/sh/scripts_common.sh
@@ -832,3 +832,86 @@ function get_disk_information {
esac
}
+
+# This function extracts information about a NIC. The first parameter
+# is a string with the filter for NICs, for example, to get the interface
+# that's going to be attached, use:
+#
+# get_nic_information "ATTACH=YES"
+#
+# To get an specific interface ID use:
+#
+# get_nic_information "NIC_ID=$NIC_ID"
+#
+# The variables set are as follows:
+#
+# * VMID
+# * NIC_ID
+# * BRIDGE
+# * VN_MAD
+# * MAC
+# * NIC_TARGET
+# * SCRIPT
+# * MODEL
+# * IP
+# * FILTER
+# * VROUTER_IP
+# * INBOUND_AVG_BW
+# * INBOUND_PEAK_BW
+# * INBOUND_PEAK_KB
+# * OUTBOUND_AVG_BW
+# * OUTBOUND_PEAK_BW
+# * OUTBOUND_PEAK_KB
+# * ORDER
+
+function get_nic_information {
+ FILTER="$1"
+
+ DRIVER_PATH=$(dirname $0)
+ XPATH="${DRIVER_PATH}/../../datastore/xpath.rb"
+ CMD="$XPATH --stdin"
+
+ unset i j XPATH_ELEMENTS
+
+ NIC_XPATH="/VMM_DRIVER_ACTION_DATA/VM/TEMPLATE/NIC[$FILTER]"
+
+ while IFS= read -r -d '' element; do
+ XPATH_ELEMENTS[i++]="$element"
+ done < <($CMD /VMM_DRIVER_ACTION_DATA/VM/ID \
+ $NIC_XPATH/NIC_ID \
+ $NIC_XPATH/BRIDGE \
+ $NIC_XPATH/VN_MAD \
+ $NIC_XPATH/MAC \
+ $NIC_XPATH/TARGET \
+ $NIC_XPATH/SCRIPT \
+ $NIC_XPATH/MODEL \
+ $NIC_XPATH/IP \
+ $NIC_XPATH/FILTER \
+ $NIC_XPATH/VROUTER_IP \
+ $NIC_XPATH/INBOUND_AVG_BW \
+ $NIC_XPATH/INBOUND_PEAK_BW \
+ $NIC_XPATH/INBOUND_PEAK_KB \
+ $NIC_XPATH/OUTBOUND_AVG_BW \
+ $NIC_XPATH/OUTBOUND_PEAK_BW \
+ $NIC_XPATH/OUTBOUND_PEAK_KB \
+ $NIC_XPATH/ORDER)
+
+ VMID="${XPATH_ELEMENTS[j++]}"
+ NIC_ID="${XPATH_ELEMENTS[j++]}"
+ BRIDGE="${XPATH_ELEMENTS[j++]}"
+ VN_MAD="${XPATH_ELEMENTS[j++]}"
+ MAC="${XPATH_ELEMENTS[j++]}"
+ NIC_TARGET="${XPATH_ELEMENTS[j++]}"
+ SCRIPT="${XPATH_ELEMENTS[j++]}"
+ MODEL="${XPATH_ELEMENTS[j++]}"
+ IP="${XPATH_ELEMENTS[j++]}"
+ FILTER="${XPATH_ELEMENTS[j++]}"
+ VROUTER_IP="${XPATH_ELEMENTS[j++]}"
+ INBOUND_AVG_BW="${XPATH_ELEMENTS[j++]}"
+ INBOUND_PEAK_BW="${XPATH_ELEMENTS[j++]}"
+ INBOUND_PEAK_KB="${XPATH_ELEMENTS[j++]}"
+ OUTBOUND_AVG_BW="${XPATH_ELEMENTS[j++]}"
+ OUTBOUND_PEAK_BW="${XPATH_ELEMENTS[j++]}"
+ OUTBOUND_PEAK_KB="${XPATH_ELEMENTS[j++]}"
+ ORDER="${XPATH_ELEMENTS[j++]}"
+}
diff --git a/src/vmm_mad/remotes/kvm/attach_nic b/src/vmm_mad/remotes/kvm/attach_nic
index 287ab3e65f..51bbc3cc54 100755
--- a/src/vmm_mad/remotes/kvm/attach_nic
+++ b/src/vmm_mad/remotes/kvm/attach_nic
@@ -20,31 +20,88 @@ source $(dirname $0)/kvmrc
source $(dirname $0)/../../scripts_common.sh
DOMAIN=$1
-MAC=$2
-BRIDGE=$3
-THE_MODEL=$4
-NET_DRV=$5
-TARGET=$6
-if [ "$THE_MODEL" != "-" ]; then
- MODEL=""
+get_nic_information "ATTACH='YES'"
+
+# defaults
+[ -z "${MODEL}" ] && [ -n "${DEFAULT_ATTACH_NIC_MODEL}" ] && \
+ MODEL="${DEFAULT_ATTACH_NIC_MODEL}"
+
+[ -z "${FILTER}" ] && [ -n "${DEFAULT_ATTACH_NIC_FILTER}" ] && \
+ FILTER="${DEFAULT_ATTACH_NIC_FILTER}"
+
+# functions
+function xml_esc
+{
+ R=${1//\'/'}
+ R=${R//\"/"}
+ R=${R//\&/&}
+ R=${R//\<}
+ R=${R//\>/>}
+ echo "${R}"
+}
+
+# interface XML
+DEVICE=''
+
+if [ -z "${BRIDGE}" ]; then
+ DEVICE+=""
+else
+ DEVICE+=""
+ [ "${VN_MAD}" = 'ovswitch' ] && DEVICE+=" "
+ DEVICE+=" "
fi
-if [ "$NET_DRV" = "ovswitch" ]; then
- VIRTUALPORT=""
+[ -n "${MAC}" ] && DEVICE+=" "
+[ -n "${NIC_TARGET}" ] && DEVICE+=" "
+[ -n "${ORDER}" ] && DEVICE+=" "
+[ -n "${SCRIPT}" ] && DEVICE+=" "
+[ -n "${MODEL}" ] && DEVICE+=" "
+
+if [ -n "${IP}" ] && [ -n "${FILTER}" ]; then
+ DEVICE+=" "
+ DEVICE+=" "
+ [ -n "${VROUTER_IP}" ] && DEVICE+=" "
+ DEVICE+=" "
fi
-DEVICE=$(cat <
-
-
-
- $MODEL
- $VIRTUALPORT
-
-EOF
-)
+if [ -n "${INBOUND_AVG_BW}${INBOUND_PEAK_BW}${INBOUND_PEAK_KB}" ] || \
+ [ -n "${OUTBOUND_AVG_BW}${OUTBOUND_PEAK_BW}${OUTBOUND_PEAK_KB}" ];
+then
+ DEVICE+=" "
+ if [ -n "${INBOUND_AVG_BW}${INBOUND_PEAK_BW}${INBOUND_PEAK_KB}" ]; then
+ DEVICE+=" "
+ fi
+
+ if [ -n "${OUTBOUND_AVG_BW}${OUTBOUND_PEAK_BW}${OUTBOUND_PEAK_KB}" ]; then
+ DEVICE+=" "
+ fi
+
+ DEVICE+=" "
+fi
+
+DEVICE+=" "
+
+# device attach
ATTACH_CMD=$(cat <