xref: /onnv-gate/usr/src/cmd/xvm/ipagent/ipagent.ksh (revision 10175:dd9708d1f561)
17423SRussell.Blaine@Sun.COM#!/bin/ksh
27423SRussell.Blaine@Sun.COM#
37423SRussell.Blaine@Sun.COM# CDDL HEADER START
47423SRussell.Blaine@Sun.COM#
57423SRussell.Blaine@Sun.COM# The contents of this file are subject to the terms of the
67423SRussell.Blaine@Sun.COM# Common Development and Distribution License (the "License").
77423SRussell.Blaine@Sun.COM# You may not use this file except in compliance with the License.
87423SRussell.Blaine@Sun.COM#
97423SRussell.Blaine@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107423SRussell.Blaine@Sun.COM# or http://www.opensolaris.org/os/licensing.
117423SRussell.Blaine@Sun.COM# See the License for the specific language governing permissions
127423SRussell.Blaine@Sun.COM# and limitations under the License.
137423SRussell.Blaine@Sun.COM#
147423SRussell.Blaine@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each
157423SRussell.Blaine@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167423SRussell.Blaine@Sun.COM# If applicable, add the following below this CDDL HEADER, with the
177423SRussell.Blaine@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying
187423SRussell.Blaine@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner]
197423SRussell.Blaine@Sun.COM#
207423SRussell.Blaine@Sun.COM# CDDL HEADER END
217423SRussell.Blaine@Sun.COM#
227423SRussell.Blaine@Sun.COM
23*10175SStuart.Maybee@Sun.COM# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
247423SRussell.Blaine@Sun.COM# Use is subject to license terms.
257423SRussell.Blaine@Sun.COM
267423SRussell.Blaine@Sun.COM#
277423SRussell.Blaine@Sun.COM# xVM PV domU IP address reporting agent. Reports IP address back to dom0.
287423SRussell.Blaine@Sun.COM#
297423SRussell.Blaine@Sun.COM
307423SRussell.Blaine@Sun.COMinterval=$1
317423SRussell.Blaine@Sun.COM
32*10175SStuart.Maybee@Sun.COMxs_ipaddr_path="guest/ipv4/0/address"
33*10175SStuart.Maybee@Sun.COMxs_link_path="guest/ipv4/default-link"
347423SRussell.Blaine@Sun.COMlink=""
357423SRussell.Blaine@Sun.COM
367423SRussell.Blaine@Sun.COM#
377423SRussell.Blaine@Sun.COM# Look for a valid-seeming address for the given link. Return 0 on success.
387423SRussell.Blaine@Sun.COM#
397423SRussell.Blaine@Sun.COMlink_to_addr()
407423SRussell.Blaine@Sun.COM{
41*10175SStuart.Maybee@Sun.COM	tmp=`netstat -I $1 -in -f inet | awk '{print $4}' | grep -v Address`;
427423SRussell.Blaine@Sun.COM	if [ -z "$tmp" ] || [ "$tmp" = "0.0.0.0" ];
437423SRussell.Blaine@Sun.COM	then
447423SRussell.Blaine@Sun.COM		addr="(none)";
457423SRussell.Blaine@Sun.COM		return 1;
467423SRussell.Blaine@Sun.COM	fi
477423SRussell.Blaine@Sun.COM
487423SRussell.Blaine@Sun.COM	addr=$tmp;
497423SRussell.Blaine@Sun.COM	return 0;
507423SRussell.Blaine@Sun.COM}
517423SRussell.Blaine@Sun.COM
527423SRussell.Blaine@Sun.COMdefault_link()
537423SRussell.Blaine@Sun.COM{
547423SRussell.Blaine@Sun.COM	#
557423SRussell.Blaine@Sun.COM	# Look in the store for a cached link name.
567423SRussell.Blaine@Sun.COM	#
577423SRussell.Blaine@Sun.COM	link=`/usr/lib/xen/bin/xenstore-read $xs_link_path 2>/dev/null`
587423SRussell.Blaine@Sun.COM	if [ -z "$link" ] || [ "$link" = "(none)" ]
597423SRussell.Blaine@Sun.COM	then
607423SRussell.Blaine@Sun.COM		#
617423SRussell.Blaine@Sun.COM		# If it's not there, try to determine what it is
627423SRussell.Blaine@Sun.COM		# and add it to the store.
637423SRussell.Blaine@Sun.COM		determine_default_link
647423SRussell.Blaine@Sun.COM	fi
657423SRussell.Blaine@Sun.COM}
667423SRussell.Blaine@Sun.COM
677423SRussell.Blaine@Sun.COM#
687423SRussell.Blaine@Sun.COM# Determine the default link name and update xenstore with the details.
697423SRussell.Blaine@Sun.COM#
707423SRussell.Blaine@Sun.COMdetermine_default_link()
717423SRussell.Blaine@Sun.COM{
727423SRussell.Blaine@Sun.COM	link="(none)";
737423SRussell.Blaine@Sun.COM	#
747423SRussell.Blaine@Sun.COM	# Choose the first up, non-loopback interface with a valid-looking
757423SRussell.Blaine@Sun.COM	# IP address.
767423SRussell.Blaine@Sun.COM	#
777423SRussell.Blaine@Sun.COM	dladm show-link -p -o link,state | while IFS=: read LINKNAME STATE;
787423SRussell.Blaine@Sun.COM	do
797423SRussell.Blaine@Sun.COM		if [ "$STATE" = "up" ];
807423SRussell.Blaine@Sun.COM		then
817423SRussell.Blaine@Sun.COM			link_to_addr "$LINKNAME"
827423SRussell.Blaine@Sun.COM			if [ $? -eq 0 ]; then link=$LINKNAME; break; fi
837423SRussell.Blaine@Sun.COM		fi
847423SRussell.Blaine@Sun.COM
857423SRussell.Blaine@Sun.COM	done
867423SRussell.Blaine@Sun.COM
877423SRussell.Blaine@Sun.COM	/usr/lib/xen/bin/xenstore-write $xs_link_path $link
887423SRussell.Blaine@Sun.COM}
897423SRussell.Blaine@Sun.COM
907423SRussell.Blaine@Sun.COMwhile true; do
917423SRussell.Blaine@Sun.COM
927423SRussell.Blaine@Sun.COM	#
937423SRussell.Blaine@Sun.COM	# Determine the default link in use by this domU.
947423SRussell.Blaine@Sun.COM	#
957423SRussell.Blaine@Sun.COM	default_link;
967423SRussell.Blaine@Sun.COM
977423SRussell.Blaine@Sun.COM	#
987423SRussell.Blaine@Sun.COM	# If the link still has a valid-looking IP address, notify dom0 of its
997423SRussell.Blaine@Sun.COM	# address.
1007423SRussell.Blaine@Sun.COM	#
1017423SRussell.Blaine@Sun.COM	link_to_addr $link
1027423SRussell.Blaine@Sun.COM	if [ $? -ne 0 ]
1037423SRussell.Blaine@Sun.COM	then
1047423SRussell.Blaine@Sun.COM		#
1057423SRussell.Blaine@Sun.COM		# An address could not be determined for the currently cached
1067423SRussell.Blaine@Sun.COM		# default link so determine it again in case it has changed.
1077423SRussell.Blaine@Sun.COM		# We'll still sleep this iteration to rate-limit dladm calls.
1087423SRussell.Blaine@Sun.COM		#
1097423SRussell.Blaine@Sun.COM		determine_default_link;
1107423SRussell.Blaine@Sun.COM	fi
1117423SRussell.Blaine@Sun.COM
1127423SRussell.Blaine@Sun.COM	/usr/lib/xen/bin/xenstore-write $xs_ipaddr_path $addr
1137423SRussell.Blaine@Sun.COM
1147423SRussell.Blaine@Sun.COM	sleep $interval
1157423SRussell.Blaine@Sun.COMdone
1167423SRussell.Blaine@Sun.COM
117