//CONSTRUCTOR public LinkProtocol(Link link, LinkSide from, LinkSide to) : base(link, string.Format("{0}->{1}", from.NodeIdentifier, to.NodeIdentifier)) { this.link = link; this.from = from; this.to = to; }
//HELPERS void onLinkFree(LinkSide side) { double whenAdded; Bundle bundle = buffer.GetNext(out whenAdded); if (bundle != null) { linkSide.SendBundle(bundle, whenAdded); } }
//CONSTRUCTION public NetworkInterface(NetworkInterfaces interfaces, LinkSide linkSide) : base(interfaces, linkSide.Link.Identificator) { this.linkSide = linkSide; this.interfaces = interfaces; linkSide.OnLinkFree += onLinkFree; linkSide.Interface = this; buffer = new InterfaceBuffer(this); }
//CONSTRUCTOR public Link(XmlNode configuration) : base(configuration) { //create two link sides XmlAttribute from = XmlParser.GetAttribute(configuration, fromTag); XmlAttribute to = XmlParser.GetAttribute(configuration, toTag); linkSides[0] = new LinkSide(from.Value, this); linkSides[1] = new LinkSide(to.Value, this); linkSides[0].SecondSide = linkSides[1]; linkSides[1].SecondSide = linkSides[0]; LinkProtocol[] protocols = new LinkProtocol[2]; protocols[0] = LinkProtocol.Create(this, configuration, linkSides[0], linkSides[1]); protocols[1] = LinkProtocol.Create(this, configuration, linkSides[1], linkSides[0]); //connect elements linkSides[0].LinkProtocol = protocols[0]; linkSides[1].LinkProtocol = protocols[1]; //parse attributes XmlAttribute ber = configuration.Attributes[berTag]; if (ber != null) // if ber == null leave default value of ber ==0 { this.ber = double.Parse(ber.Value); if (this.ber < 0) { throw new ArgumentException("BER cannot be less than 0."); } } XmlAttribute speed = XmlParser.GetAttribute(configuration, speedTag); this.speed = double.Parse(speed.Value); if (this.speed < 0) { throw new ArgumentException("Link speed cannot be less than 0."); } //create delay generator XmlNode delayGenerator = XmlParser.GetChildNode(configuration, delayGeneratorTag); this.delayGenerator = RandomGenerator.Create(delayGenerator); //subscribe to state change events (break etc.) OnBreak += onBreak; OnRepair += onRepair; OnTurnOff += onTurnOff; OnTurnOn += onTurnOn; }
//INTERFACE public static LinkProtocol Create(Link link, XmlNode configuration, LinkSide from, LinkSide to) { XmlAttribute type = XmlParser.GetAttribute(configuration, typeTag); switch (type.Value) { case LtpLinkProtocol.TypeTag: return(new LtpLinkProtocol(link, from, to)); case UdpLinkProtocol.TypeTag: return(new UdpLinkProtocol(link, from, to)); case TcpLinkProtocol.TypeTag: return(new TcpLinkProtocol(link, from, to)); default: throw new ArgumentException("Unknown value \"" + type.Value + "\" of XML attribute \"" + typeTag + "\"."); } }
//CALLBACKS void onLinkBreakChange(LinkSide linkSide) { if (!node.IsAvailable) { return; } LinkEntry entry = links[linkSide.Link]; entry.IsBroken = linkSide.IsBroken; entry.WhenUpdated = Timer.CurrentTime; List <DijkstraLinkStateUpdate> list = new List <DijkstraLinkStateUpdate>(); foreach (LinkEntry linkEntry in links.Values) { DijkstraLinkStateUpdate linkUpdate = new DijkstraLinkStateUpdate(linkEntry.Link, linkEntry.WhenUpdated, linkEntry.IsBroken); list.Add(linkUpdate); } DijkstraUpdate update = new DijkstraUpdate(list.ToArray()); RoutingInfoBundle bundle = new RoutingInfoBundle(node, null, update); NetworkInterface ignore = linkSide.IsBroken? node.NetworkInterfaces.Find(linkSide.Link):null; broadcast(bundle, ignore); }
//CONSTRUCTOR public TcpLinkProtocol(Link link, LinkSide from, LinkSide to) : base(link, from, to) { currentWindow = Configuration.Protocols.Tcp.InitialWindow; multiplier = Configuration.Protocols.Tcp.InitialMultiplier; }
//CONSTRUCTOR public LtpLinkProtocol(Link link, LinkSide from, LinkSide to) : base(link, from, to) { }
//INTERFACE public void AddNewLink(LinkSide linkSide) { interfaces.Add(linkSide.Link, new NetworkInterface(this, linkSide)); }
public void Connect(LinkSide linkSide) { interfaces.AddNewLink(linkSide); }