diff --git a/cmd/netstack/main.go b/cmd/netstack/main.go index 4d87cd8..2b68c47 100644 --- a/cmd/netstack/main.go +++ b/cmd/netstack/main.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "net" + "netstack/logger" "netstack/tcpip" "netstack/tcpip/link/fdbased" "netstack/tcpip/link/tuntap" @@ -140,6 +141,7 @@ func main() { // conn.Close() //}() + //logger.SetFlags(logger.TCP) go func() { // echo server listener := tcpListen(s, proto, addr, localPort) conn, err := listener.Accept() @@ -150,7 +152,9 @@ func main() { if _, err := conn.Read(buf); err != nil { log.Fatal(err) } - fmt.Println(string(buf)) + logger.GetInstance().Info(logger.TCP, func() { + fmt.Println(string(buf)) + }) if string(buf) != "" { conn.Write([]byte("Server echo")) } diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 0000000..6f21179 --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,49 @@ +package logger + +import ( + "sync" +) + +const ( + IP = 1 << iota + UDP + TCP +) + +type logger struct { + flags uint8 +} + +var instance *logger +var once sync.Once + +// GetInstance 获取日志实例 +func GetInstance() *logger { + once.Do(func() { + instance = &logger{ + //flags: 255, + } + }) + return instance +} + +// SetFlags 设置输出类型 +func SetFlags(flags uint8) { + GetInstance().flags = flags +} + +/* +logger.GetInstance(IP|TCP) + +logger.GetInstance().Info(logger.IP, msg) // 会输出 + +logger.GetInstance().Info(logger.UDP, msg) // 不会输出 + + +*/ + +func (l *logger) Info(mask uint8, f func()) { + if mask&l.flags != 0 { + f() + } +} diff --git a/tcpip/network/ipv4/ipv4.go b/tcpip/network/ipv4/ipv4.go index 5b0d8e6..aff1149 100644 --- a/tcpip/network/ipv4/ipv4.go +++ b/tcpip/network/ipv4/ipv4.go @@ -2,6 +2,7 @@ package ipv4 import ( "log" + "netstack/logger" "netstack/tcpip" "netstack/tcpip/buffer" "netstack/tcpip/header" @@ -129,7 +130,9 @@ func (e *endpoint) HandlePacket(r *stack.Route, vv buffer.VectorisedView) { if !h.IsValid(vv.Size()) { return } - log.Println(h) + logger.GetInstance().Info(logger.IP, func() { + log.Println(h) + }) hlen := int(h.HeaderLength()) tlen := int(h.TotalLength()) diff --git a/tcpip/transport/tcp/segment.go b/tcpip/transport/tcp/segment.go index eab7a3b..d938b48 100644 --- a/tcpip/transport/tcp/segment.go +++ b/tcpip/transport/tcp/segment.go @@ -3,6 +3,7 @@ package tcp import ( "fmt" "log" + "netstack/logger" "netstack/tcpip/buffer" "netstack/tcpip/header" "netstack/tcpip/seqnum" @@ -122,8 +123,10 @@ func (s *segment) parse() bool { s.options = h.Options() s.parsedOptions = header.ParseTCPOptions(s.options) - log.Println(h) - fmt.Println(s.parsedOptions) + logger.GetInstance().Info(logger.TCP, func() { + log.Println(h) + fmt.Println(s.parsedOptions) + }) s.data.TrimFront(offset)