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