private void W_EstablishTcp(TcpSocket socket) { var adapter = adapterFactory.CreateAdapter(socket, this); adapters.Add(adapter); if (adapters.Count > 150) { adapters.RemoveAll(a => a.IsShutdown); } }
// loads an adapter's driver and add the relevant data structures // for managing it. protected bool LoadAdapter(ProtocolParams args, string driversPath) { // the user can ignore an adapter // so ignore it... string ignore = args["ignore"]; if (ignore != null && ignore == "true") { return(true); } string name = ProtocolParams.LookupString(args, "name", "unknown"); string typeName = ProtocolParams.LookupString(args, "type", "unknown"); string id = ProtocolParams.LookupString(args, "id", "unknown"); int mtu = ProtocolParams.LookupInt32(args, "mtu", EthernetFormat.MaxFrameSize); int txRing = ProtocolParams.LookupInt32(args, "txRing", 64); int rxRing = ProtocolParams.LookupInt32(args, "rxRing", 64); int fwQueue = ProtocolParams.LookupInt32(args, "fwQueue", 64); IAdapterFactory factory = null; IAdapter adapter = null; try { string factoryTypeName = typeName + "Factory"; Assembly assembly = Assembly.LoadFrom(driversPath); Type[] types = assembly.GetTypes(); foreach (Type t in types) { if (t.IsClass && t.Name.Equals(typeName)) { factory = (IAdapterFactory)Activator.CreateInstance(t, null); break; } if (factory == null) { throw new Exception("Can't find Adapter's Factory."); } adapter = factory.CreateAdapter(name, id, txRing, rxRing); Core.Instance().RegisterAdapter(adapter, fwQueue); } } catch (Exception e) { adapter = null; Console.Out.WriteLine(e.Message); Environment.Exit(1); } IPModule ipModule = Core.Instance().GetProtocolByName("IP") as IPModule; HostConfiguration hostConfig = ipModule.HostConfiguration; for (int i = 0;; i++) { string ipTag = String.Format("ip{0}", i); string maskTag = String.Format("mask{0}", i); string gatewayTag = String.Format("gateway{0}", i); // XXX No point-to-point support here. IPv4 address = ProtocolParams.LookupIPv4(args, ipTag, IPv4.AllOnes); IPv4 netmask = ProtocolParams.LookupIPv4(args, maskTag, IPv4.AllOnes); IPv4 gateway = ProtocolParams.LookupIPv4(args, gatewayTag, IPv4.Zero); if (address == IPv4.AllOnes || netmask == IPv4.AllOnes) { break; } hostConfig.Bindings.Add(adapter, new InterfaceIPConfiguration(address, netmask, gateway, 128) ); } #if DEBUG System.Console.Out.WriteLine("[Interface {0}]", args["name"]); System.Console.Out.WriteLine("-----------------------------"); #endif return(true); }