//////////////////////////////////////////////////////////////////////////////// // // Microsoft Research Singularity // // Copyright (c) Microsoft Corporation. All rights reserved. // // File: IPConfig.cs // // Note: Simple Singularity test program. // using System; using System.Diagnostics; using System.Net.IP; using Microsoft.Singularity; using Microsoft.Singularity.Channels; using Microsoft.Singularity.Directory; using Microsoft.SingSharp; using NetStack.Contracts; using NetStack.Channels.Public; using Microsoft.Contracts; using Microsoft.SingSharp.Reflection; using Microsoft.Singularity.Applications; using Microsoft.Singularity.Io; using Microsoft.Singularity.Configuration; [assembly: Transform(typeof(ApplicationResourceTransform))] namespace Microsoft.Singularity.Applications.Network { [ConsoleCategory(HelpMessage="Configure nic with IP addresses", DefaultAction=true)] internal class DefaultConfig { [InputEndpoint("data")] public readonly TRef Stdin; [OutputEndpoint("data")] public readonly TRef Stdout; [Endpoint] public readonly TRef ipRef; [StringParameter( "device", Mandatory=true, Position=0, HelpMessage="Nic to configure")] internal string device; [StringParameter( "address", Mandatory=true, Position=1, HelpMessage="address to give it")] internal string address; [StringParameter( "mask", Mandatory=true, Position=2, HelpMessage="mask to use")] internal string mask; [StringParameter( "gateway", Mandatory=true, Position=3, HelpMessage="gateway")] internal string gateway; reflective internal DefaultConfig(); internal int AppMain() { return IPConfig.DefaultMain(this); } } [ConsoleCategory(Action="show", HelpMessage="SHOW nic' IP configuration" )] internal class ShowConfig { [Endpoint] public readonly TRef Stdin; [Endpoint] public readonly TRef Stdout; [Endpoint] public readonly TRef ipRef; [Endpoint] public readonly TRef dnsRef; reflective internal ShowConfig(); internal int AppMain() { return IPConfig.Show(this); } } [ConsoleCategory(Action="dhcp", HelpMessage="Configure nic via DHCP" )] internal class DhcpConfig { [Endpoint] public readonly TRef Stdin; [Endpoint] public readonly TRef Stdout; [Endpoint] public readonly TRef ipRef; [StringParameter( "device", Mandatory=true, Position=0, HelpMessage="Nic to configure")] internal string device; [StringParameter( "verb", Mandatory=true, Position=1, HelpMessage="verb (start or stop).")] internal string action; reflective internal DhcpConfig(); internal int AppMain() { return IPConfig.Dhcp(this); } } [ConsoleCategory(Action="verify", HelpMessage="check device interface" )] internal class VerifyConfig { [Endpoint] public readonly TRef Stdin; [Endpoint] public readonly TRef Stdout; [Endpoint] public readonly TRef ipRef; [StringParameter( "device", Mandatory=true, Position=0, HelpMessage="Nic to configure")] internal string device; reflective internal VerifyConfig(); internal int AppMain() { return IPConfig.Verify(this); } } /// /// Class for interface configuration related commands. /// public class IPConfig { // Marked unsafe for now since checker // has problems with custom vector access. public static void ShowConfig(IPContract.Imp:ReadyState! ipConn, DNSContract.Imp:ReadyState! dnsConn) { int done = 0; char[]! in ExHeap hostName, domainName; ipConn.SendGetHostName(); ipConn.RecvHostName(out hostName); ipConn.SendGetDomainName(); ipConn.RecvDomainName(out domainName); Console.WriteLine("Hostname: {0}.{1}", Bitter.ToString2(hostName), Bitter.ToString2(domainName)); delete hostName; delete domainName; Console.WriteLine("DNS Servers:"); try { Utils.DNSShow(dnsConn); } finally {} char[][]! in ExHeap ifNames; ipConn.SendGetInterfaces(); ipConn.RecvInterfaceList(out ifNames); for (int i = 0; i < ifNames.Length; ++i) { CustomVector.Expose(ifNames, i); char[] in ExHeap ifName = ifNames[i]; if (ifName == null) throw new Exception("ifName is null"); string! deviceName = Bitter.ToString2(ifName); CustomVector.UnExpose(ifNames, i); ipConn.SendGetInterfaceState(Bitter.FromString2(deviceName)); switch receive { case ipConn.InterfaceNotFound() : Console.WriteLine("Unexpected error"); break; case ipConn.InterfaceState(InterfaceInfo ifInfo) : ShowInterface(ifInfo, deviceName); break; case ipConn.ChannelClosed() : throw new Exception("ipConn channel closed"); } done++; } delete ifNames; if (done == 0) Console.WriteLine("No adapters present."); } public static void ConfigureInterface(IPContract.Imp! ipConn, string! adapterName, string! addressString, string! netmaskString, string! gatewayString) { IPv4 ifAddress, netmask, gateway; if (IPv4.Parse(addressString, out ifAddress) == false || IPv4.Parse(netmaskString, out netmask) == false || IPv4.Parse(gatewayString, out gateway) == false) { return; } ipConn.SendSetInterfaceState(Bitter.FromString2(adapterName), (uint)ifAddress, (uint)netmask, (uint)gateway); switch receive { case ipConn.InterfaceNotFound() : Console.WriteLine("No such interface found"); break; case ipConn.Err() : Console.WriteLine("Error occurred setting interface state"); break; case ipConn.OK() : Console.WriteLine("Successfully set interface state"); break; } } public static void ShowInterface([Claims] InterfaceInfo ifInfo, string! ifName) { Console.WriteLine("Interface: {0}", ifName); Console.WriteLine("Adapter: {0}", Bitter.ToString(ifInfo.driverName)); Console.WriteLine("Version: {0}", Bitter.ToString(ifInfo.driverVersion)); Console.WriteLine("MAC address: {0}", ChannelUtils.HardwareAddressToString(ifInfo.hardwareAddress)); bool found = false; delete ifInfo.driverName; delete ifInfo.driverVersion; InterfaceIPInfo[] in ExHeap ipConfigs = ifInfo.ipConfigs; if (ipConfigs != null) { for (int i = 0; i < ipConfigs.Length; i++) { InterfaceIPInfo ipc = ipConfigs[i]; Console.WriteLine(" Address: {0,-14} NetMask: {1, -14} Gateway: {2, -14}", new IPv4(ipc.address), new IPv4(ipc.netmask), new IPv4(ipc.gateway)); found |= true; } delete ipConfigs; } if (found == false) Console.WriteLine(" Not configured."); } public static void StartDhcp(IPContract.Imp! ipConn, string! adapterName) { ipConn.SendStartDhcp(Bitter.FromString2(adapterName)); switch receive { case ipConn.InterfaceNotFound() : Console.WriteLine("No such interface found"); break; case ipConn.OK() : Console.WriteLine("Successfully started DHCP"); break; } } public static void StopDhcp(IPContract.Imp! ipConn, string! adapterName) { ipConn.SendStopDhcp(Bitter.FromString2(adapterName)); switch receive { case ipConn.InterfaceNotFound() : Console.WriteLine("No such interface found"); break; case ipConn.OK() : Console.WriteLine("Successfully stopped DHCP"); break; } } internal static int Show(ShowConfig! config) { IPContract.Imp ipConn = (config.ipRef).Acquire(); if (ipConn == null) { throw new Exception("Unable to acquire handle to the IP network"); } ipConn.RecvReady(); DNSContract.Imp dnsConn = (config.dnsRef).Acquire(); if (dnsConn == null) { Console.WriteLine("Could not initialize DNS endpoint."); delete ipConn; return -1; } dnsConn.RecvReady(); ShowConfig(ipConn, dnsConn); delete ipConn; delete dnsConn; return 0; } internal static int Dhcp(DhcpConfig! config) { IPContract.Imp ipConn = (config.ipRef).Acquire(); if (ipConn == null) { throw new Exception("Unable to acquire handle to the IP network"); } ipConn.RecvReady(); if (config.action == "start") { StartDhcp(ipConn, config.device); } else if (config.action == "stop") { StopDhcp(ipConn, config.device); } else { Console.WriteLine("Unknown dhcp action:{0}", config.action); } delete ipConn; return 0; } internal static int Verify(VerifyConfig! config) { string! arg1 = config.device; IPContract.Imp ipConn = (config.ipRef).Acquire(); if (ipConn == null) { throw new Exception("Unable to acquire handle to the IP network"); } ipConn.RecvReady(); ipConn.SendGetInterfaceState(Bitter.FromString2(arg1)); switch receive { case ipConn.InterfaceNotFound() : Console.WriteLine("Interface not found: \"" + arg1 + "\""); break; case ipConn.InterfaceState(InterfaceInfo ifInfo) : ShowInterface(ifInfo, arg1); break; case ipConn.ChannelClosed() : throw new Exception("ipConn channel closed"); } delete ipConn; return 0; } internal static int DefaultMain(DefaultConfig! config) { IPContract.Imp ipConn = (config.ipRef).Acquire(); if (ipConn == null) { throw new Exception("Unable to acquire handle to the IP network"); } ipConn.RecvReady(); try { ConfigureInterface(ipConn, config.device, config.address, config.mask, config.gateway); delete ipConn; return 0; } catch(Exception e) { Console.WriteLine("Caught exception: " + e); } finally { } delete ipConn; return 1; } } // end class IPConfig }