A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
ipv4_routing_table.py
Go to the documentation of this file.
1from gi.repository import Gtk
2
3try:
4 from ns3.visualizer.base import InformationWindow
5except ModuleNotFoundError:
6 from visualizer.base import InformationWindow
7
8
10
18 (
19 COLUMN_DESTINATION,
20 COLUMN_NEXT_HOP,
21 COLUMN_INTERFACE,
22 COLUMN_TYPE,
23 COLUMN_PRIO
24 ) = range(5)
25
26 def __init__(self, visualizer, node_index):
27 """!
28 Initializer
29 @param self this object
30 @param visualizer visualizer object
31 @param node_index the node index
32 """
33 InformationWindow.__init__(self)
34 self.win = Gtk.Dialog(parent=visualizer.window,
35 flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
36 buttons=("_Close", Gtk.ResponseType.CLOSE))
37 self.win.connect("response", self._response_cb)
38 self.win.set_title("IPv4 routing table for node %i" % node_index)
39 self.visualizer = visualizer
40 self.node_index = node_index
41
42 self.table_model = Gtk.ListStore(str, str, str, str, int)
43
44 treeview = Gtk.TreeView(self.table_model)
45 treeview.show()
46 sw = Gtk.ScrolledWindow()
47 sw.set_properties(hscrollbar_policy=Gtk.PolicyType.AUTOMATIC,
48 vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
49 sw.show()
50 sw.add(treeview)
51 self.win.vbox.add(sw)
52 self.win.set_default_size(600, 300)
53
54 # Dest.
55 column = Gtk.TreeViewColumn('Destination', Gtk.CellRendererText(),
56 text=self.COLUMN_DESTINATION)
57 treeview.append_column(column)
58
59 # Next hop
60 column = Gtk.TreeViewColumn('Next hop', Gtk.CellRendererText(),
61 text=self.COLUMN_NEXT_HOP)
62 treeview.append_column(column)
63
64 # Interface
65 column = Gtk.TreeViewColumn('Interface', Gtk.CellRendererText(),
66 text=self.COLUMN_INTERFACE)
67 treeview.append_column(column)
68
69 # Type
70 column = Gtk.TreeViewColumn('Type', Gtk.CellRendererText(),
71 text=self.COLUMN_TYPE)
72 treeview.append_column(column)
73
74 # Prio
75 column = Gtk.TreeViewColumn('Prio', Gtk.CellRendererText(),
76 text=self.COLUMN_PRIO)
77 treeview.append_column(column)
78
79 self.visualizer.add_information_window(self)
80 self.win.show()
81
82 def _response_cb(self, win, response):
83 """!
84 Response callback function
85 @param self this object
86 @param win the window
87 @param response the response
88 @return none
89 """
90 self.win.destroy()
91 self.visualizer.remove_information_window(self)
92
93 def update(self):
94 """!
95 Update function
96 @param self this object
97 @return none
98 """
99 node = ns.NodeList.GetNode(self.node_index)
100 ipv4 = ns.cppyy.gbl.getNodeIpv4(node)
101 routing = ipv4.GetRoutingProtocol()
102 if routing is None:
103 return
104
105 routing_protocols = [] # list of (protocol, type_string, priority)
106
107 if isinstance(routing, ns.Ipv4StaticRouting):
108 ipv4_routing = routing_protocols.append((routing, "static", 0))
109 elif isinstance(routing, ns.Ipv4ListRouting):
110 list_routing = routing
111 for rI in range(list_routing.GetNRoutingProtocols()):
112 routing, prio = list_routing.GetRoutingProtocol(rI)
113 if isinstance(routing, ns.Ipv4StaticRouting):
114 routing_protocols.append((routing, "static", prio))
115 elif isinstance(routing, ns.Ipv4GlobalRouting):
116 routing_protocols.append((routing, "global", prio))
117 if not routing_protocols:
118 return
119
120 self.table_model.clear()
121 for route_proto, type_string, prio in routing_protocols:
122 for routeI in range(route_proto.GetNRoutes()):
123 route = route_proto.GetRoute(routeI)
124 tree_iter = self.table_model.append()
125 netdevice = ipv4.GetNetDevice(route.GetInterface())
126 if netdevice is None:
127 interface_name = 'lo'
128 else:
129 interface_name = ns.Names.FindName(netdevice)
130 if not interface_name:
131 interface_name = "(interface %i)" % route.GetInterface()
132 self.table_model.set(tree_iter,
133 self.COLUMN_DESTINATION, str(route.GetDest()),
134 self.COLUMN_NEXT_HOP, str(route.GetGateway()),
135 self.COLUMN_INTERFACE, interface_name,
136 self.COLUMN_TYPE, type_string,
137 self.COLUMN_PRIO, prio)
138
139
140def populate_node_menu(viz, node, menu):
141 menu_item = Gtk.MenuItem("Show IPv4 Routing Table")
142 menu_item.show()
143
144 def _show_ipv4_routing_table(dummy_menu_item):
145 ShowIpv4RoutingTable(viz, node.node_index)
146
147 menu_item.connect("activate", _show_ipv4_routing_table)
148 menu.add(menu_item)
149
150def register(viz):
151 viz.connect("populate-node-menu", populate_node_menu)
def _response_cb(self, win, response)
Response callback function.
def __init__(self, visualizer, node_index)
Initializer.
InformationWindow class.
Definition: base.py:25
def populate_node_menu(viz, node, menu)