xref: /titanic_44/usr/src/cmd/xvm/ipagent/ipagent.ksh (revision 349b53dd4e695e3d833b5380540385145b2d3ae8)
199ba4d70SRussell Blaine#!/bin/ksh
299ba4d70SRussell Blaine#
399ba4d70SRussell Blaine# CDDL HEADER START
499ba4d70SRussell Blaine#
599ba4d70SRussell Blaine# The contents of this file are subject to the terms of the
699ba4d70SRussell Blaine# Common Development and Distribution License (the "License").
799ba4d70SRussell Blaine# You may not use this file except in compliance with the License.
899ba4d70SRussell Blaine#
999ba4d70SRussell Blaine# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1099ba4d70SRussell Blaine# or http://www.opensolaris.org/os/licensing.
1199ba4d70SRussell Blaine# See the License for the specific language governing permissions
1299ba4d70SRussell Blaine# and limitations under the License.
1399ba4d70SRussell Blaine#
1499ba4d70SRussell Blaine# When distributing Covered Code, include this CDDL HEADER in each
1599ba4d70SRussell Blaine# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1699ba4d70SRussell Blaine# If applicable, add the following below this CDDL HEADER, with the
1799ba4d70SRussell Blaine# fields enclosed by brackets "[]" replaced with your own identifying
1899ba4d70SRussell Blaine# information: Portions Copyright [yyyy] [name of copyright owner]
1999ba4d70SRussell Blaine#
2099ba4d70SRussell Blaine# CDDL HEADER END
2199ba4d70SRussell Blaine#
2299ba4d70SRussell Blaine
23*349b53ddSStuart Maybee# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
2499ba4d70SRussell Blaine# Use is subject to license terms.
2599ba4d70SRussell Blaine
2699ba4d70SRussell Blaine#
2799ba4d70SRussell Blaine# xVM PV domU IP address reporting agent. Reports IP address back to dom0.
2899ba4d70SRussell Blaine#
2999ba4d70SRussell Blaine
3099ba4d70SRussell Blaineinterval=$1
3199ba4d70SRussell Blaine
32*349b53ddSStuart Maybeexs_ipaddr_path="guest/ipv4/0/address"
33*349b53ddSStuart Maybeexs_link_path="guest/ipv4/default-link"
3499ba4d70SRussell Blainelink=""
3599ba4d70SRussell Blaine
3699ba4d70SRussell Blaine#
3799ba4d70SRussell Blaine# Look for a valid-seeming address for the given link. Return 0 on success.
3899ba4d70SRussell Blaine#
3999ba4d70SRussell Blainelink_to_addr()
4099ba4d70SRussell Blaine{
41*349b53ddSStuart Maybee	tmp=`netstat -I $1 -in -f inet | awk '{print $4}' | grep -v Address`;
4299ba4d70SRussell Blaine	if [ -z "$tmp" ] || [ "$tmp" = "0.0.0.0" ];
4399ba4d70SRussell Blaine	then
4499ba4d70SRussell Blaine		addr="(none)";
4599ba4d70SRussell Blaine		return 1;
4699ba4d70SRussell Blaine	fi
4799ba4d70SRussell Blaine
4899ba4d70SRussell Blaine	addr=$tmp;
4999ba4d70SRussell Blaine	return 0;
5099ba4d70SRussell Blaine}
5199ba4d70SRussell Blaine
5299ba4d70SRussell Blainedefault_link()
5399ba4d70SRussell Blaine{
5499ba4d70SRussell Blaine	#
5599ba4d70SRussell Blaine	# Look in the store for a cached link name.
5699ba4d70SRussell Blaine	#
5799ba4d70SRussell Blaine	link=`/usr/lib/xen/bin/xenstore-read $xs_link_path 2>/dev/null`
5899ba4d70SRussell Blaine	if [ -z "$link" ] || [ "$link" = "(none)" ]
5999ba4d70SRussell Blaine	then
6099ba4d70SRussell Blaine		#
6199ba4d70SRussell Blaine		# If it's not there, try to determine what it is
6299ba4d70SRussell Blaine		# and add it to the store.
6399ba4d70SRussell Blaine		determine_default_link
6499ba4d70SRussell Blaine	fi
6599ba4d70SRussell Blaine}
6699ba4d70SRussell Blaine
6799ba4d70SRussell Blaine#
6899ba4d70SRussell Blaine# Determine the default link name and update xenstore with the details.
6999ba4d70SRussell Blaine#
7099ba4d70SRussell Blainedetermine_default_link()
7199ba4d70SRussell Blaine{
7299ba4d70SRussell Blaine	link="(none)";
7399ba4d70SRussell Blaine	#
7499ba4d70SRussell Blaine	# Choose the first up, non-loopback interface with a valid-looking
7599ba4d70SRussell Blaine	# IP address.
7699ba4d70SRussell Blaine	#
7799ba4d70SRussell Blaine	dladm show-link -p -o link,state | while IFS=: read LINKNAME STATE;
7899ba4d70SRussell Blaine	do
7999ba4d70SRussell Blaine		if [ "$STATE" = "up" ];
8099ba4d70SRussell Blaine		then
8199ba4d70SRussell Blaine			link_to_addr "$LINKNAME"
8299ba4d70SRussell Blaine			if [ $? -eq 0 ]; then link=$LINKNAME; break; fi
8399ba4d70SRussell Blaine		fi
8499ba4d70SRussell Blaine
8599ba4d70SRussell Blaine	done
8699ba4d70SRussell Blaine
8799ba4d70SRussell Blaine	/usr/lib/xen/bin/xenstore-write $xs_link_path $link
8899ba4d70SRussell Blaine}
8999ba4d70SRussell Blaine
9099ba4d70SRussell Blainewhile true; do
9199ba4d70SRussell Blaine
9299ba4d70SRussell Blaine	#
9399ba4d70SRussell Blaine	# Determine the default link in use by this domU.
9499ba4d70SRussell Blaine	#
9599ba4d70SRussell Blaine	default_link;
9699ba4d70SRussell Blaine
9799ba4d70SRussell Blaine	#
9899ba4d70SRussell Blaine	# If the link still has a valid-looking IP address, notify dom0 of its
9999ba4d70SRussell Blaine	# address.
10099ba4d70SRussell Blaine	#
10199ba4d70SRussell Blaine	link_to_addr $link
10299ba4d70SRussell Blaine	if [ $? -ne 0 ]
10399ba4d70SRussell Blaine	then
10499ba4d70SRussell Blaine		#
10599ba4d70SRussell Blaine		# An address could not be determined for the currently cached
10699ba4d70SRussell Blaine		# default link so determine it again in case it has changed.
10799ba4d70SRussell Blaine		# We'll still sleep this iteration to rate-limit dladm calls.
10899ba4d70SRussell Blaine		#
10999ba4d70SRussell Blaine		determine_default_link;
11099ba4d70SRussell Blaine	fi
11199ba4d70SRussell Blaine
11299ba4d70SRussell Blaine	/usr/lib/xen/bin/xenstore-write $xs_ipaddr_path $addr
11399ba4d70SRussell Blaine
11499ba4d70SRussell Blaine	sleep $interval
11599ba4d70SRussell Blainedone
11699ba4d70SRussell Blaine
117