mirror of
https://github.com/impact-eintr/netstack.git
synced 2025-10-06 13:26:49 +08:00
使用logger尝试控制日志输出级别
This commit is contained in:
@@ -5,7 +5,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"netstack/logger"
|
|
||||||
"netstack/tcpip"
|
"netstack/tcpip"
|
||||||
"netstack/tcpip/link/fdbased"
|
"netstack/tcpip/link/fdbased"
|
||||||
"netstack/tcpip/link/tuntap"
|
"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)
|
//logger.SetFlags(logger.TCP)
|
||||||
go func() { // echo server
|
go func() { // echo server
|
||||||
listener := tcpListen(s, proto, addr, localPort)
|
listener := tcpListen(s, proto, addr, localPort)
|
||||||
@@ -152,9 +133,7 @@ func main() {
|
|||||||
if _, err := conn.Read(buf); err != nil {
|
if _, err := conn.Read(buf); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
logger.GetInstance().Info(logger.TCP, func() {
|
fmt.Println(string(buf))
|
||||||
fmt.Println(string(buf))
|
|
||||||
})
|
|
||||||
if string(buf) != "" {
|
if string(buf) != "" {
|
||||||
conn.Write([]byte("Server echo"))
|
conn.Write([]byte("Server echo"))
|
||||||
}
|
}
|
||||||
|
@@ -4,10 +4,23 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
logger.GetInstance(IP|TCP)
|
||||||
|
|
||||||
|
logger.GetInstance().Info(logger.IP, msg) // 会输出
|
||||||
|
|
||||||
|
logger.GetInstance().Info(logger.UDP, msg) // 不会输出
|
||||||
|
*/
|
||||||
|
|
||||||
const (
|
const (
|
||||||
IP = 1 << iota
|
// ETH 以太网
|
||||||
|
ETH = 1 << iota
|
||||||
|
IP
|
||||||
|
ARP
|
||||||
UDP
|
UDP
|
||||||
TCP
|
TCP
|
||||||
|
// HANDSHAKE 三次握手 四次挥手
|
||||||
|
HANDSHAKE
|
||||||
)
|
)
|
||||||
|
|
||||||
type logger struct {
|
type logger struct {
|
||||||
@@ -32,16 +45,6 @@ func SetFlags(flags uint8) {
|
|||||||
GetInstance().flags = flags
|
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()) {
|
func (l *logger) Info(mask uint8, f func()) {
|
||||||
if mask&l.flags != 0 {
|
if mask&l.flags != 0 {
|
||||||
f()
|
f()
|
||||||
|
@@ -2,6 +2,7 @@ package fdbased
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
"netstack/logger"
|
||||||
"netstack/tcpip"
|
"netstack/tcpip"
|
||||||
"netstack/tcpip/buffer"
|
"netstack/tcpip/buffer"
|
||||||
"netstack/tcpip/header"
|
"netstack/tcpip/header"
|
||||||
@@ -126,7 +127,9 @@ func (e *endpoint) WritePacket(r *stack.Route, hdr buffer.Prependable,
|
|||||||
ethHdr.SrcAddr = e.addr // 说明这是一个原始报文
|
ethHdr.SrcAddr = e.addr // 说明这是一个原始报文
|
||||||
}
|
}
|
||||||
eth.Encode(ethHdr) // 将以太帧信息作为报文头编入
|
eth.Encode(ethHdr) // 将以太帧信息作为报文头编入
|
||||||
log.Println("链路层写回报文")
|
logger.GetInstance().Info(logger.ETH, func() {
|
||||||
|
log.Println("链路层写回以太报文")
|
||||||
|
})
|
||||||
// 写入网卡中
|
// 写入网卡中
|
||||||
if payload.Size() == 0 {
|
if payload.Size() == 0 {
|
||||||
return rawfile.NonBlockingWrite(e.fd, hdr.View())
|
return rawfile.NonBlockingWrite(e.fd, hdr.View())
|
||||||
@@ -203,7 +206,9 @@ func (e *endpoint) dispatch() (bool, *tcpip.Error) {
|
|||||||
|
|
||||||
switch p {
|
switch p {
|
||||||
case header.ARPProtocolNumber, header.IPv4ProtocolNumber:
|
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)
|
e.dispatcher.DeliverNetworkPacket(e, remoteLinkAddr, localLinkAddr, p, vv)
|
||||||
case header.IPv6ProtocolNumber:
|
case header.IPv6ProtocolNumber:
|
||||||
// TODO ipv6暂时不感兴趣
|
// TODO ipv6暂时不感兴趣
|
||||||
|
@@ -2,6 +2,7 @@ package fragmentation
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
"netstack/logger"
|
||||||
"netstack/tcpip/buffer"
|
"netstack/tcpip/buffer"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -71,7 +72,9 @@ func (f *Fragmentation) Process(id uint32, first, last uint16, more bool, vv buf
|
|||||||
|
|
||||||
f.mu.Lock()
|
f.mu.Lock()
|
||||||
f.size += consumed
|
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 {
|
if done {
|
||||||
f.release(r)
|
f.release(r)
|
||||||
}
|
}
|
||||||
|
@@ -111,11 +111,13 @@ func (e *endpoint) WritePacket(r *stack.Route, hdr buffer.Prependable, payload b
|
|||||||
if protocol == header.ICMPv4ProtocolNumber {
|
if protocol == header.ICMPv4ProtocolNumber {
|
||||||
log.Println("IP 写回ICMP报文", header.IPv4(append(ip, payload.ToView()...)))
|
log.Println("IP 写回ICMP报文", header.IPv4(append(ip, payload.ToView()...)))
|
||||||
} else {
|
} else {
|
||||||
if payload.Size() == 0 {
|
logger.GetInstance().Info(logger.IP, func() {
|
||||||
log.Printf("send ipv4 packet %d bytes, proto: 0x%x", hdr.UsedLength()+payload.Size(), protocol)
|
if payload.Size() == 0 {
|
||||||
} else {
|
log.Printf("发送 IP 报文 %d bytes", hdr.UsedLength()+payload.Size())
|
||||||
log.Println(header.IPv4(append(ip, payload.ToView()...)))
|
} else {
|
||||||
}
|
log.Println(header.IPv4(append(ip, payload.ToView()...)))
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return e.linkEP.WritePacket(r, hdr, payload, ProtocolNumber)
|
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()
|
r.Stats().IP.PacketsDelivered.Increment()
|
||||||
// 根据协议分发到不同处理函数,比如协议时TCP,会进入tcp.HandlePacket
|
// 根据协议分发到不同处理函数,比如协议时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)
|
e.dispatcher.DeliverTransportPacket(r, p, vv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,6 +20,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"netstack/logger"
|
||||||
"netstack/sleep"
|
"netstack/sleep"
|
||||||
"netstack/tcpip"
|
"netstack/tcpip"
|
||||||
)
|
)
|
||||||
@@ -149,7 +150,9 @@ func (e *linkAddrEntry) removeWaker(w *sleep.Waker) {
|
|||||||
|
|
||||||
// add adds a k -> v mapping to the cache.
|
// add adds a k -> v mapping to the cache.
|
||||||
func (c *linkAddrCache) add(k tcpip.FullAddress, v tcpip.LinkAddress) {
|
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()
|
c.mu.Lock()
|
||||||
defer c.mu.Unlock()
|
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.
|
// get reports any known link address for k.
|
||||||
func (c *linkAddrCache) get(k tcpip.FullAddress, linkRes LinkAddressResolver,
|
func (c *linkAddrCache) get(k tcpip.FullAddress, linkRes LinkAddressResolver,
|
||||||
localAddr tcpip.Address, linkEP LinkEndpoint, waker *sleep.Waker) (tcpip.LinkAddress, <-chan struct{}, *tcpip.Error) {
|
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 linkRes != nil {
|
||||||
if addr, ok := linkRes.ResolveStaticAddress(k.Addr); ok {
|
if addr, ok := linkRes.ResolveStaticAddress(k.Addr); ok {
|
||||||
return addr, nil, nil
|
return addr, nil, nil
|
||||||
|
@@ -3,6 +3,7 @@ package stack
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"netstack/ilist"
|
"netstack/ilist"
|
||||||
|
"netstack/logger"
|
||||||
"netstack/tcpip"
|
"netstack/tcpip"
|
||||||
"netstack/tcpip/buffer"
|
"netstack/tcpip/buffer"
|
||||||
"netstack/tcpip/header"
|
"netstack/tcpip/header"
|
||||||
@@ -92,7 +93,6 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip.
|
|||||||
peb PrimaryEndpointBehavior, replace bool) (*referencedNetworkEndpoint, *tcpip.Error) {
|
peb PrimaryEndpointBehavior, replace bool) (*referencedNetworkEndpoint, *tcpip.Error) {
|
||||||
netProto, ok := n.stack.networkProtocols[protocol]
|
netProto, ok := n.stack.networkProtocols[protocol]
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Println("添加失败")
|
|
||||||
return nil, tcpip.ErrUnknownProtocol
|
return nil, tcpip.ErrUnknownProtocol
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,7 +101,9 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip.
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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 其实就是ip地址
|
||||||
id := *ep.ID()
|
id := *ep.ID()
|
||||||
@@ -340,19 +342,23 @@ func (n *NIC) DeliverNetworkPacket(linkEP LinkEndpoint, remoteLinkAddr, localLin
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
src, dst := netProto.ParseAddresses(vv.First())
|
src, dst := netProto.ParseAddresses(vv.First())
|
||||||
log.Printf("网卡[%v]准备从 [%s] 向 [%s] 分发数据: %v\n", linkEP.LinkAddress(), src, dst, func() []byte {
|
logger.GetInstance().Info(logger.ETH, func() {
|
||||||
if len(vv.ToView()) > 64 {
|
log.Printf("网卡[%v]准备从 [%s] 向 [%s] 分发数据: %v\n", linkEP.LinkAddress(), src, dst, func() []byte {
|
||||||
return vv.ToView()[:64]
|
if len(vv.ToView()) > 64 {
|
||||||
}
|
return vv.ToView()[:64]
|
||||||
return vv.ToView()
|
}
|
||||||
}())
|
return vv.ToView()
|
||||||
|
}())
|
||||||
|
})
|
||||||
// 根据网络协议和数据包的目的地址,找到网络端
|
// 根据网络协议和数据包的目的地址,找到网络端
|
||||||
// 然后将数据包分发给网络层
|
// 然后将数据包分发给网络层
|
||||||
if ref := n.getRef(protocol, dst); ref != nil {
|
if ref := n.getRef(protocol, dst); ref != nil {
|
||||||
r := makeRoute(protocol, dst, src, linkEP.LinkAddress(), ref)
|
r := makeRoute(protocol, dst, src, linkEP.LinkAddress(), ref)
|
||||||
r.RemoteLinkAddress = remoteLinkAddr
|
r.RemoteLinkAddress = remoteLinkAddr
|
||||||
log.Println("准备前往 IP 将本地和远端的MAC、IP 保存在路由中 以便协议栈使用",
|
logger.GetInstance().Info(logger.ETH, func() {
|
||||||
r.LocalLinkAddress, r.RemoteLinkAddress, r.LocalAddress, r.RemoteAddress)
|
log.Println("准备前往 IP 将本地和远端的MAC、IP 保存在路由中 以便协议栈使用",
|
||||||
|
r.LocalLinkAddress, r.RemoteLinkAddress, r.LocalAddress, r.RemoteAddress)
|
||||||
|
})
|
||||||
ref.ep.HandlePacket(&r, vv)
|
ref.ep.HandlePacket(&r, vv)
|
||||||
ref.decRef()
|
ref.decRef()
|
||||||
return
|
return
|
||||||
@@ -396,7 +402,9 @@ func (n *NIC) getRef(protocol tcpip.NetworkProtocolNumber, dst tcpip.Address) *r
|
|||||||
|
|
||||||
n.mu.RLock()
|
n.mu.RLock()
|
||||||
if ref, ok := n.endpoints[id]; ok && ref.tryIncRef() {
|
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()
|
n.mu.RUnlock()
|
||||||
return ref
|
return ref
|
||||||
}
|
}
|
||||||
@@ -453,7 +461,9 @@ func (n *NIC) DeliverTransportPacket(r *Route, protocol tcpip.TransportProtocolN
|
|||||||
n.stack.stats.MalformedRcvdPackets.Increment()
|
n.stack.stats.MalformedRcvdPackets.Increment()
|
||||||
return
|
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 := TransportEndpointID{dstPort, r.LocalAddress, srcPort, r.RemoteAddress}
|
||||||
// 调用分流器,根据传输层协议和传输层id分发数据报文
|
// 调用分流器,根据传输层协议和传输层id分发数据报文
|
||||||
if n.demux.deliverPacket(r, protocol, vv, 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 {
|
func (n *NIC) ID() tcpip.NICID {
|
||||||
return n.id
|
return n.id
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package stack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
"netstack/logger"
|
||||||
"netstack/sleep"
|
"netstack/sleep"
|
||||||
"netstack/tcpip"
|
"netstack/tcpip"
|
||||||
"netstack/tcpip/buffer"
|
"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 := makeRoute(netProto, ref.ep.ID().LocalAddress, remoteAddr, nic.linkEP.LinkAddress(), ref)
|
||||||
r.NextHop = s.routeTable[i].Gateway
|
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
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,7 +469,9 @@ func (s *Stack) RemoveWaker(nicid tcpip.NICID, addr tcpip.Address, waker *sleep.
|
|||||||
// 最终调用 demuxer.registerEndpoint 函数来实现注册。
|
// 最终调用 demuxer.registerEndpoint 函数来实现注册。
|
||||||
func (s *Stack) RegisterTransportEndpoint(nicID tcpip.NICID, netProtos []tcpip.NetworkProtocolNumber,
|
func (s *Stack) RegisterTransportEndpoint(nicID tcpip.NICID, netProtos []tcpip.NetworkProtocolNumber,
|
||||||
protocol tcpip.TransportProtocolNumber, id TransportEndpointID, ep TransportEndpoint) *tcpip.Error {
|
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 {
|
if nicID == 0 {
|
||||||
return s.demux.registerEndpoint(netProtos, protocol, id, ep) // 给协议栈的所有网卡注册传输端
|
return s.demux.registerEndpoint(netProtos, protocol, id, ep) // 给协议栈的所有网卡注册传输端
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user