156 lines
4.7 KiB
Plaintext
156 lines
4.7 KiB
Plaintext
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// File: NetStack.sg
|
||
|
//
|
||
|
// Note:
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
using System.Runtime.InteropServices;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.Threading;
|
||
|
|
||
|
using Microsoft.SingSharp;
|
||
|
using Microsoft.Singularity;
|
||
|
using Microsoft.Singularity.Channels;
|
||
|
using Microsoft.Singularity.Directory;
|
||
|
using Microsoft.Singularity.Security;
|
||
|
using Microsoft.Singularity.Io;
|
||
|
[assembly: ApplicationPublisherAttribute("singularity.microsoft.com")]
|
||
|
[assembly: AssertPrivilegeAttribute("$register-privilege.localhost")]
|
||
|
|
||
|
namespace NetStack
|
||
|
{
|
||
|
using NetStack.Channels.Private;
|
||
|
using NetStack.Channels.Nic;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The NetStack Application class is a single instance service running
|
||
|
/// on a host. When it runs it attempts to register as /dev/netstack;
|
||
|
/// success indicates no other instances and it then initializes
|
||
|
/// the various NetStack subsystems.
|
||
|
/// </summary>
|
||
|
class NetStackApplication
|
||
|
{
|
||
|
private static string nsName = "/dev/netstack";
|
||
|
|
||
|
private static TRef<ServiceProviderContract.Exp:Start> nsChannel;
|
||
|
|
||
|
private static void ServiceProviderPump()
|
||
|
{
|
||
|
ServiceProviderContract.Exp exp = nsChannel.Acquire();
|
||
|
try
|
||
|
{
|
||
|
for (;;)
|
||
|
{
|
||
|
switch receive {
|
||
|
case exp.RecvConnect(serviceExp):
|
||
|
exp.SendNackConnect(serviceExp);
|
||
|
break;
|
||
|
|
||
|
case exp.ChannelClosed():
|
||
|
goto end;
|
||
|
}
|
||
|
}
|
||
|
end: ;
|
||
|
}
|
||
|
finally
|
||
|
{
|
||
|
delete exp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static bool RegisterServiceProvider()
|
||
|
{
|
||
|
DirectoryServiceContract.Imp ns =
|
||
|
DirectoryService.NewClientEndpoint();
|
||
|
|
||
|
ServiceProviderContract.Imp! imp;
|
||
|
ServiceProviderContract.Exp! exp;
|
||
|
ServiceProviderContract.NewChannel(out imp, out exp);
|
||
|
|
||
|
try
|
||
|
{
|
||
|
ns.SendRegister(Bitter.FromString2(nsName), imp);
|
||
|
switch receive
|
||
|
{
|
||
|
case ns.AckRegister():
|
||
|
nsChannel =
|
||
|
new TRef<ServiceProviderContract.Exp:Start>(exp);
|
||
|
Thread t =
|
||
|
new Thread(new ThreadStart(ServiceProviderPump));
|
||
|
t.Start();
|
||
|
return true;
|
||
|
break;
|
||
|
case ns.NakRegister(rejected, error):
|
||
|
delete rejected;
|
||
|
delete exp;
|
||
|
break;
|
||
|
case ns.ChannelClosed():
|
||
|
delete exp;
|
||
|
break;
|
||
|
case unsatisfiable:
|
||
|
DebugStub.Break();
|
||
|
delete exp;
|
||
|
break;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
finally
|
||
|
{
|
||
|
delete ns;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void Start()
|
||
|
{
|
||
|
NetStack.Runtime.StaticConfiguration.Initialize();
|
||
|
NetStack.Runtime.StaticConfiguration.Start();
|
||
|
|
||
|
IPExpManager ipManager = new IPExpManager();
|
||
|
ipManager.Start();
|
||
|
|
||
|
DNSExpManager dnsManager = new DNSExpManager();
|
||
|
dnsManager.Start();
|
||
|
|
||
|
RoutingExpManager routingManager = new RoutingExpManager();
|
||
|
routingManager.Start();
|
||
|
|
||
|
TcpExpManager tcpManager = new TcpExpManager();
|
||
|
tcpManager.Start();
|
||
|
|
||
|
UdpExpManager udpManager = new UdpExpManager();
|
||
|
udpManager.Start();
|
||
|
|
||
|
NicFactory.Probe();
|
||
|
}
|
||
|
|
||
|
public static void Stop()
|
||
|
{
|
||
|
NetStack.Runtime.StaticConfiguration.Stop();
|
||
|
}
|
||
|
|
||
|
public static int Main(String [] args)
|
||
|
{
|
||
|
if (RegisterServiceProvider() == false)
|
||
|
{
|
||
|
Console.WriteLine("Could not start NetStack as it is already registered in namespace.");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
#if false // Change this to true to enable GC accounting in the network stack.n
|
||
|
AppRuntime.EnableGCAccounting = true;
|
||
|
DebugStub.WriteLine("NetStack: Enabled GC Accounting");
|
||
|
#endif
|
||
|
|
||
|
Start();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
}
|