A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
show_last_packets.py
Go to the documentation of this file.
1 import gobject
2 import gtk
3 
4 import ns.core
5 import ns.network
6 import ns.visualizer
7 
8 from visualizer.base import InformationWindow
9 from visualizer.higcontainer import HIGContainer
10 from kiwi.ui.objectlist import ObjectList, Column
11 
13  class PacketList(gtk.ScrolledWindow):
14  (
15  COLUMN_TIME,
16  COLUMN_INTERFACE,
17  COLUMN_SIZE,
18  COLUMN_CONTENTS,
19  ) = range(4)
20 
21  def __init__(self):
23  self.set_properties(hscrollbar_policy=gtk.POLICY_AUTOMATIC,
24  vscrollbar_policy=gtk.POLICY_AUTOMATIC)
25  self.table_model = gtk.ListStore(*([str]*4))
26  treeview = gtk.TreeView(self.table_model)
27  treeview.show()
28  self.add(treeview)
29 
30  def add_column(descr, colid):
31  column = gtk.TreeViewColumn(descr, gtk.CellRendererText(), text=colid)
32  treeview.append_column(column)
33 
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)
38 
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)"
45  else:
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)
54  )
55 
56 
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)
67 
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)
71  else:
72  vbox.set_child_packing(expander, expand=False, fill=False, padding=0, pack_type=gtk.PACK_START)
73 
74  main_hbox = gtk.HBox(False, 4)
75  main_hbox.show()
76  main_vbox = gtk.VBox(False, 4)
77  main_vbox.show()
78  self.win.vbox.add(main_hbox)
79  main_hbox.add(main_vbox)
80 
81  self.tx_list = self.PacketList()
82  self.tx_list.show()
83  group = gtk.Expander("Last transmitted packets")
84  group.show()
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)
88 
89  self.rx_list = self.PacketList()
90  self.rx_list.show()
91  group = gtk.Expander("Last received packets")
92  group.show()
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)
96 
97  self.drop_list = self.PacketList()
98  self.drop_list.show()
99  group = gtk.Expander("Last dropped packets")
100  group.show()
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)
104 
105 
106  # Packet Filter
107 
108  # - options
109  self.packet_capture_options = ns.visualizer.PyViz.PacketCaptureOptions()
110  self.packet_capture_options.numLastPackets = 100
111 
112  packet_filter_vbox = gtk.VBox(False, 4)
113  packet_filter_vbox.show()
114  main_hbox.add(packet_filter_vbox)
115 
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)
123 
124  self.packet_filter_widget = ObjectList([
125  Column('selected', title="Sel.", data_type=bool, editable=True),
126  Column('name', title="Header"),
127  ], sortable=True)
128  self.packet_filter_widget.show()
129  packet_filter_vbox.pack_start(self.packet_filter_widget, True, True, 4)
130 
131  class TypeIdConfig(object):
132  __slots__ = ['name', 'selected', 'typeid']
133 
134  self.packet_filter_list = [] # list of TypeIdConfig instances
135 
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)
140  # check if this is a header or trailer subtype
141  typeid_tmp = typeid
142  type_is_good = False
143  while 1:
144  if typeid_tmp == Header or typeid_tmp == Trailer:
145  type_is_good = True
146  break
147  if typeid_tmp.HasParent():
148  typeid_tmp = typeid_tmp.GetParent()
149  else:
150  break
151  if not type_is_good:
152  continue
153  if typeid in [Header, Trailer]:
154  continue
155  c = TypeIdConfig()
156  c.selected = True
157  c.name = typeid.GetName()
158  c.typeid = typeid
159  self.packet_filter_list.append(c)
160  self.packet_filter_widget.add_list(self.packet_filter_list)
161 
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
165  else:
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()
170  try:
171  self.visualizer.simulation.sim_helper.SetPacketCaptureOptions(
172  self.node.GetId(), self.packet_capture_options)
173  finally:
174  self.visualizer.simulation.lock.release()
175 
176  def sel_all_cb(bt):
177  for c in self.packet_filter_list:
178  c.selected = True
179  self.packet_filter_widget.refresh()
180  update_capture_options()
181 
182  def sel_none_cb(bt):
183  for c in self.packet_filter_list:
184  c.selected = False
185  self.packet_filter_widget.refresh()
186  update_capture_options()
187 
188  select_all_button.connect("clicked", sel_all_cb)
189  select_none_button.connect("clicked", sel_none_cb)
190 
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
199 
200  self.op_AND_button.connect("toggled", lambda b: update_capture_options())
201 
202  def cell_edited(l, obj, attribute):
203  update_capture_options()
204  self.packet_filter_widget.connect("cell-edited", cell_edited)
205 
206  update_capture_options()
207 
208  self.visualizer.add_information_window(self)
209  self.win.set_default_size(600, 300)
210  self.win.show()
211 
212  def _response_cb(self, win, response):
213  self.win.destroy()
214  self.visualizer.remove_information_window(self)
215 
216  def update(self):
217  last_packets = self.visualizer.simulation.sim_helper.GetLastPackets(self.node.GetId())
218 
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)
222 
223 
224 def populate_node_menu(viz, node, menu):
225  menu_item = gtk.MenuItem("Show Last Packets")
226  menu_item.show()
227 
228  def _show_it(dummy_menu_item):
229  ShowLastPackets(viz, node.node_index)
230 
231  menu_item.connect("activate", _show_it)
232  menu.add(menu_item)
233 
234 def register(viz):
235  viz.connect("populate-node-menu", populate_node_menu)