Exemple #1
0
        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);
        }
Exemple #2
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);
        }