1*63e03724SNeil Horman# Monitor the system for dropped packets and proudce a report of drop locations and counts
2*63e03724SNeil Horman
3*63e03724SNeil Hormanimport os
4*63e03724SNeil Hormanimport sys
5*63e03724SNeil Horman
6*63e03724SNeil Hormansys.path.append(os.environ['PERF_EXEC_PATH'] + \
7*63e03724SNeil Horman		'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
8*63e03724SNeil Horman
9*63e03724SNeil Hormanfrom perf_trace_context import *
10*63e03724SNeil Hormanfrom Core import *
11*63e03724SNeil Hormanfrom Util import *
12*63e03724SNeil Horman
13*63e03724SNeil Hormandrop_log = {}
14*63e03724SNeil Hormankallsyms = []
15*63e03724SNeil Horman
16*63e03724SNeil Hormandef get_kallsyms_table():
17*63e03724SNeil Horman	global kallsyms
18*63e03724SNeil Horman	try:
19*63e03724SNeil Horman		f = open("/proc/kallsyms", "r")
20*63e03724SNeil Horman		linecount = 0
21*63e03724SNeil Horman		for line in f:
22*63e03724SNeil Horman			linecount = linecount+1
23*63e03724SNeil Horman		f.seek(0)
24*63e03724SNeil Horman	except:
25*63e03724SNeil Horman		return
26*63e03724SNeil Horman
27*63e03724SNeil Horman
28*63e03724SNeil Horman	j = 0
29*63e03724SNeil Horman	for line in f:
30*63e03724SNeil Horman		loc = int(line.split()[0], 16)
31*63e03724SNeil Horman		name = line.split()[2]
32*63e03724SNeil Horman		j = j +1
33*63e03724SNeil Horman		if ((j % 100) == 0):
34*63e03724SNeil Horman			print "\r" + str(j) + "/" + str(linecount),
35*63e03724SNeil Horman		kallsyms.append({ 'loc': loc, 'name' : name})
36*63e03724SNeil Horman
37*63e03724SNeil Horman	print "\r" + str(j) + "/" + str(linecount)
38*63e03724SNeil Horman	kallsyms.sort()
39*63e03724SNeil Horman	return
40*63e03724SNeil Horman
41*63e03724SNeil Hormandef get_sym(sloc):
42*63e03724SNeil Horman	loc = int(sloc)
43*63e03724SNeil Horman	for i in kallsyms:
44*63e03724SNeil Horman		if (i['loc'] >= loc):
45*63e03724SNeil Horman			return (i['name'], i['loc']-loc)
46*63e03724SNeil Horman	return (None, 0)
47*63e03724SNeil Horman
48*63e03724SNeil Hormandef print_drop_table():
49*63e03724SNeil Horman	print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")
50*63e03724SNeil Horman	for i in drop_log.keys():
51*63e03724SNeil Horman		(sym, off) = get_sym(i)
52*63e03724SNeil Horman		if sym == None:
53*63e03724SNeil Horman			sym = i
54*63e03724SNeil Horman		print "%25s %25s %25s" % (sym, off, drop_log[i])
55*63e03724SNeil Horman
56*63e03724SNeil Horman
57*63e03724SNeil Hormandef trace_begin():
58*63e03724SNeil Horman	print "Starting trace (Ctrl-C to dump results)"
59*63e03724SNeil Horman
60*63e03724SNeil Hormandef trace_end():
61*63e03724SNeil Horman	print "Gathering kallsyms data"
62*63e03724SNeil Horman	get_kallsyms_table()
63*63e03724SNeil Horman	print_drop_table()
64*63e03724SNeil Horman
65*63e03724SNeil Horman# called from perf, when it finds a correspoinding event
66*63e03724SNeil Hormandef skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
67*63e03724SNeil Horman			skbaddr, protocol, location):
68*63e03724SNeil Horman	slocation = str(location)
69*63e03724SNeil Horman	try:
70*63e03724SNeil Horman		drop_log[slocation] = drop_log[slocation] + 1
71*63e03724SNeil Horman	except:
72*63e03724SNeil Horman		drop_log[slocation] = 1
73