internal static int Add(AddConfig !config) { DebugStub.Break(); if (config.servers == null) { Console.WriteLine("no servers given"); return(-1); } DNSContract.Imp dnsConn = ((!)config.dnsRef).Acquire(); if (dnsConn == null) { Console.WriteLine("Could not initialize DNS endpoint."); delete dnsConn; return(1); } dnsConn.RecvReady(); for (int i = 0; i < config.servers.Length; i++) { IPv4 resolver; Console.WriteLine("Resolving {0}", config.servers[i]); if (IPv4.Parse(config.servers[i], out resolver) == false) { Console.WriteLine("Invalid IP address: {0}", config.servers[i]); } dnsConn.SendAddNameServer((uint)resolver); dnsConn.RecvAck(); } delete dnsConn; return(0); }
internal static int Add(AddConfig !config) { IPv4 gateway; RoutingContract.Imp routeConn = ((!)config.routingRef).Acquire(); if (routeConn == null) { Console.WriteLine("Could not initialize routing endpoint."); return(1); } routeConn.RecvReady(); if (IPv4.Parse(config.gateway, out gateway) == false) { Console.WriteLine("Could not parse gateway address."); delete routeConn; return(-1); } try { // NOTE: for some reason the compiler doesn't // realize that ifaddr will definitely be assigned if // we survive the if/switch-receive sequence. Work // around that by initializing. IPv4 ifaddr = new IPv4(0); if (config.ifAddress == null) { routeConn.SendFindHostRoute((uint)gateway); switch receive { case routeConn.Route(RouteEntry r): ifaddr = new IPv4(r.ifaddr); break; case routeConn.NoRouteFound(): Console.WriteLine("No route to gateway."); delete routeConn; return(-1); break; case routeConn.ChannelClosed(): Console.WriteLine("routeConn channel closed."); throw new Exception("routeConn channel closed."); } } else if (IPv4.Parse(config.ifAddress, out ifaddr) == false) { Console.WriteLine("Could not parse interface address."); delete routeConn; return(-1); } IPContract.Imp ipConn = ((!)config.ipRef).Acquire(); if (ipConn == null) { Console.WriteLine("Could not initialize IP endpoint."); delete routeConn; return(-1); } try { bool isLocal; ipConn.SendIsLocalAddress((uint)ifaddr); ipConn.RecvIsLocal(out isLocal); if (!isLocal) { Console.WriteLine("Proposed interface address is not bound to an interface."); delete routeConn; return(-1); } } finally { delete ipConn; ipConn = null; } IPv4Network destination; if (IPv4Network.Parse(config.destination, out destination) == false) { Console.WriteLine("Could not parse destination address."); delete routeConn; return(-1); } NetStack.Contracts.Network nwrk = new NetStack.Contracts.Network(); nwrk.network = (uint)destination.Network; nwrk.netmask = (uint)destination.NetMask; routeConn.SendAddRoute(nwrk, (uint)gateway, (uint)ifaddr); switch receive { case routeConn.Err(): Console.WriteLine("Route could not be added -- it may already exist."); break; case routeConn.OK(): Console.WriteLine("Route added successfully"); break; case routeConn.ChannelClosed(): throw new Exception("routeConn channel closed"); } } catch (Exception e) { Console.WriteLine("Exception: {0}", e); } delete routeConn; return(0); }