10 from kiwi.ui.objectlist
import ObjectList, Column
23 self.set_properties(hscrollbar_policy=gtk.POLICY_AUTOMATIC,
24 vscrollbar_policy=gtk.POLICY_AUTOMATIC)
30 def add_column(descr, colid):
31 column = gtk.TreeViewColumn(descr, gtk.CellRendererText(), text=colid)
32 treeview.append_column(column)
34 add_column(
"Time", self.COLUMN_TIME)
35 add_column(
"Interface", self.COLUMN_INTERFACE)
36 add_column(
"Size", self.COLUMN_SIZE)
37 add_column(
"Contents", self.COLUMN_CONTENTS)
39 def update(self, node, packet_list):
40 self.table_model.clear()
41 for sample
in packet_list:
42 tree_iter = self.table_model.append()
43 if sample.device
is None:
44 interface_name =
"(unknown)"
46 interface_name = ns.core.Names.FindName(sample.device)
47 if not interface_name:
48 interface_name =
"(interface %i)" % sample.device.GetIfIndex()
49 self.table_model.set(tree_iter,
50 self.COLUMN_TIME, str(sample.time.GetSeconds()),
51 self.COLUMN_INTERFACE, interface_name,
52 self.COLUMN_SIZE, str(sample.packet.GetSize ()),
53 self.COLUMN_CONTENTS, str(sample.packet)
57 def __init__(self, visualizer, node_index):
58 InformationWindow.__init__(self)
59 self.win = gtk.Dialog(parent=visualizer.window,
60 flags=gtk.DIALOG_DESTROY_WITH_PARENT|gtk.DIALOG_NO_SEPARATOR,
61 buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
62 self.win.connect(
"response", self._response_cb)
63 self.win.set_title(
"Last packets for node %i" % node_index)
64 self.visualizer = visualizer
65 self.viz_node = visualizer.get_node(node_index)
66 self.node = ns.network.NodeList.GetNode(node_index)
68 def smart_expand(expander, vbox):
69 if expander.get_expanded():
70 vbox.set_child_packing(expander, expand=
True, fill=
True, padding=0, pack_type=gtk.PACK_START)
72 vbox.set_child_packing(expander, expand=
False, fill=
False, padding=0, pack_type=gtk.PACK_START)
74 main_hbox = gtk.HBox(
False, 4)
76 main_vbox = gtk.VBox(
False, 4)
78 self.win.vbox.add(main_hbox)
79 main_hbox.add(main_vbox)
81 self.tx_list = self.PacketList()
83 group = gtk.Expander(
"Last transmitted packets")
85 group.add(self.tx_list)
86 main_vbox.pack_start(group, expand=
False, fill=
False)
87 group.connect_after(
"activate", smart_expand, main_vbox)
89 self.rx_list = self.PacketList()
91 group = gtk.Expander(
"Last received packets")
93 group.add(self.rx_list)
94 main_vbox.pack_start(group, expand=
False, fill=
False)
95 group.connect_after(
"activate", smart_expand, main_vbox)
97 self.drop_list = self.PacketList()
99 group = gtk.Expander(
"Last dropped packets")
101 group.add(self.drop_list)
102 main_vbox.pack_start(group, expand=
False, fill=
False)
103 group.connect_after(
"activate", smart_expand, main_vbox)
109 self.packet_capture_options = ns.visualizer.PyViz.PacketCaptureOptions()
110 self.packet_capture_options.numLastPackets = 100
112 packet_filter_vbox = gtk.VBox(
False, 4)
113 packet_filter_vbox.show()
114 main_hbox.add(packet_filter_vbox)
116 sel_buttons_box = gtk.HButtonBox()
117 sel_buttons_box.show()
118 packet_filter_vbox.pack_start(sel_buttons_box,
False,
False, 4)
119 select_all_button = gobject.new(gtk.Button, label=
"Sel. All", visible=
True)
120 select_none_button = gobject.new(gtk.Button, label=
"Sel. None", visible=
True)
121 sel_buttons_box.add(select_all_button)
122 sel_buttons_box.add(select_none_button)
124 self.packet_filter_widget = ObjectList([
125 Column(
'selected', title=
"Sel.", data_type=bool, editable=
True),
126 Column(
'name', title=
"Header"),
128 self.packet_filter_widget.show()
129 packet_filter_vbox.pack_start(self.packet_filter_widget,
True,
True, 4)
131 class TypeIdConfig(object):
132 __slots__ = [
'name',
'selected',
'typeid']
134 self.packet_filter_list = []
136 Header = ns.core.TypeId.LookupByName(
"ns3::Header")
137 Trailer = ns.core.TypeId.LookupByName(
"ns3::Trailer")
138 for typeid_i
in range(ns.core.TypeId.GetRegisteredN()):
139 typeid = ns.core.TypeId.GetRegistered(typeid_i)
144 if typeid_tmp == Header
or typeid_tmp == Trailer:
147 if typeid_tmp.HasParent():
148 typeid_tmp = typeid_tmp.GetParent()
153 if typeid
in [Header, Trailer]:
157 c.name = typeid.GetName()
159 self.packet_filter_list.append(c)
160 self.packet_filter_widget.add_list(self.packet_filter_list)
162 def update_capture_options():
163 if self.op_AND_button.props.active:
164 self.packet_capture_options.mode = ns.visualizer.PyViz.PACKET_CAPTURE_FILTER_HEADERS_AND
166 self.packet_capture_options.mode = ns.visualizer.PyViz.PACKET_CAPTURE_FILTER_HEADERS_OR
167 self.packet_capture_options.numLastPackets = 100
168 self.packet_capture_options.headers = [c.typeid
for c
in self.packet_filter_list
if c.selected]
169 self.visualizer.simulation.lock.acquire()
171 self.visualizer.simulation.sim_helper.SetPacketCaptureOptions(
172 self.node.GetId(), self.packet_capture_options)
174 self.visualizer.simulation.lock.release()
177 for c
in self.packet_filter_list:
179 self.packet_filter_widget.refresh()
180 update_capture_options()
183 for c
in self.packet_filter_list:
185 self.packet_filter_widget.refresh()
186 update_capture_options()
188 select_all_button.connect(
"clicked", sel_all_cb)
189 select_none_button.connect(
"clicked", sel_none_cb)
191 op_buttons_box = gtk.HButtonBox()
192 op_buttons_box.show()
193 packet_filter_vbox.pack_start(op_buttons_box,
False,
False, 4)
194 self.op_AND_button = gobject.new(gtk.RadioButton, label=
"AND", visible=
True)
195 self.op_OR_button = gobject.new(gtk.RadioButton, label=
"OR", visible=
True, group=self.op_AND_button)
196 op_buttons_box.add(self.op_AND_button)
197 op_buttons_box.add(self.op_OR_button)
198 self.op_OR_button.props.active =
True
200 self.op_AND_button.connect(
"toggled",
lambda b: update_capture_options())
202 def cell_edited(l, obj, attribute):
203 update_capture_options()
204 self.packet_filter_widget.connect(
"cell-edited", cell_edited)
206 update_capture_options()
208 self.visualizer.add_information_window(self)
209 self.win.set_default_size(600, 300)
212 def _response_cb(self, win, response):
214 self.visualizer.remove_information_window(self)
217 last_packets = self.visualizer.simulation.sim_helper.GetLastPackets(self.node.GetId())
219 self.tx_list.update(self.node, last_packets.lastTransmittedPackets)
220 self.rx_list.update(self.node, last_packets.lastReceivedPackets)
221 self.drop_list.update(self.node, last_packets.lastDroppedPackets)
224 def populate_node_menu(viz, node, menu):
225 menu_item = gtk.MenuItem(
"Show Last Packets")
228 def _show_it(dummy_menu_item):
231 menu_item.connect(
"activate", _show_it)
235 viz.connect(
"populate-node-menu", populate_node_menu)