@@ -16,12 +16,52 @@ import (
16
16
17
17
const bpfProgramPath = "counter.o"
18
18
19
- func ipToString (ip uint32 ) net.IP {
19
+ func ip4ToString (ip uint32 ) net.IP {
20
20
address := make (net.IP , 4 )
21
21
binary .LittleEndian .PutUint32 (address , ip )
22
22
return address
23
23
}
24
24
25
+ func ip6ToString (ip [16 ]byte ) string {
26
+ return net .IP (ip [:]).String ()
27
+ }
28
+
29
+ func printMap (m * ebpf.Map , ipToString func (interface {}) string ) {
30
+ iter := m .Iterate ()
31
+ var ip interface {}
32
+ var count uint64
33
+ for iter .Next (& ip , & count ) {
34
+ fmt .Printf ("%s: %d packets\n " , ipToString (ip ), count )
35
+ }
36
+ if err := iter .Err (); err != nil {
37
+ fmt .Printf ("Error iterating map: %v\n " , err )
38
+ }
39
+ }
40
+
41
+ func printIPv4Map (m * ebpf.Map ) {
42
+ iter := m .Iterate ()
43
+ var ip uint32
44
+ var count uint64
45
+ for iter .Next (& ip , & count ) {
46
+ fmt .Printf (" %s: %d packets\n " , ip4ToString (ip ), count )
47
+ }
48
+ if err := iter .Err (); err != nil {
49
+ fmt .Printf ("Error iterating map: %v\n " , err )
50
+ }
51
+ }
52
+
53
+ func printIPv6Map (m * ebpf.Map ) {
54
+ iter := m .Iterate ()
55
+ var ip [16 ]byte
56
+ var count uint64
57
+ for iter .Next (& ip , & count ) {
58
+ fmt .Printf (" %s: %d packets\n " , ip6ToString (ip ), count )
59
+ }
60
+ if err := iter .Err (); err != nil {
61
+ fmt .Printf ("Error iterating map: %v\n " , err )
62
+ }
63
+ }
64
+
25
65
func main () {
26
66
if len (os .Args ) < 3 || os .Args [1 ] != "-count" {
27
67
fmt .Println ("Usage: ./ebpf-packet-filter -count <interface_name>" )
@@ -39,9 +79,10 @@ func main() {
39
79
log .Fatal ("Failed to create BPF collection:" , err )
40
80
}
41
81
defer collection .Close ()
42
- ipMap := collection .Maps ["pkt_count" ]
43
- if ipMap == nil {
44
- log .Fatal ("Failed to find pkt_count map in the BPF program" )
82
+ ip4Map := collection .Maps ["ipv4_counter_map" ]
83
+ ip6Map := collection .Maps ["ipv6_counter_map" ]
84
+ if ip4Map == nil || ip6Map == nil {
85
+ log .Fatal ("Failed to find required map in the BPF program" )
45
86
}
46
87
ifname := os .Args [2 ]
47
88
iface , err := net .InterfaceByName (ifname )
@@ -68,15 +109,10 @@ func main() {
68
109
for {
69
110
select {
70
111
case <- tick :
71
- iter := ipMap .Iterate ()
72
- var ip uint32
73
- var count uint64
74
- for iter .Next (& ip , & count ) {
75
- log .Printf ("%s: %d packets\n " , ipToString (ip ), count )
76
- }
77
- if err := iter .Err (); err != nil {
78
- log .Fatal ("Error iterating map:" , err )
79
- }
112
+ fmt .Println ("IPv4 Packets count:" )
113
+ printIPv4Map (ip4Map )
114
+ fmt .Println ("IPv6 Packets count:" )
115
+ printIPv6Map (ip6Map )
80
116
case <- stop :
81
117
log .Println ("Received signal, exiting..." )
82
118
return
0 commit comments