-
Notifications
You must be signed in to change notification settings - Fork 4
/
show_rule.go
113 lines (95 loc) · 2.41 KB
/
show_rule.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright © 2015-2016 Platina Systems, Inc. All rights reserved.
// Use of this source code is governed by the GPL-2 license described in the
// LICENSE file.
package options
import (
"fmt"
"net"
"github.com/platinasystems/goes/internal/nl"
"github.com/platinasystems/goes/internal/nl/rtnl"
)
func (opt *Options) ShowRule(b []byte) {
var fra rtnl.Fra
var hostlen uint8
fra.Write(b)
msg := rtnl.FibRuleMsgPtr(b)
switch msg.Family {
case rtnl.AF_INET6:
hostlen = 128
case rtnl.AF_INET:
hostlen = 32
}
if val := fra[rtnl.FRA_PRIORITY]; len(val) > 0 {
opt.Print(nl.Uint32(val), ":\t")
} else {
opt.Print("0:\t")
}
if (msg.Flags & rtnl.FIB_RULE_INVERT) != 0 {
opt.Print("not ")
}
if val := fra[rtnl.FRA_SRC]; len(val) > 0 {
if msg.Src_len != hostlen {
opt.Print("from ", net.IP(val), "/", msg.Src_len, " ")
} else {
opt.Print("from ", net.IP(val), " ")
}
} else if msg.Src_len != 0 {
opt.Print("from 0/", msg.Src_len, " ")
} else {
opt.Print("from all ")
}
if val := fra[rtnl.FRA_DST]; len(val) > 0 {
if msg.Dst_len != hostlen {
opt.Print("to ", net.IP(val), "/", msg.Dst_len, " ")
} else {
opt.Print("to ", net.IP(val), " ")
}
} else if msg.Dst_len != 0 {
opt.Print("to 0/", msg.Dst_len, " ")
}
if msg.Tos != 0 {
opt.Print("tos ", msg.Tos, " ")
}
vmark, vmask := fra[rtnl.FRA_FWMARK], fra[rtnl.FRA_FWMASK]
if len(vmark) > 0 || len(vmask) > 0 {
mark := nl.Uint32(vmark)
mask := nl.Uint32(vmask)
if len(vmask) > 0 && mask != ^uint32(0) {
fmt.Printf("fwmark %#x/%#x ", mark, mask)
} else {
fmt.Printf("fwmark %#x ", mark)
}
}
if val := fra[rtnl.FRA_IFNAME]; len(val) > 0 {
opt.Print("iif ", nl.Kstring(val), " ")
if (msg.Flags & rtnl.FIB_RULE_IIF_DETACHED) != 0 {
opt.Print("[detatched] ")
}
}
if val := fra[rtnl.FRA_OIFNAME]; len(val) > 0 {
opt.Print("oif ", nl.Kstring(val), " ")
if (msg.Flags & rtnl.FIB_RULE_OIF_DETACHED) != 0 {
opt.Print("[detatched] ")
}
}
if val := fra[rtnl.FRA_L3MDEV]; len(val) > 0 {
if nl.Uint8(val) != 0 {
opt.Print("lookup [l3mdev-table] ")
}
}
if val := fra[rtnl.FRA_UID_RANGE]; len(val) > 0 {
r := rtnl.FibRuleUidRangePtr(val)
opt.Print("uidrange ", r.Start, "-", r.End, " ")
}
// FIXME table
if val := fra[rtnl.FRA_FLOW]; len(val) > 0 {
to := nl.Uint32(val)
from := to >> 16
to &= 0xFFFF
if from != 0 {
opt.Print("realms ", from, "/")
}
opt.Print(to, " ")
}
// FIXME RTN_NAT
}