mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-11-01 16:57:46 -04:00
97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
|
package conf
|
||
|
|
||
|
import (
|
||
|
"v2ray.com/core/app/policy"
|
||
|
)
|
||
|
|
||
|
type Policy struct {
|
||
|
Handshake *uint32 `json:"handshake"`
|
||
|
ConnectionIdle *uint32 `json:"connIdle"`
|
||
|
UplinkOnly *uint32 `json:"uplinkOnly"`
|
||
|
DownlinkOnly *uint32 `json:"downlinkOnly"`
|
||
|
StatsUserUplink bool `json:"statsUserUplink"`
|
||
|
StatsUserDownlink bool `json:"statsUserDownlink"`
|
||
|
BufferSize *int32 `json:"bufferSize"`
|
||
|
}
|
||
|
|
||
|
func (t *Policy) Build() (*policy.Policy, error) {
|
||
|
config := new(policy.Policy_Timeout)
|
||
|
if t.Handshake != nil {
|
||
|
config.Handshake = &policy.Second{Value: *t.Handshake}
|
||
|
}
|
||
|
if t.ConnectionIdle != nil {
|
||
|
config.ConnectionIdle = &policy.Second{Value: *t.ConnectionIdle}
|
||
|
}
|
||
|
if t.UplinkOnly != nil {
|
||
|
config.UplinkOnly = &policy.Second{Value: *t.UplinkOnly}
|
||
|
}
|
||
|
if t.DownlinkOnly != nil {
|
||
|
config.DownlinkOnly = &policy.Second{Value: *t.DownlinkOnly}
|
||
|
}
|
||
|
|
||
|
p := &policy.Policy{
|
||
|
Timeout: config,
|
||
|
Stats: &policy.Policy_Stats{
|
||
|
UserUplink: t.StatsUserUplink,
|
||
|
UserDownlink: t.StatsUserDownlink,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
if t.BufferSize != nil {
|
||
|
bs := int32(-1)
|
||
|
if *t.BufferSize >= 0 {
|
||
|
bs = (*t.BufferSize) * 1024
|
||
|
}
|
||
|
p.Buffer = &policy.Policy_Buffer{
|
||
|
Connection: bs,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return p, nil
|
||
|
}
|
||
|
|
||
|
type SystemPolicy struct {
|
||
|
StatsInboundUplink bool `json:"statsInboundUplink"`
|
||
|
StatsInboundDownlink bool `json:"statsInboundDownlink"`
|
||
|
}
|
||
|
|
||
|
func (p *SystemPolicy) Build() (*policy.SystemPolicy, error) {
|
||
|
return &policy.SystemPolicy{
|
||
|
Stats: &policy.SystemPolicy_Stats{
|
||
|
InboundUplink: p.StatsInboundUplink,
|
||
|
InboundDownlink: p.StatsInboundDownlink,
|
||
|
},
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
type PolicyConfig struct {
|
||
|
Levels map[uint32]*Policy `json:"levels"`
|
||
|
System *SystemPolicy `json:"system"`
|
||
|
}
|
||
|
|
||
|
func (c *PolicyConfig) Build() (*policy.Config, error) {
|
||
|
levels := make(map[uint32]*policy.Policy)
|
||
|
for l, p := range c.Levels {
|
||
|
if p != nil {
|
||
|
pp, err := p.Build()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
levels[l] = pp
|
||
|
}
|
||
|
}
|
||
|
config := &policy.Config{
|
||
|
Level: levels,
|
||
|
}
|
||
|
|
||
|
if c.System != nil {
|
||
|
sc, err := c.System.Build()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
config.System = sc
|
||
|
}
|
||
|
|
||
|
return config, nil
|
||
|
}
|