diff --git a/cmd/netstack/main.go b/cmd/netstack/main.go index 2b68c47..540248b 100644 --- a/cmd/netstack/main.go +++ b/cmd/netstack/main.go @@ -5,7 +5,6 @@ import ( "fmt" "log" "net" - "netstack/logger" "netstack/tcpip" "netstack/tcpip/link/fdbased" "netstack/tcpip/link/tuntap" @@ -123,24 +122,6 @@ func main() { }, }) - //go func() { // echo server - // // 监听udp localPort端口 - // conn := udpListen(s, proto, addr, localPort) - - // for { - // buf := make([]byte, 1024) - // n, err := conn.Read(buf) - // if err != nil { - // log.Println(err) - // break - // } - // log.Println("接收到数据", string(buf[:n])) - // conn.Write([]byte("server echo")) - // } - // // 关闭监听服务,此时会释放端口 - // conn.Close() - //}() - //logger.SetFlags(logger.TCP) go func() { // echo server listener := tcpListen(s, proto, addr, localPort) @@ -152,9 +133,7 @@ func main() { if _, err := conn.Read(buf); err != nil { log.Fatal(err) } - logger.GetInstance().Info(logger.TCP, func() { - fmt.Println(string(buf)) - }) + fmt.Println(string(buf)) if string(buf) != "" { conn.Write([]byte("Server echo")) } diff --git a/logger/logger.go b/logger/logger.go index 6f21179..b23e9ad 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -4,10 +4,23 @@ import ( "sync" ) +/* +logger.GetInstance(IP|TCP) + +logger.GetInstance().Info(logger.IP, msg) // 会输出 + +logger.GetInstance().Info(logger.UDP, msg) // 不会输出 +*/ + const ( - IP = 1 << iota + // ETH 以太网 + ETH = 1 << iota + IP + ARP UDP TCP + // HANDSHAKE 三次握手 四次挥手 + HANDSHAKE ) type logger struct { @@ -32,16 +45,6 @@ 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/link/fdbased/endpoint.go b/tcpip/link/fdbased/endpoint.go index 2829282..5759f50 100644 --- a/tcpip/link/fdbased/endpoint.go +++ b/tcpip/link/fdbased/endpoint.go @@ -2,6 +2,7 @@ package fdbased import ( "log" + "netstack/logger" "netstack/tcpip" "netstack/tcpip/buffer" "netstack/tcpip/header" @@ -126,7 +127,9 @@ func (e *endpoint) WritePacket(r *stack.Route, hdr buffer.Prependable, ethHdr.SrcAddr = e.addr // 说明这是一个原始报文 } eth.Encode(ethHdr) // 将以太帧信息作为报文头编入 - log.Println("链路层写回报文") + logger.GetInstance().Info(logger.ETH, func() { + log.Println("链路层写回以太报文") + }) // 写入网卡中 if payload.Size() == 0 { return rawfile.NonBlockingWrite(e.fd, hdr.View()) @@ -203,7 +206,9 @@ func (e *endpoint) dispatch() (bool, *tcpip.Error) { switch p { case header.ARPProtocolNumber, header.IPv4ProtocolNumber: - log.Println("链路层收到报文,来自: ", remoteLinkAddr, localLinkAddr) + logger.GetInstance().Info(logger.ETH, func() { + log.Println("链路层收到报文,来自: ", remoteLinkAddr, localLinkAddr) + }) e.dispatcher.DeliverNetworkPacket(e, remoteLinkAddr, localLinkAddr, p, vv) case header.IPv6ProtocolNumber: // TODO ipv6暂时不感兴趣 diff --git a/tcpip/network/fragmentation/fragmentation.go b/tcpip/network/fragmentation/fragmentation.go index 1de42de..a82fa06 100644 --- a/tcpip/network/fragmentation/fragmentation.go +++ b/tcpip/network/fragmentation/fragmentation.go @@ -2,6 +2,7 @@ package fragmentation import ( "log" + "netstack/logger" "netstack/tcpip/buffer" "sync" "time" @@ -71,7 +72,9 @@ func (f *Fragmentation) Process(id uint32, first, last uint16, more bool, vv buf f.mu.Lock() f.size += consumed - log.Printf("[%d]的分片 [%d,%d] 合并中\n", id, first, last) + logger.GetInstance().Info(logger.IP, func() { + log.Printf("[%d]的分片 [%d,%d] 合并中\n", id, first, last) + }) if done { f.release(r) } diff --git a/tcpip/network/ipv4/ipv4.go b/tcpip/network/ipv4/ipv4.go index aff1149..95366e9 100644 --- a/tcpip/network/ipv4/ipv4.go +++ b/tcpip/network/ipv4/ipv4.go @@ -111,11 +111,13 @@ func (e *endpoint) WritePacket(r *stack.Route, hdr buffer.Prependable, payload b if protocol == header.ICMPv4ProtocolNumber { log.Println("IP 写回ICMP报文", header.IPv4(append(ip, payload.ToView()...))) } else { - if payload.Size() == 0 { - log.Printf("send ipv4 packet %d bytes, proto: 0x%x", hdr.UsedLength()+payload.Size(), protocol) - } else { - log.Println(header.IPv4(append(ip, payload.ToView()...))) - } + logger.GetInstance().Info(logger.IP, func() { + if payload.Size() == 0 { + log.Printf("发送 IP 报文 %d bytes", hdr.UsedLength()+payload.Size()) + } else { + log.Println(header.IPv4(append(ip, payload.ToView()...))) + } + }) } return e.linkEP.WritePacket(r, hdr, payload, ProtocolNumber) } @@ -162,7 +164,9 @@ func (e *endpoint) HandlePacket(r *stack.Route, vv buffer.VectorisedView) { } r.Stats().IP.PacketsDelivered.Increment() // 根据协议分发到不同处理函数,比如协议时TCP,会进入tcp.HandlePacket - log.Printf("准备前往 UDP/TCP recv ipv4 packet %d bytes, proto: 0x%x", tlen, p) + logger.GetInstance().Info(logger.IP, func() { + log.Printf("准备前往 UDP/TCP recv ipv4 packet %d bytes, proto: 0x%x", tlen, p) + }) e.dispatcher.DeliverTransportPacket(r, p, vv) } diff --git a/tcpip/stack/linkaddrcache.go b/tcpip/stack/linkaddrcache.go index 05b80d4..e0642dd 100644 --- a/tcpip/stack/linkaddrcache.go +++ b/tcpip/stack/linkaddrcache.go @@ -20,6 +20,7 @@ import ( "sync" "time" + "netstack/logger" "netstack/sleep" "netstack/tcpip" ) @@ -149,7 +150,9 @@ func (e *linkAddrEntry) removeWaker(w *sleep.Waker) { // add adds a k -> v mapping to the cache. func (c *linkAddrCache) add(k tcpip.FullAddress, v tcpip.LinkAddress) { - log.Printf("add link cache: %v-%v", k, v) + logger.GetInstance().Info(logger.ETH, func() { + log.Printf("add link cache: %v-%v", k, v) + }) c.mu.Lock() defer c.mu.Unlock() @@ -203,7 +206,9 @@ func (c *linkAddrCache) makeAndAddEntry(k tcpip.FullAddress, v tcpip.LinkAddress // get reports any known link address for k. func (c *linkAddrCache) get(k tcpip.FullAddress, linkRes LinkAddressResolver, localAddr tcpip.Address, linkEP LinkEndpoint, waker *sleep.Waker) (tcpip.LinkAddress, <-chan struct{}, *tcpip.Error) { - log.Println("在arp本地缓存中寻找", k) + logger.GetInstance().Info(logger.ETH, func() { + log.Println("在arp本地缓存中寻找", k) + }) if linkRes != nil { if addr, ok := linkRes.ResolveStaticAddress(k.Addr); ok { return addr, nil, nil diff --git a/tcpip/stack/nic.go b/tcpip/stack/nic.go index 9eab217..d42b0fc 100644 --- a/tcpip/stack/nic.go +++ b/tcpip/stack/nic.go @@ -3,6 +3,7 @@ package stack import ( "log" "netstack/ilist" + "netstack/logger" "netstack/tcpip" "netstack/tcpip/buffer" "netstack/tcpip/header" @@ -92,7 +93,6 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip. peb PrimaryEndpointBehavior, replace bool) (*referencedNetworkEndpoint, *tcpip.Error) { netProto, ok := n.stack.networkProtocols[protocol] if !ok { - log.Println("添加失败") return nil, tcpip.ErrUnknownProtocol } @@ -101,7 +101,9 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip. if err != nil { return nil, err } - log.Printf("基于[%d]协议 为 #%d 网卡 添加网络层实现 并绑定地址到: %s\n", netProto.Number(), n.id, ep.ID().LocalAddress) + logger.GetInstance().Info(logger.IP, func() { + log.Printf("基于[%d]协议 为 #%d 网卡 添加网络层实现 并绑定地址到: %s\n", netProto.Number(), n.id, ep.ID().LocalAddress) + }) // 获取网络层端的id 其实就是ip地址 id := *ep.ID() @@ -340,19 +342,23 @@ func (n *NIC) DeliverNetworkPacket(linkEP LinkEndpoint, remoteLinkAddr, localLin return } src, dst := netProto.ParseAddresses(vv.First()) - log.Printf("网卡[%v]准备从 [%s] 向 [%s] 分发数据: %v\n", linkEP.LinkAddress(), src, dst, func() []byte { - if len(vv.ToView()) > 64 { - return vv.ToView()[:64] - } - return vv.ToView() - }()) + logger.GetInstance().Info(logger.ETH, func() { + log.Printf("网卡[%v]准备从 [%s] 向 [%s] 分发数据: %v\n", linkEP.LinkAddress(), src, dst, func() []byte { + if len(vv.ToView()) > 64 { + return vv.ToView()[:64] + } + return vv.ToView() + }()) + }) // 根据网络协议和数据包的目的地址,找到网络端 // 然后将数据包分发给网络层 if ref := n.getRef(protocol, dst); ref != nil { r := makeRoute(protocol, dst, src, linkEP.LinkAddress(), ref) r.RemoteLinkAddress = remoteLinkAddr - log.Println("准备前往 IP 将本地和远端的MAC、IP 保存在路由中 以便协议栈使用", - r.LocalLinkAddress, r.RemoteLinkAddress, r.LocalAddress, r.RemoteAddress) + logger.GetInstance().Info(logger.ETH, func() { + log.Println("准备前往 IP 将本地和远端的MAC、IP 保存在路由中 以便协议栈使用", + r.LocalLinkAddress, r.RemoteLinkAddress, r.LocalAddress, r.RemoteAddress) + }) ref.ep.HandlePacket(&r, vv) ref.decRef() return @@ -396,7 +402,9 @@ func (n *NIC) getRef(protocol tcpip.NetworkProtocolNumber, dst tcpip.Address) *r n.mu.RLock() if ref, ok := n.endpoints[id]; ok && ref.tryIncRef() { - log.Println("找到了目标网络端(绑定过的IP): ", id.LocalAddress) + logger.GetInstance().Info(logger.IP, func() { + log.Println("找到了目标网络端(绑定过的IP): ", id.LocalAddress) + }) n.mu.RUnlock() return ref } @@ -453,7 +461,9 @@ func (n *NIC) DeliverTransportPacket(r *Route, protocol tcpip.TransportProtocolN n.stack.stats.MalformedRcvdPackets.Increment() return } - log.Println("网卡准备分发传输层数据报", n.stack.transportProtocols, srcPort, dstPort) + logger.GetInstance().Info(logger.IP, func() { + log.Println("网卡准备分发传输层数据报", n.stack.transportProtocols, srcPort, dstPort) + }) id := TransportEndpointID{dstPort, r.LocalAddress, srcPort, r.RemoteAddress} // 调用分流器,根据传输层协议和传输层id分发数据报文 if n.demux.deliverPacket(r, protocol, vv, id) { @@ -484,6 +494,7 @@ func (n *NIC) DeliverTransportControlPacket(local, remote tcpip.Address, net tcp } +// ID 网卡的标识号 func (n *NIC) ID() tcpip.NICID { return n.id } diff --git a/tcpip/stack/stack.go b/tcpip/stack/stack.go index adf6a41..53876b6 100644 --- a/tcpip/stack/stack.go +++ b/tcpip/stack/stack.go @@ -2,6 +2,7 @@ package stack import ( "log" + "netstack/logger" "netstack/sleep" "netstack/tcpip" "netstack/tcpip/buffer" @@ -389,7 +390,9 @@ func (s *Stack) FindRoute(id tcpip.NICID, localAddr, remoteAddr tcpip.Address, r := makeRoute(netProto, ref.ep.ID().LocalAddress, remoteAddr, nic.linkEP.LinkAddress(), ref) r.NextHop = s.routeTable[i].Gateway - log.Println(r.LocalLinkAddress, r.LocalAddress, r.RemoteLinkAddress, r.RemoteAddress, r.NextHop) + logger.GetInstance().Info(logger.IP, func() { + log.Println(r.LocalLinkAddress, r.LocalAddress, r.RemoteLinkAddress, r.RemoteAddress, r.NextHop) + }) return r, nil } @@ -466,7 +469,9 @@ func (s *Stack) RemoveWaker(nicid tcpip.NICID, addr tcpip.Address, waker *sleep. // 最终调用 demuxer.registerEndpoint 函数来实现注册。 func (s *Stack) RegisterTransportEndpoint(nicID tcpip.NICID, netProtos []tcpip.NetworkProtocolNumber, protocol tcpip.TransportProtocolNumber, id TransportEndpointID, ep TransportEndpoint) *tcpip.Error { - log.Println("往", nicID, "网卡注册新的传输端") + logger.GetInstance().Info(logger.UDP|logger.TCP, func() { + log.Println("往", nicID, "网卡注册新的传输端") + }) if nicID == 0 { return s.demux.registerEndpoint(netProtos, protocol, id, ep) // 给协议栈的所有网卡注册传输端 }