Beispiel #1
0
        public void CreateFromFibTable(FibTable table)
        {
            Root = new FibTreeNode(null);
            Labels.Clear();

            foreach (FibEntry entry in table)
            {
                FibTreeNode node = Root;
                for (int i = 0; i < entry.BinaryForm.Length; i++)
                {
                    int edgeLabel = entry.BinaryForm[i] - (int)'0';
                    if (node.GetChild(edgeLabel) == null)
                    {
                        node.AddChild(edgeLabel);
                    }
                    node = node.GetChild(edgeLabel);
                }

                FibTreeLabel label = Labels.GetLabelByNextHop(entry.NextHop);
                if (label == null)
                {
                    label = Labels.AddLabelForNextHop(entry.NextHop);
                }
                node.Label = label;
            }

            TreeChanged?.Invoke();
        }
Beispiel #2
0
        private void addChildrenWithStride(FibTreeNode to, FibTreeNode from, Dictionary <FibTreeNode, CompressData> compressData)
        {
            if (from.Label != null)
            {
                FibTreeLabel label = Labels.GetLabelByNextHop(from.Label.NextHop);
                if (label == null)
                {
                    label = Labels.AddLabelForNextHop(from.Label.NextHop);
                }
                to.Label = label;
            }

            if (from.Children.Count == 0)
            {
                return;
            }

            List <FibTreeNode> childrenToAdd = from.GetChildrenAtLevel(compressData[from].OptimalStride);

            foreach (FibTreeNode childToAdd in childrenToAdd)
            {
                FibTreeNode newNode = to.AddChild(getConcatenatedEdgeLabelBetweenNodes(from, childToAdd));
                addChildrenWithStride(newNode, childToAdd, compressData);
            }
        }
Beispiel #3
0
        private void copyNodeAndChildrens(FibTreeNode to, FibTreeNode from)
        {
            foreach (KeyValuePair <string, FibTreeNode> child in from.Children)
            {
                FibTreeNode newNode = to.AddChild(child.Key);
                copyNodeAndChildrens(newNode, child.Value);
            }

            if (from.Label != null)
            {
                FibTreeLabel label = Labels.GetLabelByNextHop(from.Label.NextHop);
                if (label == null)
                {
                    label = Labels.AddLabelForNextHop(from.Label.NextHop);
                }
                to.Label = label;
            }
        }
Beispiel #4
0
        private void normalize_CreateLeaves(FibTreeNode node, FibTreeLabel nearestLabel)
        {
            if (node.Children.Count == 0)
            {
                return;
            }

            if (node.Label != null)
            {
                nearestLabel = node.Label;
            }

            if (node.Children.Count == 1)
            {
                string notExistingEdgeLabel = string.Format("{0}", (int)'1' - (int)node.Children.ToList()[0].Key[0]);
                node.AddChild(notExistingEdgeLabel, nearestLabel);
            }

            normalize_CreateLeaves(node.GetChild(0), nearestLabel);
            normalize_CreateLeaves(node.GetChild(1), nearestLabel);
        }