@@ -143,6 +143,15 @@ address globally if necessary. This is of course only usable for the
vif-bridge script as the vif-route will require a fully defined address
in the 'ip' field.
+### ipv6_proxy_ndp
+
+Enabling this option will cause the Dom0 to answer the IPv6 Neighbor
+Sollicitation messages it sees on 'gatewaydev' for the VM IPs.
+
+Valid values are 'no' & 'yes'. Defaults to 'no'.
+
+This feature is currently only supported in the linux hotplug script.
+
### backend
Specifies the backend domain which this device should attach to. This
@@ -346,3 +346,36 @@ dom0_ip()
fi
echo "$result"
}
+
+
+##
+# ip6_of interface
+#
+# Print the first IPv6 address currently in use at the given interface, or nothing if
+# the interface is not up.
+#
+ip6_of()
+{
+ ip -6 -o addr show primary dev "$1" scope global | awk '$3 == "inet6" {split($4,i,"/"); print i[1]; exit}'
+}
+
+
+##
+# dom0_ip6
+#
+# Print the IPv6 address of the interface in dom0 through which we are routing.
+# This is the IP address on the interface specified as "netdev" as a parameter
+# to these scripts, or eth0 by default. This function will return nothing if no
+# such interface could be found.
+#
+dom0_ip6()
+{
+ local nd=${netdev:-eth0}
+ local result=$(ip6_of "$nd")
+ if [ -z "$result" ]
+ then
+ ""
+ else
+ echo "$result"
+ fi
+}
@@ -20,11 +20,21 @@ dir=$(dirname "$0")
. "${dir}/vif-common.sh"
main_ip=$(dom0_ip)
+main_ip6=$(dom0_ip6)
+
+ipv6_proxy_ndp=$(xenstore_read_default "$XENBUS_PATH/ipv6_proxy_ndp" "0")
+
case "${command}" in
online)
ifconfig ${dev} ${main_ip} netmask 255.255.255.255 up
echo 1 >/proc/sys/net/ipv4/conf/${dev}/proxy_arp
+ if [ ! -z "${main_ip6}" ]; then
+ ip -6 addr add ${main_ip6} dev ${dev}
+ if [ "${ipv6_proxy_ndp}" != "0" ]; then
+ echo 1 >/proc/sys/net/ipv6/conf/${dev}/proxy_ndp
+ fi
+ fi
ipcmd='add'
cmdprefix=''
;;
@@ -39,7 +49,15 @@ if [ "${ip}" ] ; then
# If we've been given a list of IP addresses, then add routes from dom0 to
# the guest using those addresses.
for addr in ${ip} ; do
- ${cmdprefix} ip route ${ipcmd} ${addr} dev ${dev} src ${main_ip}
+ result=$(is_ipv6 "${addr}")
+ if [ -z "${result}" ] ; then
+ ${cmdprefix} ip route ${ipcmd} ${addr} dev ${dev} src ${main_ip}
+ else
+ ${cmdprefix} ip -6 route ${ipcmd} ${addr} dev ${dev} src ${main_ip6}
+ if [ "${ipv6_proxy_ndp}" != "0" ]; then
+ ${cmdprefix} ip -6 neighbor ${ipcmd} proxy ${addr} dev ${netdev:-eth0}
+ fi
+ fi
done
fi
@@ -214,6 +214,11 @@ static void libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
nic->rate_interval_usecs));
}
+ if (!libxl_defbool_is_default(nic->ipv6_proxy_ndp)) {
+ flexarray_append_pair(back,"ipv6_proxy_ndp",
+ libxl_defbool_val(nic->ipv6_proxy_ndp) ? "1" : "0");
+ }
+
flexarray_append(back, "bridge");
flexarray_append(back, libxl__strdup(gc, nic->bridge));
flexarray_append(back, "handle");
@@ -626,6 +626,7 @@ libxl_device_nic = Struct("device_nic", [
("rate_bytes_per_interval", uint64),
("rate_interval_usecs", uint32),
("gatewaydev", string),
+ ("ipv6_proxy_ndp", libxl_defbool),
# Note that the COLO configuration settings should be considered unstable.
# They may change incompatibly in future versions of Xen.
("coloft_forwarddev", string)
@@ -1059,6 +1059,13 @@ static int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *to
parse_vif_rate(config, oparg, nic);
} else if (MATCH_OPTION("forwarddev", token, oparg)) {
replace_string(&nic->coloft_forwarddev, oparg);
+ } else if (MATCH_OPTION("ipv6_proxy_ndp", token, oparg)) {
+ if (!strcasecmp(oparg, "on") || !strcasecmp(oparg, "1"))
+ libxl_defbool_set(&nic->ipv6_proxy_ndp, true);
+ else if (!strcasecmp(oparg, "off") || !strcasecmp(oparg, "0"))
+ libxl_defbool_set(&nic->ipv6_proxy_ndp, false);
+ else
+ fprintf(stderr, "Invalid value for 'ipv6_proxy_ndp' parameter\n");
} else if (MATCH_OPTION("accel", token, oparg)) {
fprintf(stderr, "the accel parameter for vifs is currently not supported\n");
} else {
Signed-off-by: Sylvain Munaut <s.munaut@whatever-company.com> --- docs/man/xl-network-configuration.markdown.5 | 9 ++++++++ tools/hotplug/Linux/vif-common.sh | 33 ++++++++++++++++++++++++++++ tools/hotplug/Linux/vif-route | 20 ++++++++++++++++- tools/libxl/libxl_nic.c | 5 +++++ tools/libxl/libxl_types.idl | 1 + tools/libxl/xl_cmdimpl.c | 7 ++++++ 6 files changed, 74 insertions(+), 1 deletion(-)