aboutsummaryrefslogtreecommitdiffstats
path: root/netmodel/network/fib.py
diff options
context:
space:
mode:
Diffstat (limited to 'netmodel/network/fib.py')
-rw-r--r--netmodel/network/fib.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/netmodel/network/fib.py b/netmodel/network/fib.py
new file mode 100644
index 00000000..e6b81607
--- /dev/null
+++ b/netmodel/network/fib.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017 Cisco and/or its affiliates.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class FIBEntry:
+ def __init__(self, prefix, next_hops = None):
+ if next_hops is None:
+ next_hops = set()
+
+ self._prefix = prefix
+ self._next_hops = next_hops
+
+ def update(self, next_hops = None):
+ if not next_hops:
+ return
+ self._next_hops |= next_hops
+
+ def remove(self, next_hops = None):
+ if not next_hops:
+ return
+ self._next_hops &= next_hops
+
+class FIB:
+ def __init__(self):
+ self._entries = dict()
+
+ def add(self, prefix, next_hops = None):
+ self._entries[prefix] = FIBEntry(prefix, next_hops)
+
+ def update(self, prefix, next_hops = None):
+ entry = self._entries.get(prefix)
+ if not entry:
+ raise Exception('prefix not found')
+ entry.update(next_hops)
+
+ def remove(self, prefix, next_hops = None):
+ if next_hop:
+ entry = self._entries.get(prefix)
+ if not entry:
+ raise Exception('prefix not found')
+ entry.remove(next_hops)
+ return
+
+ del self._entries[prefix]
+
+ def get(self, object_name):
+ for entry in self._entries.values():
+ if entry._prefix.object_name == object_name:
+ return next(iter(entry._next_hops))